Pixelweise Bewegung mit kollision

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Tanatos

Betreff: Pixelweise Bewegung mit kollision

BeitragFr, Sep 08, 2006 21:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe mich mal an der Pixel by Pixel Bewegung + kollision versucht allerdings funktioniert das ganze ein wenig sonderbar... aber schaut es euch selbst am besten mal an:

Code: [AUSKLAPPEN]

Const XMAX=640
Const YMAX=480

Const ESC=1
Const AUF=200
Const AB=208
Const LINKS=203
Const RECHTS=205
Const TILESIZE=20

Global posx=2*20
Global posy=18*20

Dim map(19,19)
Restore level
For y=0 To 19
For x=0 To 19
Read map(x,y)
Next
Next


Graphics XMAX,YMAX,0,2
SetBuffer BackBuffer()


Repeat

drawmap()
moveplayer()


Flip
Cls
Until KeyHit(ESC)
End

Function moveplayer()
If KeyDown(AUF)    And map(posx/20,posy/20-1)=0 Then posy = posy - 1
If KeyDown(AB)     And map(posx/20,posy/20+1)=0 Then posy = posy + 1
If KeyDown(LINKS)  And map(posx/20-1,posy/20)=0 Then posx = posx - 1
If KeyDown(RECHTS) And map(posx/20+1,posy/20)=0 Then posx = posx + 1

Color 125,0,0 : Oval posx,posy,TILESIZE,TILESIZE
End Function

Function drawmap()
   For y=0 To 19
   For x=0 To 19
   If map(x,y)=0 Then Color 0,0,0 : Rect x*TILESIZE,y*TILESIZE,TILESIZE,TILESIZE
   If map(x,y)=1 Then Color 255,255,255 : Rect x*TILESIZE,y*TILESIZE,TILESIZE,TILESIZE
   Next
   Next
End Function


.level
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
Data 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
Data 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
Data 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
Data 1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1
Data 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
Data 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
Data 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
Data 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
Data 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
Data 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
Data 1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1
Data 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
Data 1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
Data 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
Data 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
Data 1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1
Data 1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1


ich hoffe ich hab mich hier nicht total blöd angestellt aber mir ist auf meiner suche noch kein tutorial zur pixelweisen bewegung mit kolision begegnet welches ich komplett verstanden habe Sad

Hubsi

BeitragFr, Sep 08, 2006 22:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Function moveplayer()
u=map((posx+10)/20,posy/20)=0
d=map((posx+10)/20,(posy+20)/20)=0
l=map(posx/20,(posy+10)/20)=0
r=map((posx+20)/20,(posy+10)/20)=0
If KeyDown(AUF)    And u Then posy = posy - 1
If KeyDown(AB)     And d Then posy = posy + 1
If KeyDown(LINKS)  And l Then posx = posx - 1
If KeyDown(RECHTS) And r Then posx = posx + 1
If Not d
   tempy=posy/20
   posy=tempy*20
EndIf

Color 125,0,0 : Oval posx,posy,TILESIZE,TILESIZE
End Function

Für das "aufs Tile stellen" bei Kollision unten ist der Code mit dabei, für die anderen 3 Seiten dürftest Du keine Probleme haben es anzupassen, wenn die Mathematik und "rechnen mit Integern-Sache" klar ist Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...
 

Tanatos

BeitragSa, Sep 09, 2006 10:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank für die schnelle Antwort, aber leider hab ich das Gefühl, dass die Sache mit der Intergerrechnung doch nicht so klar ist. Embarassed
Mathematik war schon immer mein Problem, irgendwie brauch ich dabei immer ein bischen länger.
Ich würd mich riesig freuen wenn sich jemand die Zeit nehmen könnte und mir die Sache mal ausführlich erklärt. Very Happy
Code: [AUSKLAPPEN]
u=map((posx+10)/20,posy/20)=0
d=map((posx+10)/20,(posy+20)/20)=0
l=map(posx/20,(posy+10)/20)=0
r=map((posx+20)/20,(posy+10)/20)=0

Dass durch die Tilesize-Größe geteilt werden muss hab ich ja verstanden aber die restliche Rechnung ist mir noch ein wenig zu hoch.
Was mir auch Kopfzerbrechen bereitet ist dieser Teil:
Code: [AUSKLAPPEN]
If Not d
   tempy=posy/20
   posy=tempy*20
EndIf

Wenn ich zuerst durch 20 dividiere und anschließend wieder mit 20 multipliziere kommt doch wieder der Anfangswert raus oder hab ich mich da vertan?

Hubsi

BeitragSa, Sep 09, 2006 12:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Wenn ich zuerst durch 20 dividiere und anschließend...

Theoretisch ja, der Gadankengang ist nicht so verkehrt. Nur ist für den Computer eine Zahl nicht dasselbe wie für Dich Very Happy Der treue Diener unterscheidet hier zwischen Float (Kommazahl) ind Integer (Ganzzahl) und in Blitz ist eine Variable standardmäßig Integer, was ich mir in dem Fetzen Code zu nutzen machte:
Code: [AUSKLAPPEN]
; Für posy nehme ich den Wert 128 an:
tempy=posy/20 ; tempy=128/20 == 6.4 -> rundet Blitz zu 6
posy=tempy*20 ; posy=6*20 == 120 -> Position genau über dem Tile


Das addieren der halben Spielergröße zur X bzw. Y-Position hat einzig den Zweck die Kollision in der Mitte der Spielfigur zu haben (der Bezugspunkt der Grafik ist ja oben links). Das addieren der ganzen Spielergröße wird benötigt wenn die Kollision an den "Füssen" oder rechts der Figur rauskommen soll, weil ja, wie schon gesagt, der Bezugspunkt der Grafik oben links ist Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group