Code archives/3D Graphics - Misc/FPS like freelook camera

This code has been declared by its author to be Public Domain code.

Download source code

FPS like freelook camera by Warner2009
basic WASD+mouse control
Graphics3D 640, 480, 0, 2
SetBuffer BackBuffer()

CreateLight()

;create 3 copies of the same building
level1 = Building() ;LoadMesh("building.x")
level2 = Building()
level3 = Building()

;!!
;instead of using RemoveTris, create three separate meshes
;one with all floors
;one with all the walls
;one with all the ceilings
;RemoveTris doesn't remove redundant vertices, so it is unoptimised
;!!

RemoveTris(level1, False, False) ;floor
RemoveTris(level2, True, False)  ;wall
RemoveTris(level3, False, True)  ;ceiling
EntityType level1, 2 ;floor
EntityType level2, 3 ;wall
EntityType level3, 4 ;ceiling
EntityPickMode level1, 2 ;floor

Const sz = 10 ;player height

;create player
me = CreatePivot()
EntityType me, 1
EntityRadius me, 5, sz

;create camera
cam = CreateCamera()
EntityParent cam, me
PositionEntity cam, 0, 0, 0

;place player
PositionEntity me,0,50,200
ResetEntity me

Collisions 1, 2, 2, 3 ;floor
Collisions 1, 3, 2, 3 ;walls
Collisions 1, 4, 2, 3 ;ceiling

Local jsp# ;jump speed
Local xsp#, ysp# ;x/y speed

;reset mouse cursor
MoveMouse 400, 300
MouseXSpeed()
MouseYSpeed()

Repeat

	;space = jumpkey
	jkey = KeyHit(57)

	;lookaround with mouse	
	oldx# = EntityX(me)
	oldy# = EntityY(me)
	oldz# = EntityZ(me)
	MoveEntity me, xsp*2, 0, ysp*2
	If EntityCollided(me, 3) Then PositionEntity me, oldx, oldy, oldz ;bump into wall
	
	TurnEntity me, 0, -MouseXSpeed(), 0
	look# = look + MouseYSpeed()
	MoveMouse 400, 300
	
	If look < -80 Then look = -80
	If look > 80 Then look = 80
	RotateEntity cam, look, 0, 0

	;whobble	
	x# = EntityX(me)
	z# = EntityZ(me)
	hh# = Sin((x + z) * 8) * 0.1
	PositionEntity cam, 0, hh#, 0

	;jumping?		
	If jump > 0 Then

		xsp = xsp * 0.98 ;low friction
		ysp = ysp * 0.98

		TranslateEntity me, 0, jsp, 0 ;move up
		jsp = jsp * 0.9 ;jump friction
		If (EntityCollided(me, 2)) Then jump = 0 ;bump into floor
		If (EntityCollided(me, 4)) Then jump = 0 ;bump into ceiling
		jump = jump - 1
		
	;not jumping?
	Else		

		xsp = xsp * 0.9 ;high friction
		ysp = ysp * 0.9
	
		;jump key
		If jkey Then
			x# = EntityX(me)
			y# = EntityY(me)
			z# = EntityZ(me)
			;only allow when on floor
			If LinePick(x,y,z,0,-(sz+1),0) Then jump=45:jsp=3
		Else
			;fall down
			TranslateEntity me, 0, -gv#, 0
			If Not(EntityCollided(me, 2)) Then ;if not on floor
				gv = gv * 1.08 + 0.1 ;increase gravity
			Else
				gv = 0 ;reset gravity
				
				;cursor keys (WASD)
				If KeyDown(30) Then xsp = xsp * 1.01 - 0.1
				If KeyDown(32) Then xsp = xsp * 1.01 + 0.1
				If KeyDown(31) Then ysp = ysp * 1.01 - 0.1
				If KeyDown(17) Then ysp = ysp * 1.01 + 0.1
			End If
		End If
	End If
		
	UpdateWorld
	RenderWorld

	Flip
	
Until KeyHit(1)

End

;remove certain tris
Type TTriangle
	Field v0, v1, v2
End Type
Function RemoveTris(mesh, invert, cei)

	lt = 0
	If EntityClass(mesh) = "Mesh" Then
		For i = 1 To CountSurfaces(mesh)
			s = GetSurface(mesh, i)
			For t = 0 To CountTriangles(s) - 1
				v0 = TriangleVertex( s, t, 0 )
				v1 = TriangleVertex( s, t, 1 )
				v2 = TriangleVertex( s, t, 2 )
				ax# = VertexX( s, v1 ) - VertexX( s, v0 )
				ay# = VertexY( s, v1 ) - VertexY( s, v0 )	
				az# = VertexZ( s, v1 ) - VertexZ( s, v0 )	
				bx# = VertexX( s, v2 ) - VertexX( s, v1 )
				by# = VertexY( s, v2 ) - VertexY( s, v1 )	
				bz# = VertexZ( s, v2 ) - VertexZ( s, v1 )	
				Nx# = ( ay * bz ) - ( az * by )
				Ny# = ( az * bx ) - ( ax * bz )
				Nz# = ( ax * by ) - ( ay * bx )
				If cei Then test2 = (ny < 0) Else test2 = (ny > 0)
				test = (Abs(ny) > Abs(nx)) And (Abs(ny) > Abs(nz)) And test2
				If invert Then test = Not(test)
				
				If test Then
					tt.TTriangle = New TTriangle
					tt\v0 = v0
					tt\v1 = v1
					tt\v2 = v2
				End If
				
			Next
			ClearSurface s, False, True
			ti = 0
			For tt.TTriangle = Each TTriangle
				AddTriangle s, tt\v0, tt\v1, tt\v2
				ti=ti+1
			Next
			Delete Each TTriangle
		Next
	End If
	
	For i = 1 To CountChildren(mesh)
		RemoveTris(GetChild(mesh, i), invert, cei)
	Next
	
	UpdateNormals mesh
	
End Function

;create building
Function Building()

	tex = CreateTexture(16, 16, 1+8)
	Rect 0, 0, 16, 16, False
	CopyRect 0, 0, 16, 16, 0, 0, BackBuffer(), TextureBuffer(tex)
	mesh = CreateCube()
	ScaleMesh mesh, 300, 80, 300
	FlipMesh mesh
	EntityTexture mesh, tex
	ScaleTexture tex, 0.01, 0.03
	
	Return mesh
	
End Function

Comments

None.

Code Archives Forum