EntityPick Problem

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

Megamag

Betreff: EntityPick Problem

BeitragDi, Jun 23, 2009 20:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi, es gibt wieder Probleme mit der Kameraführung.
Es geht darum, wenn sich ein Hindernis zwischen Player und Kamera
befinded, sich die Kamera nach vorne vor das Hindernis bewegen/springen soll.
Denn sonst ist die irgendwie hinter Wänden und Co verschwunden, was eine Navigation
unmöglich macht. Hier ist der Code+Mediendaten:
https://www.blitzforum.de/upload/file.php?id=5972

FÜhrt den mal aus, dann geht ihr nach hinten (W,A,S,D + Maus) wo die Tür ist, und
dann geht ihr nach rechts, sodass die eine Wand zwischen der Kamera und dem Player ist.
Die Kamera sollte jetzt vor die Wand springen, sie bleibt aber hinter der Wand, und wackelt
komisch hin und her, wird unkontrollierbar. Wo liegt der Fehler im Code?

EDIT:
Ok, ich weiß nicht, warum hier keiner Antwortet. Habt ihr keine Lust, die FIles runterzuladen?
Falls dem so ist, hier nochmal der Code, ohne Dateien:

Code: [AUSKLAPPEN]
Graphics3D 1024, 768, 32, 1
SetBuffer BackBuffer()

Const links = 30
Const rechts = 32
Const hoch = 17
Const runter = 31

Const C_CAM=1
Const C_CC=2

Collisions C_CAM,C_CC,2,3

Global cam=CreateCamera()
EntityType cam,C_CAM

Global player=CreateCube()
EntityRadius player,1.8
EntityType player,1
Global playerpiv=CreateSphere(16,player)
ScaleEntity playerpiv,.3,.3,.3
PositionEntity playerpiv,0,3,0
EntityAlpha playerpiv,0.5

PositionEntity player,0,-30,120

;Global cam2=CreateCamera()
;PositionEntity cam2,0,20,-20
;PointEntity cam2,player

light = CreateLight(2)
PositionEntity light, 0, 20, 0
LightRange light,35

scene = LoadMesh("data\Models\level1.b3d")
ScaleEntity scene,2,2,2
PositionEntity scene, 0, 0, 0
EntityType scene,C_CC
EntityPickMode scene,2
;EntityColor scene,0,80,0

tree=CreateCube()
PositionEntity tree,0,0,-18
ScaleEntity tree,3,4,3
EntityPickMode tree,2


Global XXX#=20
Global YYY#=20
Global ZZZ#=20
Global c#=0
Global picked#

picko=CreatePivot()

;----------------------------------------------------------------------------;

While Not KeyHit(1)

picked=EntityPick(cam,XXX)
If picked>0 Then
PositionEntity picko,PickedX(),PickedY(),PickedZ()
XXX=EntityDistance(picko,player)
EndIf

winkel=winkel-MouseXSpeed()/2
winkel2=winkel2+MouseYSpeed()/1.8
X# = XXX * Cos( winkel ) * Cos( winkel2 )
Y# = XXX * Sin( winkel2 )
Z# = XXX * Sin( winkel ) * Cos( winkel2 )
PositionEntity cam,EntityX(player)+x,EntityY(player)+y,EntityZ(player)+z
RotateEntity player,EntityPitch(player),winkel+90,EntityRoll(player)

If XXX>20 XXX=20

If  EntityY(cam)<EntityY(player) Then ;EntityY(cam)<EntityY(player)-1 Then ;PositionEntity cam,EntityX(cam),EntityY(player),EntityZ(cam)
XXX=c#
EndIf

If EntityDistance(cam,player)<19.5 And picked=0 Then
XXX=c#
EndIf


PointEntity cam,playerpiv

MoveMouse 512,384


If KeyDown(hoch) MoveEntity player,0,0,0.3
If KeyDown(runter) MoveEntity player,0,0,-0.3
If KeyDown(links) MoveEntity player,-0.3,0,0
If KeyDown(rechts) MoveEntity player,0.3,0,0


UpdateWorld
RenderWorld
a#=EntityPitch(cam)*EntityPitch(cam)
b#=EntityPitch(cam)/a
c#=b*-200

Text 0,0,"picked: "+picked
Text 0,30,"Abstand cam-player: "+XXX+"m"

Flip
Wend
End

;----------------------------------------------------------------------------;


EDIT2:
Weiß echt keiner eine Lösung?
Das kann doch gar nicht sein?
  • Zuletzt bearbeitet von Megamag am Mo, Jul 06, 2009 20:59, insgesamt einmal bearbeitet
 

Kruemelator

BeitragSo, Jun 28, 2009 17:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Benutze LinePick.
Einfach die Achse oder "Linie" von der Spielfigur in die Richtung wo die Kamera wäre, und dann den Kollisionspunkt bestimmen und die Entfernung vergleichen. Wenn sie kleiner ist als die Entfernung der gewollten Kamperaposition dann muss sie auf dem Kollisionspunkt platziert werden.

Außerdem braucht deine Kamera keine Kollision Wink

Edit: Habe gerade dein anders Problem gesehen:
Man kann es auch mit Kollision machen. Einfach die Kamera in der Spielfigur platzieren, und dann in die Richtung bewegen in der die Kamera sein soll, wenn sie auf eine Wand stößt bleibt sie ja stehen.

Megamag

BeitragSo, Jun 28, 2009 18:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Habe ich alles schon versucht, nichts hat geklappt.
Wenn ich die Kamera auf den Spieler setze, passiert gar nichts.
Die Kollision der Cam ist notwendig, um nicht durch die Wände zu gehen.
LinePick funktioniert nich korrekt, deshalb habe ich es gelassen.
Aber trotzdem danke für die Antwort!

Der_Schläfer

BeitragDo, Jul 02, 2009 16:25
Antworten mit Zitat
Benutzer-Profile anzeigen
du musst die kollision der kamera entfernen und den linepick zum laufen bringen dann passt des schon

Megamag

BeitragDo, Jul 02, 2009 19:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Aber ich brauche die Kollision.
Wenn man sich soinst vor eine Wand stellt, und dann dreht, dann ist die KAmera durch
die Wand. So slided sie an der Wand entlang.

Der_Schläfer

BeitragFr, Jul 03, 2009 8:27
Antworten mit Zitat
Benutzer-Profile anzeigen
hm, ich kuck mir das mal an...

das wurgel

BeitragSa, Jul 04, 2009 19:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab mir mal Gedanken darüber gemacht und bin zu folgender Lösung gekommen: Jeden Schleifenduchlauf werden die Collisions gecleart, die Camera wird an Position der Player gebracht, dann kommt UpdateWorld, weil sich die gesetzten Collisions erst in UpdateWorld auswirken, dann werden die Collisions wieder gesetzt und die Camera wird an die Position geschoben, an die sie eigentlich hinsoll. Dabei kollidiert sie gegen die Wände, die sich zwischen Player und der Sollposition befinden.
Das ist zwar nicht so super mit dem UpdateWorld zwei mal in der Schleife, aber es ist immerhin eine Lösung
Code: [AUSKLAPPEN]
Graphics3D 1024, 768, 32, 1
SetBuffer BackBuffer()

Const links = 30
Const rechts = 32
Const hoch = 17
Const runter = 31

Const C_CAM=1
Const C_CC=2
Const C_PLAYER=3

Collisions C_CAM,C_CC,2,3
Collisions C_PLAYER,C_CC,2,3

Global cam=CreateCamera()
EntityType cam,C_CAM

Global player=CreateCube()
EntityRadius player,1.8
EntityType player,C_PLAYER
Global playerpiv=CreateSphere(16,player)
ScaleEntity playerpiv,.3,.3,.3
PositionEntity playerpiv,0,3,0
EntityAlpha playerpiv,0.5

PositionEntity player,0,-25,120

;Global cam2=CreateCamera()
;PositionEntity cam2,0,20,-20
;PointEntity cam2,player

light = CreateLight(2)
PositionEntity light, 0, 20, 0
LightRange light,35

scene = LoadMesh("data\Models\level1.b3d")
ScaleEntity scene,2,2,2
PositionEntity scene, 0, 0, 0
EntityType scene,C_CC
EntityPickMode scene,2
;EntityColor scene,0,80,0

tree=CreateCube()
PositionEntity tree,0,0,-18
ScaleEntity tree,3,4,3
;EntityPickMode tree,2

Global XXX#=20
Global YYY#=20
Global ZZZ#=20
Global c#=0
Global picked#


;----------------------------------------------------------------------------;

While Not KeyHit(1)
   winkel=winkel-MouseXSpeed()/2
   winkel2=winkel2+MouseYSpeed()/1.8
   X# = 20 * Cos( winkel ) * Cos( winkel2 )
   Y# = 20 * Sin( winkel2 )
   Z# = 20 * Sin( winkel ) * Cos( winkel2 )
   
   ClearCollisions()
   PositionEntity cam,EntityX(player),EntityY(player),EntityZ(player)
   UpdateWorld()
   Collisions C_CAM,C_CC,2,3
   Collisions C_PLAYER,C_CC,2,3
   TranslateEntity cam, x, y, z
   
   RotateEntity player,EntityPitch(player),winkel+90,EntityRoll(player)
   
   XXX=EntityDistance(cam,player)
   
   PointEntity cam,playerpiv
   
   MoveMouse 512,384
   
   If KeyDown(hoch) Then MoveEntity player,0,0,0.3
   If KeyDown(runter) Then MoveEntity player,0,0,-0.3
   If KeyDown(links) Then MoveEntity player,-0.3,0,0
   If KeyDown(rechts) Then MoveEntity player,0.3,0,0
   
   UpdateWorld
   RenderWorld
   
   Text 0,30,"Abstand cam-player: "+XXX+"m"
   
   Flip
Wend
End


edit: Eigentlich müsste das Code: [AUSKLAPPEN]
PointEntity cam,playerpiv
vor die Kamerabewegung, damit sie auch wirklich auf die richtige stelle zeigt, doch dann wackelt alles ganz komisch...
1 ist ungefähr 3

Der_Schläfer

BeitragSo, Jul 05, 2009 21:41
Antworten mit Zitat
Benutzer-Profile anzeigen
ich hatts mal probiert mit

"wenn camera kollidiert dann
wird ein linepick nach hinten gemacht, die kollision der cam deaktiviert, die cam gesetzt, die kollision wieder aktiviert"

bei mir hats auch so blöde gewackelt, argh, bin unfähig :/

Megamag

BeitragMo, Jul 06, 2009 19:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich danke euch vielmals. Very Happy
Nur kann sich einer von euch das Ruckeln erklären?
Ich habe jetzt einiges ausprobiert, aber ich kriegs nicht weg...
Woran liegt es denn überhaupt?

Der_Schläfer

BeitragMo, Jul 06, 2009 19:31
Antworten mit Zitat
Benutzer-Profile anzeigen
lol, wenn ich das wüsste Very Happy das ist eben das problem...

Megamag

BeitragMo, Jul 06, 2009 19:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe mal folgendes ausprobiert:
Code: [AUSKLAPPEN]
Const runter = 31

Const C_CAM=1
Const C_CC=2
Const C_PLAYER=3

Collisions C_CAM,C_CC,2,3
Collisions C_PLAYER,C_CC,2,3

Global cam=CreatePivot()
EntityType cam,C_CAM

Global camera=CreateCamera()

Global player=CreateCube()
EntityRadius player,1.8
EntityType player,C_PLAYER
Global playerpiv=CreateSphere(16,player)
ScaleEntity playerpiv,.3,.3,.3
PositionEntity playerpiv,0,3,0
EntityAlpha playerpiv,0.5

PositionEntity player,0,-25,120

;Global cam2=CreateCamera()
;PositionEntity cam2,0,20,-20
;PointEntity cam2,player

light = CreateLight(2)
PositionEntity light, 0, 20, 0
LightRange light,35

scene = LoadMesh("data\Models\level1.b3d")
ScaleEntity scene,2,2,2
PositionEntity scene, 0, 0, 0
EntityType scene,C_CC
EntityPickMode scene,2
;EntityColor scene,0,80,0

tree=CreateCube()
PositionEntity tree,0,0,-18
ScaleEntity tree,3,4,3
;EntityPickMode tree,2

Global XXX#=20


;----------------------------------------------------------------------------;

While Not KeyHit(1)
   winkel=winkel-MouseXSpeed()/2
   winkel2=winkel2+MouseYSpeed()/1.8
   X# = 20 * Cos( winkel ) * Cos( winkel2 )
   Y# = 20 * Sin( winkel2 )
   Z# = 20 * Sin( winkel ) * Cos( winkel2 )

   XXX=EntityDistance(camera,player)
   PositionEntity camera,EntityX(cam,True),EntityY(cam,True),EntityZ(cam,True)   
   PointEntity camera,playerpiv
   
   ClearCollisions()
   PositionEntity cam,EntityX(player),EntityY(player),EntityZ(player)
   UpdateWorld()
   Collisions C_CAM,C_CC,2,3
   Collisions C_PLAYER,C_CC,2,3
   TranslateEntity cam, x, y, z

   RotateEntity player,EntityPitch(player),winkel+90,EntityRoll(player)
   
   MoveMouse 512,384
   
   If KeyDown(hoch) Then MoveEntity player,0,0,0.3
   If KeyDown(runter) Then MoveEntity player,0,0,-0.3
   If KeyDown(links) Then MoveEntity player,-0.3,0,0
   If KeyDown(rechts) Then MoveEntity player,0.3,0,0
   
   UpdateWorld
   RenderWorld
   
   Text 0,30,"Abstand cam-player: "+XXX+"m"
   
   Flip
Wend
End


Das geht ohne Ruckeln, nur bin ich mit dem doppelten Updateworld irgendwie nicht so glücklich. Naja, solange es erstmal läuft...

Der_Schläfer

BeitragMo, Jul 06, 2009 20:41
Antworten mit Zitat
Benutzer-Profile anzeigen
yeah!

ich hab die kollision ganz rausgenommen und jetzt funktionierts wunderbar.

Code: [AUSKLAPPEN]
Graphics3D 1024, 768, 32, 2
SetBuffer BackBuffer()

Const links = 30
Const rechts = 32
Const hoch = 17
Const runter = 31

Const C_CAM=1
Const C_CC=2

Collisions C_CAM,C_CC,2,3

Global cam=CreateCamera()
EntityType cam,C_CAM

Global player=CreateCube()
EntityRadius player,1.8
EntityType player,1
Global playerpiv=CreateSphere(16,player)
ScaleMesh playerpiv,.3,.3,.3
PositionEntity playerpiv,0,3,0
EntityAlpha playerpiv,0.5
PositionEntity player,0,-30,120



;Global cam2=CreateCamera()
;PositionEntity cam2,0,20,-20
;PointEntity cam2,player

takt=CreateTimer(60)

light = CreateLight(2)
PositionEntity light, 0, 20, 0
LightRange light,35

scene = LoadMesh("data\Models\level1.b3d")
ScaleEntity scene,2,2,2
PositionEntity scene, 0, 0, 0
EntityType scene,C_CC
EntityPickMode scene,2


tree=CreateCube()
PositionEntity tree,0,0,-18
ScaleEntity tree,3,4,3
EntityPickMode tree,2

;den max. abstand der kamera zum spieler definieren
Const camradius=20

;abstand der kamera vom spieler in horinzontaler und vertikaler richtung
Global relXcam#,relYcam#

;----------------------------------------------------------------------------;

While Not KeyHit(1)


If KeyDown(hoch) MoveEntity player,0,0,0.3
If KeyDown(runter) MoveEntity player,0,0,-0.3
If KeyDown(links) MoveEntity player,-0.3,0,0
If KeyDown(rechts) MoveEntity player,0.3,0,0



winkel#=winkel-MouseXSpeed()/2.
winkel2#=winkel2+MouseYSpeed()/3.


If winkel2>-20 Then
winkel2=-20
EndIf

If winkel2<-80 Then
winkel2=-80
EndIf

relXcam=Sin(winkel2)*camradius
relYcam=Cos(winkel2)*camradius

RotateEntity player,0,winkel,0

LinePick EntityX(playerpiv,1),EntityY(playerpiv,1),EntityZ(playerpiv,1),relXcam*Sin(-winkel),relYcam,relXcam*Cos(-winkel),0

EntityType cam,0
PositionEntity cam,PickedX(),PickedY(),PickedZ(),1
DebugLog PickedX()+";"+PickedY()+";"+PickedZ()
EntityType cam,C_CAM

If PickedEntity()=0 Then
EntityParent cam,playerpiv
PositionEntity cam,0,relYcam,relXcam,0
EntityParent cam,0
EndIf


PointEntity cam,playerpiv

MoveMouse 512,384



UpdateWorld
RenderWorld

Flip 0
WaitTimer takt
Wend
End

;----------------------------------------------------------------------------;


probiers mal aus und wenn was noch nicht klappt wies sollte meld dich

ich hab übrigens noch ein paar dinge leicht verändert, inkl. variablennamen, damit die (mich) weniger verwirren.

Megamag

BeitragMo, Jul 06, 2009 20:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Wow, also das...ist...perfekt Very Happy
Aber eine Sache ist noch offen. Und zwar geht jetzt diese Funktion nicht mehr,
dass die Kamera so an den Player ran kommt (nach oben schauen), wenn ich in Richtung Boden
steuere. Ich weiß nicht, ob man das noch einbauen kann, vielleicht kann ich es auch selber, aber
du kannst mir ja einen Ansatz geben Wink

Dann habe ich das ganze mal getestet, das erste Mal ist die Kamera irgendwie wild irgendwo hängen
geblieben und war unkontrollierbar, die anderen Male ging es wunderbar. Vielen dank! Very Happy

Der_Schläfer

BeitragMo, Jul 06, 2009 21:10
Antworten mit Zitat
Benutzer-Profile anzeigen
oha, die hatt ich wohl übersehen. was machmer da...

öhm mein ansatz jetzt währe

Code: [AUSKLAPPEN]
Const camradiusx=10
Const camradiusy=20


anstatt nur einem kamera-radius zu machen.
danach nimmste den einen für die berechnung von relxcam und den anderen für relycam...

Megamag

BeitragDi, Jul 07, 2009 15:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, ich habe es geschafft Very Happy
Jetzt habe ich nur noch ein Problem, dann gebe ich (erstmal) Ruhe. Und zwar kommt die Kamera immer noch durch die Wände durch. D.h. sie kommt nicht durch, aber man kann durch sie durch sehen.Stell dich mal an die Wand und drehe die Kamera an der Wand vorbei, sodass sie kollidiert. Es wird folgendes zusehen sein:
user posted image

Mit Entityradius oder LinePick Radius größer machen hat's nicht geklappt. Weißt du, wie man das ganze beheben könnte? Hier ist jetzt mein neuer Code:

Code: [AUSKLAPPEN]
Graphics3D 1024, 768, 32, 2
SetBuffer BackBuffer()

Const links = 30
Const rechts = 32
Const hoch = 17
Const runter = 31

Const C_CAM=1
Const C_CC=2

Collisions C_CAM,C_CC,2,3

Global cam=CreateCamera()

EntityType cam,C_CAM

Global player=CreateCube()
EntityRadius player,1.8
EntityType player,1
Global playerpiv=CreateSphere(16,player)
ScaleMesh playerpiv,.3,.3,.3
PositionEntity playerpiv,0,3,0
EntityAlpha playerpiv,0.5
PositionEntity player,0,-30,120



;Global cam2=CreateCamera()
;PositionEntity cam2,0,20,-20
;PointEntity cam2,player

takt=CreateTimer(60)

light = CreateLight(2)
PositionEntity light, 0, 20, 0
LightRange light,35

scene = LoadMesh("data\Models\level1.b3d")
ScaleEntity scene,2,2,2
PositionEntity scene, 0, 0, 0
EntityType scene,C_CC
EntityPickMode scene,2


tree=CreateCube()
PositionEntity tree,0,0,-18
ScaleEntity tree,3,4,3
EntityPickMode tree,2

;den max. abstand der kamera zum spieler definieren
Global camradiusX#=20
Global camradiusY#=20

;abstand der kamera vom spieler in horinzontaler und vertikaler richtung
Global relXcam#,relYcam#

;FPS
Global FPS#=0
Global FPSZahl#=0
Global timer#=0

;----------------------------------------------------------------------------;

While Not KeyHit(1)


If KeyDown(hoch) MoveEntity player,0,0,0.3
If KeyDown(runter) MoveEntity player,0,0,-0.3
If KeyDown(links) MoveEntity player,-0.3,0,0
If KeyDown(rechts) MoveEntity player,0.3,0,0



winkel#=winkel-MouseXSpeed()/2.
winkel2#=winkel2+MouseYSpeed()/3.


If winkel2>-20 Then
winkel2=-20
EndIf

If winkel2<-150 Then
winkel2=-150
EndIf

relXcam=Sin(winkel2)*camradiusX
relYcam=Cos(winkel2)*camradiusY

RotateEntity player,0,winkel,0

LinePick EntityX(playerpiv,1),EntityY(playerpiv,1),EntityZ(playerpiv,1),relXcam*Sin(-winkel),relYcam,relXcam*Cos(-winkel),0

EntityType cam,0
PositionEntity cam,PickedX(),PickedY(),PickedZ(),1
DebugLog PickedX()+";"+PickedY()+";"+PickedZ()
EntityType cam,C_CAM

If PickedEntity()=0 Then
EntityParent cam,playerpiv
PositionEntity cam,0,relYcam,relXcam,0
EntityParent cam,0
EndIf


PointEntity cam,playerpiv

MoveMouse 512,384


UpdateWorld
RenderWorld
;DEBUG
FPS()
Text 0,0,"FPS: "+Int(FPS)
Text 0,20,"Abstand der Kamera zum Player: "+Int(EntityDistance(cam,player))
Text 0,40,"EntityX(cam): "+Int(EntityX(cam))+" | EntityY(cam): "+Int(EntityY(cam))+" | EntityZ(cam): "+Int(EntityZ(cam))   
Text 0,60,"EntityX(player): "+Int(EntityX(player))+" | EntityY(player): "+Int(EntityY(player))+" | EntityZ(player): "+Int(EntityZ(player))
Text 0,80,"Y Winkel: "+winkel2     
;-------
Flip 0
WaitTimer takt
Wend
End

;----------------------------------------------------------------------------;

Function FPS()
   FPSZahl=FPSZahl+1
   If MilliSecs()-timer >= 1000 Then
  timer = MilliSecs()
  FPS=FPSZahl
  FPSZahl=0
EndIf
End Function

Der_Schläfer

BeitragDi, Jul 07, 2009 15:24
Antworten mit Zitat
Benutzer-Profile anzeigen
jo is klar, entityradius hat ja nix mit linepick zu tun und der radius des linepicks verwandelt den pick-"strahl" zwar in eine art "röhre" aber das ändert auch nix

ich würde, nach dem pointentity cam,playerpiv dings, die kamera ein bissle richtung pivot bewegen, das sollte genügen

edit: also per moveentity

Megamag

BeitragDi, Jul 07, 2009 16:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, das hat allerdings nur teilweise geholfen. Durch den Boden geht es jetzt gar nicht mehr, aber durch die Wand immer noch zum Teil. Und da ist es egal, um wieviele Einheiten ich die nach vorne verschiebe (habe es ausprobiert), das Problem bleibt, da das wahrscheinlich die natürliche Schrägstellung der Kamera verursacht. Ich hoffe, du weißt, was ich meine Wink Hier nochmal ein Screen:

user posted image

Der_Schläfer

BeitragDi, Jul 07, 2009 17:41
Antworten mit Zitat
Benutzer-Profile anzeigen
hm, hast recht ist wohl nicht so ne geschickte lösung. öhm...

edit:
so, jetzt klappt auch das.
ich hab auch rausgefunden warums bei dir mal die cam verklemmt hat, es hatte in meinem code noch entitytype cam,c_cam drin am anfang

ich hab jetzt im prinzip die kollision wieder reingetan und dann angewendet wenn die kamera vom pivot nach hinten positioniert wird, dorthin wo der linepick getroffen hat...

Code: [AUSKLAPPEN]
Graphics3D 1024, 768, 32, 2
SetBuffer BackBuffer()

Const links = 30
Const rechts = 32
Const hoch = 17
Const runter = 31

Const C_CAM=1
Const C_CC=2

Collisions C_CAM,C_CC,2,3

Global cam=CreateCamera()

EntityRadius cam,1


Global player=CreateCube()
EntityRadius player,1.8
EntityType player,1
Global playerpiv=CreateSphere(16,player)
ScaleMesh playerpiv,.3,.3,.3
PositionEntity playerpiv,0,3,0
EntityAlpha playerpiv,0.5
PositionEntity player,0,-30,120



;Global cam2=CreateCamera()
;PositionEntity cam2,0,20,-20
;PointEntity cam2,player

takt=CreateTimer(60)

light = CreateLight(2)
PositionEntity light, 0, 20, 0
LightRange light,35

scene = LoadMesh("data\Models\level1.b3d")
ScaleEntity scene,2,2,2
PositionEntity scene, 0, 0, 0
EntityType scene,C_CC
EntityPickMode scene,2


tree=CreateCube()
PositionEntity tree,0,0,-18
ScaleEntity tree,3,4,3
EntityPickMode tree,2

;den max. abstand der kamera zum spieler definieren
Global camradiusX#=20
Global camradiusY#=20

;abstand der kamera vom spieler in horinzontaler und vertikaler richtung
Global relXcam#,relYcam#

;FPS
Global FPS#=0
Global FPSZahl#=0
Global timer#=0

;----------------------------------------------------------------------------;

While Not KeyHit(1)


If KeyDown(hoch) MoveEntity player,0,0,0.3
If KeyDown(runter) MoveEntity player,0,0,-0.3
If KeyDown(links) MoveEntity player,-0.3,0,0
If KeyDown(rechts) MoveEntity player,0.3,0,0



   winkel#=winkel-MouseXSpeed()/2.
   winkel2#=winkel2+MouseYSpeed()/3.
   
   
   If winkel2>-20 Then
      winkel2=-20
   EndIf
   
   If winkel2<-150 Then
      winkel2=-150
   EndIf
   
   relXcam=Sin(winkel2)*camradiusX
   relYcam=Cos(winkel2)*camradiusY
   
   RotateEntity player,0,winkel,0
   
   EntityType cam,0
   PositionEntity cam,EntityX(playerpiv,1),EntityY(playerpiv,1),EntityZ(playerpiv,1)
   EntityType cam,C_CAM
   
   LinePick EntityX(playerpiv,1),EntityY(playerpiv,1),EntityZ(playerpiv,1),relXcam*Sin(-winkel),relYcam,relXcam*Cos(-winkel),0

   If PickedEntity()<>0 Then
      PositionEntity cam,PickedX(),PickedY(),PickedZ(),1
   Else
      EntityParent cam,playerpiv
      PositionEntity cam,0,relYcam,relXcam,0
      EntityParent cam,0
   EndIf
   
   
   PointEntity cam,playerpiv
   
   MoveMouse 512,384


UpdateWorld
RenderWorld
;DEBUG
FPS()
Text 0,0,"FPS: "+Int(FPS)
Text 0,20,"Abstand der Kamera zum Player: "+Int(EntityDistance(cam,player))
Text 0,40,"EntityX(cam): "+Int(EntityX(cam))+" | EntityY(cam): "+Int(EntityY(cam))+" | EntityZ(cam): "+Int(EntityZ(cam))   
Text 0,60,"EntityX(player): "+Int(EntityX(player))+" | EntityY(player): "+Int(EntityY(player))+" | EntityZ(player): "+Int(EntityZ(player))
Text 0,80,"Y Winkel: "+winkel2     
;-------
Flip 0
WaitTimer takt
Wend
End

;----------------------------------------------------------------------------;

Function FPS()
   FPSZahl=FPSZahl+1
   If MilliSecs()-timer >= 1000 Then
  timer = MilliSecs()
  FPS=FPSZahl
  FPSZahl=0
EndIf
End Function

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group