Lift fahren...

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

Iguan

Betreff: Lift fahren...

BeitragSa, Nov 11, 2006 21:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Hoi Leute!

ich bin bei meinem fps auf ein Problem gestossen und komme echt nicht mehr weiter:

Ich habe ein Level-Entity, ein LiftEntity sowie ein Player-Entity...

die kollisionen habe ich so gemacht:
Code: [AUSKLAPPEN]

Collisions type_player1, type_level,2,3
Collisions type_player1, type_lift,2,3


schwerkraft:
Code: [AUSKLAPPEN]

translateentity Player1,0,-1,0


wenn ich jetzt aber in den lift einsteige, und er losfährt, wird gar keine kollision beachtet, und ich falle einfach durch den lift hindurch..
ich hab auch schon mal die schwerkraft viel geringer als die Geschwindigkeit des Lifts gemacht, ging aber auch nicht...

was mache ich da falsch??


MFG

Iguan

Blitzcoder

Newsposter

BeitragSa, Nov 11, 2006 21:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Hast du denn eine Physik Engine eingebaut? Wenn nein, dann bewege eben einfach den Spieler auch gleich schnell nach oben.
P4 3 Ghz@3,55Ghz|GF 6600GT 256MB|Samsung 80GB | 2x Samsung 160GB|2048MB DDR-400 RAM|6 Mbit Flatrate | Logitech G15 | Samsung 225BW-TFT | Ubuntu Gutsy Linux | Windows Vista | Desktop | Blog | CollIDE | Worklog
________________
|°°°°°°°°°°°°°°||'""|""\__,_
|______________ ||__ |__|__ |)
|(@) |(@)"""**|(@)(@)****|(@)
  • Zuletzt bearbeitet von Blitzcoder am So, Nov 12, 2006 14:15, insgesamt einmal bearbeitet

Iguan

BeitragSa, Nov 11, 2006 21:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, keine physikengine...
ich hab auch mal
Zitat:

if entitycollided(type_player1,type_lift) then translateentity player1,0,Liftgeschw#,0

gemacht..

das problem hierbei ist, dass dann der player auch gehoben wird, wenn er den lift nur seitlich berührt, und gar nicht drin steht...
 

Dreamora

BeitragSa, Nov 11, 2006 21:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Lift geht nicht durch die normale Kollisionshandhabung.

Das verhalten musst du dir selbst einbauen, am besten indem du abfragst, mit was für kollisionstypen er kollidiert. Wenn einer davon ein lifttyp ist, dann machst du den lift zum parent des spielers und merkst dir den aktuellen lift, so das du ihn bei weiteren kollisionen nicht betrachtest.

Und sobald der spieler nicht mehr mit dem lift kollidiert, machst du wieder 0 zum parent des spielers.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Iguan

BeitragSa, Nov 11, 2006 23:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Dreamora hat Folgendes geschrieben:
Lift geht nicht durch die normale Kollisionshandhabung.
...merkst dir den aktuellen lift, so das du ihn bei weiteren kollisionen nicht betrachtest.
.


wie meinst du das... den aktuellen lift merken?? Rolling Eyes

ich habs jetzt mal so probiert:

Code: [AUSKLAPPEN]

   Lift1Pausentimer = Lift1Pausentimer + 1
   If lift1wechsel = 0 And Lift1Pausentimer > 300 Then MoveEntity lift1,0,.3,0
   If lift1wechsel = 1 And Lift1Pausentimer > 300 Then MoveEntity lift1,0,-.3,0
   If EntityY(lift1) > 100 And Lift1Pausentimer > 2 Then Lift1Wechsel = 1:Lift1Pausentimer = 0:MoveEntity lift1,0,-.01,0
   If EntityY(lift1) < -71 And Lift1Pausentimer > 2 Then Lift1Wechsel = 0:Lift1Pausentimer = 0:MoveEntity lift1,0,.01,0
  If EntityCollided(player1,type_lift1) And EntityY(lift1) <= 100 And EntityY(lift1) >= -71 And LiftPausentimer > 2 Then
     If lift1wechsel = 0 Then TranslateEntity player1,0,1.3,0
     If lift1wechsel = 1 Then TranslateEntity player1,0,-1.3,0
     EntityParent player1,lift1
  EndIf


geht aber auch nicht!
 

Dreamora

BeitragSo, Nov 12, 2006 1:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie ich das meine: Speicher dir eine Variable wo entweder der handle des aktuellen Liftes drin steht oder 0, wenn der Spieler auf keinem Lift steht.

Das Collisionhandling würd ich übrigens garnicht erst so ansetzen, sondern alle Kollisionen durchgehen und nach den Typen der "anderen Seite" schauen und entsprechend abarbeiten. Wenn du mit einzelnen IF arbeitest, kann das extrem anstrengend werden.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Iguan

BeitragSo, Nov 12, 2006 1:47
Antworten mit Zitat
Benutzer-Profile anzeigen
?? Embarassed könntes du mir vielleicht, ein simples beispiel machen?
 

Dreamora

BeitragSo, Nov 12, 2006 2:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Pseudo Code

Code: [AUSKLAPPEN]

' in deklarationen irgendwo

global lift


' im kollisionshandling
if getEntityType(collidedEntity) = TYPE_LIFT and lift = 0
  lift = collidedEntity
  EntityParent player, collidedEntity
endif


Das ist nur mal um den Lift als solchen zu "bestimmen"
Aber anhand von dem und obiger erklärung wird es dir bestimmt auch gelingen, die Änderung von "auf dem Lift" -> "nicht auf dem Lift" umzusetzen.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

StepTiger

BeitragSo, Nov 12, 2006 11:35
Antworten mit Zitat
Benutzer-Profile anzeigen
nur, dass collidedentity einen wert zurück gibt und somit () hinter sich stehen haben muss, da es sonst nur eine 0 zurückgibt.
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.
 

Dreamora

BeitragSo, Nov 12, 2006 14:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist nur eine Variable in diesem Falle und zwar eine Variable deren EntityType = Lift ist.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Iguan

BeitragSo, Nov 12, 2006 15:38
Antworten mit Zitat
Benutzer-Profile anzeigen
hmm... habs so wie du geschrieben hast versucht, komm aber trotzdem nicht weiter...

ich hab mal einen kleinen beispielcode gemacht, wie es halbwegs läuft..

das problem hierbei ist, dass wenn der Player den lift seitlich berührt, wird er auf den lift "gebeamt" und Meshesintersect ist sehr langsam!

Code: [AUSKLAPPEN]


cam = CreateCamera()
RotateEntity cam,30,0,0


Boden = CreateCube()
ScaleEntity Boden,50,1,50
MoveEntity Boden,0,-20,10
EntityType Boden,1



Lift = CreateCube()
EntityColor Lift, 0,255,0
ScaleEntity Lift,8,.5,8
PositionEntity Lift,0,-20, 40
EntityType Lift,2

Player1 = CreateCube()
EntityColor Player1,255,0,0
ScaleEntity Player1,3,5,3
EntityRadius Player1,3,5
PositionEntity Player1,-20,-10,20
EntityType Player1,3

Collisions 3,1,2,3
Collisions 3,2,2,3
;WireFrame 1

Repeat
Cls
UpdateWorld
RenderWorld   

If Liftwechsel = 0 And Pause = 0 Then TranslateEntity Lift,0,.2,0
If Liftwechsel = 1 And Pause = 0 Then TranslateEntity Lift,0,-.2,0
If EntityY(Lift) >= 0 Then Liftwechsel = 1:Pause = 1
If EntityY(Lift) <= -20 Then Liftwechsel = 0:Pause = 1

If Pause = 1 Then
   Pausentimer = Pausentimer + 1
   If Pausentimer > 200 Then Pausentimer = 0:Pause = 0
EndIf

If KeyDown(205) Then MoveEntity Player1,.5,0,0
If KeyDown(203) Then MoveEntity Player1,-.5,0,0
If KeyDown(200) Then MoveEntity Player1,0,0,.5
If KeyDown(208) Then MoveEntity Player1,0,0,-.5

If MeshesIntersect(player1,lift) Then PositionEntity Player1,EntityX(Player1),EntityY(Lift)+6,EntityZ(Player1);EntityParent Player1,Lift


If GetParent(Player1) = 0 Then TranslateEntity Player1,0,-.5,0
Text 100,100, GetParent(Player1)
Flip   
Until KeyHit(1)
 

Dreamora

BeitragSo, Nov 12, 2006 15:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Um das Raufbeamen zu verhindern, kannst du bei der Kollision CollisionNX NY NZ betrachten.

Wenn er auf dem Lift steht, ist NX = NZ = 0, und NY ist nach oben gerichtet. (vorausgesetzt das Kollisionsmesh deines Liftes ist eine Ebene)
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Iguan

BeitragSo, Nov 12, 2006 20:49
Antworten mit Zitat
Benutzer-Profile anzeigen
hmm... auch mit collisionNY usw. hab ichs nicht hingekriegt...
hab mal zur vereinfachung anstelle einer Lift-platform, einen deformierenden cube genommen.
es klappt alles, es gibt nur 2 dinge die mich stören:

1. das Zittern des players..
2. wenn man während dem rauf oder runterfahren die blaue wand berührt, dann fällt man durch den lift hinduch, oder bleibt an der wand kleben...

bin jetzt schon sehr lange an diesem problem, und ich komme echt nicht mehr weiter!

Code: [AUSKLAPPEN]

Graphics3D 640,480,32,2

cam = CreateCamera()
RotateEntity cam,20,0,0


Boden = CreateCube()
ScaleEntity Boden,50,1,50
MoveEntity Boden,0,-20,10
EntityType Boden,1



Lift = CreateCube()
EntityColor Lift, 0,255,0
EntityType Lift,2

Player1 = CreateCube()
EntityColor Player1,255,0,0
ScaleEntity Player1,3,5,3
EntityRadius Player1,3,5
PositionEntity Player1,-20,-10,20
EntityType Player1,3

wand = CreateCube()
ScaleEntity wand,3,17,8
EntityColor wand,0,0,255
PositionEntity wand,11,-10,40
EntityType wand,1


;WireFrame 1
pause = 1

Collisions 3,2,2,3
Collisions 3,1,2,3

Repeat
Cls

If Liftwechsel = 0 And Pause = 0 Then h# = h# + .1
If Liftwechsel = 1 And Pause = 0 Then h# = h# - .1
If h# >= 10 Then Liftwechsel = 1:Pause = 1
If h# <= 0 Then Liftwechsel = 0:Pause = 1

ScaleEntity Lift,8,.5+h#,8
PositionEntity Lift,0,-19+h#, 40

If Pause = 1 Then
   Pausentimer = Pausentimer + 1
   If Pausentimer > 200 Then Pausentimer = 0:Pause = 0
EndIf

If KeyDown(205) Then MoveEntity Player1,.5,0,0
If KeyDown(203) Then MoveEntity Player1,-.5,0,0
If KeyDown(200) Then MoveEntity Player1,0,0,.5
If KeyDown(208) Then MoveEntity Player1,0,0,-.5



UpdateWorld
RenderWorld   

If EntityCollided(Player1,2) Then 
    Text 300,300,"Kollision!!!"
 
    If Liftwechsel = 0 And Liftpause = 0 Then TranslateEntity Player1,0,1.4,0
    If Liftwechsel = 1 And Liftpause = 0 Then TranslateEntity Player1,0,-1.4,0

  ;PositionEntity Player1,EntityX(Player1),EntityY(Lift)+5.5,EntityZ(Player1)
 
 
End If





TranslateEntity Player1,0,-1,0
Text 100,100, GetParent(Player1)
Flip   
Until KeyHit(1)
End
 

Dreamora

BeitragSo, Nov 12, 2006 21:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Problem mit dem Zittern lässt sich insofern beheben, dass du die Gravitation aufhebst, solange der Spieler mit dem Lift kollidiert. (Ich hatte jedoch das Problem nicht beim testen mit deinem Source)


Das Problem mit dem Klebenbleiben kannst du einfach lösen, indem du bei der Reaktion auf 2 gehst (also rauf und runter sliden), anstatt 3 (nur rauf sliden).

Hindurchfallen ist mir hingegen nicht gelungen.
Notfalls lässt sich das jedoch auch beheben, indem du einen LinePick machst, vom Spieler gerade nach unten, mit der Länge der Gravitation (falls 0,0,0 an den Füssen ist. Beim Würfel wärs halbe seitenlänge + gravitation)
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Iguan

BeitragSo, Nov 12, 2006 21:36
Antworten mit Zitat
Benutzer-Profile anzeigen
die reaktion darf ich nicht auf 2 stellen, da ich in meinem richtigen spiel rampen habe, die ich nicht runtersliden darf...

Iguan

BeitragMi, Nov 15, 2006 22:05
Antworten mit Zitat
Benutzer-Profile anzeigen
1. Muss ich um Lift zu fahren wirklich eine Physikengine einbauen?
Ist es nur so möglich auf bewegenden Plattformen zu stehen, und stehen bleiben? Möchte eben gerne später auch so was ähnliches wie eine seilbahn realisieren?

2. kennt ihr zufällig ein deutsches tutorial zu tokamak?? finde nur englisches zeugs... Confused
 

X0r

BeitragMo, Nov 20, 2006 14:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Nimm doch ODE.
 

Dreamora

BeitragMo, Nov 20, 2006 14:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Iguan hat Folgendes geschrieben:
die reaktion darf ich nicht auf 2 stellen, da ich in meinem richtigen spiel rampen habe, die ich nicht runtersliden darf...


Und wo genau ist da das Problem? Du wirst hoffentlich nicht auf die Idee gekommen sein und hast Lift im gleichen Kollisionstyp wie die Levelgeometrie, oder?

Denn Lifte sind nicht statisch, können - sollen - dürfen insofern auch nicht wie eine solche behandelt werden.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

BtbN

BeitragMo, Nov 20, 2006 14:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein weg um das langsame MeshInersect zu vermeiden wäre es, eine Projektion des Lifts von Oben zu machen, und nur zu berechnen, ob sich der mittelpunkt des Spieler-Objekts innerhalb dieser 2 Dimensionalen Projektion liegt UND oberhalb des 3D-Objekts.

Eine Physik Engine ist, wenn sie NUR für die Lifts gebraucht wird, überflüssig.
Ein gutes beispiel wie es ohne geht, ist WoW. Dort gibt es auch Lifts/Schiffe/Zepeline, bei denen sich der Spieler mitbewegt, sobald er sich über ihnen befindet.
Wenn man dann so einen Lift betritt, steht z.B. im Server-Log:

Player "TEST" entered lift #1234
Player "TEST" left lift #1234

Und solang er drinne ist, wird er mit dem Lift nach oben bewegt.

Ich hoffe, ich konnte helfen.

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group