2D Partikel Test mit Gavitation und Abprall (FRAGE dazu)

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Silbersurfer

Betreff: 2D Partikel Test mit Gavitation und Abprall (FRAGE dazu)

BeitragMo, Jun 21, 2004 21:45
Antworten mit Zitat
Benutzer-Profile anzeigen
hallo leute,

habe so ein bisschen mit Types und Writepartikelfast rumgespielt.
Was auch gut funtzt nu habe ich ein kleines prob, wie kann ich die
If Abfrage des Pixels noch besser gestalten, um die Fehler im diesen
code zu beseitigen (wenn die Pixel an den weißen Balken Aprallen sollen
sind einige im Balken)

momentan komme Ich da nicht weiter Exclamation

Wäre über tipps sehr froh Laughing

Code: [AUSKLAPPEN]
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;+++++++++++ 2D Partikel test mit Gravitation und abprall +++++++++++++++++
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Graphics 800,600,32,2
Global puffer=CreateImage (800,600)
SetBuffer ImageBuffer(puffer)
SeedRnd MilliSecs()
For t=1 To 20
   Rect Rnd(800),Rnd(600),Rnd(10,80),10,1
Next   
SetBuffer BackBuffer()
 
Global Ball=LoadImage("tex\a0neu3.bmp")
Global lastTime#,max_partikel,partikel_count,gravitation#,rotation

max_partikel= 5000
gravitation#=.02
Type partikel
   Field x#,y#
   Field leben
   Field xspeed#,yspeed#
   Field r,g,b
   Field sub 
End Type

;+++++++++++++++++++++      Hauptschleife     ++++++++++++++++++++++++++++++

Repeat
   DrawBlock puffer,0,0    
   If MouseDown(1)
      For t=1 To 12
        create_partikel
      Next
   EndIf       
   update_partikel
   farbe=ReadPixel (MouseX(),MouseY(),BackBuffer())
   Text 0,16,"Partikel "+Str(partikel_count)
   fps 20              
   Flip   
Until KeyHit(1)

;+++++++++++++++++++++++++    Functionen   +++++++++++++++++++++++++++++++++

Function create_partikel()
   If partikel_count=max_partikel Then Return
    partikel_count=partikel_count+1         
    rotation=(rotation+1+Rnd(6)) Mod 180
   x#=Cos(rotation)/2:y#=Sin(rotation)/2     
   p.partikel=New partikel   
   p\leben = Rnd(370,400)
   p\xspeed=Rnd(-.5,.5)+x
   p\yspeed=-4+y;Rnd(-2,-4)
   p\r=Rnd(100,253):p\g=Rnd(100,253):p\b=Rnd(100,253)
   p\x=MouseX():p\y=MouseY()
   p\sub=Rnd(100)
End Function
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Function update_partikel()
   
   LockBuffer BackBuffer()   
   For p.partikel=Each partikel
     p\yspeed=p\yspeed+gravitation#
     rgb=p\r*$10000 + p\g*$100 + p\b+1
      p\x=p\x+p\xspeed
      p\y=p\y+p\yspeed
      p\leben=p\leben-1      
      If p\x>0 And p\x<GraphicsWidth ()-1
         If p\y>0 And p\y<GraphicsHeight ()-1
          If ReadPixelFast (p\x,p\y, BackBuffer())=-1 Then  p\yspeed=-(p\yspeed/2)
          If p\y>597 Then p\y=597:p\yspeed=-(p\yspeed/2)
          WritePixelFast p\x,p\y,rgb,BackBuffer()
            EndIf
      EndIf         
       If p\leben=<0 Then Delete p.partikel:partikel_count=partikel_count-1               
     Next
     UnlockBuffer BackBuffer()
      
End Function
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Function fps(posX=0,posY=0)
           
   If lastTime < MilliSecs()
      currentFrames = 1000/(MilliSecs()-lastTime)
   End If
   lastTime = MilliSecs()
   Text posX,posY,"FPS: "+currentFrames
   
 
End Function


gruss

Silbersurfer
-------------------------------------------------------
XP 2000+ 512DDR Radeon 9800 XL 340GB HD
Hompage : http://home.arcor.de/silbersurfer01/
Is Bob engine http://home.arcor.de/silbersur.../Isbob.zip

Travis

BeitragMo, Jun 21, 2004 22:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm? Ist doch noch gar keine Kollisionsabfrage drin, oder? Ich habe es jetzt mal eine simple Kollisionsabfrage reingebastelt. Beim Aufprall wird einfach die Bewegung der Partikel umgekehrt. Könnte man evtl noch verbessern.

Dein Codestyle gefällt mir übrigens. Endlich mal was, was man auch 'bearbeiten' kann.

Code: [AUSKLAPPEN]

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;+++++++++++ 2D Partikel test mit Gravitation und abprall +++++++++++++++++
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Graphics 800,600,32,2
Global puffer=CreateImage (800,600)
SetBuffer ImageBuffer(puffer)
SeedRnd MilliSecs()
For t=1 To 20
Rect Rnd(800),Rnd(600),Rnd(10,80),10,1
Next
SetBuffer BackBuffer()

Global Ball=LoadImage("tex\a0neu3.bmp")
Global lastTime#,max_partikel,partikel_count,gravitation#,rotation

max_partikel= 5000
gravitation#=.02
Type partikel
Field x#,y#
Field leben
Field xspeed#,yspeed#
Field r,g,b
Field sub
End Type

;+++++++++++++++++++++ Hauptschleife ++++++++++++++++++++++++++++++

Repeat
Cls
DrawImage puffer,0,0
; FÜR EINE KOLLISIONSABFRAGE MUSS DIE TRANSPARENTFARBE BERÜCKSICHTIGT WERDEN
; DAHER HABE ICH HIER DRAWIMAGE VERWENDET!
If MouseDown(1)
For t=1 To 12
create_partikel
Next
EndIf
update_partikel
farbe=ReadPixel (MouseX(),MouseY(),BackBuffer())
Text 0,16,"Partikel "+Str(partikel_count)
fps 20

Flip
Until KeyHit(1)

;+++++++++++++++++++++++++ Functionen +++++++++++++++++++++++++++++++++

Function create_partikel()
If partikel_count=max_partikel Then Return
partikel_count=partikel_count+1
rotation=(rotation+1+Rnd(6)) Mod 180
x#=Cos(rotation)/2:y#=Sin(rotation)/2
p.partikel=New partikel
p\leben = Rnd(370,400)
p\xspeed=Rnd(-.5,.5)+x
p\yspeed=-4+y;Rnd(-2,-4)
p\r=Rnd(100,253):p\g=Rnd(100,253):p\b=Rnd(100,253)
p\x=MouseX():p\y=MouseY()
p\sub=Rnd(100)
End Function
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Function update_partikel()

LockBuffer BackBuffer()
For p.partikel=Each partikel

; --- Kollisionsabfrage für Partikelaufprall ---
If ImageRectCollide(puffer,0,0,0, p\x, p\y, 1,1)
 ;p\xspeed = p\xspeed *-1 ;ist natürlich unrealistisch
 p\yspeed = p\yspeed *-1
EndIf
; --- Kollisionsabfrage für Partikelaufprall ---

p\yspeed=p\yspeed+gravitation#
rgb=p\r*$10000 + p\g*$100 + p\b+1
p\x=p\x+p\xspeed
p\y=p\y+p\yspeed
p\leben=p\leben-1
If p\x>0 And p\x<GraphicsWidth ()-1
If p\y>0 And p\y<GraphicsHeight ()-1
If ReadPixelFast (p\x,p\y, BackBuffer())=-1 Then p\yspeed=-(p\yspeed/2)
If p\y>597 Then p\y=597:p\yspeed=-(p\yspeed/2)
WritePixelFast p\x,p\y,rgb,BackBuffer()
EndIf
EndIf
If p\leben=<0 Then Delete p.partikel:partikel_count=partikel_count-1
Next
UnlockBuffer BackBuffer()

End Function
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Function fps(posX=0,posY=0)

If lastTime < MilliSecs()
currentFrames = 1000/(MilliSecs()-lastTime)
End If
lastTime = MilliSecs()
Text posX,posY,"FPS: "+currentFrames


End Function
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.
 

Silbersurfer

BeitragMo, Jun 21, 2004 23:06
Antworten mit Zitat
Benutzer-Profile anzeigen
hmm also darauf wäre ich nicht gekommen ich habe wie du ja sehen
kannst anhand des readpixelfast auf collision geprüft Laughing

Code: [AUSKLAPPEN]
If ReadPixelFast (p\x,p\y, BackBuffer())=-1 Then  p\yspeed=p\yspeed/2)
If p\y>597 Then p\y=597:p\yspeed=-(p\yspeed/2)

aber das du hier einfach das gesamte Image als Collision genommen hast
echt nicht dum danke
PS: deine ySpeed variabel brauchst du nur auf umkehr setzen dann funtz sie gut
und fast real Wink

Code: [AUSKLAPPEN]
; --- Kollisionsabfrage für Partikelaufprall ---
If ImageRectCollide(puffer,0,0,0, p\x, p\y, 1,1)

 p\yspeed = -(p\yspeed/2) halbe Geschwindigkeit wegen aufprall
EndIf
; --- Kollisionsabfrage für Partikelaufprall ---


danke nochmal

gruss
Silbersurfer
-------------------------------------------------------
XP 2000+ 512DDR Radeon 9800 XL 340GB HD
Hompage : http://home.arcor.de/silbersurfer01/
Is Bob engine http://home.arcor.de/silbersur.../Isbob.zip

Travis

BeitragDi, Jun 22, 2004 15:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe mir dazu nochmal was einfallen lassen. Wenn man bei der Kollision jetzt einfach den Hintergrund an dieser Stelle schwarz färbt, kann man mit den Partikeln den Hintergrund sozusagen wegstrahlen.

Sieht gut aus, aber leider prallen die Partikel dann weiterhin an den Hindernissen ab, auch wenn diese gar nicht mehr da sind.

Code: [AUSKLAPPEN]

; --- Kollisionsabfrage für Partikelaufprall ---
If ImageRectCollide(puffer,0,0,0, p\x, p\y, 1,1)
 SetBuffer ImageBuffer(puffer)
 WritePixelFast p\x,p\y,black
 SetBuffer BackBuffer()
 p\yspeed = p\yspeed *-.5
EndIf
; --- Kollisionsabfrage für Partikelaufprall ---
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.
 

Silbersurfer

BeitragDi, Jun 22, 2004 17:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja sieht echt nicht schlecht aus,

wenn du deine Abfage so änderst, prallendie Partikel nach dem einfärben
nicht mehr ab da die collision wieder mit readpixelfast gemacht wird.

komisch ist wenn ich deine collisionsabfragen raus nehme gibt es einen
Memory fehler! ich denke wegen Lockbuffer.
Irgendwie scheint er dann den imagebuffer mit zu locken wenn die colliabfrage
drinbleibt


Code: [AUSKLAPPEN]
;++++++++++ hier die aenderung ++++++++
If ImageRectCollide(puffer,0,0,0, p\x, p\y, 1,1)
;SetBuffer ImageBuffer(puffer)
WritePixelFast p\x,p\y,black,ImageBuffer(puffer)
;SetBuffer BackBuffer()
;p\yspeed = p\yspeed *-.5
 
EndIf


Hier fragt er denn pixel auf weiße Farbe ab wenn ja abprall
Code: [AUSKLAPPEN]
If ReadPixelFast (p\x,p\y, BackBuffer())=-1 Then p\yspeed=-(p\yspeed/2)
If p\y>597 Then p\y=597:p\yspeed=-(p\yspeed/2) 
;WritePixelFast p\x,p\y,black,ImageBuffer(puffer)
WritePixelFast p\x,p\y,rgb,BackBuffer()


gruss
Silbersurfer
-------------------------------------------------------
XP 2000+ 512DDR Radeon 9800 XL 340GB HD
Hompage : http://home.arcor.de/silbersurfer01/
Is Bob engine http://home.arcor.de/silbersur.../Isbob.zip

Travis

BeitragDi, Jun 22, 2004 19:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Funktioniert das bei dir jetzt?
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.
 

Silbersurfer

BeitragDo, Jun 24, 2004 0:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja bei mir geht es, nur deine Abfrage muß drin bleiben
obwohl sie eigendlich überflüssig wäre,wie ich ja oben geschrieben habe
gibt es beim entfernen den Memory fehler! .

Da der Backbuffer gelockt ist, aber im Programm mit Writepixelfast auch auf dem ungelocktem ImageBuffer(puffer) zugegriffen wird (was ja eigendlich nicht geht) Scheint durch die Colli abfrage irgendwie eine art
gelock buffer Aktiv zu sein Ich teste das mal durch.

Ich hätte nartürlich den ImageBuffer ordungsgemäss Locken,
dann mit dem write schreiben und den Buffer wieder freigeben können

aber So ist es schneller und ich weiß nicht ob das ewentuell fehler geben könnte die ich aber bis jetzt nicht feststellen konnte
ändere den code wie oben und sehe selber.

Edit: Ich sehe das du bei deine änderung den mit Writepixelfast
auch ohne Lockbuffer genutzt hast Question
Laut Hilfe ist das aber doch nicht möglich Exclamation

Zitat:
Bevor man READ-/WRITEPIXELFAST verwenden kann, muss man noch den Befehl LOCKBUFFER verwenden. Dadurch wird ein Buffer für andere Befehle gesperrt und die Fehlerprüfung deaktiviert. Danach muss ein Buffer mit UNLOCKBUFFER wieder geöffnet werden.


gruss

Silbersurfer[/quote]
-------------------------------------------------------
XP 2000+ 512DDR Radeon 9800 XL 340GB HD
Hompage : http://home.arcor.de/silbersurfer01/
Is Bob engine http://home.arcor.de/silbersur.../Isbob.zip

Travis

BeitragDo, Jun 24, 2004 1:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, diese Write/ReadPixelFast-Befehle sind wirklich seltsam.

Das mit dem WritePixelFast ohne LockBuffer sehe ich auch gerade. Eigendlich habe ich ja nur den BackBuffer 'gelocked', male dann aber in den ImagBuffer. Habe mal versucht den ImageBuffer ebenfalls zu 'locken', aber das gefiel der Performance dann überhaupt nicht. Rolling Eyes

Also ich traue diesen Befehlen nicht so ganz. Da ist irgendwo der Wurm drin. Wenn man die Benutzt haften sich auch manchmal irgendwelche Pixel an den Mauszeiger.

Bei deiner Änderung, die du oben gepostet hast, funktioniert die Kollisionsabfrage mit ReadPixelFast bei mir aber nicht.

Und eigentlich dürfte bei der Kollisionsabfrage mit Imagescollide die ich gemacht habe doch gar keine Kollision mehr stattfinden, wenn die weißen Farbbalken mit Schwarz übermalt wurden. Habe das später sogar per Screenshot geprüft. Der gesamte Hintergrund war wirklich schwarz und trotzdem prallen die Partikel genau dort ab, wo verher die Balken waren. Eigendlich schade - endweder bin ich zu blöd oder diese Befehle sind ganz schön "Buggy" Wink
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.
 

Silbersurfer

BeitragDo, Jun 24, 2004 22:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm, stimmt eigendlich darf das nicht sein.
kann es möglich sein das der Collisions befehl das auf irgend eine weise
zwischen puffert um mehr speed zu erhalten und darduch den eigendlichen schirm nicht abfragt Question

wie sonst kann es zu solchen Ergebnissen kommen

also ich denke nicht das wir zu blöd sind, da scheint wirklich etwas nicht ganz in Ordung zu sein.

hier nochmal der ganze code mit der Änderung

Code: [AUSKLAPPEN]
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;+++++++++++ 2D Partikel test mit Gravitation und abprall +++++++++++++++++
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Graphics 800,600,32,2
Global puffer=CreateImage (800,600)
SetBuffer ImageBuffer(puffer)
SeedRnd MilliSecs()
For t=1 To 20
Rect Rnd(800),Rnd(600),Rnd(10,80),10,1
Next
SetBuffer BackBuffer()

Global Ball=LoadImage("tex\a0neu3.bmp")
Global lastTime#,max_partikel,partikel_count,gravitation#,rotation

max_partikel= 5000
gravitation#=.02
Type partikel
Field x#,y#
Field leben
Field xspeed#,yspeed#
Field r,g,b
Field sub
End Type

;+++++++++++++++++++++ Hauptschleife ++++++++++++++++++++++++++++++

Repeat
Cls
DrawImage puffer,0,0
; FÜR EINE KOLLISIONSABFRAGE MUSS DIE TRANSPARENTFARBE BERÜCKSICHTIGT WERDEN
; DAHER HABE ICH HIER DRAWIMAGE VERWENDET!
If MouseDown(1)
For t=1 To 12
create_partikel
Next
EndIf
update_partikel
farbe=ReadPixel (MouseX(),MouseY(),BackBuffer())
Text 0,16,"Partikel "+Str(partikel_count)
fps 20

Flip
Until KeyHit(1)

;+++++++++++++++++++++++++ Functionen +++++++++++++++++++++++++++++++++

Function create_partikel()
If partikel_count=max_partikel Then Return
partikel_count=partikel_count+1
rotation=(rotation+1+Rnd(6)) Mod 180
x#=Cos(rotation)/2:y#=Sin(rotation)/2
p.partikel=New partikel
p\leben = Rnd(370,400)
p\xspeed=Rnd(-.5,.5)+x
p\yspeed=-4+y;Rnd(-2,-4)
p\r=Rnd(100,253):p\g=Rnd(100,253):p\b=Rnd(100,253)
p\x=MouseX():p\y=MouseY()
p\sub=Rnd(100)
End Function
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Function update_partikel()

LockBuffer BackBuffer()
For p.partikel=Each partikel

;+++++++++++++++hier die änderung++++++++++++++++++++
If ImageRectCollide(puffer,0,0,0, p\x, p\y, 1,1)
 
 WritePixelFast p\x,p\y,black,ImageBuffer(puffer) 
 
 ;p\yspeed = p\yspeed *-.5
EndIf
;+++++++++++++++++Ende änderung++++++++++++++++++++++
p\yspeed=p\yspeed+gravitation#
rgb=p\r*$10000 + p\g*$100 + p\b+1
p\x=p\x+p\xspeed
p\y=p\y+p\yspeed
p\leben=p\leben-1
If p\x>0 And p\x<GraphicsWidth ()-1
If p\y>0 And p\y<GraphicsHeight ()-1
If ReadPixelFast (p\x,p\y, BackBuffer())=-1 Then p\yspeed=-(p\yspeed/2)
If p\y>597 Then p\y=597:p\yspeed=-(p\yspeed/2)
WritePixelFast p\x,p\y,rgb,BackBuffer()
EndIf
EndIf
If p\leben=<0 Then Delete p.partikel:partikel_count=partikel_count-1
Next
UnlockBuffer BackBuffer()

End Function
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Function fps(posX=0,posY=0)

If lastTime < MilliSecs()
currentFrames = 1000/(MilliSecs()-lastTime)
End If
lastTime = MilliSecs()
Text posX,posY,"FPS: "+currentFrames


End Function


gruss

Silbersurfer
-------------------------------------------------------
XP 2000+ 512DDR Radeon 9800 XL 340GB HD
Hompage : http://home.arcor.de/silbersurfer01/
Is Bob engine http://home.arcor.de/silbersur.../Isbob.zip

Travis

BeitragSa, Jun 26, 2004 20:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, wahrscheinlich. Ich habe jetzt mal folgendes gemacht. Direkt vor der Kollisionsabfrage habe ich das Bild einfach kopiert. Jetzt funktioniert es so wie es soll, nur leider drückt das ziemlich auf die Performance, wenn man in jedem Schleifendurchgang den ganzen Hintergrund kopiert.

Ich werde mich mal dransetzen und nach einer besseren Lösung suchen.

Code: [AUSKLAPPEN]

Function update_partikel()

Puffer = CopyImage(puffer) ; <----- Puffer = Puffer

LockBuffer BackBuffer()
For p.partikel=Each partikel

;+++++++++++++++hier die änderung++++++++++++++++++++
If ImageRectCollide(Puffer,0,0,0, p\x, p\y, 1,1)

WritePixelFast p\x,p\y,black,ImageBuffer(puffer)
 
p\yspeed = p\yspeed *-.5
EndIf
;+++++++++++++++++Ende änderung++++++++++++++++++++++
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group