LinePick() für Schwerkraft - Entity hüpft

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

PacMani

Betreff: LinePick() für Schwerkraft - Entity hüpft

BeitragSo, März 20, 2011 14:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen.

Ich mache wohl einen Anfängerfehler. Deswegen auch Beginners-Corner.

In diesem Beispiel hüpft das Spielerobjekt auf und ab, wenn man sich über der grünen Stufe befindet. Aber ich weiß nicht wieso Wink

Ich möchte mit Hilfe von LinePick den Abstand des Würfels zum Boden herausfinden und ihn auf ungefähr 1.0 Einheiten Abstand vom Boden bringen (das er schwebt ist Absicht).

Hier der Code. WASD und Maus steuert die Kamera, Pfeil auf und ab den Würfel.
Code: [AUSKLAPPEN]
Graphics3D(800, 600)

HidePointer

Local Camera = CreateCamera()
PositionEntity Camera, 0, -1, 0
CameraRange Camera, 0.01, 100

Local Light = CreateLight()
Local Timer = CreateTimer(120)

Global ObjGround = CreateCube()
ScaleEntity ObjGround, 10, 0.1, 20
PositionEntity ObjGround, 0, -2, 0
EntityColor ObjGround, 255, 0, 0

Global ObjObstacle = CreateCube()
ScaleEntity ObjObstacle, 2, 0.2, 6
PositionEntity ObjObstacle, 1, -1.5, 8
EntityColor ObjObstacle, 0, 255, 0

Global ObjPlayer = CreateCube()
RotateEntity ObjPlayer, 0, -90, 0
PositionEntity ObjPlayer, -5, 2, 10
Local ObjPlayerYSpeed# = -0.01


EntityPickMode ObjGround, 2
EntityPickMode ObjObstacle, 2

Repeat
    If KeyDown(200) Then MoveEntity ObjPlayer, 0, 0,  0.02
    If KeyDown(208) Then MoveEntity ObjPlayer, 0, 0, -0.02
   
   
    LinePick(EntityX(ObjPlayer), EntityY(ObjPlayer), EntityZ(ObjPlayer), 0, -2.0, 0)
    If PickedEntity() = 0 Then
        MoveEntity ObjPlayer, 0, ObjPlayerYSpeed, 0
    Else
        MoveEntity ObjPlayer, 0, PickedY() + 1.9, 0
    End If
    DebugLog PickedY()
   
    TurnEntity Camera, MouseYSpeed(), -MouseXSpeed(), 0
    RotateEntity Camera, EntityPitch(Camera), EntityYaw(Camera), 0
    MoveMouse GraphicsWidth() / 2, GraphicsHeight() / 2
    If KeyDown(17) Then MoveEntity Camera, 0, 0,  0.1
    If KeyDown(31) Then MoveEntity Camera, 0, 0, -0.1
    If KeyDown(30) Then MoveEntity Camera, -0.1, 0, 0
    If KeyDown(32) Then MoveEntity Camera,  0.1, 0, 0
   
    TurnEntity Light, 0.3, 0.1, 0.2
   
    RenderWorld
    UpdateWorld
   
    WaitTimer(Timer)
    Flip False
Until KeyHit(1)
End

Midimaster

BeitragSo, März 20, 2011 15:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe gleich 5 Fehler im Code gefunden:

1.
schon vor die REPEAT gehört eine...
BlitzBasic: [AUSKLAPPEN]
    MoveMouse GraphicsWidth() / 2, GraphicsHeight() / 2
.damit die Kamera eine definierte Anfangsposition hat.

2.
Der Wert, der den Abstand kennt ist nicht PickedEntity sondern PickedY

3.
die Bedinung für "Nichtstun" muss auf "ungefähr null" verändert werden:
BlitzBasic: [AUSKLAPPEN]
    If Abs(PickedY()-2)<0.2 Then
MoveEntity ObjPlayer, 0, ObjPlayerYSpeed, 0
Else
.....


4.
ist der Abstand noch nicht genau genug, muss pro FLIP weniger addiert werden, als der "unfähr-null-Wert":
BlitzBasic: [AUSKLAPPEN]
       ...
Else
MoveEntity ObjPlayer, 0, 0.1, 0
End If



Der fünfte Fehler ist fatal und führt zur Unbedienbarkeit des Rechners. Wahrscheinlich hat dir deshalb auch noch keiner geantwortet, weil man nach dem Programmstart jegliche Kontrolle über die Maus verliert. Ich musste meinen Rechner reseten....

BlitzBasic: [AUSKLAPPEN]
    MoveMouse GraphicsWidth() / 2, GraphicsHeight() / 2
...führt natürlich dazu, dass die Maus immer wieder in die Mitte deines Programms gesetzt wird. Man hat keine Chance mehr rauszukommen. Falls man zufällig in eine zweite Anwendung wechselt, z.b. um Dir hier zu schreiben, ist es auch vorbei mit der ESC-Taste.

Ich schreib dir das jetzt mal so, und dann such ich nach ner Lösung, aber vorher sende ich das hier ab, damit ich es wenigstens nicht nochmal schreiben muss, wenn ich gleich wieder dein Programm starte.

bis gleich....
 

PacMani

BeitragSo, März 20, 2011 16:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die Antwort Wink beachte, dass es hier sich um ein kleines dummes Beispielprogramm handelt und nur Spielerei.

Zu 2: Ich möchte aber überprüfen, ob überhaupt ein Objekt gepickt wurde. Würde ich das mit PickedY() durchführen, würde es ein falsches Ergebnis liefern, wenn PickedY() gerade mal 0 ist.

Zu 5.: Genau so soll es ja sein. Die Blitzdemos machen diese grausigen Sachen ebenfalls Very Happy
Ich denke aber schon, dass du mit Alt+Tab in andere Anwendungen gewechselt hast, damit hättest du auch in die Ausführung zurück gekonnt Wink

Midimaster

BeitragSo, März 20, 2011 16:27
Antworten mit Zitat
Benutzer-Profile anzeigen
also hier mal:

BlitzBasic: [AUSKLAPPEN]
    Wer= LinePick(EntityX(ObjPlayer), EntityY(ObjPlayer), EntityZ(ObjPlayer), 0, -2.0, 0)
Abstand=Abs(EntityY(ObjPlayer)-PickedY())
If Wer>0
If Abstand<1.9
MoveEntity ObjPlayer, 0, 0.05, 0
EndIf
Else
MoveEntity ObjPlayer, 0, ObjPlayerYSpeed, 0
EndIf
DebugLog PickedEntity+" "+ PickedEntity() + " " + Abstand


Wer liefert dir zurück, ob überhaupt und wenn ja, welches Objekt in der Nähe ist.

Wenn keines da ist, dann sinken.

Wenn eines da ist, dann steigen, wenn der Abstand zu nahe ist.

Der Abstand berechnet sich nicht in PickedY(), sondern aus der Differenz von Objektposition und PickedY().
PickedY() liefert also nix anderes als EntityY(Wer)

Der Bereich zwischen 1.9 und 2.0 dient als Hysterese und hier erfolgen keine Änderungen.
 

PacMani

BeitragSo, März 20, 2011 16:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für deine Bemühungen.

Das ist natürlich auch eine Möglichkeit.
Ich benötige aber sofortiges, ruckartiges Hochsetzen des Würfels.

Ich "bastele" mal ein wenig mit Anregungen aus deinem Code, und wenn ich eine Umsetzung gefunden habe, stelle ich sie hier rein.

Midimaster

BeitragSo, März 20, 2011 16:39
Antworten mit Zitat
Benutzer-Profile anzeigen
ja, das kannst du ja jetzt mit dem Code machen, wie du willst....

Wichtig ist, das du mit dem Aufwärts-Befehl nicht über den Soll-Abstand hinaus nach oben gehts, sondern knapp darunter bleibst.

Du kannst ja auch direkt... BlitzBasic: [AUSKLAPPEN]
	        MoveEntity ObjPlayer, 0, 2-Abstand-0.05, 0
... um den gemessenen Abstand nach oben korrigieren.


und hier noch eine Lösung für das Mausproblem:
BlitzBasic: [AUSKLAPPEN]
	CenterX=GraphicsWidth() / 2
CenterY=GraphicsHeight() / 2
If (MouseX()>CenterX-150) And (MouseX()<CenterX+150) And (MouseY()>CenterX-150) And (MouseY()<CenterX+50)
MoveMouse GraphicsWidth() / 2, GraphicsHeight() / 2
EndIf
  • Zuletzt bearbeitet von Midimaster am So, März 20, 2011 16:41, insgesamt einmal bearbeitet
 

PacMani

BeitragSo, März 20, 2011 16:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Besten Dank^^
das Testprogramm mit seiner korrupten Maussteuerung wird so sowieso niemanden erreichen Mr. Green

PS: Es war doch so einfach Sad
Code: [AUSKLAPPEN]
If LinePick(EntityX(ObjPlayer), EntityY(ObjPlayer), EntityZ(ObjPlayer), 0, -2, 0) = 0 Then
    MoveEntity ObjPlayer, 0, ObjPlayerYSpeed, 0
Else
    PositionEntity ObjPlayer, EntityX(ObjPlayer), PickedY() + 2, EntityZ(ObjPlayer)
End If

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group