60 lines
2.5 KiB
Python
60 lines
2.5 KiB
Python
from panda3d.core import *
|
|
from direct.interval.IntervalGlobal import *
|
|
from direct.task.Task import Task
|
|
from direct.directnotify import DirectNotifyGlobal
|
|
from direct.distributed import DistributedObject
|
|
from toontown.minigame import ToonBlitzGlobals
|
|
import math
|
|
|
|
class TwoDCamera(DistributedObject.DistributedObject):
|
|
notify = DirectNotifyGlobal.directNotify.newCategory('TwoDCamera')
|
|
|
|
def __init__(self, camera):
|
|
self.notify.debug('Constructing TwoDCamera with %s' % camera)
|
|
self.camera = camera
|
|
self.cameraSideView = ToonBlitzGlobals.CameraStartingPosition
|
|
self.threeQuarterOffset = 2
|
|
self.changeFacingInterval = None
|
|
self.ivalControllingCamera = False
|
|
self.accept('avatarOrientationChanged', self.setupChangeFacingInterval)
|
|
return
|
|
|
|
def onstage(self):
|
|
self.camera.reparentTo(render)
|
|
p = self.cameraSideView
|
|
self.camera.setPosHpr(render, p[0], p[1], p[2], p[3], p[4], p[5])
|
|
self.camera.setX(render, base.localAvatar.getX(render) + self.threeQuarterOffset)
|
|
|
|
def destroy(self):
|
|
self.ignore('avatarOrientationChanged')
|
|
p = self.cameraSideView
|
|
self.camera.setPosHpr(render, p[0], p[1], p[2], p[3], p[4], p[5])
|
|
|
|
def update(self):
|
|
if not self.ivalControllingCamera:
|
|
camX = base.localAvatar.getX(render) - math.sin(base.localAvatar.getH(render) * math.pi / 180) * self.threeQuarterOffset
|
|
self.camera.setX(render, camX)
|
|
|
|
def clearChangeFacingInterval(self):
|
|
if self.changeFacingInterval:
|
|
self.changeFacingInterval.pause()
|
|
del self.changeFacingInterval
|
|
self.changeFacingInterval = None
|
|
return
|
|
|
|
def setupChangeFacingInterval(self, newHeading):
|
|
self.clearChangeFacingInterval()
|
|
self.newHeading = newHeading
|
|
self.changeFacingInterval = LerpFunc(self.myLerpPos, duration=5.0)
|
|
self.changeFacingInterval.start()
|
|
|
|
def myLerpPos(self, t):
|
|
self.ivalControllingCamera = True
|
|
finalCamX = base.localAvatar.getX(render) - math.sin(self.newHeading * math.pi / 180) * self.threeQuarterOffset
|
|
diffX = finalCamX - self.camera.getX(render)
|
|
self.camera.setX(render, self.camera.getX(render) + diffX * t)
|
|
if math.fabs(self.camera.getX(render) - finalCamX) < 0.01:
|
|
self.notify.debug('giving up camera control')
|
|
self.camera.setX(render, finalCamX)
|
|
self.ivalControllingCamera = False
|
|
self.clearChangeFacingInterval()
|