Wie am Besten ein Zugspiel programmieren

Übersicht BlitzBasic Blitz3D

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen

 

Platzi

Betreff: Noch immer ein Problem

BeitragMo, Mai 31, 2010 21:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

Also wir haben immer noch ein kleines Problem mit der Drehgeschichte. Der Code von dir, Midimaster, geht gut, nur leider hast du ja die Geschwindigkeit als Konstante festgelegt. Wenn ich dass durch ne Beschleunigung ersetze, ist das Problem, dass die Tram eine immer größere Kurve beschreibt, also müssten wir das fast von der Geschwindigkeit abhängig machen. Nur leider bin ich da kläglich gescheiter, sowohl in der Theorie als auch in der Praxis Sad

LG

Flo
 

Blitzjockey

Betreff: Re: Noch immer ein Problem

BeitragMo, Mai 31, 2010 22:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Platzi hat Folgendes geschrieben:

Wenn ich dass durch ne Beschleunigung ersetze, ist das Problem, dass die Tram eine immer größere Kurve beschreibt, also müssten wir das fast von der Geschwindigkeit abhängig machen.


Nicht fast, aber vollständig.
Wenn Du weisst wie lange der Strecke ist, und weisst wie schnell der Zug fährt, kannst Du berechnen wie lange der Zug für der Kurve braucht. (Strecke dividieren durch Geschwindigkeit = Zeit)
Wenn Du weisst wie lange der Zug braucht, und um wieviel Grad er sich drehen muss, weisst Du um wieviel Grad pro Zeiteinheit er sich drehen soll. (Winkel in Graden dividieren durch Zeit = Grad pro Zeiteinheit)

Da ihr aber in der letzte Code den ich gesehen habe, vollständig auf eine Zeitmessung verzichtet habt, wird das ein schwieriges Unterfangen.

Und zum Zeitmessen würde ich auch wieder Midimasters Tutorial empfehlen.

EDIT:

Embarassed Verstanden!! Holzchopf
  • Zuletzt bearbeitet von Blitzjockey am Mo, Mai 31, 2010 22:36, insgesamt einmal bearbeitet

Holzchopf

Meisterpacker

BeitragMo, Mai 31, 2010 22:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Blitzjockey, bitte zitiere in Zukunft nur gerade relevante Stellen oder Sätze. Aber ganze Beiträge zitieren ist böse, besonders wenn es sich dabei um den Vorgängerbeitrag handelt Wink

mfG
Holzchopf
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

Midimaster

BeitragMo, Mai 31, 2010 23:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Tatsache, dass unterschiedliche Geschwindigkeiten und sogar Beschleunigungen während der Kurverfahrt auftreten berücksichtigt mein Modell schon.

Dieser Test zeigt, dass es völlig egal ist, mit welcher Geschwindigkeit das Objekt unterwegs ist, den es gibt einen direkten Zusammenhang zwischen Speed und Winkel

Um das in euerem Modell zu verwirklichen muss also nur ein faktor eingeführt werden, der aus dem diesmal addierten Wegzuwachs den dazukommenden Winkelanteil ausrechnet.

Dann sind auch Beschleunigungen kein Problem mehr

Beweis:

In diesem Beispielprogramm bewegen sich alle auf dem gleichen Radius

BlitzBasic: [AUSKLAPPEN]
Graphics3D 800,800


camera=CreateCamera()
MoveEntity camera, -60,60,0
TurnEntity camera, 90,0,0
AmbientLight 255,255,255
tram=CreateCube()
tram2=CreateCube()
tram3=CreateCube()
tram4=CreateCube()
EntityColor tram4,255,0,0

Global a#=1
Global w#=1
Global b#=1

Repeat
MoveEntity tram,0,0,a
TurnEntity tram,0,w,0

MoveEntity tram2,0,0,a/2
TurnEntity tram2,0,w/2,0

MoveEntity tram3,0,0,a/7
TurnEntity tram3,0,w/7,0

MoveEntity tram4,0,0,b/7
TurnEntity tram4,0,b/7,0

RenderWorld
Text 100,100, "Press Q or A for Tram no. 4"
If KeyDown(16) Then
b=b*1.01
ElseIf KeyDown(30) Then
b=b/1.01
EndIf
Flip

Until KeyHit(1)

BastianA

BeitragDi, Jun 01, 2010 21:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, aber die Geschwidnigkeit kann man ja immer ändern, wenn man zum Beispiel den Leerlauf reintut, sind alle Drehungen ganz anders. Deine Beispiel Demo, wo du geändert hast funktioniert mit dem Code nicht mehr. Das Problem mit den Kurven ist ja eigentlich schon behoben, allerdings lässt sich die Geschwindigkeit nicht ohne Auswirkung auf den Winkel drehen. Wenn man jetzt Gang 2 einlegt dann stimmt der ganze Weg nicht und die Kurve wird Doppelt so groß. Mir fällt aber jetzt gar nichts mehr ein.
Code: [AUSKLAPPEN]

Graphics3D 1280, 1024, 32, 0
SetBuffer BackBuffer()
light = CreateLight()
RotateEntity light, 90, 0, 0
AppTitle "VTram 2"
font = LoadFont("Calibri",20,1)
SetFont font
timer = CreateTimer (60)
Tram = LoadMesh("1/nikon.3ds")
PositionEntity Tram, 0, 0, 0
RotateEntity Tram, 0, 55, 0

LightMesh Tram, -50, -50, -50, 200, 0, 1, 8

Map = LoadMesh("map.3ds")
PositionEntity map, 0, 0, 0

Box = LoadMesh("Skybox.3ds")
PositionEntity Box, 0, 0, 0

Global cam1=CreateCamera(Tram)

CameraRange cam1, 0.001, 40001

PositionEntity cam1, 0, 1.8, 5.5

CreateLight(1, Tram)
CreateLight(1, Map)
CreateLight(1, Signa1)

Baum1 = CreateCube()
PositionEntity Baum1, -5, 6, -07
textur1 = CreateTexture (1024, 1024, 4)
textur1 = LoadTexture ("baum7.bmp", 4)
EntityTexture  baum1, textur1
ScaleEntity Baum1, 0.001, 6, 6

Baum1a = CreateCube()
PositionEntity Baum1a, -5, 6, -07
EntityTexture  baum1a, textur1
ScaleEntity Baum1a, 0.001, 6, 6
RotateEntity Baum1a, 0, 90, 0

;Signale

; Beleuchtung:
Licht=CreateLight()
TurnEntity licht, 0,90,0
MoveEntity licht,-30,30,30

Global speed# = 0
Global break# = 0.0008
Global accelerate# = 0.00025
Global force# = 0.0001
Global Gangstufe# = 0


Repeat

   
   Text 10,20, "Weg:" + Int(FahrStrecke#)
   Text 10,40, "Himmelsrichtung:" + Int(Winkel#)
   Text 10,60, "Position-X:" + Int(EntityX(Tram))
   Text 10,80, "Position-Y:" + Int(EntityZ(Tram))
   Text 10,100, "Abschnitt:" + Int(Abschnitt)
   Text 10,120,"Aktuelle Geschwindigkeit: " + speed*100
   Flip 0
   
   
   
   If KeyDown (12) Then
Gangstufe# = 9
EndIf
If KeyDown (11) Then
Gangstufe# = 8
EndIf
If KeyDown (10) Then
Gangstufe# = 7
EndIf
If KeyDown (9) Then
Gangstufe# = 6
EndIf
If KeyDown (8) Then
Gangstufe# = 5
EndIf
If KeyDown (7) Then
Gangstufe# = 4
EndIf
If KeyDown (6) Then
Gangstufe# = 3
EndIf
If KeyDown (5) Then
Gangstufe# = 2
EndIf
If KeyDown (4) Then
Gangstufe# = 1
EndIf
If KeyDown (3) Then
Gangstufe# = 0
EndIf
If KeyDown (2) Then
Gangstufe# = -1
EndIf


If Gangstufe# = 1 And speed# < 0.07
speed# = speed# + accelerate# ;accelerate = Beschleunigung
EndIf

If Gangstufe# = 2 And speed# < 0.14
speed# = speed# + accelerate# ;accelerate = Beschleunigung
EndIf

If Gangstufe# = 3 And speed# < 0.21
speed# = speed# + accelerate# ;accelerate = Beschleunigung
EndIf

If Gangstufe# = 4 And speed# < 0.28
speed# = speed# + accelerate# ;accelerate = Beschleunigung
EndIf

If Gangstufe# = 5 And speed# < 0.35
speed# = speed# + accelerate# ;accelerate = Beschleunigung
EndIf

If Gangstufe# = 6 And speed# < 0.42
speed# = speed# + accelerate# ;accelerate = Beschleunigung
EndIf

If Gangstufe# = 7 And speed# < 0.49
speed# = speed# + accelerate# ;accelerate = Beschleunigung
EndIf

If Gangstufe# = 8 And speed# < 0.56
speed# = speed# + accelerate# ;accelerate = Beschleunigung
EndIf

If Gangstufe# = 9 And speed# < 0.63
speed# = speed# + accelerate# ;accelerate = Beschleunigung
EndIf


If Gangstufe# = 0 And speed > 0
speed# = speed# - force#
EndIf


If Gangstufe# = 1 And speed > 0.07
speed# = speed# - force#
EndIf

If Gangstufe# = 2 And speed > 0.14
speed# = speed# - force#
EndIf


If Gangstufe# = 3 And speed > 0.21
speed# = speed# - force#
EndIf


If Gangstufe# = 4 And speed > 0.28
speed# = speed# - force#
EndIf


If Gangstufe# = 5 And speed > 0.35
speed# = speed# - force#
EndIf


If Gangstufe# = 6 And speed > 0.42
speed# = speed# - force#
EndIf

If Gangstufe# = 7 And speed > 0.49
speed# = speed# - force#
EndIf

If Gangstufe# = 8 And speed > 0.56
speed# = speed# - force#
EndIf

If Gangstufe# = 9 And speed > 0.63
speed# = speed# - force#
EndIf

If Gangstufe# = 0 And speed < 0
speed# = speed# + force#
EndIf


If Gangstufe# = -1 And speed# < 0.63
speed# = speed# - accelerate# ;accelerate = Beschleunigung
EndIf


MoveEntity Tram, 0, 0, speed# / 2


If KeyDown(14) Then
PositionEntity cam1, 0, 1.8, 5.5
EndIf

If KeyDown(17) Then
MoveEntity cam1, 0, 0, +0.02
EndIf

 If KeyDown(44)
MoveEntity cam1, 0, 0, +0.2
EndIf

If KeyDown(31) Then
MoveEntity cam1, 0, 0, -0.02
EndIf

If KeyDown(32) Then
MoveEntity cam1, +0.02, 0, 0
EndIf

If KeyDown(201) Then
MoveEntity cam1, 0, +0.01, 0
EndIf

If KeyDown(209) Then
MoveEntity cam1, 0, -0.01, 0
EndIf

If KeyDown(30) Then
MoveEntity cam1, -0.02, 0, 0
EndIf

If KeyDown(16) Then
TurnEntity cam1,0,+02.5,0
EndIf

If KeyDown(18) Then
TurnEntity cam1,0,-02.5,0
EndIf


SoundId=LoadSound("Sounds\Motor2.wav")
LoopSound SoundId

If KeyDown(11) Then
Ma = Ma + 1
If Ma = 1 Then ChannelId=PlaySound(SoundId)
If Ma = 2 Then StopChannel ChannelId
If Ma = 3 Then Ma = 0
EndIf
SoundPitch SoundId, speed#*20000



UpdateWorld()
RenderWorld()

   
FahrStrecke#=FahrStrecke+speed#


;Geradeausfahrten:
   If Fahrstrecke>6 And Abschnitt=0 Then
      Abschnitt=1
   ElseIf Fahrstrecke>173 And Abschnitt=2 Then
      Abschnitt=3
   ElseIf Fahrstrecke>406 And Abschnitt=4 Then
      Abschnitt=5
   ElseIf Fahrstrecke>2000 And Abschnitt=6 Then
      Abschnitt=7
   ElseIf Fahrstrecke>3000 And Abschnitt=8 Then
      Abschnitt=9
   ElseIf Fahrstrecke>4000 And Abschnitt=10 Then
      Abschnitt=11
   Else
      
   EndIf


   
;Kurvenfahrten:
   If Abschnitt=1 Then
      If Winkel#<270 Then
         TurnEntity tram,0,0.2,0
      Else
         Abschnitt=2
      EndIf
   ElseIf Abschnitt=3 Then
      If Winkel#>180 Then
         TurnEntity tram, 0, -.1, 0
      Else
         Abschnitt=4
      EndIf
   ElseIf Abschnitt=5 Then
      If Winkel#<270 Then
         TurnEntity tram, 0, 0.063, 0
      Else
         Abschnitt=6
      EndIf
   ElseIf Abschnitt=7 Then
      If Winkel#>125 Then
         TurnEntity tram, 0, -.05, 0
      Else
         Abschnitt=8
      EndIf
   ElseIf Abschnitt=9 Then
      If Winkel#<180 Then
         TurnEntity tram, 0, 0.1, 0
      Else
         Abschnitt=10
      EndIf
   ElseIf Abschnitt=11 Then
      If Winkel#>1 Then
         TurnEntity tram,0 , -.45, 0
      Else
         PositionEntity Tram,0,1,0
         RotateEntity Tram,0,0,0         
         FahrStrecke=0
         Abschnitt=0
      EndIf
   Else
   
   EndIf

; Himmelsrichtung:
   winkel=(EntityYaw(tram)+360) Mod 360



Until KeyHit(1)
End

Midimaster

BeitragDi, Jun 01, 2010 21:51
Antworten mit Zitat
Benutzer-Profile anzeigen
wieso? das zweite beispiel zeigt deutlich, dass es möglich ist, die geschwindigkeit zu ändern, ohne dass der radius sich ändert. hast du es mal laufen lassen?


das erste beispiel läuft nicht mehr? Oh, sorry, das kann nur an einem kleinen Tippfehler liegen...ich check das gleich mal....

[EDIT]

So, Fehler gefunden und gleich Code verbessert. Ich hatte eine Null vergessen:

vorher:
Zitat:
MoveEntity Tram,0,0, 0.1
FahrStrecke#=FahrStrecke+.01
....
ElseIf Abschnitt=11 Then
If Winkel#>1 Then
TurnEntity tram,0, -0.45,0
Else


nachher:
Zitat:
MoveEntity Tram,0,0, 0.01
FahrStrecke#=FahrStrecke+ 0.01
....
ElseIf Abschnitt=11 Then
If Winkel#>1 Then
TurnEntity tram,0, -0.045,0
Else



korrigiertes Komplett-Programm siehe alte post.

BastianA

BeitragMi, Jun 02, 2010 9:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, aber das hängt ja mit der Geschwindigkeit zusammen.

Code: [AUSKLAPPEN]

MoveEntity tram4,0,0,b/7
   TurnEntity tram4,0,b/7,0


b kommt ja in der Geschwindigkeit sowie in der Kurve vor, aber wir möchten ja dass die Geschwindigkeit abhängig von der Kurve ist, die Tram soll immer im gleichen Gradwinkel drehen, egal wie viel man fährt.

Midimaster

BeitragMi, Jun 02, 2010 11:56
Antworten mit Zitat
Benutzer-Profile anzeigen
ich glaube, dass musst du mir nochmal genauer erklären. ich bin kein tram-spezialist...

folgende Fragen:

die Tram fährt sagen wir mal mit 30km/h auf eine weite Kurve zu. Wie geht es jetzt weiter?

die Tram fährt sagen wir mal mit 10km/h auf eine weite Kurve zu. Wie geht es jetzt weiter?

die Tram fährt sagen wir mal mit 30km/h auf eine enge Kurve zu. Wie geht es jetzt weiter?

der Spieler beschleunigt die Tram in der engen Kurve von 10km auf 20km. Wie geht es jetzt weiter?


Also ich denke, so wäre es realistisch:

Die Tram fährt zu schnell in eine enge Kurve -> jetzt muss die Geschwindigkeit abgebremst werden. (eigentlich vorher!)

Die Tram fährt zu langsam in eine Kurve -> die Geschwindigkeit wird beibehalten.


Soll deine Tram denn automatisch regeln, wie die optimale Geschwindigkeit wäre, oder soll dass eigentlich der Spieler machen?



Bei dem Ansatz von mir, musst du doch nur der Tram am Anfang der Kurve eine neue Geschwindigkeit zuweisen, damit sie mit dieser Geschwindigkeit dann durch die Kurve fährt, oder?

Stell dir das ganze mal nicht als Simulation, sondern in REAL vor. Da kann man doch auch die Tram nicht durch die Kurve rastern lassen. Die einzige Chance die du mit einer Tram hast, ist sie zu beschleunigen oder zu bremsen. Und nur dieser Ansatz sieht im Spiel auch realistsich aus. Die Tram muss jeden Meter "zu Fuss" fahren, um durch die Kurve zu kommen. Für sie ist die Kurve eigentlich auch nur eine bestimmte "Strecke", die sie dank Geschwindigkeit überwinden kann. Und Geschwindigkeit ist das ihr einzig zur Verfügung stehende Mittel.
 

Blitzjockey

BeitragMi, Jun 02, 2010 12:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Aber, wenn er immer den gleiche Gradwinkel fährt, dann ist der größe der Kurve nicht fix. Dann wird der Kurve größer werden, wenn er schneller fährt.

Oder, anders gesacht, ihr solltet euch Gedanken machen über das unterschiedt zwischen der Kurvenwinkel - und der Winkelschritten.

Der Kurvenwinkel ist der "ganze" Winkel, den zwischen Eure beide rote Linien.
Der Winkelschritten sind die ganz kleine Schritten welche der Zug, Bild für Bild, durchmacht um den ganze Kurvenwinkel zu erreichen.

Blitz macht das ganze eigentlich wie im Film. Jedes mal wird der Zug ein paar Zentimeter weiter nach vorne gesetzt (MoveEntity) oder um ein paar Grad gedreht (TurnEntity), und dann ein neues Bild auf der Monitor gezeichnet.
In dem Moment wo der Zug schneller fährt, ist er kurzer (Zeitgemäß) in der Kurve. Der Kurvenlänge ändert sich ja nicht, aber der Geschwindigkeit der Zug schon.
Wenn man kurzer in der Kurve ist, muss man, pro Bild das Blitz zeichnet, ein größere Happen von der Kurve durchdrehen.

Und das ist genau was der Code von Midimaster macht. In dem Moment wo ihr schneller fährt, wird auch der Winkelschritt erhöht.
Das heisst nicht das der Kurvenwinkel angepasst wird, nur der ganz viele kleine zwischen-schritten werden geändert. Weniger Schritten, dafür aber etwas größer.

Wenn Der Zug der Kurve nicht genau folgt mittels
BlitzBasic: [AUSKLAPPEN]

MoveEntity tram4,0,0,b/7
TurnEntity tram4,0,b/7,0

kann man der Teil-factor "7" ändern, aber nur entweder bei der TurnEntity, oder bei MoveEntity:
BlitzBasic: [AUSKLAPPEN]

MoveEntity tram4,0,0,b/7
TurnEntity tram4,0,b/4,0 ; <--- Hier habe ich B/7 in B/4 geändert.

Hier habe ich "b/7" geändert in "b/4", aber nur in der TurnEntity-abschnitt. Jetzt bewegt er sich immer noch "b/7" nach vorne, dreht aber ein etwas heftigere Winkel "b/4" durch.
Der Kurve ist nun kleiner geworden, aber immer noch gebunden an der Geschwindigkeit. Und damit fixiert auf eine bestimmte Radius.

Ihr müsstest nur den richtigen Factor "/4" herausfinden. Entweder berechnen oder durch versuchen.

EDIT:
Very Happy Und schon wieder war Midimaster schneller.
Ja, so habe ich es erst nicht verstanden - wenn der Zug selbständig seine Geschwindigkeit an der Kurve anpassen soll, wird's ja Komplizierter...

Midimaster

BeitragMi, Jun 02, 2010 12:39
Antworten mit Zitat
Benutzer-Profile anzeigen
@blitzjockey

Genauso wie du sagst ist es. Aber es wird durch ev. Beschleunigungen nicht komplizierter. Der akt. Kurverschritt erfolgt mit der akt Geschwindigkeit und der daraus errechneten Winkeldrehung. Beides korrespondiert und daher wird der gewünschte Radius eingehalten. Ändert sich dann die Geschwindigkeit, wird ja in der neuen Berechnungsrunde auch mit den veränderten Werten gerechnet und so korresponiert wieder der Winkel und die Speed. Folge der gewünschte Radius wird eingehalten.

BastianA muss nur für jede seiner Kurven einen Faktor f finden, der den Radius genau trifft, was man schon in meinem ersten Beispielprogramm sieht. Dort fährt die Bahn ja unterschiedliche Radien. Villeicht wurde das nur nicht so deutlich, weil ja die Speed in dem Beispiel immer 1 war. Mann könnte an den ansprechenden Stellen aber auch schreiben:
BlitzBasic: [AUSKLAPPEN]

Speed#=1.0 ; oder was auch immer
...
...
For I=0 To 9
MoveEntity Tram, 0, 0, Speed*.01
FahrStrecke#=FahrStrecke + Speed*.01
...


BlitzBasic: [AUSKLAPPEN]
...
If Abschnitt=1 Then
If Winkel#<82 Then
TurnEntity tram,0, Speed*0.03,0
Else
Abschnitt=2
EndIf
...


0.03 ist in dem Fall der von dir angesprochene Faktor, der den Kurvenradius festlegt. Er kann durch ausprobieren herausgefunden werden.

Ich habe auch schon ein Beispiel für eine ev, Fehlerkorrektur eingefügt. Am Ende der Fahrtstrecke wir nämlich in meinem Beispielcode die Tram "zurechtgerückt", falls sich ein Fehler ergeben hat.

BlitzBasic: [AUSKLAPPEN]
...
ElseIf Abschnitt=11 Then
If Winkel#>1 Then
....
Else
PositionEntity Tram,0,1,0
RotateEntity Tram,0,0,0
FahrStrecke=0
Abschnitt=0
EndIf
Else
 

Blitzjockey

BeitragMi, Jun 02, 2010 13:40
Antworten mit Zitat
Benutzer-Profile anzeigen
@ Midimaster
Ja, ich habe mein Eintrag auch nicht als Antwort auf Dein Nachricht geschrieben - Du warst aber wieder etwas schneller. Very Happy

Ich habe es auch so versucht zu erklären das der Geschwindigkeit (bzw Beschleunigung) und Kurven-radius mittels MoveEntity und TurnEntity 'gleich' sind. Aber Du schreibst es etwas eleganter! (um Einiges)

Das einzige was ich letztendlich zugefügt habe ist der KurvenFactor, damit eventuele Kurven mit unterschiedliche Radii im Programm eingebaut werden können. Oder, der Kurve von der Tram an der aktuelle Kurve von den Gleissen angepasst werden kann.

Lg, BlitzJ.

BastianA

BeitragMi, Jun 02, 2010 13:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, aber nun hängt ja alles immernoch mit der Geschwindigkeit zusammen.

die Tram fährt sagen wir mal mit 30km/h auf eine weite Kurve zu. Wie geht es jetzt weiter? -> Die Tram dreht sich um den Faktor z.B. 0.03 aber die Geschwindigkeit spielt keine Rolle; der Kurvenradius muss dabei immer derselbe sein

die Tram fährt sagen wir mal mit 10km/h auf eine weite Kurve zu. Wie geht es jetzt weiter? -> gleiche wie oben

die Tram fährt sagen wir mal mit 30km/h auf eine enge Kurve zu. Wie geht es jetzt weiter? ->gleiche wie oben; Geschwindigkeit spielt keine Rolle und Kurvenradius muss immer gleich sein

der Spieler beschleunigt die Tram in der engen Kurve von 10km auf 20km. Wie geht es jetzt weiter? ->Die Tram fährt dann eben 20 kmh aber der Radius bleibt derselbe

Also ich denke, so wäre es realistisch:

Die Tram fährt zu schnell in eine enge Kurve -> jetzt muss die Geschwindigkeit abgebremst werden. (eigentlich vorher!) -> Ne, das ändert nichts an der Kurve, weil die Schienen sind ja fest; Radius bleibt wie vorgegeben und Speed -> keine Rolle

Die Tram fährt zu langsam in eine Kurve -> die Geschwindigkeit wird beibehalten -> genau; aber zu langsam ist eigentlich nicht richtig, Spieler kann ja anhand der Gangschaltung die Geschwindigkeit einstellen.

Soll deine Tram denn automatisch regeln, wie die optimale Geschwindigkeit wäre, oder soll dass eigentlich der Spieler machen? -> Nein, das macht alles der Spieler also im Klartext:

Radius muss immer gleich bleiben, egal welche Geschwindigkeit und Spieler kann Geschwindigkeit selber wählen

Radius f habe ich für die Kruven schon getroffen da es nur 3 Kurvenradien gibt, Eng, Mittel und Weit.
Radius für eine Enge Kurve ist 0.2; Mittel = 0,05; Weite: 0.01; Kurven stimmen nur in der .3ds nicht überein, da muss ich aber nur die Polys verschieben Wink

Für was steht denn das:
Code: [AUSKLAPPEN]

For I=0 To 9


Speed ist in dem Fall das Getriebe, das steht aber schon fest, udn der Faktor ist dafür eigentlich mal 1, passt aber besser speed#/2

Also nun habe ich mal MidMasters Code eingebaut, allerdings hängt der Radius wieder vom Speed ab, und genau dass will ich nicht. Radius soll immer gleich bleiben, wie vorgegeben und Geschwindigkeit kann frei vom Spieler verändert werden, das geht aber schon. Speed# habe ich mal durch 2 geteil überall weil sonst die km/h nicht direkt stimmen.
Aktueller Code:

Code: [AUSKLAPPEN]

Graphics3D 800, 600, 32, 0
SetBuffer BackBuffer()
light = CreateLight()
RotateEntity light, 90, 0, 0
AppTitle "VTram 2"
font = LoadFont("Calibri",20,1)
SetFont font

Tram = LoadMesh("1/nikon.3ds")
PositionEntity Tram, 0, 0, 0
RotateEntity Tram, 0, 55, 0

LightMesh Tram, -50, -50, -50, 200, 0, 1, 8

Map = LoadMesh("map.3ds")
PositionEntity map, 0, 0, 0

Box = LoadMesh("Skybox.3ds")
PositionEntity map, 0, 0, 0

Global cam1=CreateCamera(Tram)

CameraRange cam1, 0.001, 40001

PositionEntity cam1, 0, 1.8, 5.5

CreateLight(1, Tram)
CreateLight(1, Map)

Baum1 = CreateCube()
PositionEntity Baum1, -5, 6, -07
textur1 = CreateTexture (1024, 1024, 4)
textur1 = LoadTexture ("baum7.bmp", 4)
EntityTexture  baum1, textur1
ScaleEntity Baum1, 0.001, 6, 6

Baum1a = CreateCube()
PositionEntity Baum1a, -5, 6, -07
EntityTexture  baum1a, textur1
ScaleEntity Baum1a, 0.001, 6, 6
RotateEntity Baum1a, 0, 90, 0


; Beleuchtung:
Licht=CreateLight()
TurnEntity licht, 0,90,0
MoveEntity licht,-30,30,30

Global speed# = 0
Global break# = 0.0008
Global accelerate# = 0.00025
Global force# = 0.0001
Global Gangstufe# = 0

While Not KeyHit(1)

If KeyDown (12) Then
Gangstufe# = 9
EndIf
If KeyDown (11) Then
Gangstufe# = 8
EndIf
If KeyDown (10) Then
Gangstufe# = 7
EndIf
If KeyDown (9) Then
Gangstufe# = 6
EndIf
If KeyDown (8) Then
Gangstufe# = 5
EndIf
If KeyDown (7) Then
Gangstufe# = 4
EndIf
If KeyDown (6) Then
Gangstufe# = 3
EndIf
If KeyDown (5) Then
Gangstufe# = 2
EndIf
If KeyDown (4) Then
Gangstufe# = 1
EndIf
If KeyDown (3) Then
Gangstufe# = 0
EndIf
If KeyDown (2) Then
Gangstufe# = -1
EndIf


If Gangstufe# = 1 And speed# < 0.07
speed# = speed# + accelerate# ;accelerate = Beschleunigung
EndIf

If Gangstufe# = 2 And speed# < 0.14
speed# = speed# + accelerate# ;accelerate = Beschleunigung
EndIf

If Gangstufe# = 3 And speed# < 0.21
speed# = speed# + accelerate# ;accelerate = Beschleunigung
EndIf

If Gangstufe# = 4 And speed# < 0.28
speed# = speed# + accelerate# ;accelerate = Beschleunigung
EndIf

If Gangstufe# = 5 And speed# < 0.35
speed# = speed# + accelerate# ;accelerate = Beschleunigung
EndIf

If Gangstufe# = 6 And speed# < 0.42
speed# = speed# + accelerate# ;accelerate = Beschleunigung
EndIf

If Gangstufe# = 7 And speed# < 0.49
speed# = speed# + accelerate# ;accelerate = Beschleunigung
EndIf

If Gangstufe# = 8 And speed# < 0.56
speed# = speed# + accelerate# ;accelerate = Beschleunigung
EndIf

If Gangstufe# = 9 And speed# < 0.63
speed# = speed# + accelerate# ;accelerate = Beschleunigung
EndIf


If Gangstufe# = 0 And speed > 0
speed# = speed# - force#
EndIf

If Gangstufe# = 0 And speed < 0
speed# = speed# + force#
EndIf


If Gangstufe# = -1 And speed# < 0.63
speed# = speed# - accelerate# ;accelerate = Beschleunigung
EndIf

If KeyDown(14) Then
PositionEntity cam1, 0, 1.8, 7
EndIf

If KeyDown(17) Then
MoveEntity cam1, 0, 0, +0.02
EndIf

 If KeyDown(44)
MoveEntity cam1, 0, 0, +0.2
EndIf

If KeyDown(31) Then
MoveEntity cam1, 0, 0, -0.02
EndIf

If KeyDown(32) Then
MoveEntity cam1, +0.02, 0, 0
EndIf

If KeyDown(201) Then
MoveEntity cam1, 0, +0.01, 0
EndIf

If KeyDown(209) Then
MoveEntity cam1, 0, -0.01, 0
EndIf

If KeyDown(30) Then
MoveEntity cam1, -0.02, 0, 0
EndIf

If KeyDown(16) Then
TurnEntity cam1,0,+02.5,0
EndIf

If KeyDown(18) Then
TurnEntity cam1,0,-02.5,0
EndIf


SoundId=LoadSound("Sounds\Motor2.wav")
LoopSound SoundId

If KeyDown(11) Then
Ma = Ma + 1
If Ma = 1 Then ChannelId=PlaySound(SoundId)
If Ma = 2 Then StopChannel ChannelId
If Ma = 3 Then Ma = 0
EndIf
SoundPitch SoundId, speed#*20000


UpdateWorld()
RenderWorld()

MoveEntity Tram, 0, 0, speed# / 2
FahrStrecke#=FahrStrecke + Speed# / 2
   

;Geradeausfahrten:
   If Fahrstrecke>6 And Abschnitt=0 Then
      Abschnitt=1
   ElseIf Fahrstrecke>100 And Abschnitt=2 Then
      Abschnitt=3
   ElseIf Fahrstrecke>86 And Abschnitt=4 Then
      Abschnitt=5
   ElseIf Fahrstrecke>160 And Abschnitt=6 Then
      Abschnitt=7
   ElseIf Fahrstrecke>188 And Abschnitt=8 Then
      Abschnitt=9
   ElseIf Fahrstrecke>235 And Abschnitt=10 Then
      Abschnitt=11
   Else
      
   EndIf


   
;Kurvenfahrten:
         If Abschnitt=1 Then
      If Winkel#<270 Then
         TurnEntity Tram,0, Speed# / .4,0
      Else
         Abschnitt=2
      EndIf      
   If Abschnitt=3 Then
      If Winkel#<90 Then
         TurnEntity Tram,0, Speed# / -.4,0
      Else
         Abschnitt=4
      EndIf
   ElseIf Abschnitt=5 Then
      If Winkel#>270 Then
         TurnEntity tram, 0, -.05, 0
      Else
         Abschnitt=6
      EndIf
   ElseIf Abschnitt=7 Then
      If Winkel#>125 Then
         TurnEntity tram, 0, -.05, 0
      Else
         Abschnitt=8
      EndIf
   ElseIf Abschnitt=9 Then
      If Winkel#<180 Then
         TurnEntity tram, 0, 0.1, 0
      Else
         Abschnitt=10
      EndIf
   ElseIf Abschnitt=11 Then
      If Winkel#>1 Then
         TurnEntity tram,0 , -.45, 0
      Else
         PositionEntity Tram,0,1,0
         RotateEntity Tram,0,0,0         
         FahrStrecke=0
         Abschnitt=0
      EndIf
   Else
   
   EndIf

; Himmelsrichtung:
   winkel=(EntityYaw(tram)+360) Mod 360
   
UpdateWorld
RenderWorld   
Text 10,20, "Weg:" + Int(FahrStrecke#)
   Text 10,40, "Himmelsrichtung:" + Int(Winkel#)
   Text 10,60, "Position-X:" + Int(EntityX(Tram))
   Text 10,80, "Position-Y:" + Int(EntityZ(Tram))
   Text 10,100, "Abschnitt:" + Int(Abschnitt)
   Text 10,550, "Press P for PAUSE"
   Text 10,120,"Aktuelle Geschwindigkeit: " + speed*100
Flip
Wend
End


EDIT: habe mal die Reihenfolge mit dem Repeat und so geändert, weil ich das schon immer so gehabt habe, jetzt krieg ich die Fehlermeldung "Wend" without "While" dabei habe ich ja oben schon "While Not KeyHit(1)" stehen :S
 

Blitzjockey

BeitragMi, Jun 02, 2010 13:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja...

Ihr müsst aber schon consequent bleiben:

BlitzBasic: [AUSKLAPPEN]
;Kurvenfahrten:
If Abschnitt=1 Then
If Winkel#<270 Then
TurnEntity Tram,0, Speed# / .4,0

habt ihr richtig geschrieben (davon ausgehen dass ihr .4 auf der Kurve angepasst habt: Dann lese ich:
BlitzBasic: [AUSKLAPPEN]
 ElseIf Abschnitt=5 Then
If Winkel#>270 Then
TurnEntity tram, 0, -.05, 0

Und da habt ihr den Speed# nicht eingefügt (Ab da bei keinem einzige Abschnitt mehr). Dann ist Geschwindigkeit tatächlich nicht mehr an der Kurvenradius gebunden. Da müßt ihr "-0.05" ändern in (- Speed * 0.05). Oder den Factor muss da dann wieder angepasst werden, ich weiss nicht genau im welchen Speed-bereich das liegt.

Ansonsten braucht man auch nur 1x
BlitzBasic: [AUSKLAPPEN]

UpdateWorld
RenderWorld

zu schreiben.
Der Rest kostet nur unnötige Rechenleistung.

Lg,
BlitzJ.

EDIT: Dividieren in Multiplizieren geändert.

Midimaster

BeitragMi, Jun 02, 2010 14:30
Antworten mit Zitat
Benutzer-Profile anzeigen
da ist ein Fehler im Code:

Zitat:
If Abschnitt=1 Then
If Winkel#<270 Then
TurnEntity Tram,0, Speed# / .4,0
Else
Abschnitt=2
EndIf
If Abschnitt=3 Then


Zitat:
If Abschnitt=1 Then
If Winkel#<270 Then
TurnEntity Tram,0, Speed# / .4,0
Else
Abschnitt=2
EndIf
ElseIf Abschnitt=3 Then


da ist viel Unnötiges in deinem Code:


1.
z.B gibt es 2x RenderWorld()
Das letztere reicht.


2.
UpdateWorld()
brauchst du erst, wen es um Kollisionen geht.


3.
Wie ich sehe, hast du die Variable Speed# eingebaut. Aber!! Du musst sie natürlich ÜBERALL einbauen, wo von Winkeln die Rede ist. (Abschnitt 5 usw...) Ich gebe dir natürlich immer nur einen Gedanken vor. Verstehen und umsetzen musst du ihn dann natürlich alleine.


4.
die Variable Speed# stellt ja den echten Wert im Spiel da. Belasse sie so! Wenn du eine Anzeige in km/h wünscht, dann rechne dies nur zum Anzeigen aus Speed aus!

BlitzBasic: [AUSKLAPPEN]
Text 100,100,"Tempo= " speed*2 + " km/h"


sonst kommst du bei Berechnungen durcheinander. z.b. zählst du bei der Tramstrecke speed#/2 dazu, aber in den Kurvenradien steht dann wieder nur speed#/0.04, obwohl es genau genommen speed#/2/0.04 lauten müsste. Das ist Quatsch. So ist es richtig:

BlitzBasic: [AUSKLAPPEN]
MoveEntity Tram, 0, 0, speed#
FahrStrecke#=FahrStrecke + Speed#

bzw
BlitzBasic: [AUSKLAPPEN]
TurnEntity Tram, 0, Speed# /0.4, 0

bzw
BlitzBasic: [AUSKLAPPEN]
Text 100,100,"Tempo= " speed*2 + " km/h"





Die 10-fache FOR/NEXT

Die 10-fache FOR/NEXT erhöht die Genauigkeit deiner Strecke. Dazu habe ich aber schon ganz viel geschrieben...

"Mache 10 Durchläufe und zähle dafür immer nur ein 1/10tel der gewollten Werte dazu. Das erhöht die Genauigkeit der Streckenführung von 90% auf 99%."

BlitzBasic: [AUSKLAPPEN]
...
For I=0 To 9
....
MoveEntity Tram, 0, 0, speed#/10
FahrStrecke#=FahrStrecke + Speed#/10

....
....
If Fahrstrecke>6 And Abschnitt=0 Then
Abschnitt=1
....
.....
TurnEntity Tram, 0, Speed# /10/0.4, 0[/syntax]
; und auch alle weiteren Kurven!
....

Next
....
text 100,100,"Tempo= " speed*2 + " km/h"[/syntax]



Vieles lässt sich kürzen. Alle diese Zeilen:

BlitzBasic: [AUSKLAPPEN]
If Gangstufe# = 1 And speed# < 0.07
speed# = speed# + accelerate# ;accelerate = Beschleunigung
EndIf

If Gangstufe# = 2 And speed# < 0.14
speed# = speed# + accelerate# ;accelerate = Beschleunigung
EndIf

...usw usw




wird zu dieser Anweisung:

BlitzBasic: [AUSKLAPPEN]


If GangStufe<0 Then
If speed > GangStufe*0.7 Then
speed = speed - accelerate
EndIf

Else
If speed < GangStufe*0.7 Then
speed = speed + accelerate
EndIf

EndIf

Speed=Speed* force


Theorie:

Force bremst die Bahn immer. Es ist die Reibung. Die bremst auch, wenn noch Speed gegeben wird. Nimmst du den Gang raus, dann übernimmt sofort force die Oberhand und wird dir die Bahn bremsen. Egal ob sie vorwärst oder Rückwärst fährt. Wirkt viel natürlicher, allerdings musst du jetzt einen neuen Force-Wert durch probieren herausfinden und wird wohl irgendwo zwischen 0.990 und 0.999 liegen

[EDIT]
ah, diesmal war Blitzjockey schneller. Smile

mpmxyz

Betreff: Warnung: Mathematik!

BeitragMi, Jun 02, 2010 18:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Man muss nicht unbedingt irgendwelche Annahmen machen, die Winkelgeschwindigkeit festzulegen, damit man dieses Thema erledigt hat:
Es gibt eine Gleichung für Kreisbahnen - also auch kreisförmigen Kurven -, welche ein Verhältnis zwischen der Winkelgeschwindigkeit w, der Bahngeschwindigkeit v und dem Bahnradius r festlegt:
v=w*r
Hierbei gilt, dass die Winkelgeschwindigkeit w die Geschwindigkeit im Bogenmaß ist. (Übersetzt in eine Formel: 2*Pi/s Bogenmaß = 360°/s Gradmaß)
Da die Winkelgeschwindigkeit w gesucht ist, wird die Gleichung umgeformt:
w=v/r
Mit Berücksichtigung des in B3D verwendeten Gradmaßes kommt man auf diese Formel:
w=(v/r)/Pi*180
Es ist bei dieser Formel egal, ob sie für die Drehung des Zuges um einen "Kurven-Pivot" oder für die eigenständige Drehung des Zuges verwendet wird.
Um einen Drehwinkel zu bekommen, muss man den erhaltenen Wert aber noch mit der vergangenden Zeit multiplizieren. (Die Winkelgeschwindigkeit muss aber nicht unbedingt in °/s angegeben sein; °/Frame wäre auch möglich, wobei dann immer mit 1 multipliziert wird, wenn die Drehung jeden Frame stattfindet.)
mfG
mpmxyz
Edit: Es geht eigentlich darum, den nötigen Dreh-Faktor zur Bewegungsgeschwindigkeit in Abhängigkeit zum Kurvenradius zu berechnen. Es tut mir Leid, dass ich mich ziemlich umständlich ausgedrückt habe.
Für die Drehung gilt einfach diese Formel:
BlitzBasic: [AUSKLAPPEN]
Drehung=zurueckzulegeneStrecke/Kurvenradius/Pi*180

Ich sollte vielleicht weniger Uni-HAs gleichzeitig zum Beitragsschreiben machen. Razz
Edit2: Dieser Beitrag ist eine mehr oder weniger direkte Antwort auf diesen Beitrag.
  • Zuletzt bearbeitet von mpmxyz am Mi, Jun 02, 2010 20:36, insgesamt 2-mal bearbeitet

Midimaster

BeitragMi, Jun 02, 2010 19:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Häääh?

also.. ich wüßte auch noch einen Weg, der unter Zuhilfenahme von zwei Atan2 der Vektornormalen, der Erdbeschleunigung unter Berücksichtigung der akt. Entfernung Mars-Jupiter in Lichtjahren ebenso zweifelsfrei und völlig mathematisch die Tram durch die Kurve bringt. Aber man muss sich voher mit den Zerfallstabellen von Uran32 auseinanderngesetzt haben.... Wink

Aber ob das unser BastianA checkt?

Nein wirklich: Die Kreisstrecke ist immer direkt proportional zum dabei überstrichenen Winkel. Wenn 1cm Kreisbahn 15° durchliefen, werden bei 10cm Kreisbahn 150° abgefahren. Ich kann also zweifelfrei aus der zuückgelegten Strecke auf den bereits durchfahrenen Winkel schließen.

Der Junge muss nur mal den Code fehlerfrei hinkriegen, dann läuft es auch.

@BastianA
ich helfe dir hier sehr gerne, trau dich ruhig zu fragen, wenn etwas nicht klar ist. Findest du mein Modell deckt noch nicht ganz deine Anforderungen an die zukünftige Tram ab?
 

TheMuffi

BeitragDo, Jun 03, 2010 0:41
Antworten mit Zitat
Benutzer-Profile anzeigen
sorry,
aber als noob hab ich da mal ne klitzekleine frage:

ich hab den kompletten code durchgelesen und habs vom beschleunigen her bei mir auch so ähnlich... aber wieso hast du Geschwindigkeit# als Variabel genommen?
das ändert sich doch eh nicht, da du sowieso nur speed# benutzt
 

Blitzjockey

BeitragDo, Jun 03, 2010 2:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaube, das letzte mal das BastianA in diese Code "Geschwindigkeit#" benutzt hat, war auf Seite 1. Und das ist schon eine weile her!

BastianA

BeitragDo, Jun 03, 2010 8:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Jaaa, es funzt jetzt, besonderen Dank an Midmaster und blitzjockey.

Die Variable Geschwindigkeit habe ich noch von der Ersten Seite, aber die kann eigentlich raus, kleine Unordnung halt Very Happy

@mpxyz: Also deine Methode ist ja noch komplizierter, da Blick ich nicht durch.

EDIT:
Eine letzte Frage habe ich noch. Ich möchte eine Ampel erstellen, also habe ich 4 Ampeln gemalt und die in ein .bmp von Größe 512 x 512 gespeichert. Dann habe ich erstmal nen Quader erstellt, Position verändert und gescalt.
Code: [AUSKLAPPEN]
Amp1 = CreateCube()
PositionEntity Amp1, 44.544, 4.75, -15.811
ScaleEntity Amp1, 0.01, 0.32, 0.12

So, dann lade ich mti LoadAnimTexture die Textur, jedes ist 128 breit und 512 hoch, Starframe liegt bei 0, ist ja eigentlich egal und es gibt 4 Textur Frames (Rot,Geb,Grün, Rot & Gelb).

Code: [AUSKLAPPEN]
tAmp1 = LoadAnimTexture("Signale/ampel.bmp", 1, 128, 512, 0, 4)
EntityTexture Amp1, tAmp1, 3


Dan weiße ich das mit EntityTexture zu, Texturframes habe ich 3 angegeben, wenn ich 4 angebe ist der ganze Quader grau, aber woher weiß Blitz eigentlich wann es umschalten soll ?

Texturframe heißt ja wie oft in der Sekunde er umschalten soll, wenn ich jetzt 0.1 hinschreibe müsste er jede 6 Sekunden umschalten, tut er aber nicht. Das Bild bleibt immer auf Startframe 0, was mache ich falsch ?

Midimaster

BeitragDo, Jun 03, 2010 11:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei LoadAnimTexture() handelt es sich zwar um eine Texture, die man animieren kann, aber du musst selbst für das Weiterschalten der Zustände sorgen.

BlitzBasic: [AUSKLAPPEN]
tAmp1 = LoadAnimTexture("Signale/ampel.bmp", 1, 128, 512, 0, 4)
Global AmpleZeit%, AmpleFrame%
....
While KeyHit(1)
....
If AmpelZeit<MilliSecs() Then
AmpelZeit = MilliSecs() + 6*1000
AmpelFrame = (AmpelFrame +1) Mod 4
EntityTexture Amp1, tAmp1, AmpelFrame
EndIf
....


Hier eine klassische Zeitsteuerung wie du sie in meinem Timer-Tutorial lernen kannst.

https://www.blitzforum.de/foru...hp?t=34436

Innerhalb der Hauptschleife wird ein Timer AmpelZeit% gecheckt und immer wenn der von Millisecs() überholt wird wird er neu gesetzt und x Sekunden dazugezählt. Dann wird noch der anzuzeigende Frame AmpelFrame% auf das nächste Bild erhöht und die Texture auf die Ampel gebracht.

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group