Kollisionen - Aus welcher Richtung?

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

PacMani

Betreff: Kollisionen - Aus welcher Richtung?

BeitragDo, Sep 10, 2009 22:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo, ist mein erster Thread hier für eines meiner ersten Blitz3D-Spiele.
Meine Frage ist auch Recht simpel... entweder kann ich mit der Suchfunktion nicht so wirklich, oder so direkt wurde das hier noch nicht gepostet (für Ersteres entschuldige ich mich).

Ich möchte ein Jump'n'Run-Spiel programmieren. Die Steuerung mit Pfeiltasten, und Springen geht auch.
Springen kann man bei JnR natürlich nur wenn man auf einem Boden steht. Da dachte ich mir, ich machs einfach mal so: Sobald der Spieler mit dem Levelmodell kollidiert ist, kann er Springen. Aber dann kann ers natürlich auch, wenn er an der Wand klebt.
Ist das ein grundsätzlich falscher Denkansatz, Sprünge zu erlauben oder zu verbieten, oder kann man überprüfen, ob eine Kollision von "oben" stattfindet, also die Figur auf dem "Boden" und nicht mit einer "Wand" kollidiert?

Mein Code aus dem Hauptloop ist übrigens der hier (Achtung: Würstchencode!):
Code:
While Not KeyDown(1)
   If KeyDown( 29) = True And CanJump = 1 Then Gravity# = 0.4
   If KeyDown(203) Then TurnEntity Player, 0,  2, 0
   If KeyDown(205) Then TurnEntity Player, 0, -2, 0
   If KeyDown(208) Then MoveEntity Player, 0,  0, -.2
   If KeyDown(200) Then MoveEntity Player, 0,  0, 0.2

   If EntityCollided(Player, SceneryCollisions) = False Then
      If Gravity# < 1 Then Gravity# = Gravity# - 0.01
      CanJump = 0
   Else
      Gravity# = 0
      CanJump = 1
   End If
   MoveEntity Player, 0, Gravity, 0
   
   UpdateWorld
   RenderWorld
   Flip
Wend
End

Noobody

BeitragDo, Sep 10, 2009 22:19
Antworten mit Zitat
Benutzer-Profile anzeigen
CollisionNY sollte hier helfen Razz

Du überprüfst einfach, ob die Kollisionsnormale in der Y - richtung nach oben zeigt, z.B. so BlitzBasic:
If CollisionNY() < -0.75 Then Jump()

Den Wert von -0.75 kannst du variieren, um zu steuern, wie stark der Untergrund gekippt sein darf, damit der Spieler noch springen kann.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun
 

Omenaton_2

BeitragFr, Sep 11, 2009 10:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi !

Ich würde dem Boden grundsätzlich eine andere Kollisionvariable zuweisen als allen anderen Hindernissen.
Das würde dir viel mehr Freiheiten für die Erweiterung deines Programmes lassen und dein besagtes Problem wäre damit auch gelöst.
In 3D Spielen mit einer Welt ist das Terrain meist nicht das Selbe wie die Objekte darauf.
 

PacMani

BeitragFr, Sep 11, 2009 13:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke an euch beide. Wusste von dem besagten Befehl noch nichts und werde ihn ausprobieren.
Das mit der Trennung zwischen Objekte und Boden ist auch eine gute Idee. Das bedürfte dann natürlich 2 3ds-Modelle, in denen ich meine Levels speichere.
Kann man irgendwie festlegen, dass der Spieler ab einem bestimmten Gefälle den Boden nicht mehr hochkrackseln kann, sondern wie bei einer Wand unten stehen bleibt?
EDIT: Ich verstehe den Collision-Index (2. Parameter) nicht ganz. Bekomme ständig Index Out Of Range, habe auch eine absolute Nummer (1) angegeben. Brauche noch Hilfe, bin halt Anfänger Embarassed
 

FreizeitCoder

BeitragFr, Sep 11, 2009 16:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

sieh dir mal zusätzlich den Befehl "countcollisions" an.

Grunsätzlich läuft es so ab. Die mit deinen Kollisionstypen abgefragten Kollisionen werden schön hintereinander in eine Liste geschrieben.

Mit dem Parameter "Index" bei deinem Befehl wird auf eine bestimmte Nummer deiner Kollisionsliste zugegriffen. Wenn Du nichts angibst, wird denke ich immer auf den ersten Kollisionsvorfall zugegriffen.
Wie auch immer..... Du vermeidest viele Fehler, wenn Du vorher "CountCollisions" ausführst. Mit diesem Befehl ermittelst du wieviele Collisionen denn bisher stattgefunden haben, und welche die gerade aktuelle ist. Die Nummer der aktuellen Kollision kannst du dann als "Index" für den anderen Befehl verwenden.

Alternativ kannst du natürlich auch mit dem Befehl "ClearCollisions" die Liste nach jedem Zugriff löschen. Somit wäre immer nur maximal ein Eintrag vorhanden, und Du kannst in den anderen Befehlen immer die 1 als Index übergeben. Allerdings finden bei einer Löschung der Liste auch auch keine Kollisionsprüfungen mehr statt.

Ich hoffe ich konnte dir etwas weiterhelfen. Falls ich falsch liege bitte ich darum verbessert zu werden.... bin auch noch nicht lange dabei Wink


Gruß und ein schönes Wochenende

PS: wie kann ich denn hyperlinks auf die BB-Befehle linken?

FireballFlame

BeitragFr, Sep 11, 2009 17:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Pac-Man hat Folgendes geschrieben:
Das mit der Trennung zwischen Objekte und Boden ist auch eine gute Idee. Das bedürfte dann natürlich 2 3ds-Modelle, in denen ich meine Levels speichere.
Ich halte es allgemein für ratsam, seine Welten in mehrere 3D-Modelle aufzuteilen, damit nicht immer alles gemeinsam gerendert werden muss...

FreizeitCoder hat Folgendes geschrieben:
wie kann ich denn hyperlinks auf die BB-Befehle linken?
Mit "[[Befehl]]".
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group