Problem mit schrägen tiels
Übersicht

andigrazBetreff: Problem mit schrägen tiels |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() 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. |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
danke | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group