Map drehen

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

ToeB

Betreff: Map drehen

BeitragSa, Feb 21, 2009 17:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich benutze für mein aktuelles Project Draw3D. Das gibts so ne schönbe funtion die heißt "DrawQuad3D". Daraus setzte ich meine Map zusammen. Die Map besteht aus Types :
Code: [AUSKLAPPEN]
Type quad
   Field x[3],y[3]
   Field r#[3]
   Field tex
End Type


x,y sind die 4 positionen, r soll der abstand zur mitte der map sein.

Damit rechne ich den abstand zur mitte aus :
Code: [AUSKLAPPEN]
For i = 0 To 3
   q\r[i] = Sqr((Mitte_X-q\x[i])^2+(Mitte_Y-q\y[i])^2)
Next


Jetzt will ich die komplette map drehen, und zwar so, das sie gleich ausieht, also das alle quader so betshen blieben wie sie sind, nur halt anders positioniert. Ich dachte mir das so, wenn ich einen quader erstelle, wird der abstand zur mitte ausgerechnet (also Mitte_X,Mitte_Y) und dann kann man mit Cos(winkel) * rad und Sin(winkel) * rad die punkte positionieren. Falsch gedacht. Ich wollte es so lösen :


Code: [AUSKLAPPEN]
X1# = q\x[0] + Cos(Map_winkel) * q\r[0]
      Y1# = q\y[0] + Sin(Map_winkel) * q\r[0]
      X2# = q\x[1] + Cos(Map_winkel) * q\r[1]
      Y2# = q\y[1] + Sin(Map_winkel) * q\r[1]
      X3# = q\x[2] + Cos(Map_winkel) * q\r[2]
      Y3# = q\y[2] + Sin(Map_winkel) * q\r[2]
      X4# = q\x[3] + Cos(Map_winkel) * q\r[3]
      Y4# = q\y[3] + Sin(Map_winkel) * q\r[3]


Zeichnen tu ich so

Code: [AUSKLAPPEN]
DrawQuad3D(Map_Tex(q\tex),X1,Y1,X2,Y2,X3,Y3,X4,Y4)


Aber da wird die map so komisch gezeichnet. Wie macht man das ? Und wie kann ich das machen das sich die Map um die mitte herum dreht ? weil so würde sich die map immer nur um 0 herumdrehen, aber wie macht man das ?


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!

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, Feb 21, 2009 17:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Du hast die Möglichkeit deine Textur auf das WorldPivot zu laden und eine Mapdrehung anhand RotateEntity Camera,0,0,Winkel zu machen. Die restlichen Anzeigen bleiben denoch an Ort und Stelle. Das Codebeispiel Draw3D, ClearOff3D, free moving.bb zeigt am ehesten deine Fragestellung. Packe in diesem Code noch TurnEntity Camera,0,0,1 mit rein, um es genau zu erkennen.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

ToeB

BeitragSa, Feb 21, 2009 18:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja das problem ist nur das ich bei dem spiel deine Physix verwende,und die CL's müssen sich ja auch irgentwie mitdrehen... oder kann ich das genauso machen ?

Weil ich will das sich nur die map um den Spieler drum herum dreht, also so das be Phsix der Spieler weriter nachunten fällt, obwohl sich die map um ihn herum dreht...

mfg ToeB

[Edit]

So habs jetzt hinbekommen :

Ganzer Code: [AUSKLAPPEN]

Graphics3D 800,600,16,2
SetBuffer BackBuffer()

Include "Data\Draw3D.bb"
Include "Data\Physix.bb"

PhysixInit(0,-0.98,2)

Global Camera = CreateCamera()

DrawInit3D(Camera)
Global Native_back = LoadImage3D("Data\Gfx\Metall.png")
Origin3D(800,600)

Dim Map_Tex(0)
For i = 0 To 0
   Map_Tex(i) = LoadImage3D("Data\gfx\Map_"+(i+1)+"_Tex.png",4)
Next

Type quad
   Field x[3],y[3]
   Field r#[3],w#[3]
   Field tex
End Type

Type cl_rad
   Field cl.cl
   Field rad1#,rad2#
   Field w1#,w2#
End Type

Global Native_front = LoadImage3D("Data\Gfx\Metall.png")
Global Font = LoadFont3D("Data\Gfx\Romulan2.png")

Global Map_Winkel# = 0
Global Mitte_X,Mitte_Y

Global Kugel.KP = NewKP(Native_Front,-60,60,10,1,1,1000)

LoadMap("TestMap")
;q.quad = New quad
;q\tex = 0
;q\x[0] = -100
;q\y[0] = -100
;q\x[1] = -100
;q\y[1] = -50
;q\x[2] = -50
;q\y[2] = -50
;q\x[3] = -50
;q\y[3] = -100
;For i = 0 To 3
;   q\r[i] = Sqr((Mitte_X-q\x[i])^2+(Mitte_Y-q\y[i])^2)
;Next
Collisions 1,2,2,2

Repeat   
   If KeyDown(203) Map_winkel = Map_winkel - 1
   If KeyDown(205) Map_winkel = Map_winkel + 1
   ;DebugLog "Cos(MW) : "+Cos(Map_winkel)
   ;DebugLog "Sin(MW) : "+Sin(Map_winkel)
   ColorN3D 255,255,255,1
   For q.quad = Each quad
      X1# = Mitte_X + Cos(Map_winkel+q\w[0]) * q\r[0]
      Y1# = Mitte_Y + Sin(Map_winkel+q\w[0]) * q\r[0]
      X2# = Mitte_X + Cos(Map_winkel+q\w[1]) * q\r[1]
      Y2# = Mitte_Y + Sin(Map_winkel+q\w[1]) * q\r[1]
      X3# = Mitte_X + Cos(Map_winkel+q\w[2]) * q\r[2]
      Y3# = Mitte_Y + Sin(Map_winkel+q\w[2]) * q\r[2]
      X4# = Mitte_X + Cos(Map_winkel+q\w[3]) * q\r[3]
      Y4# = Mitte_Y + Sin(Map_winkel+q\w[3]) * q\r[3]
      DrawQuad3D(Map_Tex(q\tex),X1,Y1,X2,Y2,X3,Y3,X4,Y4)
      
      ;For i = 0 To 3
      ;   Oval3D(Native_Front,q\x[i],q\y[i],2.5,2.5,1,2.5)
      ;Next
   Next
   For cr.cl_rad = Each cl_rad
      cr\cl\x1 = Mitte_X + Cos(Map_Winkel+cr\w1) * cr\rad1   
      cr\cl\y1 = Mitte_Y + Sin(Map_Winkel+cr\w1) * cr\rad1   
      cr\cl\x2 = Mitte_X + Cos(Map_Winkel+cr\w2) * cr\rad2   
      cr\cl\y2 = Mitte_Y + Sin(Map_Winkel+cr\w2) * cr\rad2
   Next    
   ;For c.cl = Each cl
   ;   Line3D Native_Front,c\x1,c\y1,c\x2,c\y2,2
   ;Next
   DrawCL(3)
   ColorN3D(255,0,0,1)
   DrawKP()
   Physix(1)
   UpdateWorld()
   RenderWorld()   
   Clear3D()
   Flip
Until KeyHit(1)
End



Function LoadMap(Name$)   
   stream = ReadFile("Data\Map\"+Name$+".map")
   If Not(stream) Return
   Local Lastquad.quad
   Local lastcl_x,lastcl_y,last_cl_ccl
   Delete Each quad
   While Not Eof(stream)
      l$ = ReadLine(stream)
      If Trim(l$) <> "" And Left(l$,1) <> ";"
         Func$ = Trim(Lower(Left(l$,Instr(l$,"(")-1)))
         If Instr(l$,"=") > 0 l2$ = Trim(Lower(Mid(l$,Instr(l$,"=")+1,Len(l$))))
         l$ = Mid(l$,Instr(l$,"(")+1,Instr(l$,")")-(Instr(l$,"(")+1))
         l$ = Trim(Lower(l$))         
         Select Func
         Case "createquad"
            lastquad = New quad
            lastquad\tex = 0
         Case "quad"
            nr = l
            v1 = Left(l2$,Instr(l2$,",")-1)
            v2 = Mid(l2$,Instr(l2$,",")+1,Len(l2$))
            lastquad\x[nr] = v1
            lastquad\y[nr] = v2
         Case "createcl"   
            last_cl_ccl = 1         
         Case "cl"
            If last_cl_ccl = 1
               nr = l
               v1 = Left(l2$,Instr(l2$,",")-1)
               v2 = Mid(l2$,Instr(l2$,",")+1,Len(l2$))
               If nr = 1
                  lastcl_x = v1
                  lastcl_y = v2
               ElseIf nr = 2
                  tmp_cl.cl = NewCL(Native_Front,lastcl_x,lastcl_y,v1,v2)
                  cr.cl_rad = New cl_rad
                  cr\cl = tmp_cl                  
                  last_cl_ccl = 0
               EndIf
            EndIf                
         Case "mapmiddlex"
            Mitte_X = l2
         Case "mapmiddley"
            Mitte_Y = l2
         End Select
      EndIf 
   Wend   
   CloseFile(stream)   
   For q.quad = Each quad
      For i = 0 To 3
         q\r[i] = Sqr((Mitte_X-q\x[i])^2+(Mitte_Y-q\y[i])^2)
         q\w[i] = ATan2(q\y[i]-Mitte_Y,q\x[i]-Mitte_X)
      Next
   Next
   For cr.cl_rad = Each cl_rad
      cr\rad1 = Sqr((Mitte_X-cr\cl\x1)^2+(Mitte_Y-cr\cl\y1)^2)
      cr\rad2 = Sqr((Mitte_X-cr\cl\x2)^2+(Mitte_Y-cr\cl\y2)^2)
      cr\w1# = ATan2(cr\cl\y1-Mitte_Y,cr\cl\x1-Mitte_X)
      cr\w2# = ATan2(cr\cl\y2-Mitte_Y,cr\cl\x2-Mitte_X)
   Next
End Function



Function GetParam$(s$,st%,z$=",")
   anzahl = 1
   letzteskomma = 1
   For i = 1 To Len(s$)
      If Mid(s$,i,1) = z$ Or i = Len(s$) Then
         If anzahl = st Then Tex$ = Mid(s$,letzteskomma,i)
         letzteskomma = i+1
         anzahl = anzahl + 1
      EndIf
   Next
   Return Tex$
End Function


Wie man sieht, habe ich dem Type "CL" um einen externen eintrag erwietert, der Radius und Winkel zum Mittelpunkt von beiden X/Y punkten des CL speichert. Die Function NewCL habe ich in Physix so veränert, das se den Type jetzt zurückgibt. Aber wie kann ich die Kollision des CL jetzt an
Die neue Position anpassen ? Die Koordinaten werden richtig geändert, aber die Kollision taugt trotzdem nix...


mfg ToeB

[Edit2] Oh ich merk grad... Das kann ja gar nicht gehen...

Ich habs geschafft das cl geändert wird.... Aber dadurch ist CL auch kein statisches object mehr, also keine Kollision -.-

Embarassed Crying or Very sad

Man jetzt hatt ich mir soviel mühe gegeben .. Sad

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!

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, Feb 21, 2009 20:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Gerade wenn du Physix benutzt, solltest du die Kamera drehen, da Blitz3D von Haus aus keine 3D-Kollisionen erkennt wenn sich die Kollisionsflächen bewegen. Das heisst: Sie fallen dann alle einfach durch. Mit dem Beispiel von mir, passiert das nicht. Das einzige was man machen muß ist die Gravitation jedes Frame neu anpassen. Das ist allerdings nicht direkt mit der Physix vorgesehen. Du musst also bereits als global deffinierte Variablen neuberechnen. Und diese lauten GPhyxXGravity und GPhyxYGravity.

Man erkennt schnell, dass dieser Ansatz um Welten einfacher ist, als die gesamte Map immer wieder neu zu berechnen. Funktioniert nebenbei auch ohne Probleme. Was nach wie vor nicht geht sind bewegte Rampen, Türen etc. auf welche die Objekte stossen könnten.

Vielleicht hilft dir folgender Code:

Dahin kopieren, wo auch die anderen Beispielcodes der Draw3D sind.

Code: [AUSKLAPPEN]
Graphics3D 1024,768,0,2
SetBuffer BackBuffer()

Local Timer=CreateTimer(100)
Local Camera=CreateCamera()
CameraClsColor Camera,64,64,64

Include "Includes\Draw3D.bb"
Include "Includes\Physix.bb"
DrawInit3D(Camera)
PhysixInit(0,-0.1,2)
Origin3D(1024,768)

Local KP

Local ImageCL=LoadImage3D("Natives\IronsC.png",2,2,1)
Local ImageVK=LoadImage3D("Natives\Gauss.png",2,2,1)
Local ImageKP=LoadImage3D("Natives\GMaxA.png",2,2,1)
Local ImageXX=LoadImage3D("Natives\Metall.png",2,2,1)
Local Font=LoadFont3D("Fonts\Verdana1.png",2,2,0)

Local K1.KP=NewKP(ImageXX,-250,+350,6,1,1,1000)
Local K2.KP=NewKP(ImageKP,-150,+350,6,1,1,1000)
Local K3.KP=NewKP(ImageKP,-150,+250,6,1,1,1000)
Local K4.KP=NewKP(ImageKP,-250,+250,6,1,1,1000)

NewVK(ImageVK,K1,K2,1,1)
NewVK(ImageVK,K2,K3,1,1)
NewVK(ImageVK,K3,K4,1,1)
NewVK(ImageVK,K4,K1,1,1)
NewVK(ImageVK,K1,K3,1,1)
NewVK(ImageVK,K2,K4,1,1)

NewCL(ImageCL,-700,+200,-200,-200)
NewCL(ImageCL,-200,-200,+200,-300)
NewCL(ImageCL,+200,-300,+700,+200)

Collisions 1,2,2,2




;HAUPTSCHLEIFE
While Not KeyHit(1)
   
   Text3D(Font,-380,270,"Mouse for moving Camera",0)
   Text3D(Font,-380,240,"Hold [1] to undraw VK",0)
   Text3D(Font,-380,210,"Hold [2] to undraw KP",0)
   Text3D(Font,-380,180,"Hold [3] to undraw CL",0)
   Text3D(Font,-380,150,"Cursor for accelerate the black point",0)
   
   If KeyDown(203) Then MoveKP(K1,-0.5,0)
   If KeyDown(205) Then MoveKP(K1,+0.5,0)
   If KeyDown(200) Then MoveKP(K1,0,+0.5)
   If KeyDown(208) Then MoveKP(K1,0,-0.5)
   
   If Not KeyDown(2) Then DrawVK(3)
   If Not KeyDown(3) Then DrawKP()
   If Not KeyDown(4) Then DrawCL(3)
   
   PositionEntity Camera,MouseX3D,MouseY3D,0
   RotateEntity Camera,0,0,MouseX3D/4.0
   
   GPhyxXGravity=+Sin(EntityRoll(Camera))*0.05
   GPhyxyGravity=-Cos(EntityRoll(Camera))*0.05
   
   
   Physix(1)
   
   ;Standard-Sachen
   WaitTimer(Timer)
   UpdateWorld
   RenderWorld
   Clear3D()
   Flip 0
Wend
End
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

ToeB

BeitragSo, Feb 22, 2009 12:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey cool !

Aber irgentwie wird die CL nicht angepasst :

Code: [AUSKLAPPEN]

Graphics3D 800,600,16,2
SetBuffer BackBuffer()

Include "Data\Draw3D.bb"
Include "Data\Physix.bb"

Global GRAV# = -0.98

PhysixInit(0,GRAV,2)

Global Camera = CreateCamera()

DrawInit3D(Camera)
Global Native_back = LoadImage3D("Data\Gfx\Metall.png")
Origin3D(800,600)

Dim Map_Tex(0)
For i = 0 To 0
   Map_Tex(i) = LoadImage3D("Data\gfx\Map_"+(i+1)+"_Tex.png",4,2,1)
Next

Type quad
   Field x[3],y[3]
   Field r#[3],w#[3]
   Field tex
End Type

Type cl_rad
   Field cl.cl
   Field rad1#,rad2#
   Field w1#,w2#
End Type

Global CL_Tex = LoadImage3D("Data\Gfx\Metall.png",2,2,1)

Global Native_front = LoadImage3D("Data\Gfx\Metall.png")
Global Font = LoadFont3D("Data\Gfx\Romulan2.png")


Global Map_Winkel# = 0
Global Mitte_X,Mitte_Y

Global Kugel.KP = NewKP(Native_Front,-60,60,10,1,1,1000)

LoadMap("TestMap")
DrawMap()

Collisions 1,2,2,2

PositionEntity Camera,Mitte_X,Mitte_Y,0

Repeat   
   OldWinkel = Map_winkel
   If KeyDown(203) Map_winkel = Map_winkel - 1
   If KeyDown(205) Map_winkel = Map_winkel + 1
   RotateEntity Camera,0,0,Map_winkel
   ColorN3D 255,255,255,1
   DrawCL(3)
   ColorN3D(255,0,0,1)
   DrawKP()   
   GPhyxXGravity=+Sin(Map_winkel)*-GRAV
   GPhyxyGravity=-Cos(Map_winkel)*-GRAV
   Physix(1)
   UpdateWorld()
   RenderWorld()   
   Clear3D()
   Flip
Until KeyHit(1)
End



Function LoadMap(Name$)   
   stream = ReadFile("Data\Map\"+Name$+".map")
   If Not(stream) Return
   Local Lastquad.quad
   Local lastcl_x,lastcl_y,last_cl_ccl
   Delete Each quad
   While Not Eof(stream)
      l$ = ReadLine(stream)
      If Trim(l$) <> "" And Left(l$,1) <> ";"
         Func$ = Trim(Lower(Left(l$,Instr(l$,"(")-1)))
         If Instr(l$,"=") > 0 l2$ = Trim(Lower(Mid(l$,Instr(l$,"=")+1,Len(l$))))
         l$ = Mid(l$,Instr(l$,"(")+1,Instr(l$,")")-(Instr(l$,"(")+1))
         l$ = Trim(Lower(l$))         
         Select Func
         Case "createquad"
            lastquad = New quad
            lastquad\tex = 0
         Case "quad"
            nr = l
            v1 = Left(l2$,Instr(l2$,",")-1)
            v2 = Mid(l2$,Instr(l2$,",")+1,Len(l2$))
            lastquad\x[nr] = v1
            lastquad\y[nr] = v2
         Case "createcl"   
            last_cl_ccl = 1         
         Case "cl"
            If last_cl_ccl = 1
               nr = l
               v1 = Left(l2$,Instr(l2$,",")-1)
               v2 = Mid(l2$,Instr(l2$,",")+1,Len(l2$))
               If nr = 1
                  lastcl_x = v1
                  lastcl_y = v2
               ElseIf nr = 2
                  NewCL(CL_Tex,lastcl_x,lastcl_y,v1,v2)
                  last_cl_ccl = 0
               EndIf
            EndIf                
         Case "mapmiddlex"
            Mitte_X = l2
         Case "mapmiddley"
            Mitte_Y = l2
         End Select
      EndIf 
   Wend   
   CloseFile(stream)   
End Function


Function DrawMap()
   For i = 0 To 0
      ClearOff3D(Map_Tex(i))
   Next
   For q.quad = Each quad
      DrawQuad3D(Map_Tex(q\tex),q\x[0],q\y[0],q\x[1],q\y[1],q\x[2],q\y[2],q\x[3],q\y[3])
   Next
End Function



Function GetParam$(s$,st%,z$=",")
   anzahl = 1
   letzteskomma = 1
   For i = 1 To Len(s$)
      If Mid(s$,i,1) = z$ Or i = Len(s$) Then
         If anzahl = st Then Tex$ = Mid(s$,letzteskomma,i)
         letzteskomma = i+1
         anzahl = anzahl + 1
      EndIf
   Next
   Return Tex$
End Function


(ich hoffe du blickst durch den code durch x)

Die map und so dreht sich jetzt perfect, aber die CLs bleiben an einer stelle bzw. drehen sich mit der camera mit...


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!

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Feb 22, 2009 15:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Alle Bilder die nicht im HUD-Pivot gezeichnet werden, müßen auch mit dem Parameter -''Pivot'' auf 1 gestellt sein. In deinem Fall auch Native_front.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

ToeB

BeitragSo, Feb 22, 2009 17:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja danke ich hatts auch gesehen, aber erst als ich die nachricht abgeschikt hatte ^^

aber kann man diese Gravitations-änderung nicht sofort wirkken lassen, also so das wenn dich die gravitaion ändert die ricfhtung der kugel sich auch schlagartig ändert ? sonst wirkt das ganze sehr schleppend...


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!

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Feb 22, 2009 19:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Sie ändert sich ja sofort. Das was so ''komisch'' aussieht ist die Tatsache, dass so eine Kamerabewegung für den Menschen ungewohnt ist. Abhilfe dazu kann das mitführen der Kamera auf das Zielobjekt schaffen. Also so, dass deine Kugel immer im Mittelpunkt vom Bildschirm sich aufhält.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group