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

PacManiBetreff: LinePick() für Schwerkraft - Entity hüpft |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 4. ist der Abstand noch nicht genau genug, muss pro FLIP weniger addiert werden, als der "unfähr-null-Wert": BlitzBasic: [AUSKLAPPEN] ... 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke für die Antwort ![]() 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 ![]() 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 ![]() |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
also hier mal:
BlitzBasic: [AUSKLAPPEN] Wer= LinePick(EntityX(ObjPlayer), EntityY(ObjPlayer), EntityZ(ObjPlayer), 0, -2.0, 0) 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
- Zuletzt bearbeitet von Midimaster am So, März 20, 2011 16:41, insgesamt einmal bearbeitet
PacMani |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Besten Dank^^
das Testprogramm mit seiner korrupten Maussteuerung wird so sowieso niemanden erreichen ![]() PS: Es war doch so einfach ![]() 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 |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group