hab den Code nochmal ein bisschen erweitert.
Die Kamera lässt sich jetzt frei um das Mesh drehen, wenn man die rechte Maustaste gedrückt hält.
1. Kann man die Höhe eines Entitys ermitteln (eventuell sogar direkt aus dem Speicher lesen)? Da so eine Rotation ja um den Kopf des Spielers stattfinden sollte.
2. Falls einer nich animierte Mesh einbauen will möchte ich noch ein bisschen Werbung für meinen Konverter machen.
Code: Alles auswählen
;
; ------------------------------------------------------------
;
; PureBasic - Terrain
;
; (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;
#CameraSpeed = 5
IncludeFile "Screen3DRequester.pb"
Define.f KeyX, KeyY, MouseX, MouseY
; die folgenden beiden Proceduren rechnen einen Winkel vom Bogenmaß ins Gradmaß um
Procedure.f GSin(winkel.f)
ProcedureReturn Sin(winkel*#PI/180)
EndProcedure
Procedure.f GCos(winkel.f)
ProcedureReturn Cos(winkel*#PI/180)
EndProcedure
If InitEngine3D()
Add3DArchive("Data\" , #PB_3DArchive_FileSystem)
Add3DArchive("Data\Skybox.zip", #PB_3DArchive_Zip)
InitSprite()
InitKeyboard()
InitMouse()
If Screen3DRequester()
LoadMesh (0, "Robot.mesh");-Mesh laden
CreateMaterial (0, LoadTexture(0, "Terrain_Texture.jpg"))
AddMaterialLayer(0, LoadTexture(1, "Terrain_Detail.jpg"), 1)
CreateMaterial(2, LoadTexture(2, "r2skin.jpg")) ;-Material für Entity erstellen
CreateTerrain("Terrain.png", MaterialID(0), 1, 1, 1, 4)
CreateEntity(1, MeshID(0), MaterialID(2), 100,100,100) ;-Entity erstellen
CreateCamera(0, 0, 0, 100, 100)
CameraLocate(0, 128, 25, 128)
SkyDome("Clouds.jpg",5)
CreateLight(0,RGB(200,100,150),0,200,0)
AmbientColor(RGB(177,180,177))
WorldShadows(#PB_Shadow_Modulative)
ScaleEntity(1,0.1,0.1,0.1)
;-Entity X und Z position
Global botx.f, botz.f
botx = 300
botz = 300
; Distanz der Camera zum Entity kann mit Mausrad verändert werden
; Mindestwert
MinCameraDistance = 5
; Maximalwert
MaxCameraDistance = 50
; Standardeinstellung
CameraDistance = 20
; Hier noch ein Paar optionen für die Camera Rotation
; AngleX ist waagerecht (bei 360 kann der Spieler sich komplett um das Mesh drehen)
MaxCameraAngleX = 360
MinCameraAngleX = 0
; AngleY ist senkrecht und als Sollwert definiert, die wahre Höhe wird an das Terrain angepasst
MaxCameraAngleY = 80
MinCameraAngleY = -20
; Mindesthöhe der Camera
MinCameraHeight = 5
Repeat
Screen3DEvents()
If ExamineKeyboard()
If KeyboardPushed(#PB_Key_Left)
KeyX = -#CameraSpeed
ElseIf KeyboardPushed(#PB_Key_Right)
KeyX = #CameraSpeed
Else
KeyX = 0
EndIf
If KeyboardPushed(#PB_Key_Up)
KeyY = -#CameraSpeed
ElseIf KeyboardPushed(#PB_Key_Down)
KeyY = #CameraSpeed
Else
KeyY = 0
EndIf
;-Entity bewegen
If KeyboardPushed(#PB_Key_A)
rot + 1
RotateEntity(1,rot,0,0)
RotateCamera(0, 1 , 0, RollZ)
ElseIf KeyboardPushed(#PB_Key_D)
rot - 1
RotateEntity(1,rot,0,0)
RotateCamera(0, -1 , 0, RollZ)
EndIf
If KeyboardPushed(#PB_Key_W)
botx = botx + Cos(2*#PI*(rot/360))*0.1
botz = botz - Sin(2*#PI*(rot/360))*0.1
anim = 1
ElseIf KeyboardPushed(#PB_Key_S)
Else
anim = 0
EndIf
boty = TerrainHeight(botx,botz)+7
EndIf
If anim = 1
If funk = 0
funk = 1
AnimateEntity(1, "Walk")
EndIf
Else
If funka = 0
funka = 1
AnimateEntity(1, "Idle")
EndIf
EndIf
If anim = 0 And funk = 1
funk = 0
EndIf
If anim = 1 And funka = 1
funka = 0
EndIf
If ExamineMouse()
MouseX = -(MouseDeltaX()/10)*#CameraSpeed/2
MouseY = -(MouseDeltaY()/10)*#CameraSpeed/2
; diese Werte benutze ich für die Bewegung der Camera
MouseDeltaX = MouseDeltaX()
MouseDeltaY = MouseDeltaY()
If MouseWheel()
CameraDistance-MouseWheel()*#CameraSpeed/4
If CameraDistance < MinCameraDistance
CameraDistance = MinCameraDistance
ElseIf CameraDistance > MaxCameraDistance
CameraDistance = MaxCameraDistance
EndIf
EndIf
If MouseButton(2)
CameraAngleX+MouseDeltaX
CameraAngleY+MouseDeltaY
EndIf
EndIf
;Height.f = TerrainHeight(CameraX(0), CameraZ(0))
;RotateCamera(0, MouseX , MouseY, RollZ)
;MoveCamera (0, KeyX, -CameraY(0)+Height+8, KeyY)
;CameraLocate (0, botx - Cos(2*#PI*(rot/360))*15, TerrainHeight(botx,botz)+10, botz + Sin(2*#PI*(rot/360))*15)
If CameraAngleX > MaxCameraAngleX : CameraAngleX-360 : ElseIf CameraAngleX < 0 : CameraAngleX+360 : EndIf
If CameraAngleY > MaxCameraAngleY
CameraAngleY = MaxCameraAngleY
ElseIf CameraAngleY < MinCameraAngleY
CameraAngleY = MinCameraAngleY
EndIf
CameraLocate(0, GSin(CameraAngleX)*CameraDistance+botx, GSin(CameraAngleY)*CameraDistance+boty, GCos(CameraAngleX)*CameraDistance+botz)
If CameraY(0) < TerrainHeight(CameraX(0), CameraZ(0))+MinCameraHeight
CameraLocate(0, CameraX(0), TerrainHeight(CameraX(0), CameraZ(0))+MinCameraHeight, CameraZ(0))
EndIf
CameraLookAt (0, botx, boty, botz)
EntityLocate(1,botx,boty-7,botz);-Entityposition festlegen
RenderWorld()
Screen3DStats()
StartDrawing(ScreenOutput())
DrawingMode(1)
FrontColor(#White)
DrawText(10, 10, "CameraX: "+StrF(CameraX(0), 3))
DrawText(10, 30, "CameraY: "+StrF(CameraY(0), 3))
DrawText(10, 50, "CameraAngleX: "+Str(CameraAngleX))
DrawText(10, 70, "CameraAngleY: "+Str(CameraAngleY))
DrawText(10, 90, "CameraDistance: "+Str(CameraDistance))
StopDrawing()
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
EndIf
Else
MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf
End