Seite 1 von 1

Schanze bzw. unebener Boden

Verfasst: 10.01.2008 15:09
von Tompazi
Ich will ein 2D Spiel programmieren so eine Art Motorcross Spiel.
Mein erstes Problem ist das ich nicht weiß wie ich einen unebenen Boden bzw. Schanzen oder Objekte "erstellen" kann.
Kann mir das wer erklären?

Danke Tompazi

Verfasst: 10.01.2008 16:14
von ZeHa
Bin grad an was ähnlichem... im Moment gehe ich folgendermaßen vor: Ein Tile besteht zum einen aus der rein optischen Information und zum anderen aus einer Maske, die genauer beschreibt, wie die Oberfläche beschaffen ist. Diese taste ich beim Initialisieren einfach ab und speicher sie in einem Array, wenn das Tile also 64 Pixel breit ist, dann habe ich 64 Werte mit einer Höheninformation.

Wenn sich nun die Figur / das Motorrad drauf bewegen soll, dann findest Du zunächst raus, auf welchem Tile es sich befindet, und danach schaust Du noch, wie es mit der Höheninformation ausschaut und paßt die Position entsprechend an.

Natürlich kannst Du dann auch statt einem einzigen Punkt auch 2 auslesen und den Winkel ausrechnen um das Motorrad z.B. leicht schräg zu stellen.

Hier mal ein Beispiel-Tile, das ich zur Zeit als Test-Tile verwende:
Bild

Der obere Bereich ist nur das Aussehen, darunter ist die Maske zu sehen. Wie Du siehst entspricht die obere Kante in meinem Fall auch gar nicht der optischen Kante, somit werden bei mir die Objekte nicht direkt auf dem Rand plaziert. Also diese Trennung von Optik und tatsächlicher Oberfläche ist schon ziemlich sinnvoll.

Verfasst: 10.01.2008 16:23
von ZeHa
Also ich bin jetzt davon ausgegangen daß Du grundsätzlich mit Tiles und Tile-Maps umgehen kannst... wenn nicht, dann mußt Du natürlich erstmal da die Grundlagen anschauen und was Mario-mäßiges programmieren (wo ja meist alles schön aus Quadraten aufgebaut ist), dann kannst Du das später erweitern um solche Schrägen usw.

Verfasst: 10.01.2008 17:48
von #NULL
hab mal rumgespielt:
(kollision nur im rechteck; abprall nur senkrecht zum horizont)
(hoch,runter,links,rechst zum bewegen)

Code: Alles auswählen

InitSprite()
InitKeyboard()
ww=800
wh=600
hWin=OpenWindow(0, 50,100,ww,wh, "")
OpenWindowedScreen( hWin, 0,0,ww,wh, 0,0,0)

Structure ball_S
  x.f
  y.f
  speedx.f
  speedy.f
  r.f
EndStructure
Define ball.ball_S
ball\x=ww/2
ball\y=wh/2
ball\r=4

max=ww-1
Dim map(max)
map(0) = wh*0.7
map(1)=map(0)
map(2)=map(0)
For i=1 To max-2
  If i/3 <> i_
    map(i) = map(i-1) + (Random(8)-4)
    map(i+1)=map(i)
    map(i+2)=map(i)
  EndIf
  i_=i/3
Next

Repeat
  ExamineKeyboard()
  If KeyboardPushed(#PB_Key_Right)  ::  ball\speedx + 0.2  ::  EndIf
  If KeyboardPushed(#PB_Key_Left )  ::  ball\speedx - 0.2  ::  EndIf
  If KeyboardPushed(#PB_Key_Up   )  ::  ball\speedy - 0.2  ::  EndIf
  If KeyboardPushed(#PB_Key_Down )  ::  ball\speedy + 0.2  ::  EndIf
  
  ball\x + ball\speedx
  ball\y + ball\speedy
  ball\speedx * 0.99
  ball\speedy + 0.3
  If ball\x-ball\r < 10
    ball\x = 10+ball\r
    If ball\speedx < 0
      ball\speedx * -0.8
    EndIf
  ElseIf ball\x+ball\r > ww-10
    ball\x = ww-10-ball\r
    If ball\speedx > 0
      ball\speedx * -0.8
    EndIf
  EndIf
  
  coll=0
  For i=(ball\x-ball\r) To (ball\x+ball\r)
    If i>=0  And i<=max And  ball\y+ball\r >= map(i)
      coll=1
      ball\y-1
      If ball\speedy > 0
        ball\speedy * -0.7
      EndIf
    EndIf
  Next
  
  event=WaitWindowEvent(30)
  Select event
    Case #PB_Event_CloseWindow
      quit=1
  EndSelect
  StartDrawing(ScreenOutput())
    For i=0 To max
      LineXY(i,map(i),i,wh, $225566 )
    Next
    Box(0,0,10,wh,$225566)
    Box(ww-10,0,10,wh,$225566)
    If coll=0 
      DrawingMode(#PB_2DDrawing_Outlined)
    EndIf
    ;Circle(ball\x,ball\y,ball\r,$00ff00)
    Box(ball\x-ball\r,ball\y-ball\r,2*ball\r,2*ball\r,$00ff00)
  StopDrawing()
  FlipBuffers()
  ClearScreen($333333)
Until quit
@ZeHa
benutzt du dafür ein eigenes bildformat für beides? bzw speicherst du die heightmap in einem normalen bild? interessiert mich nur mal, klingt interessant.

Verfasst: 10.01.2008 18:05
von ZeHa
Das Bild speichere ich so, wie Du es siehst. Oben das Aussehen, unten die Maske. Beim Laden wird dann einfach die Maske abgetastet, um die 64 Werte zu erhalten.

Natürlich kann man auch beides separat speichern oder die abgetasteten Werte bereits vorher auslesen und dann nur diese noch speichern, aber wenn alles im Bild drin ist, kann man es halt viel schneller ändern.


EDIT: Dein Beispiel sieht ziemlich cool aus, da könnte man direkt ein kleines Spielchen draus machen ;)

Verfasst: 10.01.2008 18:18
von #NULL
dachte ich mir auch grad <)
wizball for Stargate's DrawMania :D

Verfasst: 11.01.2008 12:27
von Tompazi
danke, mit tiles kenne ich mich noch nicht aus.
aber ich werde mich damit beschäftigen.

@#NULL
Cooles Beispiel verstehe ich aber leider nicht ganz. kannst du mir diesen Teil erklären?

Code: Alles auswählen

max=ww-1 
Dim map(max) 
map(0) = wh*0.7 
map(1)=map(0) 
map(2)=map(0) 
For i=1 To max-2 
  If i/3 <> i_ 
    map(i) = map(i-1) + (Random(8)-4) 
    map(i+1)=map(i) 
    map(i+2)=map(i) 
  EndIf 
  i_=i/3 
Next 
PS: Ich kann von meinem Heim PC nichts in diesem Forum Posten... Ungültige Session oder so was... woran kann das liegen?

Verfasst: 11.01.2008 13:08
von Laurin
Tompazi hat geschrieben:PS: Ich kann von meinem Heim PC nichts in diesem Forum Posten... Ungültige Session oder so was... woran kann das liegen?
Cookies aktivieren.

Verfasst: 11.01.2008 16:16
von Kaeru Gaman
ein etwas älteres beispiel von mir...

http://www.purebasic.fr/german/viewtopi ... 539#136539