Pixel Kollision

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Raiden93

Betreff: Pixel Kollision

BeitragDo, Jan 06, 2011 23:58
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Xeres

Moderator

BeitragFr, Jan 07, 2011 0:05
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Raiden93

BeitragFr, Jan 07, 2011 0:28
Antworten mit Zitat
Benutzer-Profile anzeigen
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
   

Xeres

Moderator

BeitragFr, Jan 07, 2011 0:36
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Raiden93

BeitragFr, Jan 07, 2011 1:12
Antworten mit Zitat
Benutzer-Profile anzeigen
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
   

Xeres

Moderator

BeitragFr, Jan 07, 2011 1:20
Antworten mit Zitat
Benutzer-Profile anzeigen
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
map(x,y)\Speed = ...


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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Raiden93

BeitragFr, Jan 07, 2011 1:42
Antworten mit Zitat
Benutzer-Profile anzeigen
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
   

Xeres

Moderator

BeitragFr, Jan 07, 2011 1:49
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Objekt.
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Raiden93

BeitragFr, Jan 07, 2011 2:10
Antworten mit Zitat
Benutzer-Profile anzeigen
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
   

Xeres

Moderator

BeitragFr, Jan 07, 2011 2:24
Antworten mit Zitat
Benutzer-Profile anzeigen
"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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Raiden93

BeitragFr, Jan 07, 2011 8:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann kann ich also bei:
Code: [AUSKLAPPEN]
Type Erdetyp
   Field X#,Y#,Speed#
End Type


Die X# und Y# Koordinaten weg lasse?

Xeres

Moderator

BeitragFr, Jan 07, 2011 13:47
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Raiden93

BeitragFr, Jan 07, 2011 14:17
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group