My code is here:
import direct.directbase.DirectStart
from direct.task import Task
from direct.gui.OnscreenText import OnscreenText
from pandac.PandaModules import PandaNode,NodePath,Camera,TextNode, CardMaker
from direct.showbase.DirectObject import DirectObject
import random, sys, os, math
from pandac.PandaModules import CollisionHandlerEvent, CollisionNode, CollisionSphere, CollisionTraverser, BitMask32
from pandac.PandaModules import VBase4, AmbientLight, DirectionalLight
from pandac.PandaModules import Vec3,Vec4
def addInstructions(pos, msg):
return OnscreenText(text=msg, style=1, fg=(1,1,1,1), pos=(-1.3, pos), align=TextNode.ALeft, scale = .05)
text = TextNode(‘node name’)
text.setText(“Every day in every way I’m getting better and better.”)
textNodePath = aspect2d.attachNewNode(text)
textNodePath.setScale(0.17)
textNodePath.setPos(-0.5,0,-0.5)
ACCEL = 100
DECCEL = 1.1
class World(DirectObject):
def __init__(self):
self.initno = 0
self.cam = 0
self.inst1 = addInstructions(0.95, "Test")
self.inst2 = addInstructions(0.90, "Aim1: make variable meters COMPLETE")
self.inst3 = addInstructions(0.85, "Aim2: make camera follow car COMPLETE")
self.inst4 = addInstructions(0.80, "Aim3: control keyboard to move car COMPLETE")
self.inst5 = addInstructions(0.75, "Checkpoint1 ***")
self.inst6 = addInstructions(0.70, "Aim4: make floating obstacle COMPLETE")
self.inst7 = addInstructions(0.65, "Aim5: make car clash with obstable: obstacle move COMPLETE")
self.inst8 = addInstructions(0.60, "Aim6: make car clash with obstable: car and obstacle move INCOMPLETE")
self.inst9 = addInstructions(0.55, "Checkpoint2")
self.inst10 = addInstructions(0.50, "Aim7: make a box fall on the world and stop upon impact, and make it fall to infinite if it does not touch the world")
self.inst11 = addInstructions(0.45, "Aim8: make a box fall on the world and bounce upon impact")
self.inst12 = addInstructions(0.40, "Aim9: make a box fall on the world rotating and bounce upon impact with random movement")
self.inst13 = addInstructions(0.35, "Aim10: make a box fall on the world and upon bouncing a little sparks are generated")
self.inst14 = addInstructions(0.30, "Aim11: make the car fall on the world and generate sparks")
self.inst15 = addInstructions(0.25, "Checkpoint3")
self.inst16 = addInstructions(0.20, "Aim12: make the obstacles fall and have gravity too")
self.inst17 = addInstructions(0.15, "Aim13: make the car fall on the world and upon impact the car animate")
self.inst18 = addInstructions(0.10, "Aim14: make the world regenerate in the direction of Y axis as a box moves at Y axis")
self.inst19 = addInstructions(0.05, "Aim15: make a longer bridge")
self.inst20 = addInstructions(0.00, "Aim16: make bridge fall if box moves far from the segment, make bridge regenerate if otherwise")
self.keyMap = {"left":0, "right":0, "forward":0, "space":0}
self.accept("arrow_left", self.setKey, ["left",1])
self.accept("arrow_right", self.setKey, ["right",1])
self.accept("arrow_up", self.setKey, ["forward",1])
self.accept("arrow_down", self.setKey, ["space",1])
self.accept("arrow_left-up", self.setKey, ["left",0])
self.accept("arrow_right-up", self.setKey, ["right",0])
self.accept("arrow_up-up", self.setKey, ["forward",0])
self.accept("arrow_down-up", self.setKey, ["space",0])
self.box1 = loader.loadModel("box1")
self.box1.reparentTo(render)
self.box1.setScale(1,1,1)
self.box1.setPos(2,20,2) #x=2, y=12, z=2
# | O << box1 position
# |
#------------
# |
# |
self.box2 = loader.loadModel("box1")
self.box2.reparentTo(self.box1)
self.box2.setScale(1,1,1)
self.box2.setPos(-2,0,-2) #x=0, y=12, z=0
# |
# |box2 position
#-----O------
# |
# |
self.box1.hide()
self.box2.hide()
self.world = loader.loadModel("world")
self.world.reparentTo(self.box1)
self.world.setScale(1,1,1)
self.world.setPos(-2,0,-10) #x=0, y=12, z=0
self.floater = NodePath(PandaNode("floater"))
self.floater.reparentTo(render)
self.floaterCentre = loader.loadModel("box1")
self.floaterCentre.reparentTo(self.floater)
self.floaterCentre.setScale(0.2,0.2,0.2)
self.floaterCentre.setPos(-1,10,0)
self.meter = loader.loadModel("box1")
self.meter.reparentTo(self.floater)
self.meter.setScale(0.2,0.2,0.2)
self.meter.setPos(-1,10,0)
self.meter2 = loader.loadModel("box1")
self.meter2.reparentTo(self.floater)
self.meter2.setScale(0.2,0.2,0.2)
self.meter2.setPos(-1,10,0)
taskMgr.add(self.moveFloater, "moveBox2")
taskMgr.add(self.moveBox, "moveBox")
taskMgr.add(self.randomMoveBox, "randomMoveBox")
taskMgr.add(self.move, "move")
taskMgr.add(self.obstaclemove, "obstaclemove")
self.cameraFloater = NodePath(PandaNode("cameraFloater"))
self.cameraFloater.reparentTo(base.camera)
self.cameraFloater.setPos(0,30,-4)
self.cameraFloater.hide()
self.xFloater = NodePath(PandaNode("Floater"))
self.xFloater.reparentTo(render)
self.xFloater.setPos(0,30,-4)
self.variableMeter = loader.loadModel("box1")
self.variableMeter.reparentTo(self.xFloater)
self.variableMeter.setScale(0.2,0.2,0.2)
self.variableMeter.setPos(0,10,0)
self.keyboardMover = loader.loadModel("smiley")
self.keyboardMover.reparentTo(self.xFloater)
self.keyboardMover.setScale(0.1,0.1,0.1)
self.keyboardMover.setPos(0,10,0)
self.obstacle = loader.loadModel("box1")
self.obstacle.reparentTo(self.xFloater)
self.obstacle.setScale(0.3,0.3,0.3)
self.obstacle.setPos(0,5,0)
self.pair1=1
self.alight = AmbientLight('alight')
self.alight.setColor(VBase4(0.5, 0.5, 0.5, 1))
self.alnp = render.attachNewNode(self.alight)
render.setLight(self.alnp)
self.dlight = DirectionalLight('dlight')
self.dlight.setColor(VBase4(0.0, 0.0, 0.0, 1))
self.dlnp = render.attachNewNode(self.dlight)
base.cTrav=CollisionTraverser()
collisionHandler = CollisionHandlerEvent()
collisionHandler.addInPattern('%fn-into-%in')
collisionHandler.addOutPattern('%fn-out-%in')
self.c = self.keyboardMover.attachNewNode(CollisionNode('CmoverC'))
self.c.node().addSolid(CollisionSphere(0, 0, 0, 2.2))
self.c.node().setFromCollideMask(BitMask32.bit(self.pair1))
base.cTrav.addCollider(self.c, collisionHandler)
self.dlnp.lookAt(self.keyboardMover)
self.keyboardMover.setLight(self.dlnp)
self.c2 = self.obstacle.attachNewNode(CollisionNode('CobstacleC'))
self.c2.node().addSolid(CollisionSphere(0, 0, 0, 2.2))
self.c2.node().setIntoCollideMask(BitMask32.bit(self.pair1))
self.V_obstacle = Vec3(0,0,0)
self.accelV = Vec3(0,0,0)
self.repelV = Vec3(0,0,0)
self.dlnp.lookAt(self.obstacle)
self.obstacle.setLight(self.dlnp)
base.cTrav.showCollisions(render)
def collideEventIn(entry):
self.dlight.setColor(VBase4(0.9, 0.9, 0.9, 1))
self.tovvVar = "%10.3f px" % self.meter2.getZ()
self.tovvObject = OnscreenText(text = "meter2 Z: " + self.tovvVar, pos = (-1.2, -0.7), scale = (0.07,0.04), align = TextNode.ALeft)
norm = entry.getSurfaceNormal(render)
getpt = entry.getSurfacePoint(render)
nearpt = self.obstacle.getPos() - self.keyboardMover.getPos()
nearptReaction = self.keyboardMover.getPos() - self.obstacle.getPos()
accelSide = -norm
self.accelV = accelSide
nearpt = nearpt/4
self.accelV += nearpt
nearptReaction = nearptReaction/4
self.repelV = nearptReaction
def collideEventOut(entry):
self.dlight.setColor(VBase4(0.0, 0.0, 0.0, 1))
self.tovvVar = "%10.3f px" % self.meter2.getZ()
self.tovvObject = OnscreenText(text = "meter2 Z: " + self.tovvVar, pos = (-1.2, -0.7), scale = (0.07,0.04), align = TextNode.ALeft)
self.accelV = 0
self.repelV = 0
self.DO=DirectObject()
# notice the names used in the accept and confront with what we did while assigning patterns above with collisionHandler.addInPattern and collisionHandler.addOutPattern methods
self.DO.accept('CmoverC-into-CobstacleC', collideEventIn)
self.DO.accept('CmoverC-out-CobstacleC', collideEventOut)
self.DO.accept(‘CobstacleC-into-CmoverC’, self.collideEventIn)
self.DO.accept(‘CobstacleC-out-CmoverC’, self.collideEventOut)
def tovv(task):
if (self.initno==1):
self.tovObject.destroy()
self.tovVobstacle.destroy()
self.tovVar = "%10.3f px" % self.meter2.getZ()
self.tovObject = OnscreenText(text = "meter2 Z: " + self.tovVar, pos = (-1.2, -0.9), scale = (0.07,0.04), align = TextNode.ALeft)
if (self.initno==0 or self.V_obstacle != Vec3(0,0,0)):
self.tovVobs = "x %10.3f px y %10.3f px z %10.3f px" % (self.obstacle.getX(), self.obstacle.getY(), self.obstacle.getZ())
self.tovVobstacle = OnscreenText(text = "self.V_obstacle: " + self.tovVobs, pos = (-1.2, -0.<img src="/uploads/default/original/1X/ae031e9834d19166598edd060b063d44f1829139.gif" width="15" height="15" alt="8)" title="Cool"/>, scale = (0.07,0.04), align = TextNode.ALeft)
if (self.initno==0):
self.initno=1
# self.text1 = TextNode('variable1')
# self.text1.setText(self.tov_var)
# if (self.initno==0):
# self.textNodePath1 = aspect2d.attachNewNode(self.text1)
# self.textNodePath1.setScale(0.17)
# self.textNodePath1.setPos(-0.5,0,-0.7)
# self.initno=1
# task.delayTime += 100
return Task.again
myTask = taskMgr.doMethodLater(0.11, tovv, 'tov')
def obstaclemove(self, task):
dt = globalClock.getDt()
if dt > .2:
return Task.cont
self.V_obstacle /= DECCEL
self.V_obstacle += self.accelV * dt * ACCEL
self.obstacle.setPos(self.obstacle.getPos() + (self.V_obstacle * dt))
return Task.cont
def moveFloater(self, task):
angledegrees = task.time * 6.0
angleradians = angledegrees * (math.pi / 180.0)
self.floater.setPos(20*math.sin(angleradians),-20.0*math.cos(angleradians),0)
self.floater.setHpr(angledegrees, 0, 0)
return Task.cont
def moveBox(self, task):
angledegrees = task.time * 6.0
angleradians = angledegrees * (math.pi / 180.0)
self.meter.setPos(20*math.sin(angleradians),-20.0*math.cos(angleradians),0)
self.meter.setHpr(angledegrees, 0, 0)
return Task.cont
def randomMoveBox(self, task):
randomNo = random.uniform(1, 10)
self.meter2.setPos(randomNo,0,randomNo)
self.meter2.setHpr(0, 0, 0)
return Task.cont
def setKey(self, key, value):
self.keyMap[key] = value
def move(self, task):
elapsed = globalClock.getDt()
piVsTime = task.time*60
piVsradians = piVsTime * (math.pi / 180.0)
if (self.keyMap["space"]!=0):
self.cam = self.cam+1
if (self.cam > 200):
self.cam = 0
if (self.cam == 0):
base.camera.reparentTo(render)
elif (self.cam == 5):
base.camera.reparentTo(self.keyboardMover)
base.camera.setPos(self.keyboardMover.getPos())
elif (self.cam > 10):
base.camera.reparentTo(self.keyboardMover)
base.camera.setY(self.keyboardMover.getY() - self.cam/10)
base.camera.setZ(self.keyboardMover.getZ() + 2)
if (self.keyMap["left"]!=0):
self.keyboardMover.setH(self.keyboardMover.getH() + elapsed*self.meter2.getZ()*30)
if (self.keyMap["right"]!=0):
self.keyboardMover.setH(self.keyboardMover.getH() - elapsed*self.meter2.getZ()*30)
if (self.keyMap["forward"]!=0):
if (-(elapsed*math.sin(piVsradians)*25)<0):
self.keyboardMover.setY(self.keyboardMover, (elapsed*math.sin(piVsradians)*25))
elif (-(elapsed*math.sin(piVsradians)*25)>=0):
self.keyboardMover.setY(self.keyboardMover, -(elapsed*math.sin(piVsradians)*25))
self.keyboardMover.setPos(self.keyboardMover.getPos() + (self.repelV))
return Task.cont
#def SpinCameraTask(task):
# angledegrees = task.time * 6.0
# angleradians = angledegrees * (math.pi / 180.0)
# base.camera.setPos(20*math.sin(angleradians),-20.0*math.cos(angleradians),0)
# base.camera.setHpr(angledegrees, 0, 0)
# return Task.cont
#taskMgr.add(SpinCameraTask, "SpinCameraTask")
w = World()
run()