toontown-just-works/toontown/minigame/TwoDCamera.py
2024-07-07 18:08:39 -05:00

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()