hey all i just recently dipped into collisions with physics. and i just recently dipped into collisionBox()es i have the physics part working more or less and i think i have the collisionBox() working also, but for some reason the physics collisions arent working. i get no errors so im assuming i did something wrong in the collision solids area. Im not sure where my code went awry so here is all of it XD
##############################################
# #IMPORT# #
##############################################
from direct.showbase.ShowBase import ShowBase
from direct.interval.IntervalGlobal import *
from pandac.PandaModules import *
from panda3d.core import Texture
from shapeGenerator import *
##############################################
# #NEW CLASS# #
##############################################
class initGame(ShowBase):
def __init__(self):
ShowBase.__init__(self)
######################################################
#keeps the game running the same speed on all systems#
FPS = 60##############################################
globalClock = ClockObject.getGlobalClock()############
globalClock.setMode(ClockObject.MLimited)#############
globalClock.setFrameRate(FPS)#########################
#keeps the game running the same speed on all systems#
######################################################
self.disableMouse()
base.enableParticles()
self.loadPlayer()
self.loadLevel()
self.createLight()
self.lookForCollisions()
def loadPlayer(self):
self.player = Player()
def loadLevel(self):
self.level = Level(self.player.playerModel)
def createLight(self):
self.lightSource = Light(self.player.playerModel)
def lookForCollisions(self):
self.collision = Collisions(self.player.playerCol, self.player.playerModel, self.level.rootCollisionNode)
##############################################
# #NEW CLASS# #
##############################################
class Player(ShowBase, object):
speed = 5
Forward = Vec3(0, 0, 2)
Back = Vec3(0, 0, -.5)
STOP = Vec3(0, 0, 0)
walk = STOP
material = Material()
material.setShininess(3)
cameraZoom = -20
def __init__(self):
self.Texture = loader.loadTexture('textures/PlayerTexture.jpg')
self.loadPlayer()
self.setCamera()
self.playerControls()
taskMgr.add(self.movePlayer, 'moves player')
def loadPlayer(self):
self.player = Cube(1, 0-1, 1)
self.player.setMaterial(self.material)
self.player.setTexture(self.Texture)
self.player.setTwoSided(True)
self.playerModelNode = NodePath(PandaNode('ohai'))
self.playerModelActor = ActorNode('actorNode')
self.playerModel = self.playerModelNode.attachNewNode(self.playerModelActor)
self.player.reparentTo(self.playerModel)
self.player.setX(-.5)
self.player.setZ(-.5)
self.playerCol = self.playerModel.attachNewNode(CollisionNode('playercnode'))
self.playerCol.node().addSolid(CollisionBox(0, 0, 0, .5, .5, .5))
self.playerModelNode.reparentTo(base.render)
base.physicsMgr.attachPhysicalNode(self.playerModelActor)
def setCamera(self):
base.accept('wheel_down', self.moveCameraIn)
base.accept('wheel_up', self.moveCameraOut)
base.camera.reparentTo(self.player)
base.camera.setP(80)
taskMgr.add(self.updateCamera, 'updatesCamera')
def moveCameraIn(self):
self.cameraZoom -= 1
print (self.cameraZoom)
def moveCameraOut(self):
self.cameraZoom += 1
def updateCamera(self, task):
base.camera.setPos(.5, -2, self.cameraZoom)
return task.cont
def playerControls(self):
base.accept("w", self.__setattr__,["walk",self.Forward])
base.accept("w-up", self.__setattr__,["walk",self.STOP])
base.accept("s", self.__setattr__,["walk",self.Back])
base.accept("s-up", self.__setattr__,["walk",self.STOP])
self.accept('d', self.rotateLeft)
self.accept('a', self.rotateRight)
def rotateLeft(self):
for i in range(1000):
if self.playerModel.getR()/90 == i or self.playerModel.getR()/90 == 0-i:
cameraHprLerp = LerpHprInterval(self.playerModel, .1, (self.playerModel.getH(), self.playerModel.getP(), self.playerModel.getR() + 90), bakeInStart = 0)
cameraHprLerp.start()
else:
print("sorry, couldn't rotate")
def rotateRight(self):
for i in range(1000):
if self.playerModel.getR()/90 == i or self.playerModel.getR()/90 == 0-i:
cameraHprLerp = LerpHprInterval(self.playerModel, .1, (self.playerModel.getH(), self.playerModel.getP(), self.playerModel.getR() - 90), bakeInStart = 0)
cameraHprLerp.start()
else:
print("sorry, couldn't rotate")
def movePlayer(self, task):
self.playerModel.setPos(self.playerModel,self.walk*globalClock.getDt()*self.speed)
return task.cont
##############################################
# #NEW CLASS# #
##############################################
class Level(ShowBase, object):
levelArray = [
[3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3],
[3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3],
[3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3],
[3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3],
[3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3],
[3,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,3],
[3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3],
[3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3],
[3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3],
[3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3],
[3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,3],
[3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3],
[3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3],
]
itemArray = [
[1,2,3,2,1,2,3,2,1,2,3,2,1,2,3,2,1,2,3,2,1],
]
def __init__(self, playerModel):
#################
#levekArray Key##
#0 = spawn#######
#1 = floor#######
#2 = holes#######
#3 = wall########
#################
#################
#itemArrayKey####
#1 = speed boost#
#2 = something###
#3 = something###
#################
self.playerModel = playerModel
self.Texture = loader.loadTexture('textures/LevelTexture.jpg')
self.createLevel()
self.flattenStrongRootNode()
def createLevel(self):
##################################
#ok so! index = x pos! i = z pos!#
##################################
self.rootNode = render.attachNewNode("ohaidernode")
self.rootCollisionNode = render.attachNewNode(CollisionNode('worldCollider'))
for i in range(len(self.levelArray)):
for index, item in enumerate(self.levelArray[i]):
if item == 0:
self.spawn(index, item, i)
if item == 1:
self.addFloor(index, item, i)
if item == 2:
self.addHole(index, item, i)
if item == 3:
self.addWall(index, item, i)
def spawn(self, index, item, i):
index = index
item = item
i = i
cube = Cube(1, 0-1, 1)
cube.setTwoSided(True)
cube.setTexture(self.Texture)
cube.reparentTo(self.rootNode)
cube.setX(index)
cube.setZ(i)
box = CollisionBox(index, 0, i, .5, .5, .5)
self.rootCollisionNode.node().addSolid(box)
self.playerModel.setX(index + .5)
self.playerModel.setZ(i + .5)
self.playerModel.setY(-2)
print(index, item, i)
def addFloor(self, index, item, i):
index = index
item = item
i = i
cube = Cube(1, 0-1, 1)
cube.setTwoSided(True)
cube.setTexture(self.Texture)
cube.reparentTo(self.rootNode)
cube.setX(index)
cube.setZ(i)
box = CollisionBox(index, 0, i, .5, .5, .5)
self.rootCollisionNode.node().addSolid(box)
print(index, item, i)
def addHole(self, index, item, i):
index = index
item = item
i = i
print(index, item, i)
def addWall(self, index, item, i):
index = index
item = item
i = i
cube = Cube(1, 0-3, 1)
cube.setTwoSided(True)
cube.setTexture(self.Texture)
cube.reparentTo(self.rootNode)
cube.setX(index)
cube.setZ(i)
box = CollisionBox(index, 0, i, .5, 1.5, .5)
self.rootCollisionNode.node().addSolid(box)
print(index, item, i)
def flattenStrongRootNode(self):
self.rootNode.flattenStrong()
##############################################
# #NEW CLASS# #
##############################################
class Light(ShowBase, object):
def __init__(self, playerModel):
self.playerModel = playerModel
self.addDirectionalLight(80, -100, 80, False)
self.addAmbientLight()
def addDirectionalLight(self, X, Y, Z, showfrustrum):
X = X
Y = Y
Z = Z
showfrustrum = showfrustrum
dirLight = DirectionalLight("dlight")
dirLight.setSpecularColor (VBase4(.249,.235,.207,1))
dirLight.setDirection(Vec3(X, Y, Z))
dirLight.setShadowCaster(True, 2048, 2048)
dirLight.getLens().setFilmSize(4096,4096)
if showfrustrum:
dirLight.showFrustum()
dLight = render.attachNewNode(dirLight)
render.setLight(dLight)
render.setShaderAuto()
def addAmbientLight(self):
alight = AmbientLight('alight')
alight.setColor(VBase4(0.2, 0.2, 0.2, 1))
alnp = render.attachNewNode(alight)
render.setLight(alnp)
##############################################
# #NEW CLASS# #
##############################################
class Collisions(ShowBase, object):
def __init__(self, From, model, Into):
self.playerCol = From
self.playerModel = model
self.rootCollisionNode = Into
globalforcesFN = ForceNode('world-forces')
globalforcesFNP = base.render.attachNewNode(globalforcesFN)
globalforcesGravity = LinearVectorForce(0,9.81,0)
globalforcesFN.addForce(globalforcesGravity)
base.physicsMgr.addLinearForce(globalforcesGravity)
def __init__(self):
self.addCollisions()
def addcollisions(self):
base.cTrav = CollisionTraverser()
CollisionHandler = PhysicsCollisionHandler()
CollisionHandler.addCollider(self.playercol, self.playerModel)
base.cTrav.addCollider(self.playerCol, collisionHandler)
app = initGame()
app.run()
im using a shapegenerator script that i found on the forums for the Cube()