Von Punkt zu Punkt [solved]

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

N0X

Betreff: Von Punkt zu Punkt [solved]

BeitragSo, Jan 19, 2014 17:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey Leute,
Ich sitze im Moment an einem Bewegungsablauf meiner Gegner.
Ich weiß leider nicht wirklich wie ich ansetzen soll...
Mein Gegner bekommt in der Methode Move() eine neue Position zugewiesen und soll über die Methode upd() von der alten Position langsam zur neuen bewegt werden.

Könnt ihr mir vllt. helfen und mir sagen was an meinem Ansatz verkehrt ist?
Ich habe den Verdacht, dass an der Winkelberechnung was nicht stimmt.

BlitzMax: [AUSKLAPPEN]
Type TEnemy
Global list:TList = New TList

Field new_x:Float,new_y:Float,new_z:Float
Field old_x:Float,old_y:Float,old_z:Float
Field mesh:TEntity

Method Init:TEnemy(tmpX:Int,tmpZ:Int)
list.addLast(Self)
Self.mesh = LoadAnimMesh("./models/dwarf1.b3d")

Self.old_x = tmpX
Self.old_y = 0
Self.old_z = tmpZ
Self.mesh.PositionEntity(Self.old_x,Self.old_y,Self.old_z)

Return(Self)
EndMethod
Method Move(tmpX:Int,tmpZ:Int)
'remember old coordinates
Self.old_x = Int(EntityX(Self.mesh))
Self.old_y = 0
Self.old_z = Int(EntityZ(Self.mesh))

Self.new_x = tmpX
Self.new_y = 0
Self.new_z = tmpZ

Local xdiff:Int = Self.old_x - Self.new_x
Local zdiff:Int = Self.old_z - Self.new_z
Local yaw:Float = ATan2(xdiff,-zdiff)
Self.mesh.RotateEntity(0,yaw,0,True)
EndMethod
Method upd()
If Self.old_z <> Self.new_z Then
If Self.old_z < Self.new_z Then
Self.old_z = Self.old_z +.5
ElseIf Self.old_z > Self.new_z
Self.old_z = Self.old_z -.5
EndIf
Self.mesh.PositionEntity(Self.old_x,Self.old_y,Self.old_z)
EndIf

If Self.anim<>Self.old_anim Then Self.mesh.Animate(1,0.3,Self.anim)
EndMethod
EndType


Gruß,
N0X
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%
  • Zuletzt bearbeitet von N0X am So, Jan 19, 2014 19:40, insgesamt einmal bearbeitet

Xeres

Moderator

BeitragSo, Jan 19, 2014 17:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Du könntest ja mal beschreiben, was momentan nicht funktioniert und was du gerne für eine Bewegung hättest.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

N0X

BeitragSo, Jan 19, 2014 17:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Also die Gegner bewegen sich zwar, aber nicht immer zu den neuen Punkten.
Sie sollen von Punkt A nach Punkt B laufen.
Ich habe versucht das entsprechende Mesh einfach in Richtung des neuen Punktes zu drehen und es dann solange auf der Z-Achse nach vorne zu bewegen bis es den Punkt erreicht hat.

Gruß,
N0X
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

Xeres

Moderator

BeitragSo, Jan 19, 2014 17:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn es nur um eine gerade Linie in einer Ebene geht, würde ich den Vektor in Richtung des Ziels bestimmen.
Ich sehe nicht ganz, wozu die "old" und "new" Werte bei der Postion genutzt werden und warum du die Bewegung in upd und move machst. Vielleicht solltest du das stärker trennen. Die eigentliche Bewegungsgeschwindigkeit sollte auch in einer Variable stehen.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

N0X

BeitragSo, Jan 19, 2014 19:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Jetzt hab ich sowas in der Art, aber funktioniert auch wieder nicht.
Ich lasse ja immer alle fünf Sekunden beispielsweise über move() neue Zielkoordinaten berechnen und update() korrigiert ständig (wenn nötig) die aktuelle Position (x,z) bis die neue Position erreicht wurde.

BlitzMax: [AUSKLAPPEN]
Type TEnemy
Global list:TList = New TList

Field x:Float,z:Float
Field new_x:Float = 0,new_z:Float = 0

Method Init:TEnemy(tmpX:Int,tmpZ:Int)
list.addLast(Self)

Self.x = tmpX
Self.z = tmpZ

Return(Self)
EndMethod
Method move()
Self.new_x = Rand(0,10)
Self.new_z = Rand(0,10)
EndMethod
Method update()
If Int(Self.x) <> Int(Self.new_x) Then
If Int(Self.z) <> Int(Self.new_z) Then
Local xdiff:Float = (Self.new_x - Self.x)
Local zdiff:Float = (Self.new_z - Self.z)
Local yaw:Float = ATan2(zdiff,xdiff)
Self.x:+.5 * Cos(yaw)
Self.z:+.5 * Sin(yaw)
EndIf
EndIf
EndMethod
EndType


Ich hoffe ich bewege mich in die richtige Richtung mit meinem Ansatz? :/

Gruß,
N0X

//EDIT: Hat sich erledigt! Funktioniert jetzt super, danke für die Hilfe! Smile
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group