schneefall simulieren (erledigt)

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Dragonkiller

Betreff: schneefall simulieren (erledigt)

BeitragSo, Feb 18, 2007 21:10
Antworten mit Zitat
Benutzer-Profile anzeigen
ich hab ein problem bei meiner schneefallsimulation und zwar möchte ich das der schnee sich stapelt aber irgendwas stimmt bei der kollision anscheinend nicht hier mal der code
Code: [AUSKLAPPEN]

Graphics 800,600,32,2

SetBuffer BackBuffer()

schnee_weis=LoadImage("schnee_weis.jpg")
schnee_grau=LoadImage("schnee_grau.jpg")

SeedRnd MilliSecs()

Type schnee
   Field x,y,imagewahl,image,liegen,stapeln
End Type


While Not KeyHit(1)
   
   For i=1 To 1
      flocke.schnee       = New schnee
      flocke\x            = Rnd(0,800)
      flocke\y            = 0
      flocke\imagewahl    = Rnd(0,1)
      Select flocke\imagewahl
         Case 0
         flocke\image    = schnee_weis
         Case 1
         flocke\image    = schnee_grau
      End Select
      flocke\liegen       = False
      flocke\stapeln      = False
   Next
   
   For flocke.schnee = Each schnee
      
      flocke\x            = flocke\x+1*Rnd(-1,1)
      If (flocke\liegen=False) Or (flocke\stapeln=False)
         flocke\y        = flocke\y+Rnd(0.5,1)
      EndIf
      If flocke\y > 597 Then flocke\liegen=True
      If (flocke\liegen = True) And (ImagesCollide(flocke\image,2,3,0,flocke\image,2,3,0)) Then flocke\stapeln = True 
      DrawImage flocke\image,flocke\x,flocke\y
   Next

Flip
Cls
Wend

End
  • Zuletzt bearbeitet von Dragonkiller am Fr, März 30, 2007 9:31, insgesamt 2-mal bearbeitet

Justus

BeitragSo, Feb 18, 2007 21:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Schnee und ImagesCollide ist ein Widerspruch in sich. Der Befehl ist viel zu langsam für so einen massiven Einsatz.
Ich würde dir eher eine einfache Rect-Überprüfung raten oder mit einzelnen Pixeln als Flocken arbeiten.

Dragonkiller

BeitragSo, Feb 18, 2007 21:54
Antworten mit Zitat
Benutzer-Profile anzeigen
ich würd das aber gerne so machen und außerdem haben die schneeflocken eine größe von 2*3 pixel
 

Krümel

BeitragMo, Feb 26, 2007 2:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Schau dir mal meinen Code an, evtl. kannst du damit was anfagen:

Code: [AUSKLAPPEN]

Const GRX=800,GRY=600
Graphics GRX,GRY,32,2
timer=CreateTimer(600)

Dim Schnee(GRX,GRY)
HintergrundImg=CreateImage(GRX,GRY)
;flocken images erstellen
FlockeImg=CreateImage(8,8,6)
Type flocke
   Field x#,y#,xs#,r#
End Type
For t=0 To 5
   Color 50+t*40,50+t*40,50+t*40
   SetBuffer ImageBuffer(FlockeImg,t)
   r#=t*1.5
   Oval 0,0,t*1.5,t*1.5
Next

;Wunderschönen Hintergrund erstellen
SetBuffer ImageBuffer (HintergrundImg)
SetFont LoadFont("",200,1)
Text GRX*0.5,GRY*0.5,"Winter",1,1
LockBuffer
For y=0 To GRY-1
   c=(y*0.1) Shl 16 + (y*0.17) Shl 8 + (y*0.25)+10
For x=0 To GRX-1
   ;wo Text steht Schnee-Dim auf 1 setzten:
   If ReadPixelFast(x,y)=$FF000000 WritePixelFast x,y,c Else Schnee(x,y)=1: WritePixelFast x,y,$FF886633+(255-y*0.65)*x/(y+1)
   ;den Boden mit Schnee bedecken damit flocken nicht durchfallen
   If y>597 Schnee(x,y)=1   
Next
Next
UnlockBuffer
SetBuffer BackBuffer()

;flocken initialisieren
For t=1 To 1500
   f.flocke=New flocke
   f\r=Rand(1,4)   
   ;flocken nicht auf textstellen positionieren (sieht unschön aus)
   Repeat
      f\x=Rand(GRX):f\y=Rand(GRY)
   Until Schnee(f\x,f\y)=0   
Next


While Not KeyHit(1)
   DrawImage HintergrundImg,0,0

   ;zufall windrichtung
   wx#=wx#+wxs#:If wx<-0.5 wx=-0.5 Else If wx>0.5 wx=0.5
   wxs=wxs+Rnd(-0.001,0.001):If wxs<-0.03 wxs=-0.03 Else If wxs>0.03 wxs=0.03

   For f.flocke=Each flocke
      ;flocken bewegung / grenzen testen
      f\x=f\x+f\xs+wx : If f\x<1 f\x=GRX-2 Else If f\x>GRX-2 f\x=1
      f\y=f\y+f\r*0.4 : If f\y<1 f\y=1 Else If f\y>GRY-2 f\y=GRY-2
      f\xs=f\xs + Rnd(-0.005,0.005) * f\r

      ;testen ob sich unterhalb der flocke schnee befindet
      If Schnee(f\x,f\y+1)<>0
         ;abhang runterrutschen
         f\x=f\x+(Schnee(f\x-1,f\y+1)-Schnee(f\x+1,f\y+1))
      EndIf

      ;flocke trifft auf Schnee:
      If Schnee(f\x,f\y)<>0
         ;schneewert berechnen (sorgt für schöne abgerundete schneekuppen)
         Schnee(f\x,f\y-1)=(Schnee(f\x-1,f\y)+Schnee(f\x+1,f\y)+Schnee(f\x,f\y-1)+Schnee(f\x,f\y+1))*0.25
         SetBuffer ImageBuffer(HintergrundImg)
         ;flocke in flockenimage zeichnen
         Color Rnd(210,255),Rnd(210,255),Rnd(220,255)
         Oval f\x,f\y-1,f\r,f\r
         SetBuffer BackBuffer()
         ;neue flocke erstellen
         f\y=0 : f\x=Rnd(GRX):f\xs=0
      EndIf

      DrawImage FlockeImg, f\x-2,f\y-2, f\r
      
   Next

   Flip 0
;   WaitTimer timer
Wend

 

joni8a

BeitragSa, März 10, 2007 14:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Habe auch ne frage zu types wiseo funktioniert dieser code nicht?

Code: [AUSKLAPPEN]

Graphics 640,480
SetBuffer BackBuffer()

Type alien
   Field x
   Field y
End Type

Global a.alien

For i=1 To 10

   a=New alien
   a\x=Rnd(0,640)
   a\y=Rnd(0,480)
Next

For a=Each alien
   Print a\x
   Print a\y
Next   
Repeat
Cls
Rect a\x,a\y,20,20
Flip
Until KeyHit(1)

Eingeproggt

BeitragSa, März 10, 2007 15:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit dem Code wirst du nur ein Rechteck zeichnen, und zwar an die Stelle des letzten Aliens, da du in der Hauptschleife kein "For a=Each alien" hast.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group