Spieler in richtung Maus bewegen lassen?

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Farami

Betreff: Spieler in richtung Maus bewegen lassen?

BeitragSo, Feb 05, 2006 15:13
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Smile
 

Ava

Gast

BeitragSo, Feb 05, 2006 15:48
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

BeitragSo, Feb 05, 2006 16:10
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Smile

Nun noch nen problem. Wie drehe ich den Mesh erst in die Richtung wo er sich hinbewegen soll?
 

Ava

Gast

BeitragSo, Feb 05, 2006 17:02
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. Smile
 

HW

BeitragSo, Feb 05, 2006 17:39
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Feb 05, 2006 17:57
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Feb 05, 2006 18:34
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Wink
 

Farami

BeitragSo, Feb 05, 2006 18:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Aaaaah. Ich verwechsel die beiden Befehle immer. Besten dank! Laughing

Habe allerdings noch ein Problem. Embarassed
Und zwar dreht sich die Figur teilweise sehr komisch nach unten...
user posted image
 

HW

BeitragSo, Feb 05, 2006 19:50
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Feb 06, 2006 1:57
Antworten mit Zitat
Benutzer-Profile anzeigen
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... Embarassed

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMo, Feb 06, 2006 2:42
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Feb 07, 2006 15:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,
schau mal hier.
Da ist alles drin was du brauchst.
https://www.blitzforum.de/viewtopic.php?t=10800

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group