Sprung eines Sprites simulieren

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Marvin133
Beiträge: 80
Registriert: 25.01.2010 15:51
Computerausstattung: Win 7 Home Premium 64 Bit \ PB 4.41 Demo\2.8Ghz QuadCore \4GB RAM\ nVidia GTS 250
Kontaktdaten:

Sprung eines Sprites simulieren

Beitrag 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 :)
Win 7 Home Premium 64 Bit \ PB 4.41 Demo\2.8Ghz QuadCore \4GB RAM\ nVidia GTS 250

Bild
Kaeru Gaman
Beiträge: 17386
Registriert: 10.11.2004 03:22

Re: Sprung eines sprites simulieren

Beitrag 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.
... machts gut und danke für den fisch ...
Benutzeravatar
Marvin133
Beiträge: 80
Registriert: 25.01.2010 15:51
Computerausstattung: Win 7 Home Premium 64 Bit \ PB 4.41 Demo\2.8Ghz QuadCore \4GB RAM\ nVidia GTS 250
Kontaktdaten:

Re: Sprung eines sprites simulieren

Beitrag 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
Win 7 Home Premium 64 Bit \ PB 4.41 Demo\2.8Ghz QuadCore \4GB RAM\ nVidia GTS 250

Bild
Kaeru Gaman
Beiträge: 17386
Registriert: 10.11.2004 03:22

Re: Sprung eines sprites simulieren

Beitrag 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.
... machts gut und danke für den fisch ...
Benutzeravatar
Marvin133
Beiträge: 80
Registriert: 25.01.2010 15:51
Computerausstattung: Win 7 Home Premium 64 Bit \ PB 4.41 Demo\2.8Ghz QuadCore \4GB RAM\ nVidia GTS 250
Kontaktdaten:

Re: Sprung eines sprites simulieren

Beitrag 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
Win 7 Home Premium 64 Bit \ PB 4.41 Demo\2.8Ghz QuadCore \4GB RAM\ nVidia GTS 250

Bild
Benutzeravatar
Marvin133
Beiträge: 80
Registriert: 25.01.2010 15:51
Computerausstattung: Win 7 Home Premium 64 Bit \ PB 4.41 Demo\2.8Ghz QuadCore \4GB RAM\ nVidia GTS 250
Kontaktdaten:

Re: Sprung eines sprites simulieren

Beitrag 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
Win 7 Home Premium 64 Bit \ PB 4.41 Demo\2.8Ghz QuadCore \4GB RAM\ nVidia GTS 250

Bild
Benutzeravatar
kswb73
Beiträge: 319
Registriert: 04.02.2008 16:51
Kontaktdaten:

Re: Sprung eines sprites simulieren

Beitrag 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
Windows XP: PB 4.31, PB 4.4, PB 4.51
Open Suse 11.2: PB 4.4
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Re: Sprung eines sprites simulieren

Beitrag von Fluid Byte »

Klasse Beispiel kswb73! :allright:

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 **
Windows 10 Pro, 64-Bit / Outtakes | Derek
Kaeru Gaman
Beiträge: 17386
Registriert: 10.11.2004 03:22

Re: Sprung eines sprites simulieren

Beitrag 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.
... machts gut und danke für den fisch ...
Benutzeravatar
Marvin133
Beiträge: 80
Registriert: 25.01.2010 15:51
Computerausstattung: Win 7 Home Premium 64 Bit \ PB 4.41 Demo\2.8Ghz QuadCore \4GB RAM\ nVidia GTS 250
Kontaktdaten:

Re: Sprung eines sprites simulieren

Beitrag von Marvin133 »

Vielen Dank genau das habe ich gesucht :allright:

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?
Win 7 Home Premium 64 Bit \ PB 4.41 Demo\2.8Ghz QuadCore \4GB RAM\ nVidia GTS 250

Bild
Antworten