Pixel Kollision
Übersicht

![]() |
Raiden93Betreff: Pixel Kollision |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hey,
ich wollte eine kleine Pixel Engine erstellen. Mit MouseDown (1) wird Erde erstellt (in Pixeln). Die Erde soll mit anderen Erd pixeln Kollidieren können. Doch leider weis ich nicht wie ich das anstelle. Hier ist mein Code: [OHNE IMAGES,Sounds......... nutzbar] Code: [AUSKLAPPEN] Type ErdeTyp
Field X#,Y#,Speed# End Type Global Erde.ErdeTyp AppTitle "Pixel Engine" Graphics 800,600,32,2 SetBuffer BackBuffer() Global FPS_Timer = CreateTimer(60) SeedRnd MilliSecs() Global Modus = 1 Repeat Cls Boden_Function() Erde_Function() Flip 0 WaitTimer(FPS_Timer) Until KeyHit(1) Function Boden_Function() Color 255,255,255 Line 0,500,800,500 End Function Function Erde_Function() ;Erstellung der Erde Select Modus Case 1 If MouseDown(1) Erde.ErdeTyp = New ErdeTyp Erde\X = MouseX() Erde\Y = MouseY() Erde\Speed = Rnd(5,7) End If End Select For Erde.ErdeTyp = Each ErdeTyp ;Zeichnen der Erde Color 255,255,0 Plot Erde\X,Erde\Y ;Gravity der Erde Erde\Y = Erde\Y +Erde\Speed Next End Function |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nur Types sind dafür denkbar ungeeignet - viel zu langsam für diese Anwendung. Denk dir lieber eine Tilemap mit 1px großen Tiles - dann kannst du die Umgebung leicht untersuchen, z.B. ob darunter frei ist, oder ein anderes Teilchen.
Für diverse Eigenschaften, kombiniere Array und Types. |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Raiden93 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich habe es nun wie folgt gemacht, doch es wird mir immer de Fehler "Out of Data" bekannt gegeben. Ich denke mal das liegt daran das ich dieses Dim Feld nicht gemacht habe, was aber sonst daszu führen würde das ich ein Dim Feld in der Größe von 300x300 machen müsste.Gibt es eine Alternative dafür?
Code: [AUSKLAPPEN] Type Erdetyp
Field X#,Y#,Speed# End Type Global Erde.Erdetyp AppTitle "Pixel Engine" Graphics 800,600,32,2 SetBuffer BackBuffer() Global FPS_Timer = CreateTimer(60) SeedRnd MilliSecs() ;Daten Laden Global GFX_Erde = LoadImage("gfx/Erde.png") ;Variablen ;Cache Variablen Global MapX Global MapY Dim map(300,300) For MapX=0 To 300 For MapY=0 To 300 Read map(MapX,MapY) Next Next Repeat Cls Boden_Function() Erde_Function() Rect 0,0,301,301,0 Flip 0 WaitTimer(FPS_Timer) Until KeyHit(1) Function Boden_Function() Color 255,255,255 Line 0,250,300,250 End Function Function Erde_Function() ;Erstellung der Erde If KeyDown(1) For MapX=0 To 300 For MapY=0 To 300 Erde.Erdetyp = New Erdetyp Erde\X = MouseX() Erde\Y = MouseY() Erde\Speed = Rnd(1,3) Next Next End If ;Zeichnen der Erde DrawImage GFX_Erde,Erde\X,Erde\Y-Erde\Speed ;Gravity der Erde End Function |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja, wenn du kein Daten hast, kannst du auch keine Einlesen.
Aber warum solltest du das auch wollen? Du startest dann halt mit einem leeren Array. Viel wichtiger ist: Warum ein Integer Array? Ich hätte daran gedacht: BlitzBasic: [AUSKLAPPEN] Dim map.Erdetyp(300,300) Die doppelte Schleife in der Erde_Function() ist in keiner Weise nötig. |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Raiden93 |
![]() Antworten mit Zitat ![]() |
---|---|---|
habe es nun so gemacht aber wie spreche ich jetzt die einzelnen Pixel an?
Z.b um festzustellen ob unter einem pixel fester Boden ist? Code: [AUSKLAPPEN] Type Erdetyp
Field X#,Y#,Speed# End Type Global Erde.Erdetyp AppTitle "Pixel Engine" Graphics 800,600,32,2 SetBuffer BackBuffer() Global FPS_Timer = CreateTimer(60) SeedRnd MilliSecs() ;Daten Laden Global GFX_Erde = LoadImage("gfx/Erde.png") ;Variablen ;Cache Variablen Global MapX Global MapY Dim map.Erdetyp(300,300) Repeat Cls Boden_Function() Erde_Function() ;Zeichnet den Rand Rect 0,0,301,301,0 Flip 0 WaitTimer(FPS_Timer) Until KeyHit(1) Function Boden_Function() Color 255,255,255 Line 0,250,300,250 End Function Function Erde_Function() ;Erstellung der Erde If MouseDown(1) Erde.Erdetyp = New Erdetyp Erde\X = MouseX() Erde\Y = MouseY() Erde\Speed = Rnd(1,3) End If For Erde.Erdetyp = Each Erdetyp ;Zeichnen der Erde DrawImage GFX_Erde,Erde\X,Erde\Y ;Gravity der Erde Erde\Y = Erde\Y +Erde\Speed Next End Function |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Zum fallen der Pixel...
Pseudo Code: [AUSKLAPPEN] Y durchiterieren, von unten nach oben
X durchiterieren Wenn an Position X, Y+1 nichts liegt: dort hin Bewegen ggf. mit Beschleunigung Umsetzen wenn du das geschafft hast. Wenn nötig auf Null-Objekte und Array grenzen aufpassen. Und wegen ansprechen: BlitzBasic: [AUSKLAPPEN] map(x,y)\MeinTypeFeld Edit: in deinem Code musst du beim erstellen den Type-Eintrag natürlich noch mit dem richtigen Platz im Array verbinden... |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Raiden93 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wie meinst du das mit dem erstellen noch richtig im Array verbinden?
Habe bei der Gravity der Erde es jetzt eigentlich meiner Meinung nach richtig ergänzt, dennoch wird mir ein Fehler angezeigt"Illegal Type Convert" bei If map.Erdetyp(Erde\X,Erde\Y+1) = 0 Code: [AUSKLAPPEN] Type Erdetyp
Field X#,Y#,Speed# End Type Global Erde.Erdetyp AppTitle "Pixel Engine" Graphics 800,600,32,2 SetBuffer BackBuffer() Global FPS_Timer = CreateTimer(60) SeedRnd MilliSecs() ;Daten Laden Global GFX_Erde = LoadImage("gfx/Erde.png") ;Variablen ;Cache Variablen Dim map.Erdetyp(300,300) Repeat Cls Boden_Function() Erde_Function() ;Zeichnet den Rand Rect 0,0,301,301,0 Flip 0 WaitTimer(FPS_Timer) Until KeyHit(1) Function Boden_Function() Color 255,255,255 Line 0,250,300,250 End Function Function Erde_Function() ;Erstellung der Erde If MouseDown(1) Erde.Erdetyp = New Erdetyp Erde\X = MouseX() Erde\Y = MouseY() Erde\Speed = Rnd(1,3) End If For Erde.Erdetyp = Each Erdetyp ;Zeichnen der Erde DrawImage GFX_Erde,Erde\X,Erde\Y ;Gravity der Erde If map.Erdetyp(Erde\X,Erde\Y+1) = 0 Erde\Y = Erde\Y +Erde\Speed End If Next End Function |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
a) Wo wird denn das Array überhaupt benutzt? Etwa so geht's:
Code: [AUSKLAPPEN] map(mx, my) = New Erdetyp
map(mx, my)\Speed = Rnd(1,3) Jetzt ist an der Position mx,my im Array der richtige Type-Eintrag zu finden. b) Du arbeitest mit Types, nicht mit einem Integer Array! Code: [AUSKLAPPEN] If map.Erdetyp(X,Y) <> Null Then
map.Erdetyp(X,Y)\Speed = map.Erdetyp(X,Y)\Speed +1 End If Null (0) ist kein Null ![]() |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Raiden93 |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich habe bei der Erstellung noch die Variablen X und Y der MouseX und MouseY zugewiesen jetzt zeichnet er zwar die Pixel aber es fallen keine Pixel.
Code: [AUSKLAPPEN] Type Erdetyp
Field X#,Y#,Speed# End Type Global Erde.Erdetyp AppTitle "Pixel Engine" Graphics 800,600,32,2 SetBuffer BackBuffer() Global FPS_Timer = CreateTimer(60) SeedRnd MilliSecs() ;Daten Laden Global GFX_Erde = LoadImage("gfx/Erde.png") ;Variablen Global mx Global my ;Cache Variablen Dim map.Erdetyp(300,300) Repeat Cls Boden_Function() Erde_Function() ;Zeichnet den Rand Rect 0,0,301,301,0 Flip 0 WaitTimer(FPS_Timer) Until KeyHit(1) Function Boden_Function() Color 255,255,255 Line 0,250,300,250 End Function Function Erde_Function() ;Erstellung der Erde If MouseDown(1) map.Erdetyp(mx, my) = New Erdetyp map.Erdetyp(mx, my)\X = MouseX() map.Erdetyp(mx, my)\Y = MouseY() map.Erdetyp(mx, my)\Speed = Rnd(1,3) End If For Erde.Erdetyp = Each Erdetyp ;Zeichnen der Erde DrawImage GFX_Erde,Erde\X,Erde\Y ;Gravity der Erde If map.Erdetyp(mx,my) <> Null Then map.Erdetyp(mx,my)\Speed = map.Erdetyp(mx,my)\Speed +1 End If Next End Function |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
"mx" und "my" stehen üblicherweise für MouseX() und MouseY() die am Anfang der Hauptschleife zugewiesen werden, genauso wie für Maustastsendrücke mh1 (oder ähnliches) verwendet wird...
Code: [AUSKLAPPEN] Repeat
Cls mx = MouseX() my = MouseY() mh1 = MouseHit(1) Ja, du gibst dem Type X und Y Werte, nein, das hilft in keiner Weise. Verwende die Array-Koordinaten (der nutzen des Arrays ist ja eben der, dass man den Nachbarn schnell und sicher ansprechen kann...). Setzte denn Pseudo Code von weiter oben um, anstatt blind meine Codeschnippsel zu kopieren - natürlich kann da so nichts passieren. Das bekommst du schon noch hin, vielleicht nach einer Mütze Schlaf. |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Raiden93 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Dann kann ich also bei:
Code: [AUSKLAPPEN] Type Erdetyp
Field X#,Y#,Speed# End Type Die X# und Y# Koordinaten weg lasse? |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Absolut, ja! Stattdessen benutzte die Fields für die Eigenschaften der Materie (ich nehme mal an, dass du zumindest Erde/Wasser umsetzen möchtest ähnlich powder game oder auch The Powder Toy). | ||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Raiden93 |
![]() Antworten mit Zitat ![]() |
---|---|---|
naja klingt zwar gut aber ich wollte eigentlich nur Erde haben, da ich nur wissen will wie dieses Poweder game aufgebaut ist und für mich ein kleinen Erfolg habe.
EDIT: Ich habe es nun so gemacht, dennoch scheinen keinerlei Erdpartikel zu Spawnen: Code: [AUSKLAPPEN] Type Erdetyp
Field Speed# End Type Global Erde.Erdetyp AppTitle "Pixel Engine" Graphics 800,600,32,2 SetBuffer BackBuffer() Global FPS_Timer = CreateTimer(60) SeedRnd MilliSecs() ;Daten Laden Global GFX_Erde = LoadImage("gfx/Erde.png") ;Variablen Global mx Global my Global mh1 ;Cache Variablen Dim map.Erdetyp(300,300) Repeat Cls mx = MouseX() my = MouseY() mh1 = MouseHit(1) Boden_Function() Erde_Function() ;Zeichnet den Rand Rect 0,0,301,301,0 Flip 0 WaitTimer(FPS_Timer) Until KeyHit(1) Function Boden_Function() Color 255,255,255 Line 0,250,300,250 End Function Function Erde_Function() ;Erstellung der Erde If MouseDown(1) map.Erdetyp(mx, my) = New Erdetyp map.Erdetyp(mx, my)\Speed = Rnd(1,3) End If For Erde.Erdetyp = Each Erdetyp ;Zeichnen der Erde DrawImage GFX_Erde,mx,my ;Gravity der Erde If map.Erdetyp(mx,my) <> Null Then map.Erdetyp(mx,my)\Speed = map.Erdetyp(mx,my)\Speed +1 End If Next End Function |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group