i am working on code that changes the altitude of the camera relative to a game map when the mouse wheel is scrolled up or down…
i’ve gotten it to work, but i think that the scrolling is too rigid… is there any way i can change this code so that the scroll wheel creates a fluid and smooth movement?
import direct.directbase.DirectStart
from direct.task.Task import Task
from direct.showbase.DirectObject import DirectObject
from pandac.PandaModules import WindowProperties
from pandac.PandaModules import Texture
from pandac.PandaModules import TextureStage
from pandac.PandaModules import Vec3
from pandac.PandaModules import Vec4
# Shader input: Sky
_sky = Vec4( 0.25, 0.5, 1.25, 0 ) # r, g, b, skip (default blue value was 1)
_clouds = Vec4( 0.0014, 0.0012, 0.0018, 0.0010 ) # vx, vy, vx, vy
_lightvec = Vec4( 1, 0, 1, 0 ) # x, y, z, skip
_fog = Vec4( 0.16, 0.32, 0.36, 0.0002 ) # r, g, b, density
#Game class
class World( DirectObject ):
#first things loaded
def __init__( self ):
# Control
# stores down buttons
self.heading = 0
self.pitch = 0
self.mouse = [ 0, 0, 0 ]
self.Xkeys = [ 0 , 0 ]
self.Ykeys = [ 0 , 0 ]
self.Zkeys = [ 0 , 0 ]
self.wheel = [ 0, 0, 0 ]
# Setup
# loads components
self._setupBase( )
self._setupInput( )
self._setupCamera( )
self._setupTerrain( )
self._setupSky( )
#sky setup
render.setShaderInput( 'fog', _fog )
render.setShaderInput( 'lightvec', _lightvec )
#update camera and sky
taskMgr.add( self.updateCamera, 'updateCamera' )
taskMgr.add( self.updateScene, 'updateScene' )
# _________________________________________________________________________
# CONTROL
#sets keys up or down state
def setMouseButton( self, button, value ):
self.mouse[ button ] = value
def setWheel( self, button, value ):
self.wheel[ button ] = value
def setXKey(self, key, val):
self.Xkeys[key] = val
def setYKey(self, key, val):
self.Ykeys[key] = val
def setZkey(self, key, val):
self.Zkeys[key] = val
def toggleWireframe( self ):
base.toggleWireframe( )
def toggleTexture( self ):
base.toggleTexture( )
def screenshot( self ):
base.screenshot( 'screenshots/' )
def exit( self ):
taskMgr.stop( )
# _________________________________________________________________________
# SETUP
#base setup
def _setupBase( self ):
props = WindowProperties( )
props.setCursorHidden( True )
self.centerx = base.win.getProperties( ).getXSize( )/2
self.centery = base.win.getProperties( ).getYSize( )/2
base.disableMouse( )
base.setBackgroundColor( 0, 0, 0 )
base.win.requestProperties( props )
base.win.movePointer( 0, self.centerx, self.centery )
#accepts keyboard and mouse
def _setupInput( self ):
self.accept( 'f1', self.toggleWireframe )
self.accept( 'f3', self.screenshot )
self.accept( 'escape', self.exit )
self.accept("arrow_left", self.setXKey, [ 0, 1 ] )
self.accept("arrow_left-up", self.setXKey, [ 0, 0 ] )
self.accept("arrow_right", self.setXKey, [ 1, 1 ] )
self.accept("arrow_right-up", self.setXKey, [ 1 ,0 ] )
self.accept("arrow_up", self.setYKey, [ 0 ,1 ] )
self.accept("arrow_up-up", self.setYKey, [ 0, 0 ] )
self.accept("arrow_down", self.setYKey, [1, 1 ] )
self.accept("arrow_down-up", self.setYKey, [ 1, 0 ] )
self.accept("page_up", self.setZkey, [0, 1 ] )
self.accept("page_up-up", self.setZkey, [ 0, 0 ] )
self.accept("page_down", self.setZkey, [1, 1 ] )
self.accept("page_down-up", self.setZkey, [ 1, 0 ] )
self.accept( 'mouse1', self.setMouseButton, [ 0, 1 ] )
self.accept( 'mouse1-up', self.setMouseButton, [ 0, 0 ] )
self.accept( 'mouse2', self.setMouseButton, [ 1, 1 ] )
self.accept( 'mouse2-up', self.setMouseButton, [ 1, 0 ] )
self.accept( 'mouse3', self.setMouseButton, [ 2, 1 ] )
self.accept( 'mouse3-up', self.setMouseButton, [ 2, 0 ] )
self.accept( 'wheel_up', self.setWheel,[ 0, 1 ])
self.accept( 'wheel_down', self.setWheel, [ 1, 1])
#loads terrain
def _setupTerrain( self ):
tex0 = loader.loadTexture( 'levels/Desertland1_TX.jpg' )
tex0.setMinfilter( Texture.FTLinearMipmapLinear )
np = loader.loadModel( 'levels/Desertland1.egg' )
np.reparentTo( render )
np.setPos(0, 0, 0 )
np.setTexture(tex0)
np.setHpr( 0,0, 180 )
#loads sky
def _setupSky( self ):
self.skyNP = loader.loadModel( 'environment/sky.egg' )
self.skyNP.reparentTo( render )
self.skyNP.setScale( 8000, 8000, 3000 )
self.skyNP.setPos( 0, 0, 0 )
self.skyNP.setTexture( loader.loadTexture( 'environment/clouds.png' ) )
self.skyNP.setShader( loader.loadShader( 'environment/sky.sha' ) )
self.skyNP.setShaderInput( 'sky', _sky )
self.skyNP.setShaderInput( 'clouds', _clouds )
def _setupCamera( self ):
# Setup scene camera
cam0 = base.cam.node( )
cam0.getLens( ).setNear( 100 )
cam0.getLens( ).setFar( 10000 )
cam0.setTagStateKey( 'Normal' )
base.camera.setPos( -500, -500, 600 ) # Initial position
#_________________________________________________________________________
# TASKS
#moves the camera on keypress or mouse wheel
def updateCamera( self, task ):
md = base.win.getPointer( 0 )
x = md.getX( )
y = md.getY( )
speed = 0
rotation = 0
# camera X control keys
# 0 = left
# 1 = right
# camera Y control keys
# 0 = up
# 1 = down
#
# camera Z control keys
# 0 = page up
# 1 = page down
#
if self.Xkeys[ 0 ]:
base.camera.setX(base.camera,-10)
elif self.Xkeys [ 1 ]:
base.camera.setX(base.camera,+10)
if self.Ykeys[ 0 ]:
zz = camera.getZ()
base.camera.setY(base.camera,+10)
base.camera.setZ( zz )
elif self.Ykeys [ 1 ]:
zz = camera.getZ()
base.camera.setY(base.camera,-10)
base.camera.setZ( zz )
if base.win.movePointer( 0, self.centerx, self.centery ):
self.heading += ( x - self.centerx ) * -0.2
self.pitch += ( y - self.centery ) * -0.2
self.pitch = clampScalar( self.pitch, -80.0, 80.0 )
if self.mouse[ 1 ]:
base.camera.setHpr(self.heading, self.pitch,0)
if self.wheel[0]:
base.camera.setZ(base.camera.getZ()+12)
self.setWheel(0,0)
elif self.wheel[1]:
base.camera.setZ(base.camera.getZ()-12)
self.setWheel(1,0)
elif self.Zkeys [0]:
base.camera.setZ(base.camera.getZ()+8)
elif self.Zkeys [1]:
base.camera.setZ(base.camera.getZ()-8)
#base.camera.setPos( base.camera, Vec3( 0, 1, 0 ) * speed )
# base.camera.setHpr( self.heading, self.pitch, rotation )
#control Z
if camera.getZ() < 100:
camera.setZ(101)
elif camera.getZ() > 3000:
camera.setZ(2999)
#control Y
if camera.getY() < -4000:
camera.setY(-3999)
elif camera.getY() > 4000:
camera.setY(3999)
#control X
if camera.getX() < -4000:
camera.setX(-3999)
elif camera.getX() > 4000:
camera.setX(3999)
self.last = task.time
return Task.cont
#updates sky
def updateScene( self, task ):
# Re-center sky dome
pos = base.camera.getPos( )
pos.setZ( 0 )
self.skyNP.setPos( pos )
render.setShaderInput( 'time', task.time )
return Task.cont
#Runs the game
world = World( )
run( )