Kamerasteuerung/Terrainbefahren in Ballrennen

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Noobody

Betreff: Kamerasteuerung/Terrainbefahren in Ballrennen

BeitragDi, Okt 16, 2007 20:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab mir ne kurze Auszeit von meinem Grossprojekt genommen und progge daher mal was kleines.
Es sollte so ein kleiner 'Marble Insanity'-Klon werden, wer das kennt.
Nur bin ich jetzt auf ein kelines Problem gestossen, nämlich mit der Kamera.
Mit EntityRadius und Collisions habe ich verhindern wollen, dass die Kamera durch das Terrain durchgeht, was ziemlich unschön wirkt.
Nur bleibt sie nach der Kollision in der Entfernung und in dem Winkel, in dem sie sich wieder losgerissen hat, was dazu führt, dass auch die Kamerasicht nicht mehr mit der Ballbewegung übereinstimmt.
Weiss wer von euch, wie ich das am geschicktesten lösen kann?
Auch eine andere Frage: Ich habe die Physik mit Collisions einigermassen hinbekommen.
Nun ist die Frage, ob ich eine eigene Physik schreiben soll mit Ausrichtung am Terrain, langsamer werden bei schrägen Flächen etc. oder genügt hier Collisions?

Hier der Code:
Code: [AUSKLAPPEN]
Graphics3D 640, 480, 0, 2
SetBuffer BackBuffer()

Global winkel

Global EGround = CreateTerrain( 32 )
PositionEntity EGround, -16, 0, -16
file = ReadFile( "Level.dat" )
For i = 0 To 31
   For t = 0 To 31
      ModifyTerrain( EGround, i, t, ReadFloat( file ) )
   Next
Next
CloseFile file
ScaleEntity EGround, 2, 5, 2
Global TGround = LoadTexture( "Ground.bmp" )
ScaleTexture TGround, 0.5, 0.5
EntityTexture EGround, TGround
EntityType EGround, 1

Global EPlayer = CreateSphere( 16 )
Global TPlayer = LoadTexture( "Player.bmp" )
PositionEntity EPlayer, 0, 5, 0
EntityRadius EPlayer, MeshHeight( EPlayer )/2
ScaleTexture TPlayer, 0.1, 0.1
EntityTexture EPlayer, TPlayer
EntityType EPlayer, 2
Collisions 2, 1, 2, 2

Type Vector
   Field X#
   Field Y#
   Field Z#
End Type

Velocity.Vector = New Vector
   Velocity\Y# = -0.2

Global KCamera = CreateCamera()
CameraViewport KCamera, 0, 0, 640, 480
PositionEntity KCamera, 0, 2, 0
EntityRadius KCamera, 1
EntityType KCamera, 3
Collisions 3, 1, 2, 1
TurnEntity KCamera, 90, 0, -90
MoveEntity KCamera, 0, 0, -4

Global PPivot = CreatePivot()
EntityParent KCamera, PPivot
TurnEntity PPivot, 0, 0, 60
 
Global XSpeed#, ZSpeed#
Const Maxspeed# = 0.3

timer = CreateTimer( 30 )
HidePointer

While Not KeyHit( 1 )
   UpdateWorld
   RenderWorld
   Positionplayer()
   Flip 0
   WaitTimer timer
Wend

End

Function Positionplayer()
   Local Altwinkel = Winkel
   Velo.Vector = First Vector
      Laenge# = Sqr( Velo\Z#^2 + Velo\X#^2 )
   If KeyDown( 200 ) Then
      Velo.Vector = First Vector
         If Laenge# < Maxspeed Then
            Velo\X# = Velo\X# + 0.01*Cos( Winkel )
            Velo\Z# = Velo\Z# + 0.01*Sin( Winkel )
         EndIf
   EndIf
   If KeyDown( 208 ) Then
      Velo.Vector = First Vector
         If Laenge# < Maxspeed Then
            Velo\X# = Velo\X# - 0.01*Cos( Winkel )
            Velo\Z# = Velo\Z# - 0.01*Sin( Winkel )
         EndIf
   EndIf
   MXSpeed = MouseXSpeed()
   If MXSpeed <> 0 Then
      TurnEntity EPlayer, 0, -MXSpeed, 0, 1
      TurnEntity PPivot, 0, -MXSpeed, 0, 1
      Winkel = Winkel - MXSpeed
   EndIf
   MYSpeed = MouseYSpeed()
   If MYSpeed > 0 And EntityRoll( PPivot, 1 ) - MYSpeed > 0 Then
      TurnEntity PPivot, 0, 0, -MYSpeed
   ElseIf MYSpeed < 0 And EntityRoll( PPivot, 1 ) - MYSpeed < 70 Then
      TurnEntity PPivot, 0, 0, -MYSpeed
   EndIf
   Velo.Vector = First Vector
      Local Vektorwinkel# = ATan2( -Velo\X#, Velo\Z# )
      Vektorwinkel# = Vektorwinkel# - ( Altwinkel - Winkel )*0.6
      Laenge# = Sqr( Velo\Z#^2 + Velo\X#^2 )
      Velo\Z# = Laenge#*Cos( Vektorwinkel# )
      Velo\X# = -Laenge#*Sin( Vektorwinkel# )
      Velo\Z# = Velo\Z#*0.97
      Velo\X# = Velo\X#*0.97
   Text 0, 0, "Z: " + Velo\Z# + " X: " + Velo\X# + " [LE] " + Laenge
   TranslateEntity EPlayer, Velo\X#, Velo\Y#, Velo\Z#, 1
   TurnEntity EPlayer, 0, 0, -( Laenge#/( MeshHeight( EPlayer )*Pi ) )*360
   PositionEntity PPivot, EntityX( EPlayer, 1 ), EntityY( EPlayer, 1 ), EntityZ( EPlayer, 1 ), 1
   PointEntity KCamera, EPlayer
   MoveMouse 320, 240
End Function


Wens interessiert, der kann sich hier den Level mit den Texturen runterladen (die Texturen sind hammermässig... )
Klick

Danke schon mal im Vorraus
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

hectic

Sieger des IS Talentwettbewerb 2006

BeitragFr, Okt 19, 2007 23:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Nee, du hast kein Geschwindigkeitsvektor, da du keine Fallbeschleunigung hast. Schaue dir mal folgenden Code an (Links: so wie es bei dir ist, Rechts: so wie es sein sollte).
Code: [AUSKLAPPEN]
Graphics 300,600,0,2
SetBuffer BackBuffer()

yp1#=0
yp2#=0
yg2#=0

While Not KeyHit(1)
   
   If yp1<500 Then yp1=yp1+2
   
   If yp2<500 Then yg2=yg2+.05 Else yg2=0
   yp2=yp2+yg2
   
   Rect 100,yp1,8,8,1
   Rect 200,yp2,8,8,1
   Flip
   Cls
Wend
End


edit1: Upss, sorry. Hab ausversehen die PN mit dem Beitrag verwechselt, dann gehts auf öffentlicher Ebene. Embarassed

Noobody

BeitragSa, Okt 20, 2007 0:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist auch nicht mehr ganz aktueller Code Razz
In meinem jetzigen Code hab ich das eingebaut mit Beschleunigung, aber trotzdem danke^^
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group