Wie am Besten ein Zugspiel programmieren
Übersicht

PlatziBetreff: Noch immer ein Problem |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() LG Flo |
||
BlitzjockeyBetreff: Re: Noch immer ein Problem |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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: ![]() |
||
- Zuletzt bearbeitet von Blitzjockey am Mo, Mai 31, 2010 22:36, insgesamt einmal bearbeitet
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() mfG Holzchopf |
||
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
![]() |
BastianA |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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]
kann man der Teil-factor "7" ändern, aber nur entweder bei der TurnEntity, oder bei MoveEntity: BlitzBasic: [AUSKLAPPEN]
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: ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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]
BlitzBasic: [AUSKLAPPEN] ... 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] ... |
||
Blitzjockey |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@ Midimaster
Ja, ich habe mein Eintrag auch nicht als Antwort auf Dein Nachricht geschrieben - Du warst aber wieder etwas schneller. ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ja...
Ihr müsst aber schon consequent bleiben: BlitzBasic: [AUSKLAPPEN] ;Kurvenfahrten: habt ihr richtig geschrieben (davon ausgehen dass ihr .4 auf der Kurve angepasst habt: Dann lese ich: BlitzBasic: [AUSKLAPPEN] ElseIf Abschnitt=5 Then 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]
zu schreiben. Der Rest kostet nur unnötige Rechenleistung. Lg, BlitzJ. EDIT: Dividieren in Multiplizieren geändert. |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
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# 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] ... .... .... 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 wird zu dieser Anweisung: BlitzBasic: [AUSKLAPPEN]
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. ![]() |
||
![]() |
mpmxyzBetreff: Warnung: Mathematik! |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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.... ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() @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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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) 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. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group