here is the full code :
import direct.directbase.DirectStart
from pandac.PandaModules import CollisionTraverser,CollisionNode
from pandac.PandaModules import CollisionHandlerQueue,CollisionRay
from pandac.PandaModules import AmbientLight,DirectionalLight,LightAttrib
from pandac.PandaModules import TextNode
from pandac.PandaModules import Point3,Vec3,Vec4,BitMask32
from direct.gui.OnscreenText import OnscreenText
from direct.actor.Actor import Actor
from direct.showbase.DirectObject import DirectObject
from direct.task.Task import Task
import sys
BLACK = Vec4(0,0,0,1)
WHITE = Vec4(1,1,1,1)
HIGHLIGHT = Vec4(0,1,1,1)
PIECEBLACK = Vec4(.15, .15, .15, 1)
def PointAtZ(z, point, vec):
return point + vec * ((z-point.getZ()) / vec.getZ())
def SquarePos(i):
return Point3((i%8) - 3.5, int(i/8) - 3.5, 0)
def SquareColor(i):
if (i + ((i/8)%2))%2: return BLACK
else: return WHITE
def SquareWiz(i):
return Point3((i%8) - 3.5, int(i/8) - 3.5, 0.5)
class World(DirectObject):
def __init__(self):
self.accept('escape', sys.exit)
base.disableMouse()
camera.setPosHpr(0, -13.75, 6, 0, -25, 0)
self.picker = CollisionTraverser()
self.pq = CollisionHandlerQueue()
self.pickerNode = CollisionNode('mouseRay')
self.squareRoot = render.attachNewNode("squareRoot")
#For each square
self.squares = [None for i in range(64)]
self.pieces = [None for i in range(64)]
for i in range(64):
self.squares[i] = loader.loadModelCopy("models/square")
self.squares[i].reparentTo(self.squareRoot)
self.squares[i].setPos(SquarePos(i))
self.squares[i].setColor(SquareColor(i))
self.squares[i].setScale(1)
self.squares[i].find("**/polygon").node().setIntoCollideMask(
BitMask32.bit(1))
self.squares[i].find("**/polygon").node().setTag('square', str(i))
self.keyMap = {"left":0, "right":0, "forward":0}
self.wizard = Actor('Wizard/gw01',
{'waving2':'Wizard/gw02',
'waving3':'Wizard/gw03',
'waving4':'Wizard/gw04',
'waving5':'Wizard/gw05',
'waving6':'Wizard/gw06',
'waving7':'Wizard/gw07',
'waving8':'Wizard/gw08',})
self.wizard.reparentTo(render)
self.wizard.setScale(0.0005)
self.pieces = self.wizard.setPos(SquareWiz(1))
self.wizard.setHpr(180, 0,0)
self.wizard.loop('waving8')
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_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.pickerNP = self.wizard.attachNewNode(self.pickerNode)
self.letshope = self.wizard.attachNewNode(base.camNode)
self.pickerNode.setFromCollideMask(BitMask32.bit(1))
self.pickerRay = CollisionRay()
self.pickerNode.addSolid(self.pickerRay)
self.picker.addCollider(self.pickerNP, self.pq)
self.picker.showCollisions(render)
taskMgr.add(self.move, "movetask")
self.prevtime = 0
def setKey(self, key, value):
self.keyMap[key]=value
def move(self, task):
elapsed=task.time - self.prevtime
backward = self.wizard.getNetTransform().getMat().getRow3(1)
backward.normalize()
j = backward*(elapsed *0.8)
if (self.keyMap["left"]!=0):
self.wizard.setH(self.wizard.getH() + elapsed*200)
if (self.keyMap["right"]!=0):
self.wizard.setH(self.wizard.getH() - elapsed*200)
if (self.keyMap["forward"]!=0):
self.wizard.setPos(self.wizard.getPos() - j)
wpos = self.wizard.getPos() + backward*(elapsed *0.8)
self.pickerRay.setFromLens(self.letshope, wpos.getX(), wpos.getY())
self.picker.traverse(self.squareRoot)
if self.pq.getNumEntries() > 0:
self.pq.sortEntries()
i = int(self.pq.getEntry(0).getIntoNode().getTag('square'))
self.squares[i].setColor(HIGHLIGHT)
self.prevtime = task.time
return Task.cont
w = World()
run()