Jumping Issues

I am having issues with my jumping… It kind of works, but it doesn’t quite. I cant seem to upload my file right now, but the code is here:

import direct.directbase.DirectStart
from direct.showbase.DirectObject import DirectObject
from direct.gui.OnscreenText import OnscreenText
from direct.gui.DirectGui import *
from direct.actor.Actor import Actor
from direct.task.Task import Task
from pandac.PandaModules import *
from direct.interval.IntervalGlobal import *
import random, sys, os, math

font = loader.loadFont("cmss12")

class game(DirectObject):
    def __init__(self):
        self.keyMap = {"forward":0, "backward":0, "left":0, "right":0, "jump":0}
        
        base.win.setClearColor(Vec4(0,0,0,1))
        base.enableParticles()
        
        self.cTrav = CollisionTraverser()
        
        self.terrain = loader.loadModel("Maps\map")
        self.terrain.reparentTo(render)
        
        self.alight = AmbientLight('alight')
        self.alight.setColor(Vec4(0.3,0.3,0.3,1))
        self.alightNP = render.attachNewNode(self.alight)
        render.setLight(self.alightNP)
        
        self.plight = PointLight('plight')
        self.plight.setColor(Vec4(0.8,0.8,0.8,1))
        self.plightNP = render.attachNewNode(self.plight)
        self.plightNP.setPos(0,0,100)
        render.setLight(self.plightNP)
        
        self.highPoint = 3
        self.jump = -0.1
        self.isJumping = False
        self.onGround = False
        
        self.char = loader.loadModel("Models\littlebrother")
        self.char.setScale(3,3,3)
        self.char.reparentTo(render)
        
        self.charSph = CollisionSphere(0,0,1,1)
        self.charCol = CollisionNode("Cnone")
        self.charCol.addSolid(self.charSph)
        self.charCol.setFromCollideMask(BitMask32.bit(0))
        self.charCol.setIntoCollideMask(BitMask32.allOff())
        self.charSphNp = self.char.attachNewNode(self.charCol)
        self.charSphNp.node().addSolid(self.charSph)
        self.charHandler = CollisionHandlerQueue()
        self.cTrav.addCollider(self.charSphNp, self.charHandler)
        
        self.charSphNp.show()
        
        base.disableMouse()
        base.camera.setPos(0,20,12)
        base.camera.lookAt(self.char)
        base.camera.reparentTo(self.char)
        
        self.label = DirectLabel(text="Weapon: None", text_bg=(0,0,1,0.5), text_fg=(0,0,0,1), pos=(-1.16,0,0.95), scale=(0.06), relief=None)
        
        taskMgr.add(self.update, "Update")
        self.accept("escape", sys.exit)
        self.accept("w", self.setKey, ["forward",1])
        self.accept("s", self.setKey, ["backward",1])
        self.accept("a", self.setKey, ["left",1])
        self.accept("d", self.setKey, ["right",1])
        self.accept("space", self.setKey, ["jump",1])
        self.accept("w-up", self.setKey, ["forward",0])
        self.accept("s-up", self.setKey, ["backward",0])
        self.accept("a-up", self.setKey, ["left",0])
        self.accept("d-up", self.setKey, ["right",0])
        self.accept("space-up", self.setKey, ["jump",0])
        
    def setKey(self, key, value):
        self.keyMap[key] = value
        
    def update(self, task):
        elapsed = globalClock.getDt()
        
        self.startPos = self.char.getPos()
        
        if(self.keyMap["left"] != 0):
            self.char.setH(self.char.getH() + elapsed * 300)
        if(self.keyMap["right"] != 0):
            self.char.setH(self.char.getH() - elapsed * 300)
                
        if(self.keyMap["forward"] != 0):
            self.char.setY(self.char, -(elapsed * 10))
        if(self.keyMap["backward"] != 0):
            self.char.setY(self.char, +(elapsed * 10))
            
        if(self.keyMap["jump"] != 0):
            if(self.onGround):
                self.isJumping = True
                self.onGround = False
                self.highPoint = self.char.getZ() + 1
        
        
        if(self.isJumping):
            if(self.jump <= self.highPoint):
                self.jump += 0.5
            else:
                self.isJumping = False
        else:
            self.jump -= 0.7
        
        if(self.jump > self.char.getZ() - self.highPoint):
            self.jump = self.highPoint
        
        self.char.setZ(self.char, +(0.02 * self.jump))
        
        self.cTrav.traverse(render)
        entries = []
        for i in range(self.charHandler.getNumEntries()):
            entry = self.charHandler.getEntry(i)
            entries.append(entry)
        entries.sort(lambda x,y: cmp(y.getSurfacePoint(render).getZ(),
                                     x.getSurfacePoint(render).getZ()))
        if(len(entries) > 0) and (entries[0].getIntoNode().getName() == "ground"):
            self.char.setZ(entries[0].getSurfacePoint(render).getZ())
            self.onGround = True
        else:
            self.onGround = False
            #self.char.setPos(self.startPos)
        
        return Task.cont
g = game()
run()

The jumping is slow and doesn’t start right away. I have no clue what is going on…

Thanks in advance,
IonDuel.

i changed some stuff so you may need to revert some of the changes. but this works more or less:

import direct.directbase.DirectStart
from direct.showbase.DirectObject import DirectObject
from direct.gui.OnscreenText import OnscreenText
from direct.gui.DirectGui import *
from direct.actor.Actor import Actor
from direct.task.Task import Task
from pandac.PandaModules import *
from direct.interval.IntervalGlobal import *
import random, sys, os, math

font = loader.loadFont("cmss12")

class game(DirectObject):
    def __init__(self):
        self.keyMap = {"forward":0, "backward":0, "left":0, "right":0, "jump":0}
       
        base.win.setClearColor(Vec4(0,0,0,1))
        base.enableParticles()
       
        self.cTrav = CollisionTraverser()
       
        self.terrain = loader.loadModel("/usr/share/panda3d/samples/Roaming-Ralph/models/world.egg.pz")
        self.terrain.reparentTo(render)
       
        self.alight = AmbientLight('alight')
        self.alight.setColor(Vec4(0.3,0.3,0.3,1))
        self.alightNP = render.attachNewNode(self.alight)
        render.setLight(self.alightNP)
       
        self.plight = PointLight('plight')
        self.plight.setColor(Vec4(0.8,0.8,0.8,1))
        self.plightNP = render.attachNewNode(self.plight)
        self.plightNP.setPos(0,0,100)
        render.setLight(self.plightNP)
       
        self.highPoint = 3
        self.jump = -0.1
        self.isJumping = False
        self.onGround = False
       
        self.char = loader.loadModel("jack.egg.pz")
        self.char.setScale(3,3,3)
        self.char.reparentTo(render)
       
        self.charSph = CollisionSphere(0,0,1,1)
        self.charCol = CollisionNode("Cnone")
        self.charCol.addSolid(self.charSph)
        self.charCol.setFromCollideMask(BitMask32.bit(0))
        self.charCol.setIntoCollideMask(BitMask32.allOff())
        self.charSphNp = self.char.attachNewNode(self.charCol)
        self.charSphNp.node().addSolid(self.charSph)
        self.charHandler = CollisionHandlerQueue()
        self.cTrav.addCollider(self.charSphNp, self.charHandler)
       
        self.charSphNp.show()
       
        base.disableMouse()
        base.camera.setPos(0,20,12)
        base.camera.lookAt(self.char)
        base.camera.reparentTo(self.char)
       
        self.label = DirectLabel(text="Weapon: None", text_bg=(0,0,1,0.5), text_fg=(0,0,0,1), pos=(-1.16,0,0.95), scale=(0.06), relief=None)
       
        taskMgr.add(self.update, "Update")
        self.accept("escape", sys.exit)
        self.accept("w", self.setKey, ["forward",1])
        self.accept("s", self.setKey, ["backward",1])
        self.accept("a", self.setKey, ["left",1])
        self.accept("d", self.setKey, ["right",1])
        self.accept("space", self.setKey, ["jump",1])
        self.accept("w-up", self.setKey, ["forward",0])
        self.accept("s-up", self.setKey, ["backward",0])
        self.accept("a-up", self.setKey, ["left",0])
        self.accept("d-up", self.setKey, ["right",0])
        self.accept("space-up", self.setKey, ["jump",0])
       
    def setKey(self, key, value):
        self.keyMap[key] = value
       
    def update(self, task):
        elapsed = globalClock.getDt()
       
        self.startPos = self.char.getPos()
       
        if(self.keyMap["left"] != 0):
            self.char.setH(self.char.getH() + elapsed * 300)
        if(self.keyMap["right"] != 0):
            self.char.setH(self.char.getH() - elapsed * 300)
               
        if(self.keyMap["forward"] != 0):
            self.char.setY(self.char, -(elapsed * 10))
        if(self.keyMap["backward"] != 0):
            self.char.setY(self.char, +(elapsed * 10))
           
        if(self.keyMap["jump"] != 0):
            if(self.onGround):
                self.isJumping = True
                self.onGround = False
                self.highPoint = self.char.getZ() + 1
       
        print self.jump, self.isJumping, self.onGround, self.keyMap["jump"]
        
        if(self.isJumping):
            if(self.jump <= self.highPoint):
                self.jump = 10.0
            else:
                self.isJumping = False
       
        self.char.setZ(self.char, +(0.02 * self.jump))
        
        self.cTrav.traverse(render)
        entries = []
        for i in range(self.charHandler.getNumEntries()):
            entry = self.charHandler.getEntry(i)
            entries.append(entry)
        entries.sort(lambda x,y: cmp(y.getSurfacePoint(render).getZ(),
                                     x.getSurfacePoint(render).getZ()))
        if len(entries) > 0:
          if entries[0].getIntoNode().getName() == "terrain":
            self.char.setZ(entries[0].getSurfacePoint(render).getZ())
            self.onGround = True
            self.jump = 0
        else:
            self.onGround = False
            self.jump -= .25
       
        return Task.cont
g = game()
run()

some hints on programming. remove stuff you dont understand to the basics and implement it yourself.

Thank so much for that code! But now that i have it in mine it still has a little error. Sometimes when jumping, isJumping stays true. So, the character just keeps floating up. This is the code I have.

import direct.directbase.DirectStart
from direct.showbase.DirectObject import DirectObject
from direct.gui.OnscreenText import OnscreenText
from direct.gui.DirectGui import *
from direct.actor.Actor import Actor
from direct.task.Task import Task
from pandac.PandaModules import *
from direct.interval.IntervalGlobal import *
import random, sys, os, math

font = loader.loadFont("cmss12")

class game(DirectObject):
    def __init__(self):
        self.keyMap = {"forward":0, "backward":0, "left":0, "right":0, "jump":0}
        
        base.win.setClearColor(Vec4(0,0,0,1))
        base.enableParticles()
        
        self.cTrav = CollisionTraverser()
        
        self.terrain = loader.loadModel("Maps\map")
        self.terrain.reparentTo(render)
        
        self.alight = AmbientLight('alight')
        self.alight.setColor(Vec4(0.3,0.3,0.3,1))
        self.alightNP = render.attachNewNode(self.alight)
        render.setLight(self.alightNP)
        
        self.plight = PointLight('plight')
        self.plight.setColor(Vec4(0.8,0.8,0.8,1))
        self.plightNP = render.attachNewNode(self.plight)
        self.plightNP.setPos(0,0,100)
        render.setLight(self.plightNP)
        
        self.highPoint = 3
        self.jump = -0.1
        self.isJumping = False
        self.onGround = False
        
        self.char = loader.loadModel("Models\littlebrother")
        self.char.setScale(3,3,3)
        self.char.reparentTo(render)
        
        self.charSph = CollisionSphere(0,0,1,1)
        self.charCol = CollisionNode("Cnone")
        self.charCol.addSolid(self.charSph)
        self.charCol.setFromCollideMask(BitMask32.bit(0))
        self.charCol.setIntoCollideMask(BitMask32.allOff())
        self.charSphNp = self.char.attachNewNode(self.charCol)
        self.charSphNp.node().addSolid(self.charSph)
        self.charHandler = CollisionHandlerQueue()
        self.cTrav.addCollider(self.charSphNp, self.charHandler)
        
        self.charSphNp.show()
        
        base.disableMouse()
        base.camera.setPos(0,20,12)
        base.camera.lookAt(self.char)
        base.camera.reparentTo(self.char)
        
        self.label = DirectLabel(text="Weapon: None", text_bg=(0,0,1,0.5), text_fg=(0,0,0,1), pos=(-1.16,0,0.95), scale=(0.06), relief=None)
        
        taskMgr.add(self.update, "Update")
        self.accept("escape", sys.exit)
        self.accept("w", self.setKey, ["forward",1])
        self.accept("s", self.setKey, ["backward",1])
        self.accept("a", self.setKey, ["left",1])
        self.accept("d", self.setKey, ["right",1])
        self.accept("space", self.setKey, ["jump",1])
        self.accept("w-up", self.setKey, ["forward",0])
        self.accept("s-up", self.setKey, ["backward",0])
        self.accept("a-up", self.setKey, ["left",0])
        self.accept("d-up", self.setKey, ["right",0])
        self.accept("space-up", self.setKey, ["jump",0])
        
    def setKey(self, key, value):
        self.keyMap[key] = value
        
    def update(self, task):
        elapsed = globalClock.getDt()
        
        self.startPos = self.char.getPos()
        
        if(self.keyMap["left"] != 0):
            self.char.setH(self.char.getH() + elapsed * 300)
        if(self.keyMap["right"] != 0):
            self.char.setH(self.char.getH() - elapsed * 300)
                
        if(self.keyMap["forward"] != 0):
            self.char.setY(self.char, -(elapsed * 10))
        if(self.keyMap["backward"] != 0):
            self.char.setY(self.char, +(elapsed * 10))
            
        if(self.keyMap["jump"] != 0):
            if(self.onGround):
                self.isJumping = True
                self.onGround = False
                self.highPoint = self.char.getZ() + 1
        
        print self.jump, self.isJumping, self.onGround, self.keyMap["jump"]
        
        if(self.isJumping):
            if(self.jump <= self.highPoint):
                self.jump = 10.0
            else:
                self.isJumping = False
        
        self.char.setZ(self.char, +(0.02 * self.jump))
        
        self.cTrav.traverse(render)
        entries = []
        for i in range(self.charHandler.getNumEntries()):
            entry = self.charHandler.getEntry(i)
            entries.append(entry)
        entries.sort(lambda x,y: cmp(y.getSurfacePoint(render).getZ(),
                                     x.getSurfacePoint(render).getZ()))
        if(len(entries) > 0) and (entries[0].getIntoNode().getName() == "ground"):
            self.char.setZ(entries[0].getSurfacePoint(render).getZ())
            self.onGround = True
            self.jump = 0
        else:
            self.onGround = False
            self.jump -= 0.25
        
        return Task.cont
g = game()
run()

Maybe I typed something in wrong… But I cant see any differences.

I changed this line:

        if(self.isJumping): 
            if(self.jump <= self.highPoint): 
                self.jump = 10.0 
            else: 
                self.isJumping = False 

To this:

        if(self.isJumping):
            self.jump = 10.0
            self.isJumping = False

And now it works. Thanks so much for the help everyone!

My final code for anyone who is interested:

import direct.directbase.DirectStart
from direct.showbase.DirectObject import DirectObject
from direct.gui.OnscreenText import OnscreenText
from direct.gui.DirectGui import *
from direct.actor.Actor import Actor
from direct.task.Task import Task
from pandac.PandaModules import *
from direct.interval.IntervalGlobal import *
import random, sys, os, math

font = loader.loadFont("cmss12")

class game(DirectObject):
    def __init__(self):
        self.keyMap = {"forward":0, "backward":0, "left":0, "right":0, "jump":0}
        
        base.win.setClearColor(Vec4(0,0,0,1))
        base.enableParticles()
        
        self.cTrav = CollisionTraverser()
        
        self.terrain = loader.loadModel("Maps\map")
        self.terrain.reparentTo(render)
        
        self.alight = AmbientLight('alight')
        self.alight.setColor(Vec4(0.3,0.3,0.3,1))
        self.alightNP = render.attachNewNode(self.alight)
        render.setLight(self.alightNP)
        
        self.plight = PointLight('plight')
        self.plight.setColor(Vec4(0.8,0.8,0.8,1))
        self.plightNP = render.attachNewNode(self.plight)
        self.plightNP.setPos(0,0,100)
        render.setLight(self.plightNP)
        
        self.jump = 0.0
        self.isJumping = False
        self.onGround = False
        
        self.char = loader.loadModel("Models\littlebrother")
        self.char.setScale(3,3,3)
        self.char.reparentTo(render)
        
        self.charSph = CollisionSphere(0,0,1,1)
        self.charCol = CollisionNode("Cnone")
        self.charCol.addSolid(self.charSph)
        self.charCol.setFromCollideMask(BitMask32.bit(0))
        self.charCol.setIntoCollideMask(BitMask32.allOff())
        self.charSphNp = self.char.attachNewNode(self.charCol)
        self.charSphNp.node().addSolid(self.charSph)
        self.charHandler = CollisionHandlerQueue()
        self.cTrav.addCollider(self.charSphNp, self.charHandler)
        
        self.charSphNp.show()
        
        base.disableMouse()
        base.camera.setPos(0,20,12)
        base.camera.lookAt(self.char)
        base.camera.reparentTo(self.char)
        
        self.label = DirectLabel(text="Weapon: None", text_bg=(0,0,1,0.5), text_fg=(0,0,0,1), pos=(-1.16,0,0.95), scale=(0.06), relief=None)
        
        taskMgr.add(self.update, "Update")
        self.accept("escape", sys.exit)
        self.accept("w", self.setKey, ["forward",1])
        self.accept("s", self.setKey, ["backward",1])
        self.accept("a", self.setKey, ["left",1])
        self.accept("d", self.setKey, ["right",1])
        self.accept("space", self.setKey, ["jump",1])
        self.accept("w-up", self.setKey, ["forward",0])
        self.accept("s-up", self.setKey, ["backward",0])
        self.accept("a-up", self.setKey, ["left",0])
        self.accept("d-up", self.setKey, ["right",0])
        self.accept("space-up", self.setKey, ["jump",0])
        
    def setKey(self, key, value):
        self.keyMap[key] = value
        
    def update(self, task):
        elapsed = globalClock.getDt()
        
        self.startPos = self.char.getPos()
        
        if(self.keyMap["left"] != 0):
            self.char.setH(self.char.getH() + elapsed * 300)
        if(self.keyMap["right"] != 0):
            self.char.setH(self.char.getH() - elapsed * 300)
                
        if(self.keyMap["forward"] != 0):
            self.char.setY(self.char, -(elapsed * 10))
        if(self.keyMap["backward"] != 0):
            self.char.setY(self.char, +(elapsed * 10))
            
        if(self.keyMap["jump"] != 0):
            if(self.onGround):
                self.isJumping = True
                self.onGround = False
        
        print self.jump, self.isJumping, self.onGround, self.keyMap["jump"]
        
        if(self.isJumping):
            self.jump = 10.0
            self.isJumping = False
        
        self.char.setZ(self.char, +(0.02 * self.jump))
        
        self.cTrav.traverse(render)
        entries = []
        for i in range(self.charHandler.getNumEntries()):
            entry = self.charHandler.getEntry(i)
            entries.append(entry)
        entries.sort(lambda x,y: cmp(y.getSurfacePoint(render).getZ(),
                                     x.getSurfacePoint(render).getZ()))
        if(len(entries) > 0):
            if(entries[0].getIntoNode().getName() == "ground"):
                self.char.setZ(entries[0].getSurfacePoint(render).getZ())
                self.onGround = True
                self.isJumping = False
                self.jump = 0
        else:
            self.onGround = False
            self.jump -= 1.00
            
        return Task.cont
g = game()
run()