Aufprall bei Jump'n'Run

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

joachim_neu

Betreff: Aufprall bei Jump'n'Run

BeitragFr, Mai 06, 2005 15:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

ich baue gerade nen jump'n'run. bin grad bei schwerkraft und wiederstand des bodens. bei meinem code landet die figur aber eintweder etwas IM boden oder etwas ÜBERM boden. vielleicht könnte mir jemand helfen, was an meinen formeln nicht simmt. die figur ist 64x64 groß, die tiles 32x32. hier ist mein ganzer code. die wichtigen stellen markiere ich mal.

BlitzBasic: [AUSKLAPPEN]

AppTitle \"EnterPC\"
Graphics 800,600,0,0
SetBuffer BackBuffer()

;erstellen der variablen
.var
Dim level(63,255,1) ;der erste wert ist X, der zweite Y. Hier werden die tiles gespeichert.
;beim dritten wert: 0 = tilenummer; 1 = durchgehbar oder nicht
Dim def(31) ;hier werden für die tiles gespeichert, ob sie durchgehbar sind oder nicht
Global levelX
Global levelY
Global leveltilename$
Global leveldefname$
Global levelsfxname$
Global levelsound
Global leveltile
Global leveldef
Global leveltilenumber
Global levelbg
Global levelbgname$
Global cardX
Global cardY
Global virusX = 368
Global virusY = 268
Global virusanim
Global virus_v
Global virus_r
Global virusrichtung
Global speedX#
Global speedY#
Global timer
Global sprung
Global oldvirusrichtung = 1

;laden
.laden
timer = CreateTimer(50)
virus_v = LoadAnimImage(\"gfx/virus_v.png\",64,64,0,4)
virus_r = LoadAnimImage(\"gfx/virus_r.png\",64,64,0,4)
virusanim = 0
load_level(\"1.level\")

;menü
.menue

Repeat
Cls

;<======================= wichtig ab hier!
;wiederstand unten machen
If (level((virusX - cardX)/32,(virusY + 64 - cardY)/32,1) = 0) Or (level((virusX + 32 - cardX)/32,(virusY + 64 - cardY)/32,1) = 0) Or (level((virusX + 64 - cardX)/32,(virusY + 64 - cardY)/32,1) = 0) Then
speedY = 0
sprung = 0
EndIf

;wiederstand oben machen
;wiederstand unten machen
If (level((virusX - cardX)/32,(virusY - cardY)/32,1) = 0) Or (level((virusX + 32 - cardX)/32,(virusY - cardY)/32,1) = 0) Or (level((virusX - cardX)/32,(virusY - cardY)/32,1) = 0) Then
speedY = 0
EndIf

;schwerkraft machen
If (level((virusX - cardX)/32,(virusY + 64 - cardY)/32,1) = 1) And (level((virusX + 32 - cardX)/32,(virusY + 64 - cardY)/32,1) = 1) And (level((virusX + 64 - cardX)/32,(virusY + 64 - cardY)/32,1) = 1) Then
speedY = speedY + 0.2
sprung = 1
EndIf

;reaktion berechnen
virusrichtung = 0
If KeyDown(203) Then virusrichtung = 2 : oldvirusrichtung = 2
If KeyDown(205) Then virusrichtung = 1 : oldvirusrichtung = 1
If KeyDown(203) And virusrichtung = 2 Then cardX = cardX + 4
If KeyDown(205) And virusrichtung = 1 Then cardX = cardX - 4
If KeyDown(200) And sprung = 0 Then speedY = -7.4 : sprung = 1

;einwirkunden von sprung usw.
cardX = cardX - speedX
cardY = cardY - speedY

;<===================== wichtig bis hier!

;tot
If virusY - cardY > (levelY - 2) * 32 Then Goto tot

Text 0,0,(virusY - cardY)

;zeichnen
DrawImage levelbg,0,0
For I = 0 To levelY - 1
For J = 0 To levelX - 1
DrawImage leveltile,32*J+cardX,32*I+cardY,level(J,I,0)
Next
Next
If virusrichtung = 1 Then DrawImage virus_v,virusX,virusY,virusanim / 10
If virusrichtung = 2 Then DrawImage virus_r,virusX,virusY,virusanim / 10
If virusrichtung = 0 And oldvirusrichtung = 1 Then DrawImage virus_v,virusX,virusY,0
If virusrichtung = 0 And oldvirusrichtung = 2 Then DrawImage virus_r,virusX,virusY,0
virusanim = virusanim + 1
If virusanim = 40 Then virusanim = 0


WaitTimer timer
Flip
Until KeyDown(1)

End

;tod
.tot
End

;funktionen
.funktion
Function load_level(dateiname$)
tempfile = OpenFile(\"level/\" + dateiname$)
If tempfile = 0 Then RuntimeError \"Level konnte nicht geladen werden!\"
leveltilename = ReadLine(tempfile)
leveldefname = ReadLine(tempfile)
levelsfxname = ReadLine(tempfile)
levelbgname = ReadLine(tempfile)
levelX = ReadLine(tempfile)
levelY = ReadLine(tempfile)
levelbg = LoadImage(\"gfx/\" + levelbgname)
If levelbg = 0 Then RuntimeError \"Hintergrund konnte nicht geladen werden!\"
leveldef = OpenFile(\"gfx/\" + leveldefname)
If leveldef = 0 Then RuntimeError \"Tiledefinitionsdatei konnte nicht geladen werden!\"
leveltilenumber = ReadLine(leveldef)
For I = 0 To leveltilenumber - 1
def(I) = ReadByte(leveldef) - 48
Next
levelsound = LoadSound(\"sfx/\" + levelsfxname$)
If levelsound = 0 Then RuntimeError \"Sound konnte nicht geladen werden!\"
leveltile = LoadAnimImage(\"gfx/\" + leveltilename$,32,32,0,leveltilenumber)
If leveltile = 0 Then RuntimeError \"Tileset konnte nicht geladen werden!\"
For I = 0 To levelY - 1
For J = 0 To levelX - 1
level(J,I,0) = ReadByte(tempfile) - 48
level(J,I,1) = def(level(J,I,0))
Next
ReadByte(tempfile)
ReadByte(tempfile)
Next
End Function


wie gesagt, das wichtige ist markiert, aber zur vorständigkeit mal alles...
danke für hilfe,

J!N
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

Mr.Keks

BeitragFr, Mai 06, 2005 16:21
Antworten mit Zitat
Benutzer-Profile anzeigen
versuch mal, bei einer kollision nicht nur den speed auf null zu setzen, sondern auch die position an die kante anzupassen. lässt sich ja eigentlich errechnen.

es heißt übrigens "widerstand" Wink
MrKeks.net

joachim_neu

BeitragFr, Mai 06, 2005 18:27
Antworten mit Zitat
Benutzer-Profile anzeigen
geht auch nicht...
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

Hubsi

BeitragFr, Mai 06, 2005 19:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Was bisher immer funktioniert hat:BlitzBasic: [AUSKLAPPEN]
temp=player_y/32
player_y=temp*32
Versuchs mal Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

joachim_neu

BeitragFr, Mai 06, 2005 20:13
Antworten mit Zitat
Benutzer-Profile anzeigen
so kann ich nimmer springen...
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

joachim_neu

BeitragFr, Mai 06, 2005 21:54
Antworten mit Zitat
Benutzer-Profile anzeigen
*g* und er macht dann bei dem wert -1 in cardY am ende daraus -32 => viel zu schneller fall!
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

Hubsi

BeitragFr, Mai 06, 2005 21:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Das darf natürlich nur berechnet werden wenn sich die Figur in y-Richtung nicht bewegt Wink Sprich wenn sie nicht springt oder fällt. Nur dann ist im normalen bugfreien Zustand gegeben das sie auf einem Tile steht Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

joachim_neu

BeitragFr, Mai 06, 2005 22:07
Antworten mit Zitat
Benutzer-Profile anzeigen
aso...
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

joachim_neu

BeitragFr, Mai 06, 2005 22:09
Antworten mit Zitat
Benutzer-Profile anzeigen
geht auch nicht:

BlitzBasic: [AUSKLAPPEN]

;richtigstellen
If sprung = 0 Then
tempY = cardY / 32
cardY = tempY * 32
EndIf
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

Hubsi

BeitragFr, Mai 06, 2005 22:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Gut möglich das ich mich irre, aber die Koordinaten des Spielers (oder Virus?) werden in virusx, bzw. speziell in virusy gespeichert? Nicht in cardy? Wenn doch andersrum bin ich mit meiner Weisheit am Ende Mr. Green
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

joachim_neu

BeitragSa, Mai 07, 2005 0:17
Antworten mit Zitat
Benutzer-Profile anzeigen
jo, aber virusX und virusY sind immer gleich. die geben den abstand zum bildschirmeckchen an. cardX und Y auch, also muss ich die verändern, damit der virus richtig steht...
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

Ctuchik

BeitragSa, Mai 07, 2005 11:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Also cardY ist die y-Position des Spielers?
Dann würd ich dann wenn er mit dem Boden kollidiert machen:
Code: [AUSKLAPPEN]
cardY = Int(cardY/32.0) * 32

Das sollte gehen!
Wenn nicht dann lad mal die restlichen Dateien hoch, damit ich das selbst mal testen kann!

MfG Ctuchik
Zu den Nebenwirkungen gehören trockener Mund, Übelkeit, Erbrechen, Harnstau, schmerzhafter rektaler Juckreiz, Halluzinationen, Demenz, Psychose, Koma, Tod und Mundgeruch!
Magie eignet sich nicht für alle!
Fraget euren Arzt oder Apotheker!

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group