Panzer Physik V1.2

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

ToeB

Betreff: Panzer Physik V1.2

BeitragDo, Okt 01, 2009 20:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe mal wieder ein neues Project aufgemacht und da wollte ich mal das Panzerfahren realistischer machen. Dazu habe ich mich unter anderem auch der Verlet berechnung bedient. Es functioniert so, das ketten und Panzer getrennt sind. Auch sind die zwei Ketten getrennt. Also 3 teile. Jetzt hat jede Kette eine Geschwindigkeit S (+/-) , eine Position und einen Winkel und den ABstand zu 0 (dem Panzer). Jetzt wird zum beispiel die rechte Kette bewegt (er soll sich im kreis drehen). Dazu wird jetzt der Winkel zu 0 (panzer) gemessen und die Kette schonmal angepasst (winkel+90). Die andere Kette auch. Dann wird der Abstand zur anderen Kette gemessen und der Panzer auf halber strecke positioniert. Dann werden (wie bei Verlet) die beiden Ketten auf ursprüngliche Position zurückgesetz. Das gute daran ist das alles berechnet wird und man nix mehr hard coden muss (so wie bei tastendruck 17 den panzer um 2 pixel verschieben oder bei drehen dann gucken welche geschwindigkeit der drauf hat und abbremsen etc. braucht man hier alles nicht)

Ich Wollte das mal für andere hier reinstellen dies gebrauchen könnten.
Bitte meldet mir mal zurück was man noch besser machen kann oder was unlogisch wirkt. Danke Very Happy

Hier der Download (mit Dateien,BB-Code und Exe) :
Download PanzerPhys.rar

Einen Screen Poste ich hier bewuss nicht da man nicht mehr als einen Panzer auf einem leeren Bildschirm sieht...

Und hier der Code :
Code: [AUSKLAPPEN]
Include "Draw3D.bb"

Global GWidth = 800
Global GHeight = 600
Global GModi = 2
Global GScale# = 16/9.

Graphics3D GWidth,GHeight,32,GModi
SetBuffer BackBuffer()

;CONSTS/
Const TankMaxSpeed# = 2

;ARRAYS/
Dim TANK_IMAGE(0),SHOT_IMAGE(0)

;TYPES/TANK
Type tank
   Field typ
   Field x#,y#,w#
   Field kx#[1],ky#[1],kw#[1],kr#
   Field ks#[1]
   Field gas#[1]
   Field chain#[1]
   Field tx#,ty#,tw#
   Field kox#[1],koy#[1]
   Field r
   Field shotms
   Field leben
   Field dead,deadms
End Type

;TYPES/KI
Type ki
   Field info.tank
End Type

;TYPES/SPUR
Type spur
   Field x1#,y1#
   Field x2#,y2#
   Field r,g,b
   Field a#
End Type


;CREATE/TIMER
Global timer = CreateTimer(60)

;INIT/CAMERA
Global CAMERA = CreateCamera()
   scalex# = 1.
   scaley# = 1.
   If GModi = 1
      scalex# = GScale / (4/3.0)
      scaley# = (Float(GWidth) / Float(GHeight)) / (4/3.0)
   EndIf
   ScaleEntity(camera,scalex,scaley,scalex)
   CameraClsColor(CAMERA,64,128,64)
   DrawInit3D(CAMERA)
   Origin3D(800,600)


;LOAD/NATIVE/SPUR
Global NAT_SPUR = LoadImage3D("gfx\NAT_HUD.PNG",2,2)



   
;LOAD/IMAGE/PANZER
Global TANK_IMAGE_MAIN = LoadImage3D("gfx\TANK_1.PNG")
   TANK_IMAGE(0) = GrabImage3D(TANK_IMAGE_MAIN,31,32,33,17)
   GrabImage3D(TANK_IMAGE_MAIN,30,0,34,8)
   GrabImage3D(TANK_IMAGE_MAIN,31,1,32,6)
   GrabImage3D(TANK_IMAGE_MAIN,22,13,42,15)
   


   
;LOAD/NATIVE/HUD
Global NATIVE_HUD = LoadImage3D("gfx\NAT_HUD.PNG",2,2,0)


;LOAD/FONT/HUD   
Global FONT_HUD = LoadFont3D("gfx\FONT_HUD.PNG")
;Global FONT_HUD = FontRange3D(FONT_HUD_IMAGE)
   SetFont3D(2,1,1,0)
   
;CREATE/PLAYER/TANK
Global PLAYER.tank = CreateTank()

CreateKI()

Zoom# = 1

Repeat
   FPSc=FPSc+1:If FPSms<=MilliSecs()FPS=FPSc:FPSc=0:FPSms=MilliSecs()+999
   Text3D FONT_HUD,-400,290,"FPS : "+FPS
   ;MOVE/TANK
   Zoom# = Zoom# + MouseZSpeed()/10.0
   CameraZoom(CAMERA,Zoom)
   MOVE1# = 0
   MOVE2# = 0   
   If KeyDown(17) Then
      If MOVE1 = 0 MOVE1 = 0.05
      If MOVE2 = 0 MOVE2 = 0.05
   EndIf
   If KeyDown(31) Then
      If MOVE2 = 0 MOVE1 = -0.05
      If MOVE2 = 0 MOVE2 = -0.05
   EndIf
   If KeyDown(30) Then
      
      If MOVE1 <> 0
         MOVE1 = MOVE1 * 0.5
      Else
         MOVE1 = -0.05
      EndIf
      If MOVE2 = 0
         MOVE2 = 0.05
      EndIf
   EndIf
   If KeyDown(32) Then
      If MOVE2 <> 0
         MOVE2 = MOVE2 * 0.5
      Else
         MOVE2 = -0.05
      EndIf
      If MOVE1 = 0
         MOVE1 = 0.05
      EndIf
   EndIf
   If MOVE1 < 0 And MOVE2 > 0
      MOVE1 = MOVE1 * 0.25
      MOVE2 = MOVE2 * 0.25
   EndIf
   If MOVE1 > 0 And MOVE2 < 0
      MOVE2 = MOVE2 * 0.25
      MOVE1 = MOVE1 * 0.25
   EndIf
   MoveTank(PLAYER,MOVE1,MOVE2)
   PointTank(PLAYER,MouseX3D,MouseY3D)
   ;UPDATE/ALL
   UpdateTank()
   UpdateSpur()
   UpdateKI()
   ;DRAW/ALL
   DrawSpur()
   DrawTank()
   RenderWorld()
   Flip 0
   WaitTimer(timer)
   Clear3D()
Until KeyHit(1)
End

;FUNCTIONS/TANK
;FUNCTION/CREATETANK
Function CreateTank.tank(TYP=0)
   tmp.tank = New tank
   tmp\typ = TYP
   tmp\x = 0
   tmp\y = 0
   tmp\kr = 10
   tmp\kx[0] = tmp\x - tmp\kr
   tmp\ky[0] = tmp\y
   tmp\kx[1] = tmp\x + tmp\kr
   tmp\ky[1] = tmp\y
   tmp\kox[0] = tmp\kx[0]
   tmp\koy[0] = tmp\ky[0]
   tmp\kox[1] = tmp\kx[1]
   tmp\koy[1] = tmp\ky[1]
   tmp\tx = 0
   tmp\ty = 0
   tmp\w = 270
   tmp\kw[0] = 270
   tmp\kw[1] = 270
   tmp\r = 33/2.0
   tmp\leben = 100
   Return tmp
End Function

;FUNCTION/UPDATETANK
Function UpdateTank()
   For tmp.tank = Each tank
      tmp\ks[0] = tmp\ks[0] +   tmp\gas[0]
      tmp\ks[1] = tmp\ks[1] +   tmp\gas[1]
      tmp\kx[0] = tmp\kx[0] + Cos(-tmp\kw[0]) * tmp\ks[0]
      tmp\ky[0] = tmp\ky[0] + Sin(-tmp\kw[0]) * tmp\ks[0]
      tmp\kx[1] = tmp\kx[1] + Cos(-tmp\kw[1]) * tmp\ks[1]
      tmp\ky[1] = tmp\ky[1] + Sin(-tmp\kw[1]) * tmp\ks[1]
      tmp\ks[0] = tmp\ks[0] * 0.98
      tmp\ks[1] = tmp\ks[1] * 0.98
      If tmp\ks[0] > +TankMaxSpeed tmp\ks[0] = tmp\ks[0] * 0.981
      If tmp\ks[0] < -TankMaxSpeed tmp\ks[0] = tmp\ks[0] * 0.981
      If tmp\ks[1] > +TankMaxSpeed tmp\ks[1] = tmp\ks[1] * 0.981
      If tmp\ks[1] < -TankMaxSpeed tmp\ks[1] = tmp\ks[1] * 0.981
      tmp\chain[0] = (tmp\chain[0] + tmp\ks[0]) Mod 32
      tmp\chain[1] = (tmp\chain[1] + tmp\ks[1]) Mod 32
      ;GET/COLLISION
      If col_on = 0
         For info.tank = Each tank
            If info <> tmp And info\dead = 0
               DX# = info\x-tmp\x
               DY# = info\y-tmp\y
               ab# = Sqr(DX*DX+DY*DY)
               abg# = info\r+tmp\r
               If ab <= abg
                  abg = abg - ab+1
                  abw# = ATan2(DY,DX)
                  tmpx# = Cos(abw)
                  tmpy# = Sin(abw)
                  PosTank(tmp,tmp\x-tmpx*abg,tmp\y-tmpy*abg)
                  PosTank(info,info\x+tmpx*abg,info\y+tmpy*abg)
                  tmp\kw[0] = tmp\w
                  tmp\kw[1] = tmp\w                        
                  Exit
               EndIf
            EndIf
         Next
      EndIf
      ;CREATE/SPUR
      sp.spur = New spur
      sp\x1 = tmp\kox[0]
      sp\y1 = tmp\koy[0]
      sp\x2 = tmp\kx[0]
      sp\y2 = tmp\ky[0]
      sp\r = 64
      sp\g = 128
      sp\b = 64
      sp\a = 1
      sp.spur = New spur
      sp\x1 = tmp\kox[1]
      sp\y1 = tmp\koy[1]
      sp\x2 = tmp\kx[1]
      sp\y2 = tmp\ky[1]
      sp\r = 64
      sp\g = 128
      sp\b = 64
      sp\a = 1
      tmp\kox[0] = tmp\kx[0]
      tmp\koy[0] = tmp\ky[0]
      tmp\kox[1] = tmp\kx[1]
      tmp\koy[1] = tmp\ky[1]
      ;CALC/CHAINS
      tmpW1# = ATan2(tmp\ky[0]-tmp\y,tmp\kx[0]-tmp\x)
      tmpW2# = ATan2(tmp\ky[1]-tmp\y,tmp\kx[1]-tmp\x)
      tmpW3# = ATan2(tmp\ky[1]-tmp\ky[0],tmp\kx[1]-tmp\kx[0])      
      tmp\w = -tmpW3+90
      tmpRX# = tmp\kx[1] - tmp\kx[0]
      tmpRY# = tmp\ky[1] - tmp\ky[0]
      tmpR1# = Sqr(tmpRX*tmpRX + tmpRY*tmpRY)
      tmp\x = tmp\kx[0] + Cos(tmpW3) * tmpR1/2.0
      tmp\y = tmp\ky[0] + Sin(tmpW3) * tmpR1/2.0
      tmpR2# = (tmp\kr*2-tmpR1) / (tmp\kr*2)
      tmp\kx[0] = tmp\kx[0] - tmpRX * tmpR2 * 0.5
      tmp\ky[0] = tmp\ky[0] - tmpRY * tmpR2 * 0.5   
      tmp\kx[1] = tmp\kx[1] + tmpRX * tmpR2 * 0.5
      tmp\ky[1] = tmp\ky[1] + tmpRY * tmpR2 * 0.5            
      tmpW# = ATan2(tmp\ky[1]-tmp\ky[0],tmp\kx[1]-tmp\kx[0])      
      tmp\kw[0] = -tmpW+90
      tmp\kw[1] = -tmpW+90
      nn = 0
      If tmp\x < -400-tmp\r Then nx = 400+tmp\r : ny = tmp\y : nn = 1
      If tmp\x >  400+tmp\r Then nx =-400-tmp\r : ny = tmp\y : nn = 1
      If tmp\y < -300-tmp\r Then ny = 300+tmp\r : nx = tmp\x : nn = 1
      If tmp\y >  300+tmp\r Then ny =-300-tmp\r : nx = tmp\x : nn = 1
      If nn PosTank(tmp,nx,ny)
   Next
End Function

;FUNCTION/MOVETANK
Function MoveTank(tmp.tank,GAS2#=0,GAS1#=0)
   tmp\gas[0] = GAS1
   tmp\gas[1] = GAS2
End Function

;FUNCTION/POINTTANK
Function PointTank(tmp.tank,x#,y#)
   TX# = tmp\x + tmp\tx
   TY# = tmp\y + tmp\ty
   DX# = X# - TX
   DY# = Y# - TY
   W# = -ATan2(DY,DX)
   tmp\tw = w
End Function

;FUNCTION/POSTANK
Function PosTank(tmp.tank,nx#,ny#)
   tmp\x = nx
   tmp\y = ny
   tmp\kx[0] = tmp\x + Cos(-tmp\w-90) * tmp\kr
   tmp\ky[0] = tmp\y + Sin(-tmp\w-90) * tmp\kr
   tmp\kx[1] = tmp\x + Cos(-tmp\w+90) * tmp\kr
   tmp\ky[1] = tmp\y + Sin(-tmp\w+90) * tmp\kr
   tmp\kox[0] = tmp\kx[0]
   tmp\koy[0] = tmp\ky[0]
   tmp\kox[1] = tmp\kx[1]
   tmp\koy[1] = tmp\ky[1]
End Function


;FUNCTION/DRAWTANK
Function DrawTank()
   For tmp.tank = Each tank
      If tmp\dead = 0
         ColorG3D(255,255,255,1)
         DrawImage3D(TANK_IMAGE(tmp\typ),tmp\kx[0],tmp\ky[0],0,tmp\kw[0],1, 1)
         DrawRect3D(TANK_IMAGE(tmp\typ),tmp\kx[0],tmp\ky[0],-tmp\chain[0],58,32,6,0,tmp\kw[0])
         DrawImage3D(TANK_IMAGE(tmp\typ),tmp\kx[1],tmp\ky[1],0,tmp\kw[1],1, 1)
         DrawRect3D(TANK_IMAGE(tmp\typ),tmp\kx[1],tmp\ky[1],tmp\chain[1],58,32,6,0,tmp\kw[1]+180)
         ColorG3D(128,128,255,1)
         DrawImage3D(TANK_IMAGE(tmp\Typ),tmp\x,tmp\y,0,tmp\w)
         DrawImage3D(TANK_IMAGE(tmp\typ),tmp\x+tmp\tx,tmp\y+tmp\ty,0,tmp\tw,1,3)
      EndIf
   Next
End Function


;FUNCTION/UPADTESPUR
Function UpdateSpur()
   For tmp.spur = Each spur
      tmp\a = tmp\a -0.01
      If tmp\a <=0 Then Delete tmp
   Next
End Function

;FUNCTION/DRAWSPUR
Function DrawSpur()
   For tmp.spur = Each spur
      ColorN3D(tmp\r,tmp\g,tmp\b,tmp\a)
      Line3D(NAT_SPUR,tmp\x1,tmp\y1,tmp\x2,tmp\y2)
   Next
End Function



;FUNCTION/CREATEKI
Function CreateKI()
   tmp.KI = New KI
   tmp\info = CreateTank()
End Function

;FUNCTION/UPDATEKI
Function UpdateKI()
   For tmp.KI = Each KI
      MoveTank(tmp\info,0.05,0.025)
      PointTank(tmp\info,PLAYER\x,PLAYER\y)
   Next
End Function


Viel Spaß =)

mfg ToeB
  • Zuletzt bearbeitet von ToeB am Fr, Okt 02, 2009 21:52, insgesamt 5-mal bearbeitet

Nicdel

BeitragDo, Okt 01, 2009 21:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Schöne Sache Smile
Allerdings besitzt noch nicht jeder Draw3D2 Wink

Edit: Ich seh grad, im Archiv ist sie ja dabei. Ich weiß aber nicht, was hectic davon hält.
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

ToeB

BeitragDo, Okt 01, 2009 21:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh mist Embarassed

Ich geb schnell mal die alte mit ....

Danke für den Hinweis Wink

Edit : So jetzt die veröffentliche Version der Draw3D2 beigegeben...Hoffe hectic hat nix dagegen ?
Auch habe ich noch bewegliche ketten hinzugefügt, damit das ganze etwas belebter wirkt, die drehen sich jetzt genau zur geschwindigkeit.

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!

Thorsten

BeitragDo, Okt 01, 2009 22:07
Antworten mit Zitat
Benutzer-Profile anzeigen
https://www.blitzforum.de/foru...hp?t=17380
Es gibt kein Copyright auf im Codearchiv gepostete Codes.

Sieht schon ganz nett aus aber ich finde die drehungen iwie zu eierig. ;D

ToeB

BeitragDo, Okt 01, 2009 22:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja gut dann denk dir das (C) vor der Exe und dem code weg ^^

Warum zu eierig ? was meinst du damit ?

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

BeitragDo, Okt 01, 2009 22:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich finds eigendlich nicht so schön wenn die Draw3D2 hier beiliegt. Außerdem ist es eine Uraltversion. Bis heute hab ich ja fast alles noch einmal durchgearbeitet. Und selbst die zur Zeit aktuelle ist noch Beta. Wenn jetzt die Leute mit der Uralt-Version anfangen zu arbeiten wird die Verwirrung groß sein.

Es wäre zumindest was anderes gewesen, wenn neue Funktionen benutzt worden wären, die unter der Draw3D V.3.2 nicht lauffähig sind. Das ist hier aber nicht der Fall. Man kann den selben Panzer-Code mit folgenden Änderungen auch unter der Draw3D V.3.2 zum laufen bekommen (damit können dann Interessierte auch was anfangen, da die Draw3D V.3.2 von mir ja noch ''offiziel supportet'' wird Wink ):

Zeile 1 wird zu Code: [AUSKLAPPEN]
Include "Draw3D.bb"


Zeilen 50 bis 52 werden zu Code: [AUSKLAPPEN]
Global FONT_HUD = LoadFont3D("gfx\FONT_HUD.PNG")
;Global FONT_HUD = FontRange3D(FONT_HUD_IMAGE)
SetFont3D(2,1,1,0)


Daher bitte ich dich das zu ändern. Ansonsten finde ich den Panzer gut umgesetzt. Fürs Codearchiv würde ich es aber besser finden, wenn der Panzer möglichst einfach gehalten und nicht über ein Multyplayerfähiges-Type angesprochen wird. Ist zwar gut gemacht, aber diejenigen die etwas lernen wollen hängen dann mit viel Codezeilen rum die sie vielleicht nicht verstehen.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

ToeB

BeitragDo, Okt 01, 2009 22:58
Antworten mit Zitat
Benutzer-Profile anzeigen
So habe ich geändert und noch direct ein kleines Update mit hochgekladen.

Jetzt kann man sich den Panzer aus der nähe angucken ... und ne Kanone ist auch drauf.

Die version ohne Types werde ich noch machen, brauch ich aber noch etwas für... Very Happy


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!

ozzi789

BeitragFr, Okt 02, 2009 8:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Sieht ganz nett aus, aber iwie ist das Ding auf nem Eisboden?
Der Panzer rutscht noch lange rum nachdem ich kein "Gas" mehr gebe

mfg Very Happy
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

ToeB

BeitragFr, Okt 02, 2009 13:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja da musst du nur den "Abbrems Faktor" in der "UpdateTank" Function ändern :
Code: [AUSKLAPPEN]
tmp\ks[0] = tmp\ks[0] * 0.981
tmp\ks[1] = tmp\ks[1] * 0.981


Da wird die geschwindigkeit verringert. Möchtest du zum beispiel ein sehr unebens Terrain befahren änderst du den Faktor in 0.9 oder 0.8. Nur um so näher er an 1 ist umso langsamer wird die Fahrt verringert und um so näher an null um so schneller bremmst der ab...

mfg ToeB


EDIT :

So es gibt eine neue Version :

[+] Spuren
[+] Kollision
[+] [Zoom]
[_] Speed angespasst (realistischer), panzer rutscht nicht mehr so rum
[+] anderen CPU-Panzer zum testen

Mein Spiel dazu macht auch fortschritte, man kann schon gegen den CPU panzer kämpfen (Schüsse / Leben / Tod / REspawn sind drin). UAch ist eine Particle Engine eingebaut, welche Explosionen und rauch effecte simuliert.

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!

Thorsten

BeitragSo, Okt 04, 2009 22:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Seehr geil! =)

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group