Schanze bzw. unebener Boden
Schanze bzw. unebener Boden
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
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
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:

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.
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:

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.


ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
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.


ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
hab mal rumgespielt:
(kollision nur im rechteck; abprall nur senkrecht zum horizont)
(hoch,runter,links,rechst zum bewegen)
@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.
(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
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.
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
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



ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
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?
PS: Ich kann von meinem Heim PC nichts in diesem Forum Posten... Ungültige Session oder so was... woran kann das liegen?
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
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22