[B3D] 3D-Steuerung funktioniert nicht richtig (springen)

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Dernwar

Betreff: [B3D] 3D-Steuerung funktioniert nicht richtig (springen)

BeitragSa, Jan 06, 2007 11:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo erstmal an alle, mein erster Post hier, hoffentlich richtiger Bereich ^^

Ich weiß dieses Thema gab es hier schon öfters, ich habe gestern ca 3 Stunden lang versucht die Angebotenen Sprungfunktionen in meinen Code einubauen.

Idee ist folgende : Man soll sich mit einem Modell in der 3-Person ansicht (kamera hinter dem objekt), in einer 3D-Welt bewegen sollen, dazu gehört mMn auch springen und fallen ^^
Jetzt hat ein Freund mir eine kleine 3D Welt gemodelt (kleines Haus und Gelände), der Würfel kollidiert mitlerweile super mit Beiden Objekten, man kann ihn drehen und sich mit WASDund maussicht bewegen.
Problem: Der Gravitiations und Sprungteil funktioniert wie gesagt nicht, ich habe es mit einer einfachen Schaltung schon hinbekommen, nur da konnte man halt in der Luft immer wieder Springen Wink

Im Moment verwende ich diesen Teil zum springen:

Zitat:
;gravitation
Gravity# = Gravity# + 0.1
TranslateEntity Player,0,-Gravity# ,0
If KeyHit(57) And EntityCollided(Player,2) Then Gravity# = Gravity# -1
If EntityCollided(Player,2) And Gravity# >0 Then Gravity# = 0
;Gravitation


Irgendwie scheint das EntityCollided nicht zu funktionieren, dem Boden und dem Haus hab ich mit Entitytype den Typ 2 zugewiesen.
Der würfel ist typ 1
meine kollision sieht so aus:
Collisions 1,2,2,2
und der Würfel hat noch einen Radius: EntityRadius Player, 2

Das Problem ist, dass Kollision mit dem Boden nicht erkannt wird, deswegen wird die Gravitation immer größer, wenn ich ne weile warte und dann über die kante von meinem gelände laufe haut es mich richtig runter!
Wenn ich sofort drüberrenne falle ich normal schnell.

Mir fällt im Moment echt keine Lösung mehr ein, hab gestern ca 3-4 stunden nur an ner realistischen sprungfunktion gesessen, ich glaubedas Prinzip von meiner sollte Funktionieren, ich weiß nur icht warum sie dies eben nicht tut ^^

Auf Wunsch poste ich gerne nochmal den kompletten Code
Du hast keine Chance, nutze sie
 

Dreamora

BeitragSa, Jan 06, 2007 11:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Würfel hat kein Radius, beim Würfel musst du explizit die Würfeldaten angeben. Rate ich jedoch für den Spieler SEHR davon ab, denn der würfel wird nicht rotiert etc, insofern ist dort "sphere" besser (die "" weils keine Kugel ist sondern ein ellipsoid, du kannst also x-z ausdehnung und y ausdehung angeben), dann würde auch der Radius funktionieren.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

Dernwar

BeitragSa, Jan 06, 2007 11:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, hab den Würfel jetzt durch ne Kugel ersetzt, die restlichen Daten (auch den radius) beibehalten.

Aber die Kollisionsabfrage (und damit auch der Sprung) gehen immer noch nicht.

Die normale Kollision funktioniert (Collisions), aber die Entitycollided(player,2) will immer noch nicht Sad
Du hast keine Chance, nutze sie
 

Dreamora

BeitragSa, Jan 06, 2007 11:53
Antworten mit Zitat
Benutzer-Profile anzeigen
hmm, dann wirds hingegen leicht komisch.
Ich nehme an, du hast UpdateWorld drin vor RenderWorld, oder? (wenn ja, versuch mal MoveEntity nur zur Sicherheit)

Allerdings hast du aktuell nen Fehler drin, oder scheint mir zumindest so:

Du addierst immer zur Gravitation. Das klingt ja eigentlich nicht schlecht, ABER wenn du nun auf etwas stehst, was nicht zu Kollisionsgruppe 2 gehört, wird es nicht 0, was falsch ist.

Insofern würde ich einen Status "springen" oder so einführen, nur während der aktiv ist, wird die Gravitation raufgezählt, sonst nicht. (will heissen sobald er mit etwas kollidiert, wo CollisionNY() > 0, steht er auf dem boden - natürlich angenommen, das bei dir die Y achse von unten nach oben verläuft)
Sonst wirds nämlich eine ziemlich unschöne "Hyperbeschleunigung" geben wenn du von sonst irgendwas runterspringst, das nicht als kollisionstyp 2 definiert war
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

Dernwar

BeitragSa, Jan 06, 2007 11:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Das mit dem Objekttyp 2 is schon Absicht, falls wir nachträglich noch Objekte einbinden müssen wir denen lediglich den Typ 2 geben, ist ja kein großer Aufwand.

ImMoment gibt es eh nur die Kamera, das Haus-Model, den Würfel und den Boden.

Ich poste jetzt einfach mal den kompletten Quellcode, ist ja noch nicht allzu lang

Zitat:
Graphics3D 1024, 768, 32, 1
SetBuffer BackBuffer()

AmbientLight 150,150,150


Global Gravity#=0
;Kamera - Anfang
Global cam = CreateCamera(Player)
MoveEntity Cam, 50,10,50
CameraRange Cam, 0.1 , 1000

;Kamera - Ende

;Testobjekte-Anfang
Haus = LoadMesh("Haus.x")
ScaleMesh Haus, 0.1, 0.1, 0.1
MoveEntity Haus, 100, 0, 100
EntityType Haus,2

Player = CreateSphere(20)
EntityColor Player, 255, 0, 0
EntityType Player,1
EntityRadius Player, 2
MoveEntity Player, 50,5,60

Boden=LoadTerrain("Gelände.bmp")
EntityType Boden,2
;Testobjekte-Ende



;Hauptschleife
While Not KeyHit(1)

;Maussteuerung - Anfang
RotateEntity Player,EntityPitch(Player)+MouseYSpeed(),EntityYaw(Player)-MouseXSpeed(),0
MoveMouse 200,100
;Maussteuerung - Ende

EntityParent cam, Player

;Laufen - Anfang

If KeyDown(17) MoveEntity Player, 0,0,1 ;w - vorne
If KeyDown(30) MoveEntity Player, -1,0,0 ;a - links
If KeyDown(31) MoveEntity Player, 0,0,-1 ;s - hinten
If KeyDown(32) MoveEntity Player, 1,0,0 ;d _ rechts
;Laufen - Ende

;gravitation
Gravity# = Gravity# + 0.1
TranslateEntity Player,0,-Gravity# ,0
If KeyHit(57) And EntityCollided(Player,2) Then Gravity# = Gravity# -1
If EntityCollided(Player,2) And Gravity# >0 Then Gravity# = 0
;Gravitation



;Kollision - Anfang
Collisions 1,2,2,2
; Kollision - Ende
UpdateWorld
RenderWorld
Flip
Wend
ClearWorld
End


Danke jedenfalls schonmal für die schnellen Antworten, sowas habe ich bis jetzt nur im ogame-forum erlebt Smile
Du hast keine Chance, nutze sie
 

Dreamora

BeitragSa, Jan 06, 2007 13:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Code ist falsch.

Du erzeugst eine Cam mit Parent Player, welcher noch garnicht erzeugt ist, deswegen ist cam nicht an player gehängt ...
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

Dernwar

BeitragSa, Jan 06, 2007 13:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Graphics3D 1024, 768, 32, 1
SetBuffer BackBuffer()

AmbientLight 150,150,150


Global Gravity#=0

Player = CreateSphere(20)
EntityColor Player, 255, 0, 0
EntityType Player,1
EntityRadius Player, 2
MoveEntity Player, 50,5,60

;Kamera - Anfang
Global cam = CreateCamera()
MoveEntity Cam, 50,10,50
CameraRange Cam, 0.1 , 1000

;Kamera - Ende

;Testobjekte-Anfang
Haus = LoadMesh("Haus.x")
ScaleMesh Haus, 0.1, 0.1, 0.1
MoveEntity Haus, 100, 0, 100
EntityType Haus,2




Boden=LoadTerrain("Gelände.bmp")
EntityType Boden,2
;Testobjekte-Ende



;Hauptschleife
While Not KeyHit(1)

;Maussteuerung - Anfang
RotateEntity Player,EntityPitch(Player)+MouseYSpeed(),EntityYaw(Player)-MouseXSpeed(),0
MoveMouse 200,100
;Maussteuerung - Ende

EntityParent cam, Player

;Laufen - Anfang

If KeyDown(17) MoveEntity Player, 0,0,1 ;w - vorne
If KeyDown(30) MoveEntity Player, -1,0,0 ;a - links
If KeyDown(31) MoveEntity Player, 0,0,-1 ;s - hinten
If KeyDown(32) MoveEntity Player, 1,0,0 ;d _ rechts
;Laufen - Ende

;gravitation
Gravity# = Gravity# + 0.1
TranslateEntity Player,0,-Gravity# ,0
If KeyHit(57) And EntityCollided(Player,2) Then Gravity# = Gravity# -1
If EntityCollided(Player,2) And Gravity# >0 Then Gravity# = 0
;Gravitation



;Kollision - Anfang
Collisions 1,2,2,2
; Kollision - Ende
UpdateWorld
RenderWorld
Flip
Wend
ClearWorld
End


Hab es sogar doppelt gehabt ^^ einmal bei der Kamera und einmal in der Hauptschleife, deswegen gings. habs jetzt optimiert.

Springen geht aber immer noch nicht ^^
Du hast keine Chance, nutze sie
 

Dreamora

BeitragSa, Jan 06, 2007 14:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Jetzt ist es erst recht falsch Smile

Setz einfach parent beim erzeugen und nimm das unten raus, das unten bringt nämlich nichts ausser Zeit verschwenden Smile

Was allerdings die Kollision betrifft, so sehe ich aktuell das genaue Problem auch grad net. Ausser natürlich die Kugel wäre von anfang an schon zu tief, denn das objekt muss von über dem Boden auf den Boden fallen, damit es damit kollidiert, wenn es erst mal im Boden drin ist, wird es einfach hindurch fallen.
Allerdings meinstest du, das es mit der "normalen" Art Kollisionen zu überprüfen geht, von daher liegts vielleicht einfach nur an EntityCollided.
Es wäre ohnehin zu empfehlen die normale Art zu nehmen. Du kannst dir ja eine globale Variable onGround machen. Wenn in den Kollisionen eine Kollision mit dem Typ 2 vorkommt, dann onGround = true (einfach vor der Loop onGround = false setzen). Den Type der Entity welche bei einer Kollision zurück gegeben wird, kannst du mit getEntityType ermitteln.

Ach ja, das Collisions brauchst du net in die Loop zu packen, da reicht es wenn du es vorher deklarierst.

Übrigens hast du auch sonst noch einen kleinen Fehler: Kollisionsradius ist 2, deine Kugel hat jedoch nur einen Radius von 1. Wenn du die Kugel also so positioniert hast, das sie grafisch direkt auf der Oberfläche war, dann muss sie durchfallen.


Ach würde ich dir etwas anderes dringend ans Herz legen: Frame unabhängige Programmierung. So wie du das aktuell machst, hat jemand mit 500 FPS keine Chance überhaupt jemals einen Sprung zu sehen *ggg*

Wie das zu bewerkstelligen ist, findest du hier im Forum, wenn ich mich richtig erinner hat es sogar ein Tutorial dazu.
Prinzipiell musst du einfach deine Werte mit einem Faktor multiplizieren, der 1.0 / FPS entspricht.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

Dernwar

BeitragSa, Jan 06, 2007 14:24
Antworten mit Zitat
Benutzer-Profile anzeigen
merkwürdigerweise kommt es zu fehlern wenn ich die kamera direkt der kugel zuweise, liegt wahrscheinlich an der bewegung dannach ^^

hab jetzt beide entitiycollisions rausgenommen, jetzt gehts nur kann man halt noch in der luft springen...

ich bin ab morgen snowboardfahren, in der 1 woche werde ich mir mal gedanken drüber machen, dann post ich hier wieder den aktuellen stand.

die idee mit der variablen klingt gut, ich denke oswas in der art werde ich machen
Du hast keine Chance, nutze sie
 

Dreamora

BeitragSa, Jan 06, 2007 14:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Also: Du musst die Cam auch nicht mehr bewegen (bzw. viel weniger!). Mit Create und einem Parent ist die Kamera direkt dort wo das Parent ist Smile

Springen in der Luft: Einfach überprüfen ob onGround = true, wenn ja, dann kann er springen, wenn nein, dann nicht.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group