let’s see if this scene could make you laugh :
import direct.directbase.DirectStart
from pandac.PandaModules import *
from direct.showbase.DirectObject import DirectObject
from direct.interval.IntervalGlobal import *
from direct.actor import Actor
from direct.task import Task
import sys
class World(DirectObject):
def __init__(self):
self.accept('escape',sys.exit)
base.cTrav = CollisionTraverser()
# base.cTrav.showCollisions(render)
self.cHandler = CollisionHandlerEvent()
self.cHandler.setInPattern("collide-%in")
self.cHandler.addInPattern("collide-%fn")
collMASK=BitMask32.bit(1)
collMASKoff=BitMask32.allOff()
#load panda actor
self.panda=Actor.Actor('panda-model',{'walk':'panda-walk4'})
self.panda.reparentTo(render)
self.panda.setScale(.01)
pandaGeom=self.panda.find('**/+GeomNode')
pandaGeom.setName('myPanda')
pandaGeom.setCollideMask(collMASK)
self.panda.accept('collide-myPanda', self.pandaHit,extraArgs=[self.panda])
#load smiley
self.smiley=loader.loadModel('smiley')
self.smiley.reparentTo(render)
self.smiley.setPos(0,20,2)
self.smiley.setP(30)
self.smiley.setScale(2)
#create a collision solid for this model
smileyC = self.smiley.attachCollisionSphere('smileyColl',0,0,0,1.1,collMASK,collMASKoff)
# smileyC.show()
base.cTrav.addCollider(smileyC, self.cHandler)
self.moveAgain()
self.accept('smileyMove',self.moveAgain)
self.accept('collide-smileyColl',self.smileyHit)
camera.setPos(30,-60,20)
camera.lookAt(0,-20,0)
mat=Mat4(camera.getMat())
mat.invertInPlace()
base.mouseInterfaceNode.setMat(mat)
def moveAgain(self,t=0):
pos1=self.smiley.getPos()+Point3(0,-1,.7)
pos2=self.smiley.getPos()+Point3(0,-2,0)
self.smileyPosIval = Sequence(
self.smiley.posInterval(.1,pos1),
self.smiley.posInterval(.1,pos2),
)
self.smileyPosIval.setDoneEvent('smileyMove')
self.smileyPosIval.start()
print 'move'
def pandaHit(self,actor,entry):
pos1=actor.getPos()+Point3(0,-3,1.5)
pos2=actor.getPos()+Point3(0,-4,0)
posY=actor.getPos()+Point3(0,-10,0)
pandaIval=Sequence(
Sequence(
actor.posHprInterval(.1,pos1,Vec3(0,15,0),blendType='easeOut'),
actor.posHprInterval(.1,pos2,Vec3(0,0,0),blendType='easeIn'),
),
actor.posInterval(.5,posY,blendType='easeOut')
)
pandaIval.setDoneEvent('stopActorMove')
pandaIval.start()
actor.acceptOnce('stopActorMove',actor.stop)
actor.setPlayRate(10,'walk')
actor.loop('walk')
print 'hit'
def smileyHit(self,entry=0):
if entry:
self.smileyPosIval.setDoneEvent('smileyHit')
self.acceptOnce('smileyHit',self.smileyHit)
return
pos=self.smiley.getPos()+Point3(0,2,0)
hIval=Sequence(
self.smiley.hprInterval(.08,Vec3(15,0,0),blendType='easeOut'),
self.smiley.hprInterval(.08,Vec3(-15,0,0),blendType='easeOut'),
)
smileyHitIval = Sequence(
self.smiley.posHprInterval(.1,pos,hpr=Vec3(0,0,0),blendType='easeIn'),
Wait(.2),
hIval, hIval, hIval, hIval,
self.smiley.hprInterval(1.5,Vec3(0,30,0),blendType='easeOut'),
)
smileyHitIval.setDoneEvent('smileyMove')
smileyHitIval.start()
World()
run()