Schanze bzw. unebener Boden

Anfängerfragen zum Programmieren mit PureBasic.
Tompazi
Beiträge: 211
Registriert: 22.09.2007 15:38

Schanze bzw. unebener Boden

Beitrag 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
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag 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.
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag 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.
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag 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.
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag 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 ;)
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

dachte ich mir auch grad <)
wizball for Stargate's DrawMania :D
my pb stuff..
Bild..jedenfalls war das mal so.
Tompazi
Beiträge: 211
Registriert: 22.09.2007 15:38

Beitrag 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?
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag 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.
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ein etwas älteres beispiel von mir...

http://www.purebasic.fr/german/viewtopi ... 539#136539
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten