kollision mit tiel und draw3d

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

andi79

Betreff: kollision mit tiel und draw3d

BeitragDi, März 16, 2010 17:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo ich bins mall wieder
Ich hab da ein kleines Problem mit tilemap und Kollision abfrage über Dim. Feld
Hab mir jetzt die ganzen Beiträge zu Kollision durchgelesen und durch probiert leider ohne erfolg
Dort wo er mir Kollisionen anzeigt gibt es keine tiels ich benutze draw3d ich hab mall die Vermutung das es mit der Nullpunkt Verschiebung zu tun hat aber habe keinen Plan wie ich es Lössen soll
Hier meine code
Code: [AUSKLAPPEN]

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



DrawInit3D(Camera)

Const TIELX = 128    ;tiel grösse x
Const TIELY = 128   ;tiel grösse y
Const MAPX = 8
Const MAPY =6

Global hintergrund=loadimage3d("hintergrund.png",1,1,0)
Global boden=loadimage3d("boden.png",2,1,0)
Global boden2=loadimage3d("boden2.png",2,1,0)
Global grass=loadimage3d("grass.png",2,1,0)
Global player=LoadImage3D("player.png",2,1,0)
Global xposspie=-150;Die x koordinate für den spieler
Global yposspie=-234;Die y Koordinate für den spiler
Global Font1=LoadFont3D("Fonts\Babylon1.png",2,2)
Global Offset_x = 448, Offset_y = 320

Global u
Global r
Global d
Global l
Global m
;leveldaten lesen
Dim map (MAPY,MAPX)

Restore mapdata
For y=0 To 5
   For x=0 To 7
      Read map(x,y)
   Next
Next


;Hauptschleife

Repeat
   hintergrund()
   DrawMap()
   spielerbewegen()
   debug()
   ;Springen:
   Dim Sprungweite(18)
   Restore springen
   For I=2 To 18
      Read Sprungweite(I)
   Next
   
   
   
   If KeyDown(57) And Sprung=0 Then ; Sprung
      Sprung = 1
      If map((Offset_x +64) /128,yposspie /128)=1 And sprung = 1  Then
         sprung = 0
         yposspie = yposspie +1   
      EndIf
   EndIf
   If Sprung > 0 Then ; während des Sprungs
      Sprung = Sprung + 1
      If Sprung = 19 Then Sprung = 0
      yposspie = yposspie + Sprungweite(Sprung)
   EndIf
   
   
   
   If xposspie = 0 Then Offset_x = Offset_x + 5
   
   WaitTimer(Timer)
   RenderWorld   
   
   
   Clear3D()
   Flip 0
Until KeyHit(1)
End


;funktionen
Function spielerbewegen()


   
         
         
         
;prüfen ab spieler mit tils kolosion besteht:
   
   
   u=map((xposspie+64)/128,(yposspie+64)/128)  ; Oben / Up
   r=map((xposspie+64)/128,(yposspie+64)/128) ; Rechts / Right
   d=map((xposspie+64)/128,(yposspie+64)/128) ; Unten / Down
   l=map((xposspie+64)/128,(yposspie+64)/128)      ; Links / Left
   
   
   If KeyDown(200) And d=0 Then yposspie = yposspie + 4
   If KeyDown(208) And u=0  Then yposspie = yposspie - 4
   If KeyDown(205) And r=0 Then xposspie = xposspie + 4
   If KeyDown(203) And l=0  Then xposspie = xposspie - 4      
   
         
         

End Function   






Function hintergrund()
   
   DrawImage3D(hintergrund,0,0,0,0,1)
End Function

   
   
   

Function DrawMap()
   For y = 0 To 5
      For x = 0 To 7
         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 (grass, x*TIELX- Offset_x, y*TIELY - Offset_y,0,0,1)
            
         EndIf
         If map(x,y) = 3 Then
            DrawImage3d (boden2, x*TIELX - Offset_x, y*TIELY - Offset_y,0,0,1)
            
         EndIf
      Next
   Next
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,d + "UNTEN",0,Glow)
      Text3D(Font1,-400,210,u + "OBEN",0,Glow)
      Text3D(Font1,-400,150,r + "RECHTS ",0,Glow)
      Text3D(Font1,-400,120,l + "LINKS ",0,Glow)
End If
End Function
.springen
Data 30,30,30,30,30,20,20,0,0,-20,-20,-30,-30,-30,-30,-30,0

;level daten

.mapdata
Data 1,1,1,1,1,0,1,1
Data 0,0,0,0,0,0,0,0
Data 0,0,0,0,1,1,1,0
Data 0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0

Midimaster

BeitragDi, März 16, 2010 18:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich nehme mal an dies sind alle Zeilen, die du derzeit zur Kollision geschrieben hast?

BlitzBasic: [AUSKLAPPEN]
   u=map((xposspie+64)/128,(yposspie+64)/128)  ; Oben / Up
r=map((xposspie+64)/128,(yposspie+64)/128) ; Rechts / Right
d=map((xposspie+64)/128,(yposspie+64)/128) ; Unten / Down
l=map((xposspie+64)/128,(yposspie+64)/128) ; Links / Left


Da kann dich schon mal was nicht stimmen, weil ja alle Zeilen gleich sind....

So wie das aussieht, willst du nur wissen, welche Ecke deines SpielerTiles in welcher Ecke der Map steht, oder?

BlitzBasic: [AUSKLAPPEN]
   u=map((xposspie-64)/128,(yposspie-64)/128)  ; Links Oben 
r=map((xposspie+64)/128,(yposspie-64)/128) ; Rechts Oben
d=map((xposspie-64)/128,(yposspie+64)/128) ; Links Unten
l=map((xposspie+64)/128,(yposspie+64)/128) ; Rechts Unten

Hier hab ich die Vorzeichen mal geändert. So wären die 4 Testpunkte links/oben, rechts/oben, links/unten und rechts/unten. Also die Ecken deiner Figur.

Ist es das, was du suchst?

andi79

BeitragDi, März 16, 2010 19:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die Mühe aber es hat leider nichts gebracht zu besseren Verständnis meines Problems habe ich die Dateien hochgeladen mein Problem ist das die Koordinaten irgendwie nicht stimmen dort wo eigentlich nichts ist bleibt die Figur stehen und dort wo was ist ignoriert sei es
http://rapidshare.com/files/36...t.zip.html

Midimaster

BeitragDi, März 16, 2010 20:16
Antworten mit Zitat
Benutzer-Profile anzeigen
also 4x das gleiche ist sicherlich falsch. Wo sollen denn deiner Meinung nach die vier Stellen L,O,R,U sein?


ich dachte erst so:
Code: [AUSKLAPPEN]

L-----O
|     |
|     |
|     |
R-----U


aber wahrscheinlich meinst du so:

Code: [AUSKLAPPEN]

+--O--+
|     |
L     R
|     |
+--U--+


Außerdem muss ja der Offset immer abgezogen werden:
BlitzBasic: [AUSKLAPPEN]
RelativSpielerX = xPosSpie - Offset_X
RelativSpielerY = yPosSpie - Offset_Y

kann aber auch grad anders herum sein:
BlitzBasic: [AUSKLAPPEN]
RelativSpielerX = xPosSpie + Offset_X
RelativSpielerY = yPosSpie + Offset_Y

oder eine Mischung davon....probier einfach alle 4 Möglichkeiten durch...


dann wäre der Code:


BlitzBasic: [AUSKLAPPEN]
   u=map( RelativSpielerX/128 , (RelativSpielerY-64)/128 )    ; Oben Mitte 
r=map( (RelativSpielerX+64)/128 , RelativSpielerY/128 ) ; Rechts
d=map( RelativSpielerX/128 , (RelativSpielerY+64)/128) ; Unten Mitte
l=map( (RelativSpielerX-64)/128 , RelativSpielerY/128 ) ; Links

andi79

BeitragMi, März 17, 2010 17:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok ohne draw3d und offset geht es aber mit funktioniert es nicht Crying or Very sad Crying or Very sad leider. Weis jemand noch einen rat wie ich es angehen könnte Rolling Eyes

ToeB

BeitragMi, März 17, 2010 17:25
Antworten mit Zitat
Benutzer-Profile anzeigen
DU musst ja auch bedenken das die Y-Achse invertiert ist !

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Midimaster

BeitragMi, März 17, 2010 17:35
Antworten mit Zitat
Benutzer-Profile anzeigen
@Toeb
aha! muss ich ihm dann den code irgendwie anpassen? Oder liege ich mit meiner Hilfe hier völlig falsch. Ich glaube ja immer noch, das das Problem genau in diesen Zeilen liegt, oder?


@andi79

umgedrehtes Y wäre dann so:

BlitzBasic: [AUSKLAPPEN]
   u=map( RelativSpielerX/128 , (RelativSpielerY+64)/128 )    ; Oben Mitte 
r=map( (RelativSpielerX+64)/128 , RelativSpielerY/128 ) ; Rechts
d=map( RelativSpielerX/128 , (RelativSpielerY-64)/128) ; Unten Mitte
l=map( (RelativSpielerX-64)/128 , RelativSpielerY/128 ) ; Links

andi79

BeitragMi, März 17, 2010 17:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Super es funktioniert endlich Idea danke für die hilfe anbei noch die funktionierende Funktion Laughing

Code: [AUSKLAPPEN]
Function spielerbewegen()


   DrawImage3D(player,player_x,player_y,0,0,1)
   
   RelativSpielerX = player_x + Offset_x + (TIELX/2)
   RelativSpielerY = player_y + Offset_y + (TIELY/2)
   
   u=map( RelativSpielerX/128 , (RelativSpielerY-64)/128 )    ; Oben Mitte
   r=map( (RelativSpielerX+64)/128 , RelativSpielerY/128 )    ; Rechts
   d=map( RelativSpielerX/128 , (RelativSpielerY+64)/128)     ; Unten Mitte
   l=map( (RelativSpielerX-64)/128 , RelativSpielerY/128 )    ; Links
   
   If KeyDown(200) And d=0 Then player_y = player_y + 4
   If KeyDown(208) And u=0  Then player_y = player_y - 4
   If KeyDown(205) And r=0 Then player_x = player_x + 4
   If KeyDown(203) And l=0  Then player_x = player_x - 4   

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group