Sprung auf Balken

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

wishmaster

Betreff: Sprung auf Balken

BeitragDi, Apr 10, 2007 10:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

bin gerade am Programmieren eines Jump n Run Spieles und habe ein Problem mit dem Sprung auf einen Balken. Momentan springt die Hauptfigur durch den Balken, als ob dieser nicht existiert. Wäre dankbar, wenn mir jemand erklären könnte, was ich falsch gemacht habe.

Mfg Wishmaster

Code: [AUSKLAPPEN]
Global balken=LoadImage("Gfx\balken.bmp")
MaskImage balken,255,0,255
MidHandle balken

Type balken
Field x
Field y
End Type




Code: [AUSKLAPPEN]


Dim map (20,15)

.mapdata
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0
Data 0,0,2,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0
Data 0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0
Data 1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0


Function Zeichne_Map() ; map

Restore mapdata

 For y = 0 To 14
  For x = 0 To 19
  Read map(x,y)
   If map(x,y) = 1 Then
balken1.balken=New balken
 balken1\x=x*32
 balken1\y=y*32
    DrawImage balken, balken1\x, balken1\y
   EndIf
  Next
 Next

End Function ; ende map


[code]
Function Sprung () ; sprung

If KeyHit(57) And sprung=1 Then
chn=PlaySound(sound1)
sprung=0
For i=-30 To 30
y_figur#=y_figur#+d_y
d_y=(-0.111)*i^2+100
y_figur#=y_figur#-d_y


Zeichne_Map()
Zeichne_Figur()
Bewegung()
Schuss1()
Zaehler()
Muenze()
Gegner2()
Leben()
Gegner1()

If i=30 Then
GoDown()
EndIf


For balken1.balken=Each balken

If ImagesCollide(figur_r,x_figur,y_figur,0,balken,balken1\x,balken1\y,0) And i> 0 Then
godown = 0
sprung = 1
Exit
EndIf

If ImagesCollide(figur_l,x_figur,y_figur,0,balken,balken1\x,balken1\y,0) And i> 0 Then
godown = 0
sprung = 1
Exit
EndIf

If ImagesCollide(figur_r,x_figur,y_figur,0,balken,balken1\x,balken1\y,0) And i< 0 Then
Exit
GoDown()
EndIf

If ImagesCollide(figur_r,x_figur,y_figur,0,balken,balken1\x,balken1\y,0) And i< 0 Then
Exit
GoDown()
EndIf

Next

Flip
Cls
Next
Else

d_y=0

EndIf

End Function

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Apr 10, 2007 10:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmmm, also erstmal würde ich Dim-Felder nicht mit Types mischen. Für eine solche 2D-Map ist das alleinige nutzen von einem Dim-Feld wohl besser. Types kannst du dann später immernoch für Schüsse etc. machen.

Ich nehme an, dass später noch weitere Werte ins Data-Feld kommen? Dann kannst du das folgendermassen machen.

Code: [AUSKLAPPEN]
Dim tiles(AnzahlKachelmuster)
tiles(1)=LoadImage("Gfx\balken.bmp")
tiles(2)=LoadImage("Gfx\baum.bmp")
...
 For y = 0 To 14
  For x = 0 To 19
   If map(x,y) > 0 Then
    DrawImage tiles(map(x,y)),x,y
   EndIf
  Next
 Next

Exclamation Bisher hast du jeden Schleifendurchlaug 'Read map' zum zeichnen der Map benutzt. Dieses reicht nur einmal, dann lassen sich die Werte aus dem Dim-Feld ganz leicht auslesen.
Exclamation Wenn du Ladehandlich nicht so gern hast, so packe alle Bilder gekachelt in nur ein Bild und lade die mithilfe ql:LoadAnimImage. Dann kanst du auch alle Bilder nach Wunsch laden.
Exclamation Bei der Kollisionsabfrage lässt du nur ein kleinen Radius um den Spieler nach ImagesCollide prüfen, weil dieser Befehl sehr langsam ist.

Um dich jetzt nicht auf die Folter su spannen, hier mal zwei kleine Beispiele:

Grobe Bewegung mit Cursor Code: [AUSKLAPPEN]
;Grafik setzen
Graphics 320,320,32,2
SetBuffer BackBuffer()

;Variablen festlegen
Dim xy%(29,29)   ;Spielfeld mit 30^2 Tiles
xp%=10   ;Start-X-Position im Spielfeld
yp%=10   ;Start-Y-Position im Spielfeld

;ZufallsTiles
For y=0 To 29
 For x=0 To 29
  xy(x,y)=Rand(0,255)
 Next
Next




;Hauptroutine
While Not KeyHit(1)

 ;Tastaturabfrage
 If KeyHit(203) Then xp=xp-1:If xp<0 Then xp=0
 If KeyHit(205) Then xp=xp+1:If xp>20 Then xp=20
 If KeyHit(200) Then yp=yp-1:If yp<0 Then yp=0
 If KeyHit(208) Then yp=yp+1:If yp>20 Then yp=20

 ;Tiles
 For y=1 To 8
  For x=1 To 8
   Color xy(xp+x,yp+y),0,0
   Rect x*32,y*32,32,32,1
  Next
 Next

 Flip
Wend
End


Feine Bewegung mit der Maus Code: [AUSKLAPPEN]
;Grafik setzen
Graphics 320,320,0,2
SetBuffer BackBuffer()

;Variablen festlegen
Dim xy%(99,99)   ;Spielfeldspeicher mit 100*100 Tiles
xp#=1000   ;X-Position im Spielfeld
yp#=1000   ;Y-Position im Spielfeld
dvx%=0   ;X-Faktor für Tileverschiebung
dvy%=0   ;Y-Faktor für Tileverschiebung
tpx%=0   ;X-Faktor für Dim-Tilesprung
tpy%=0   ;Y-Faktor für Dim-Tilesprung
mx#=0   ;X-Position Maus
my#=0   ;Y-Position Maus

;Felder
For y=0 To 99
 For x=0 To 99
  If Rand(0,10)>8 Then xy(x,y)=Rand(1,6)
 Next
Next

;Rahmen
For q=0 To 99
 xy(0,q)=6
 xy(q,0)=6
 xy(99,q)=6
 xy(q,99)=6
Next




;Hauptroutine
While Not KeyHit(1)

 ;Rechne
 mx=MouseX()
 my=MouseY()
 xp=xp-(160-mx)/20
 yp=yp-(160-my)/20
 If xp<0 Then xp=0
 If yp<0 Then yp=0
 If xp>2943 Then xp=2943
 If yp>2943 Then yp=2943
 dvx=xp Mod 32
 dvy=yp Mod 32
 tpx=Floor(xp/32)
 tpy=Floor(yp/32)

 ;Tiles
 For y=0 To 8
  For x=0 To 8
   Color xy(x+tpx,y+tpy)*32,0,0
   Rect 32+x*32-dvx,32+y*32-dvy,32,32,1
  Next
 Next

 ;Info
 Color 255,255,255
 Rect 32,32,256,256,0
 Text 0,0,xp
 Text 0,16,yp
 Flip
 Cls
Wend
End
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

wishmaster

BeitragDi, Apr 10, 2007 12:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke hectic für die schnelle Antwort!

Die 2 kleinen Beispiele habe ich mal angeschaut, glaube aber nicht, dass ich so etwas in meinem Spiel brauche, da mein Spielfeld immer an der gleichen Stelle bleibt.

Den Balken habe ich ohne Types gemacht und jetzt funktioniert der Imagecollide Befehl, ausserdem läuft das Spiel wieder viel flüssiger.

Das Problem ist jetzt aber, dass die Figur den Sprung nicht genau an der Balkengrenze abbricht, sondern unterschiedlich weit in den Balken springt, bevor der Sprung abgebrochen wird.

Eigentlich wollte ich noch einen Imagecollide Befehl machen, bei dem i grösser als 0 ist( die Figur befindet sich im 2ten Teil des Sprunges) und der Balken ein bisschen weiter unten ist. Wenn es jetzt zu einer Kollision kommt, weiss der PC, dass die Figur von der Seite an den Balken springt und die Figur geht dann ohne seitliche Bewegung nach unten.

Ich habe noch Pics gemacht:

Hier sieht man was passiert, wenn man von der Seite an den Balken springt

http://www.cghost.de/mediahost/img1/1F1Pc.JPG

So sollte es eigentlich sein. Der rote Balken ist der leicht nach unten versetzte Balken:

http://www.cghost.de/mediahost/img7/2Opj6.JPG
 

Beatenvoy

BeitragMi, Apr 11, 2007 0:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Kollisionsimages?


_
| P |
---


Also die Sachen über, unter und neben "P" sind Kollisionsbilder, und wenn nun das rechte Bild eine Mauer oder der gleichen trifft dann

If Image berührt Wand then
X = X - Speed
endif


Ganz einfach, und die bildchen kannst du ja vor dem Mapzeichen Laden!

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group