Kollisionen - Aus welcher Richtung?
Übersicht

PacManiBetreff: Kollisionen - Aus welcher Richtung? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
CollisionNY![]() ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() |
||
FreizeitCoder |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() Gruß und ein schönes Wochenende PS: wie kann ich denn hyperlinks auf die BB-Befehle linken? |
||
![]() |
FireballFlame |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group