Seite 1 von 2
Sprung eines Sprites simulieren
Verfasst: 03.04.2010 12:22
von Marvin133
Ich hatte schon ein mal ein thema aufgemacht wo dies besprochen wurde nur leider wurde das gelöscht und ich habe vergessen wie das geht falls jemand eine lösung dazu hat bitte posten ich habe es verscuht mir ner forschleife aber leider ist mir das nicht richtig gelungen
.
es soll so sein das das sprite für eine gewisse zeit um eine bestimmte zahl an pixeln nach oben verschoben werden soll und wenn sich nach links oder rwechts beweg im sinus kurve nach unten wieder fallen soll.
Mit freundlichen grüßen Marvin133
Re: Sprung eines sprites simulieren
Verfasst: 03.04.2010 13:02
von Kaeru Gaman
Marvin133 hat geschrieben:Ich hatte schon ein mal ein thema aufgemacht wo dies besprochen wurde nur leider wurde das gelöscht
du wurdest x-mal aufgefordert, den Titel auf einen
Sinnvollen zu ändern, was dir dann schließlich ein Admin abgenommen hat.
http://www.purebasic.fr/german/viewtopi ... 67#p268767
also erstmal deine eigenen Postings durchsuchen, so viele sind das schließlich nicht, bevor du irgendwelche Behauptungen aufstellst.
Re: Sprung eines sprites simulieren
Verfasst: 03.04.2010 22:01
von Marvin133
Sorry für die Beschuldigung.
und dnkae das du mirr den link zu topic gegeben hast.
nun habe ich aber ein weiteres probelem ich will dass wenn das sprite ein andrese überlabt dann da drüber stehen bleibt,also wenn ich zum beispiel auf einen stein springen und dann oben auf dem stein stehen bleibe.
Code: Alles auswählen
InitSprite()
InitKeyboard()
InitSound()
;Variables
activate=1
Global player_x.f = 100 , player_y.f = 500
#JumpSpeed = 50 : #JumpHeight = 200
Structure ground
x.i
y.i
img.i
EndStructure
Dim tiles.ground(32,32)
tiles(0,0)\x = 100
tiles(0,0)\y = 400
tiles(0,0)\img = 1
;Window
OpenWindow(0,100,100,1024,768,"Basic")
OpenWindowedScreen(WindowID(0),0,0,1024,768,0,0,0)
;Image
CreateSprite(0, 50, 50)
StartDrawing(SpriteOutput(0))
Box(0,0,50,50,0)
StopDrawing()
;Load
LoadSound(1,"flag.wav")
LoadSprite(1,"gfx\stone.bmp",0)
;Main Loop
While activate=1
ExamineKeyboard()
ClearScreen(RGB(255,255,255))
If Jump : Jump - 1 : EndIf
DisplaySprite( 0, player_x, player_y-Sin(Jump*#PI/#JumpSpeed)*#JumpHeight)
DisplaySprite( 1, tiles(0,0)\x, tiles(0,0)\y)
FlipBuffers()
If KeyboardReleased(#PB_Key_Space) And Not Jump : Jump = #JumpSpeed : PlaySound(1) : EndIf
If KeyboardPushed(#PB_Key_Left)
player_x=player_x-5
If player_x<0
player_x=1020
EndIf
EndIf
If KeyboardPushed(#PB_Key_Right)
player_x=player_x+5
If player_x>1024
player_x=0
EndIf
EndIf
If SpritePixelCollision( 0, player_x, player_y, img, tiles(0,0)\x, tiles(0,0)\y) =1
player_y=tiles(0,0)\y-50
EndIf
If KeyboardReleased(#PB_Key_Escape)
activate=0
End
EndIf
Wend
Re: Sprung eines sprites simulieren
Verfasst: 03.04.2010 22:33
von Kaeru Gaman
konzipiere komplett um!
deine statischen Objekte müssen in einer Tilemap stehen, auf die kannst du deine Spielfigur oben aufsitzen lassen.
eine Tilemap kann halbwegs dynamisch sein, also wie z.b. die Felsen in "Boulder Dash"...
nur wirklich dynamische Objekte, also schnelle Gegner, sind über dieser Tilemap, und denen wirst du kaum auf dem Kopf stehen wollen.
schaffe dir mehr Basiswissen über dieses Genre.
es sind schon eine Menge Grundlösungen gepostet worden im Laufe der Jahre.
lies vielleicht auch mal ein Buch oder ein Tutrial im Netz.
häng dich dabei an den Algorithmen auf.
wenn du sie verstehst bist du nicht auf die C-Beispiele angewiesen sondern kannst es direkt in PB selber umsetzen.
wenn du sie nicht verstehst, solltest du sowieso deine Ansprüche runterschrauben.
PB ist zwar sehr Game-freundlich, aber ist kein Game-Maker.
Re: Sprung eines sprites simulieren
Verfasst: 04.04.2010 15:14
von Marvin133
irgendwie klappt es dennoch nicht
Code: Alles auswählen
InitSprite()
InitKeyboard()
InitSound()
;Variables
activate=1
Global player_x.f = 100 , player_y.f = 650
#JumpSpeed = 50 : #JumpHeight = 200
Dim Map(100,100)
For n = 0 To 100
For t = 0 To 100
Map(n,t) = 1
Next
Next
;Window
OpenWindow(0,100,100,1024,768,"Basic")
OpenWindowedScreen(WindowID(0),0,0,1024,768,0,0,0)
;Load
LoadSound(1,"sfx\flag.wav")
LoadSprite(1,"gfx\player.bmp",0)
LoadSprite(2,"gfx\stone.bmp",0)
;Create
TransparentSpriteColor(1,$FFFFFF)
;Main Loop
While activate=1
ExamineKeyboard()
ClearScreen(RGB(150,0,255))
For SY=0 To 30
For SX = 0 To 20
DisplaySprite(2, 16*SX - FineX , 16*SY - FineY )
Next
Next
If Jump : Jump - 1 : EndIf
DisplaySprite( 1, player_x, player_y-Sin(Jump*#PI/#JumpSpeed)*#JumpHeight)
FlipBuffers()
If KeyboardReleased(#PB_Key_Space) And Not Jump : Jump = #JumpSpeed : PlaySound(1) : EndIf
If KeyboardPushed(#PB_Key_Left)
player_x=player_x-5
If player_x<0
player_x=1020
EndIf
EndIf
If KeyboardPushed(#PB_Key_Right)
player_x=player_x+5
If player_x>1024
player_x=0
EndIf
EndIf
If SpriteCollision(1,2,2,2,2,2)=1
player_y=player_y-10
EndIf
If KeyboardReleased(#PB_Key_Escape)
activate=0
End
EndIf
Wend
Re: Sprung eines sprites simulieren
Verfasst: 04.04.2010 17:59
von Marvin133
ich habe jetz schon vieles versucht aber immer missglückt es mit tile map habe ich jetzt aber schon ,nur mit einem stein erst mal zu m testen
Code: Alles auswählen
InitSprite()
InitKeyboard()
InitSound()
InitMovie()
;Variables
activate=1
Structure tile
x.i
y.i
EndStructure
Global player_x.f = 100 , player_y.f = 650
#JumpSpeed = 50 : #JumpHeight = 200
Dim tiles.tile(100)
Dim value.s(10)
OpenFile(0,"Data\level.txt")
FileSeek(0,0)
value.s(0) = ReadString(0)
FileSeek(0,4)
value.s(1) = ReadString(0)
CloseFile(0)
tiles(0)\x= Val(value.s(0))
tiles(0)\y= Val(value.s(1))
;Window
OpenWindow(0,100,100,1024,768,"Basic")
OpenWindowedScreen(WindowID(0),0,0,1024,768,0,0,0)
;Load
LoadSound(1,"sfx\flag.wav")
LoadSprite(1,"gfx\player.bmp",0)
LoadSprite(2,"gfx\stone.bmp",0)
;Create
TransparentSpriteColor(2,$FFFFFF)
;Main Loop
While activate=1
ExamineKeyboard()
ClearScreen(RGB(150,0,255))
SetFrameRate(60)
DisplaySprite( 2, tiles(0)\x , tiles(0)\y )
DisplaySprite( 1, player_x, player_y-Sin(Jump*#PI/#JumpSpeed)*#JumpHeight)
FlipBuffers()
If Jump : Jump - 1 : EndIf
If KeyboardReleased(#PB_Key_Space) And Not Jump : Jump = #JumpSpeed : PlaySound(1) : EndIf
If KeyboardPushed(#PB_Key_Left)
player_x=player_x-5
If player_x<0
player_x=1020
EndIf
EndIf
If KeyboardPushed(#PB_Key_Right)
player_x=player_x+5
If player_x>1024
player_x=0
EndIf
EndIf
If KeyboardReleased(#PB_Key_Escape)
activate=0
End
EndIf
Wend
ich hogffe ihr könnt den fehle endecken
Re: Sprung eines sprites simulieren
Verfasst: 05.04.2010 15:05
von kswb73
Ich hab dir mal ein kompettes Beispiel geschreiben. (Sowohl für Tilemap, als auch fürs Springen). Dabei verwende ich eine andere Formel für den Sprung (Sei mir jetzt nicht böse STARGÅTE). Am besten einfach mal ein paar Werte verändern und Teile auskommentieren um zu sehen was genau sie bewirken.
Code: Alles auswählen
;Für dieses Beispiel brauche ich Bilder (Sprites)
;und die Tastatur (Keybard)
InitSprite()
InitKeyboard()
;Procedure zum prüfen ob zwei Rechtecke kollidieren
Procedure BoxKolli(X1,Y1,W1,H1, X2,Y2,W2,H2)
If X1<X2+W2 And X1+W1>X2
If Y1<Y2+H2 And Y1+H1>Y2
ProcedureReturn 1
EndIf
EndIf
ProcedureReturn 0
EndProcedure
;Wer erstellen erstmal eine Karte
;So brauchen wir übringends keine extra Dateien
#W=10
#H=10
#TileW=64;Breite eines Tiles
#TileH=64;Höhe eines Tiles
#PlayerW=64;Breite des Spielers
#PlayerH=64;Höhe des Spielers
Dim Feld(#W,#H)
For a=0 To 10
Feld(a,10)=1
Next a
For a=5 To 10
Feld(a,6)=1
Next a
Feld(8,9)=1
;Wir öffnen ein Vollbild mit der Auflösung des Desktops
ExamineDesktops()
OpenScreen(DesktopWidth(0),DesktopHeight(0),DesktopDepth(0),"Jump and Run - Test")
;Jetzt brauchen wir noch ein paar Grafiken
CreateSprite(0,#PlayerW,#PlayerH)
StartDrawing(SpriteOutput(0))
Box(0,0,#PlayerW,#PlayerH,RGB(0,0,255))
StopDrawing()
CreateSprite(1,#TileW,#TileH)
StartDrawing(SpriteOutput(1))
Box(0,0,#TileW,#TileH,RGB(128,128,128))
StopDrawing()
;Die Variabeln für den Spieler
Define.l PlayerX,PlayerY;Position
Define.f MoveX,MoveY;Bewegung für den aktuellen Frame
Define.b OnGround;Ist der Spieler auf dem Boden?
Repeat
If IsScreenActive()
ClearScreen(0)
ExamineKeyboard()
;Beenden
If KeyboardPushed(#PB_Key_Escape)
End
EndIf
MoveX=0;Mann könnte auch *0.9 oder so schreiben.
;Dann würde der Spieler rutschen
;Jetzt kommt Physik ins Spiel. MoveY ist die
;aktuelle Geschwindigkeit. Diese ändert sich
;jedes mal um einen Konstanten Wert, wenn ein
;Objekt fällt. Um Aufprall usw. kümmern wir
;uns später
MoveY+0.5
;Bewegen
If KeyboardPushed(#PB_Key_Left)
MoveX-5
EndIf
If KeyboardPushed(#PB_Key_Right)
MoveX+5
EndIf
If OnGround
If KeyboardPushed(#PB_Key_Space)
MoveY=-20 ;Größerer Wert=Höherer Sprung
EndIf
EndIf
;Wir bewegen den Spieler (Position wird nachher korregiert)
;Der folgende Code mag verwirrend erscheinend.
;Um es mal leicht zu machen
;Wir verschieben einfach den Spieler.
;Steckt er dann in einer Wand fest setzten wir ihn einfach
;vor die Mauer
PlayerY+MoveY
OnGround=0
Hit=0
For x=0 To #W
For y=0 To #H
If Feld(x,y)=1 ;Ist das Feld eine Mauer (einzige Hinderniss)
If BoxKolli(x*#TileW,y*#TileH,#TileW,#TileH,PlayerX,PlayerY,#PlayerW,#PlayerH) ;Ist der Spieler in der Mauer
Hit=1;Der Spieler kollidiert mit einem Hinderniss
If MoveY<0; Diese überprüfen ist wichtig, sonst wüsten wir nicht auf
;welche Seite der Mauer wir den Spieler setzen müssen.
PlayerY=Y*#TileH+#TileH;Untere Seite
ElseIf MoveY>0
OnGround=1
PlayerY=Y*#TileH-#PlayerH;Linke Seite
EndIf
EndIf
EndIf
Next y
Next x
If Hit=1
MoveY=0; Würden wir MoveY nicht auf 0 setzten würde
;der Spieler jetzt über einen Abgrund laufen, würde
;er Schlagartig runterfallen.
EndIf
;Das gleiche noch einmal für die X-Achse
PlayerX+MoveX
Hit=0
For x=0 To #W
For y=0 To #H
If Feld(x,y)=1
If BoxKolli(x*#TileW,y*#TileH,#TileW,#TileH,PlayerX,PlayerY,#PlayerW,#PlayerH)
Hit=1
If MoveX<0
PlayerX=X*#TileW+#TileW
ElseIf MoveX>0
PlayerX=X*#TileW-#PlayerW
EndIf
EndIf
EndIf
Next y
Next x
If Hit=1
MoveX=0
EndIf
;Wir zeichnen die Tilemap
;Was du benutzt ist keine Tilemap
;0=Leeres Feld
;1=Mauer
;Wir gehen jedes Feld durch
For x=0 To #W
For y=0 To #H
;Wir prüfen was im Feld ist
Select Feld(x,y)
Case 0;Ein leeres Feld
;Ein leeres Feld brauchen wir nicht anzuzeigen
Case 1;Eine Mauer
;und zeichnen es.
DisplaySprite(1,x*#TileW,y*#TileH)
EndSelect
;Man könnte hier auch noch andere Felder hinzufügen
;Zum Beispiel Lava oder so
Next y
Next x
;Jeztzt zeichnen wir noch unseren Spieler
;(Blauer Kasten)
DisplaySprite(0,PlayerX,PlayerY)
EndIf
FlipBuffers()
ForEver
PS: Du kannst die Kollisionsrutine auch für unterschiedlich große Objekte verwenden und für welche die nicht in einer Tilemap sind
Re: Sprung eines sprites simulieren
Verfasst: 05.04.2010 15:26
von Fluid Byte
Klasse Beispiel kswb73!
All die Jahre hab' ich diverse mal angefangen ein Jump 'N' Run zu programmieren bin aber immer an der Kollision gescheitert. Jetzt kriege ich wieder Bock mal ein paar alte Projekte rauszukramen.
** Lesezeichen setz **
Re: Sprung eines sprites simulieren
Verfasst: 05.04.2010 15:36
von Kaeru Gaman
sehr schönes Beispiel, wirklich.
zu der Tileengine, sieh dir mal maine alte an:
http://www.purebasic.fr/german/viewtopi ... 34#p116634
erstens wird man wahrscheinlich sowieso einen Hintergrund haben wollen, nicht einfach ein schwarzes Bild,
zweitens ist es einfach schneller wenn man im Array direkt die Spritenummer drin stehen hat und sich nicht mir cases rumschlägt.
Re: Sprung eines sprites simulieren
Verfasst: 05.04.2010 18:31
von Marvin133
Vielen Dank genau das habe ich gesucht
ist echt klassen von euch das ihr mir geholfen habt großes lob an euch.nur ich habe noch ein frage ich lades alle werte für die tile map aus einer datei wie kann ich aber in die nächste zeile der datei springen um dort den wert auszulesen?