Problem mit schrägen tiels

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

andigraz

Betreff: Problem mit schrägen tiels

BeitragSo, Jan 29, 2012 19:06
Antworten mit Zitat
Benutzer-Profile anzeigen
hallo ich hab ein kleines Problem .Ich benutze blitz3D mit Draw3d2.Ich bastel gerade an ein Jump&Run was tiel basiert aufgebaut ist.
Mein Problem mit der Kollision ist das ich nicht Weiß wie ich es anstellen soll das bei schrägen tiels (z.b. bei berg ab oder Berg auf) die Spielfigur in den tiel eindringen kann
Code: [AUSKLAPPEN]

;Grafikmodus setzen
AppTitle "Super Maus"
Graphics3D 1024,768,0,2
SetBuffer BackBuffer()
Include "includes\Draw3D2.bb"
Local Timer=CreateTimer(50)
Local Camera=CreateCamera()
DrawInit3D(Camera)


Global hintergrund=LoadImage3D("grafik/hintergrund.png",1,1,0)
;Sprite laden
Global LoadedImage=LoadImage3D("grafik/maus.png",2,2,0,0)
Global GrabedAnimImage=GrabAnimImage3D(LoadedImage,64,64,0,10,1,1)
Global XP,YP,Direction,Times,Frame
Global boden=LoadImage3D("grafik/boden.png",2,2,0)
Global boden2=LoadImage3D("grafik/boden2.png",2,2,0)
;font laden
Global Font1=FontRange3D(LoadImage3D("fonts/arial.png",2,2,0,-100))
;Varieabeln deklarieren
Global sprung = 20
Global gravitation = 5
Global treibstoff = 10000000
Global Angle#=0
Global Scale#=1
Global links
Global RelativSpielerX
Global RelativSpielerY
Global xposspie=-150;Die x koordinate für den spieler
Global yposspie=-225;Die y Koordinate für den spiler
Global u
Global r
Global d
Global l
Global m
Global Offset_x = 485, Offset_y = 352
;Constanten deklarieren
Const TIELX = 64   ;tiel grösse x
Const TIELY = 64   ;tiel grösse y
Const MAPX = 30
Const MAPY =11
;leveldaten lesen
Dim map (MAPX,MAPY)

Restore mapdata
For y=0 To MAPY
   For x=0 To MAPX
      Read map(x,y)
   Next
Next


;Hauptschleife

Repeat
   hintergrund()
   DrawMap()
   spielerbewegen()
   debug()
   Hid()
   WaitTimer(Timer)
   RenderWorld
   Clear3D()
   Flip 0
   
Until KeyHit(1)
End


   
Function spielerbewegen()
   
   RelativSpielerX = xposspie + Offset_x + (TIELX/2)
   RelativSpielerY = yposspie+ Offset_y + (TIELY/2)
     u=map( RelativSpielerX/64 , (RelativSpielerY-32)/64)     ; Unten Mitte
    r=map( (RelativSpielerX+32)/64 , RelativSpielerY/64 )    ; Rechts
   d=map( RelativSpielerX/64 , (RelativSpielerY+32)/64)     ; oben Mitte
    l=map( (RelativSpielerX-32)/64 , RelativSpielerY/64 )    ; Links
    ;Gravitation
   If u = 0 Then
      yposspie = yposspie - gravitation
      Frame = 8
      If links = 1 Then USwap3D(GrabedAnimImage,Frame,-1)
      
   End If
   ;figur Steuerung
      
   If KeyDown(203) And l=0 Then ;nach links
      links = 1
      xposspie = xposspie - 3
      If xposspie < -220 Then
         Offset_x = Offset_x - 5
         xposspie = xposspie + 3
      End If
      
      If u = 1 Then
      Times=Times+1
      links = 1
      If Times=4 Then Times=0: Frame=Frame+1: If Frame>3 Then Frame=0
   Else
      Frame = 8
   End If
      USwap3D(GrabedAnimImage,Frame,-1)
      
   End If
   
   If KeyDown(205) And r= 0 Then ;nach recht
      links = 0
      xposspie = xposspie + 3
      If xposspie > 220 Then
         Offset_x = Offset_x + 5
         xposspie = xposspie - 3
      End If
      
      If u = 1 Then
      Times=Times+1
      If Times=4 Then Times=0: Frame=Frame+1: If Frame>3 Then Frame=0
      USwap3D(GrabedAnimImage,Frame,+1)
   Else
      Frame = 8
      USwap3D(GrabedAnimImage,8,+1)
   End If
   
   
   End If
   ;Racketen antrieb
   If KeyDown(57) And d = 0 Then
      If treibstoff >0 Then
         yposspie = yposspie + 8
         treibstoff = treibstoff - 1
         If links = 1 Then Frame = 6
         If links = 0 Then Frame = 5
         
      End If
      
   End If
   

   
   DrawImage3D(GrabedAnimImage,xposspie,yposspie,0,Angle,1,Frame)

   
End Function

   
   


Function DrawMap()
   For y = 0 To MAPY
      For x = 0 To MAPX
         If map(x,y) = 1 Then
            DrawImage3d (boden, x*TIELX - Offset_x, y*TIELY - Offset_y,0,0,1)
           
      EndIf
      If map(x,y) = 2 Then
            DrawImage3d (boden2, x*TIELX - Offset_x, y*TIELY - Offset_y,0,0,1)
           
      EndIf
      Next
   Next
End Function

Function hintergrund()
   
   DrawImage3D(hintergrund,0,0,0,0,1)
End Function
Function Hid()
End Function
Function debug(); debug
   ;If KeyDown(59) Then
   
      Text3D(Font1,-400,330,"!!!!!!! DEBUG INFO !!!!!!!",0,glow)
      Text3D(Font1,-400,270,Offset_x + " X Map Pos ",0,Glow)
      Text3D(Font1,-400,300,yposspie + " Y Spieler ",0,Glow)
      Text3D(Font1,-400,240,xposspie + " x Spieler ",0,Glow)
      Text3D(Font1,-400,180,u + " UNTEN",0,Glow)
      Text3D(Font1,-400,210,d + " OBEN",0,Glow)
      Text3D(Font1,-400,150,r + " RECHTS ",0,Glow)
   Text3D(Font1,-400,120,l + " LINKS ",0,Glow)
   Text3D(Font1,-400,90,links + " VLINKS",0,Glow)
;End If
End Function

;level daten
.mapdata
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 1,1,1,1,1,2,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

 

PhillipK

BeitragSo, Jan 29, 2012 19:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Viel helfen kann ich dir leider nicht, weil ich keine lust habe, deinen code durchzuwühlen.
Wenn du entsprechende passagen hervorhebst, geht das ganze sicher einfacher Smile

Zum anderen, wenn du "schräge tiles" sagt, gehe ich von quadratischen teilen aus, wobei manche eine steigung bzw ein gefälle von 45° haben.
In diesem fall kannst du die X position zur Y höhe umrechnen.

Wie folgt:

TileX, TileY, TileBreite, TileHöhe, SpielerX, SpielerY benötigt.

Fall: 45° Steigung.

In diesem fall ist die höhe die der spieler braucht:

(SpielerX-TileX) -> Position im tile.
(1.0 / TileBriete)*Position_im_tile -> faktor, wieviel '%' der spieler von der Linken kante des tiles entfernt ist.
Bei 45° gibt es eine steigung von 1y pro 1x. Heißt:


TileY+ (((1.0 / TileBreite)*(SpielerX-TileX))*TileHöhe) -> Höhe, die von der unteren Kante des Y tiles auf die schräge zeigt.

Das ganze lässt sich noch variieren, zb (TileHöhe*0.5) für schrägen mit 22,5° steigung.

Im endeffekt ist die höhe des Spielers also TileY-errechnete_höhe_im_Tile ^^

(Alle angaben ohne gewähr, aber so in der art müsste es hinhaun - geht aber sicher noch einfacher bzw dynamischer)

Vorgehen:

Position im Tile auf X achse berechnen
PositionX als faktor umrechnen
Höhe des Tiles mit dem Faktor multiplizieren (faktor ist ein wert von 0.0 wenn der spieler ganz links und ein wert von 1.0 wenn der spieler ganz rechts ist)
SpielerpositionY = tileY-errechnete höhe
wobei anzumerken ist, das du evtl tiley+höhe rechnen musst, je nachdem wo dein Koordinatenursprung liegt.

Meine Jetzige rechnung geht davon aus, das dein Koordinatenursprung oben / Links liegt und die Tileposition an ihren unteren, linken ecke bekannt ist. Sodass sich das teil nach rechts und nach oben erstreckt.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Jan 29, 2012 20:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde das gar nicht so kompliziert machen. Die Draw3D2 bietet dir da eine Funktion, die du gut dafür verwenden kannst.

Alpha%=GetTexel3D(BildHandle, SpielerFussXPos, SpielerFussYPos, BildXPos, BildYPos, BildWinkel, BildSkalierung, FarbMaskierung)

BildHandle = Das Handle, dass die LoadImage3D zurück gibt.
SpielerFuss(X/Y)Pos = Die Spielerposition, wo die Füsse sind.
Bild(X/Y)Pos = Das zu überprüfende Tile (sind maximal 4 um den Spieler herum).
BildWinkel = Wird wohl meistens 0 sein.
BildSkalierung = Wird wohl meistens 1 sein.
FarbMaskierung = Wird $FF000000 sein, wenn du nur den Alphawert erhalten willst.

Nun bewegst du dein Spieler ganz normal durch die Gegend. Wenn der Fuss auf ein Tile mit dem Alphawert <> 0 trifft, prüfst du (beispielsweise) 4 Texel höher vom Fuss, ob zumindest da der Alphawert = 0 ist. Wenn ja, dann bewegst du den Spieler entsprechend nach oben. Wenn der zweite Texel <> 0 ist, dann ist es zu steil für den Spieler da hoch zu klettern.

Deine Tiles kannst du dann einfach in allen Formen bringen. Ob schräg gezagt oder einfach nur uneben. Der Spieler passt sich der Form der Tiles an. Die Tiles müssen nur entsprechend im Alphakanal kodiert sein.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

andigraz

BeitragMo, Jan 30, 2012 23:07
Antworten mit Zitat
Benutzer-Profile anzeigen
danke

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group