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

SilbersurferBetreff: 2D Partikel Test mit Gavitation und Abprall (FRAGE dazu) |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() Wäre über tipps sehr froh ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
hmm also darauf wäre ich nicht gekommen ich habe wie du ja sehen
kannst anhand des readpixelfast auf collision geprüft ![]() 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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() Laut Hilfe ist das aber doch nicht möglich ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() 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" ![]() |
||
www.funforge.org
Ich hasse WASD-Steuerung. Man kann alles sagen, man muss es nur vernünftig begründen können. |
Silbersurfer |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group