Spieler in richtung Maus bewegen lassen?
Übersicht

FaramiBetreff: Spieler in richtung Maus bewegen lassen? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hiho. Ich bin relativ neu in B3D und hätte da nen kleines Problem.
Zum üben schreibe ich gerade an nem kleinen "Spiel". Und zwar habe ich eine Plane, einen Mesh(spieler) und eine Kamera erstellt. Die Kamera ist über dem ganzen und überblickt Spieler und Plane. Nun möchte ich mit der Maus irgendwo auf die Plane klicken und der Mesh(Spieler) soll dorthin laufen. Leider fehlen mir die Befehle die ich dafür benötige. Wenn ich dies geschafft habe wäre mein nächstes Problem Kollisionen. Und zwar soll der Mesh, falls möglich, um Gegenstände herum laufen solange ein möglicher weg vorhanden ist, sonst soll er stehen bleiben wo er ist. Ich möchte nicht das ihr mir den ganzen Code vorschreibt. Ein vorschlag und die benötigten Befehle oder kleine Code ausschnitte würden mir schon völlig reichen. Vielen dank. ![]() |
||
AvaGast |
![]() Antworten mit Zitat |
|
---|---|---|
Schau Dir mal diese Befehle an: http://blitzbase.de/menu/3m.htm
Du könntest einen CameraPick an den 2D-Koordinaten Deiner Mouse auf die Plane werfen (dafür musst Du auch den EntityPickMode für die Plane einstellen). Anschliessend kannst Du die 3D Koordinaten für den Pick auslesen (PickedX, PickedY, PickedZ) und Dein Mesh langsam an diese Stelle bewegen lassen (MoveEntity oder TranslateEntity). Lieben Gruss, Ava |
||
Farami |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Irgendwie stehe ich gerade aufm Schlauch. Ich verstehe zwar was du geschrieben hast, aber wie bewege ich den Mesh nun dorthin? MoveEntity ist klar, aber mit welchen Angaben?
-edit- Ah, Ok. Hab's. ![]() Nun noch nen problem. Wie drehe ich den Mesh erst in die Richtung wo er sich hinbewegen soll? |
||
AvaGast |
![]() Antworten mit Zitat |
|
---|---|---|
Am einfachsten lässt sich das mit einem Pivot lösen, den Du Dir am Anfang einmal erstellst und dann immer dorthin platzierst, wo Du mit der Mouse hingeklickt hast (also an die Pick-Koordinaten). Wenn Du das getan hast, kannst Du Dein Mesh mit PointEntity auf den Pivot ausrichten. ![]() |
||
HW |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Später willst du aber wahrscheinlich nicht, dass sich der Spieler sofort zum Zielpunkt wendet, sondern sich langsam dorthin dreht. Das kannst du dann mit ql:Turnentity erreichen. Der Spieler dreht sich also mit Turnentity, bis der Winkel zwischen Zielpunkt und Spieler 0 ist. Die Berechnung des Winkels funktioniert mit Tangensberechnunen von den Koordinaten des Spielers und des Zielpunkts. | ||
Farami |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Also. Momentan habe ich das Problem das sich der Spieler zwar dorthin bewegt wo ich will, aber nicht immer (teilweise läuft er einfach endlos weiter) oder aber er bewegt sich in komischen bahnen bis er irgendwann seine Position erreicht hat.
Ich bin mir ziemlich sicher das das an der Art liegt wie ich die Position überprüfe, weiss aber leider nicht wie ich es besser machen könnte. Hier mein momentaniger Code... Code: [AUSKLAPPEN] Graphics3D 800,600,32,2 SetBuffer BackBuffer() ; Plane plane = CreatePlane() plane_tex = LoadTexture("plane.jpg") EntityTexture plane, plane_tex EntityType plane, 2 EntityPickMode plane, 2 ; Spieler spieler_tex = LoadTexture("armour.pcx",1) spieler_pivot = CreatePivot() Global spieler = LoadMD2("tris.md2",spieler_pivot) EntityTexture spieler, spieler_tex ScaleEntity spieler, 0.015, 0.015, 0.015 EntityRadius spieler, 0.1 PositionEntity spieler_pivot, 0, 2, -1 EntityType spieler_pivot, 1, 1 EntityRadius spieler_pivot, 0.4 ; Kamera Global kamera = CreateCamera() PositionEntity kamera, 0, 5, -4 TurnEntity kamera, 30, 20, 0 ; Pick-Pivot ppivot = CreatePivot() ; Collisions Collisions 1, 2, 2, 2 Collisions 2, 1, 1, 1 While Not KeyHit(1) mx = MouseX() my = MouseY() Entity = CameraPick(kamera, mx, my) If MouseHit(1) pickx% = Int(PickedX()) picky% = Int(PickedY()) pickz% = Int(PickedZ()) PositionEntity ppivot, pickx, picky, pickz PointEntity spieler, ppivot End If If pickx > Int(EntityX(spieler)) Then MoveEntity spieler, 0.01, 0, 0: moved = 1 If pickx < Int(EntityX(spieler)) Then MoveEntity spieler, -0.01, 0, 0: moved = 1 If picky > Int(EntityY(spieler)) Then MoveEntity spieler, 0, 0.01, 0: moved = 1 If picky < Int(EntityY(spieler)) Then MoveEntity spieler, 0, -0.01, 0: moved = 1 If pickz > Int(EntityZ(spieler)) Then MoveEntity spieler, 0, 0, 0.01: moved = 1 If pickz < Int(EntityZ(spieler)) Then MoveEntity spieler, 0, 0, -0.01: moved = 1 If pickx = Int(EntityX(spieler)) And picky = Int(EntityY(spieler)) And pickz = Int(EntityZ(spieler)) moved = 0 End If If moved = True If MD2AnimTime(spieler) < 40 Or MD2AnimTime(spieler) > 46 Then AnimateMD2 spieler, 1, 0.1, 40, 46 End If End If If moved = False If MD2AnimTime(spieler) < 0 Or MD2AnimTime(spieler) > 10 Then AnimateMD2 spieler, 1, 0.1, 0, 5 End If End If UpdateWorld RenderWorld Text 100, 100, mx+", "+my Text 100, 120, pickx+", "+picky+", "+pickz Text 100, 140, Int(EntityX(spieler))+", "+Int(EntityY(spieler))+", "+Int(EntityZ(spieler)) Flip Wend End |
||
HW |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Als erstes fällt mir auf, dass du den Pivot eigentlich nicht als Parent für den Spieler erstellen solltest, sondern nur, um eine unsichtbare Entity am Zielpunkt zu haben. Aber ich bin noch nicht ganz mit dem Lesen des Codes fertig...
Edit: Sry, ist doch nicht der Fehler. Wie gesagt habe ich mir den Code noch nicht ganz durchgelesen, aber ich suche nach einer Lösung... Edit²: Du solltest die Entity einfach nur nach vorne bewegen. So wie du das jetzt hast, würde es nur mit ql:translateentity statt ql:moveentity gehen. Les dir die Hilfedateien zu den beiden Befehlen am Besten noch mal durch. ![]() |
||
Farami |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Aaaaah. Ich verwechsel die beiden Befehle immer. Besten dank! ![]() Habe allerdings noch ein Problem. ![]() Und zwar dreht sich die Figur teilweise sehr komisch nach unten... ![]() |
||
HW |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Das kann nur damit zusammenhängen, dass der Pivot direkt am Boden erstellt wird. Dann dreht sich die Figur eben auch zum Boden. Du solltest den Y Wert des Pivots nicht an ql:PickedY anpassen, sondern ihn etwas erhöhen, sodass er auf derselben Höhe wie der Spieler liegt. | ||
Farami |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Beste Dank. Funktioniert nun alles bestens.
Nun, wie gesagt, mein letztes Problem. Wie schaffe ich es das der Spieler nicht gegen Gegenstände läuft, sondern versucht einen weg aussen rum zu finden? Da habe ich leider keinen blassen schimmer... ![]() |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das nennt sich Pathfinding und ist auf der Vektorebene nicht grad einfach zu lösen... Daher machen es viele so, daß sie eine art 2D-Rastermap auf die 3D-Welt projezieren und dann eine 2D-Pathfinding anwenden. Dabei müsste aber die 3D-Welt in ein Raster aufgeteilt werden und dieses in ein Dim-Feld gespeichert werden... Ansonsten habe ich ein kleinen Ansatz dazu im Codearchiv abgelegt. Die Version ist allerdings nur für einfache Lösungswege gedacht... https://www.blitzforum.de/viewtopic.php?t=16193 | ||
![]() |
Bob |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi,
schau mal hier. Da ist alles drin was du brauchst. https://www.blitzforum.de/viewtopic.php?t=10800 |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group