示例#1
0
    def __init__(self, base, mapNo):
        self.isListening = False

        # Holds rigid bodies, joints, controls global params
        self.world = OdeWorld()
        self.world.setGravity(0, 0, -9.8)

        st = SurfaceType()
        st.load(self.world)
        del st

        self.contactgroup = OdeJointGroup()

        self.space = OdeHashSpace()
        self.space.setAutoCollideWorld(self.world)
        self.space.setAutoCollideJointGroup(self.contactgroup)
        self.space.setCollisionEvent(EventType.ODE_COLLISION)
        base.accept(EventType.ODE_COLLISION, self.onCollision)

        self.ball = Ball(self.world, self.space, "Johanneksen pallo")

        self.level = Level(self, mapNo)
        self.player = Player("Johannes")

        self.camera = Camera(base, self.ball)
示例#2
0
    def post(self, level_id):
        user = User.getLevelBlockUser(users.get_current_user())

        if user:
            level = self.request.get('level')
            name = self.request.get('name')
            if level_id:
                l = Level.getById(int(level_id))
                #only modify if you are the original author
                if l.user.id == user.key.id:
                    l.name = name
                    l.user = user.key
                    l.score = 0
                    l.published = False
                    l.level = str(level)
                    l.put()
            else:
                l = Level()
                l.name = name
                l.user = user.key
                l.score = 0
                l.published = False
                l.level = str(level)
                l.put()

            self.response.out.write(level)

        else:
            template_values = {
                'signinurl': users.create_login_url("/")
            }

            template = jinja_environment.get_template('signin.html')
            self.response.out.write(template.render(template_values))
示例#3
0
    def get(self):
        max = Level.getByMaxJackpot()
        score = Level.getByHighScore()
        popular = Level.getByMostPlayed()

        template_values = {
            'max': max,
            'score': score,
            'popular': popular
        }

        template = jinja_environment.get_template('index.html')
        self.response.out.write(template.render(template_values))
示例#4
0
    def get(self):
        template_values = {
            'levels' : Level.get_all()
        }

        template = jinja_environment.get_template('levels.html')
        self.response.out.write(template.render(template_values))
示例#5
0
    def get(self, level_id):

        template_values = {
            'level': Level.getById(int(level_id)) if level_id else 0
        }

        template = jinja_environment.get_template('editor.html')
        self.response.out.write(template.render(template_values))
示例#6
0
 def __init__(self, camera, luObserver, fxObserver, lvl):
     self.mSwitch = True
     self.mTimer = 0.0
     self.mLevelDone = False
     self.mCamera = camera
     self.mLuObs = luObserver
     self.mFxObs = fxObserver
     self.contactListener = ContactListener()
     self.gravity = Gravity()
     self.physWorld = b2World(gravity=(0,0),doSleep=True, contactListener=self.contactListener)
     self.level = Level(self.physWorld, self.gravity, lvl)
     self.player = Player(self.level.mStartPos, self.physWorld, self.gravity)
     self.mEntityToFollow = self.player
示例#7
0
    def post(self, levelid=""):
        user = User.getLevelBlockUser(users.get_current_user())
        currentlevel = Level.getById(int(levelid))
        action = self.request.get('done')
        if user:
            if action == 'true':
                self.response.headers['Content-Type'] = 'application/json'
                #check to see if level belongs to user and is if published
                if currentlevel.user.id == user.key.id:
                    if not currentlevel.published:
                        currentlevel.published = True
                        currentlevel.played += 1
                        currentlevel.put()
                    else:
                        user.score += 1
                        user.put()
                    self.response.out.write('{"points": 1, "publish": true}')
                else:
                    score = 0
                    if currentlevel.jackpot:
                        score = math.ceil(currentlevel.score * 0.5)
                        creator = User.get_by_id(currentlevel.user.id())
                        creator.score += int(score)
                        creator.put()
                        currentlevel.jackpot = False
                        currentlevel.played += 1
                        currentlevel.put()
                    else:
                        score += math.ceil(currentlevel.score * 0.1)
                    user.score += int(score)
                    user.put()
                    self.response.out.write('{"points": ' + str(score) + ', "publish": false}')
            else:
                if currentlevel.published:
                    if currentlevel.jackpot:
                        currentlevel.score += 1

                    currentlevel.played += 1
                    currentlevel.put()

        else:
            template_values = {
                'signinurl' : users.create_login_url("/")
            }

            template = jinja_environment.get_template('signin.html')
            self.response.out.write(template.render(template_values))
示例#8
0
    def test_wawes(self):
        Orc._velocity = 1
        path = [Vector(1, 0), Vector(2, 0)]
        towers = [Vector(0, 0)]
        waves = [WavePart([Orc] * 2, Vector(0, 0), path)]
        level = Level(100, towers, WavesManager(waves, preparation_duration=0,
                                                unit_interval=2), '')
        game = Game(levels=iter((level,)))
        game.current_level.tick()
        orcs = self._find(Orc)
        self.assertEqual(1, len(orcs))

        game.current_level.tick()
        orcs = self._find(Orc)
        self.assertEqual(1, len(orcs))

        game.current_level.tick()
        orcs = self._find(Orc)
        self.assertEqual(1, len(orcs))
示例#9
0
    def get(self):

        user = User.getLevelBlockUser(users.get_current_user())
        #checks to see if we have a user signed in
        if user:
            template_values = {
                'levels' : Level.getUserLevels(user.key),
                'currentuser': user.nickname
            }

            template = jinja_environment.get_template('userlevels.html')
            self.response.out.write(template.render(template_values))
        #if not is ask them to sign in
        else:
            template_values = {
                'signinurl' : users.create_login_url("/")
            }

            template = jinja_environment.get_template('signin.html')
            self.response.out.write(template.render(template_values))
示例#10
0
    def get(self, levelid=""):
        user = User.getLevelBlockUser(users.get_current_user())
        #checks to see if we have a user signed in
        if user:
            currentlevel = Level.getById(int(levelid))
            creator = User.get_by_id(currentlevel.user.id())
            template_values = {
                'level': currentlevel,
                'creator': creator
            }

            template = jinja_environment.get_template('game.html')
            self.response.out.write(template.render(template_values))

        #if not is ask them to sign in
        else:
            template_values = {
                'signinurl' : users.create_login_url("/")
            }

            template = jinja_environment.get_template('signin.html')
            self.response.out.write(template.render(template_values))
示例#11
0
 def get(self, level=""):
     if level:
         l = Level.getById(int(level))
         l.key.delete()
     self.redirect("/mylevels")
示例#12
0
 def get(self, level=''):
     if level:
         self.response.headers['Content-Type'] = 'application/json'
         self.response.out.write(Level.getByName(level)[0].level)
示例#13
0
class GameModel:
    #Represents the world data.

    def __init__(self, base, mapNo):
        self.isListening = False

        # Holds rigid bodies, joints, controls global params
        self.world = OdeWorld()
        self.world.setGravity(0, 0, -9.8)

        st = SurfaceType()
        st.load(self.world)
        del st

        self.contactgroup = OdeJointGroup()

        self.space = OdeHashSpace()
        self.space.setAutoCollideWorld(self.world)
        self.space.setAutoCollideJointGroup(self.contactgroup)
        self.space.setCollisionEvent(EventType.ODE_COLLISION)
        base.accept(EventType.ODE_COLLISION, self.onCollision)

        self.ball = Ball(self.world, self.space, "Johanneksen pallo")

        self.level = Level(self, mapNo)
        self.player = Player("Johannes")

        self.camera = Camera(base, self.ball)

    def turnGravityTask(self):
        ''''''
        g = self.world.getGravity()
        g = -g
        self.world.setGravity(g)
        self.camera.turn()

    def turnGravityTask2(self):
        ''''''
        g = self.world.getGravity()
        g2 = self.ball.perpendicularUnitVec3WithFixedX(g)
        g2 *= g.length()
        self.world.setGravity(g2)

    def updateObjects(self):
        '''
		Update objects after one physics iteration
		@see GameLoop.simulationTask
		'''
        self.level.updateModelNode()
        self.camera.updateModelNode()
        #Has to be last for RESTART to work inside Ball
        self.ball.updateModelNode()

    def getBall(self):
        return self.ball

    def getPlayer(self):
        return self.player

    # http://www.panda3d.org/wiki/index.php/Collision_Detection_with_ODE
    def onCollision(self, entry):
        geom1 = entry.getGeom1()
        geom2 = entry.getGeom2()
        body1 = entry.getBody1()
        body2 = entry.getBody2()

        # Is the ball touching something?
        if body1 == self.ball.getBody() or body2 == self.ball.getBody():
            self.ball.refreshCollisionTime(entry)

        for coin in self.level.getCoins():
            if body1 == coin.getBody() and body2 == self.ball.getBody():
                coin.collect()
                messenger.send(EventType.UPDATE_HUD)

        exit = self.level.getExit()
        if geom1 == exit or geom2 == exit:
            if Coin.collectable == self.level.getGoal():
                # todo: make event based
                messenger.send(EventType.NEXT_LEVEL)

    def cleanUp(self):
        self.level.removeLevel()
        self.ball.removeNode()
示例#14
0
    def levels():
        path = [
            Vector(320, 600),
            Vector(320, 420),
            Vector(290, 360),
            Vector(211, 338),
            Vector(170, 293),
            Vector(168, 244),
            Vector(212, 180),
            Vector(318, 170),
            Vector(385, 178),
            Vector(477, 162),
            Vector(588, 237),
            Vector(710, 255)
        ]
        towers = [
            Vector(465, 222),
            Vector(178, 392),
            Vector(254, 295),
            Vector(241, 417),
            Vector(248, 234),
            Vector(323, 234),
            Vector(387, 138),
            Vector(586, 161)
        ]
        waves = [
            WavePart([Orc] * 3 + [Shaman] * 2, Vector(310, 630), path),
            WavePart([Bandit] * 15, Vector(310, 630), path, unit_interval=15),
            WavePart([Orc, Orc, Shaman] * 4, Vector(310, 630), path)
        ]
        yield Level(100, towers, WavesManager(waves), 'res/maps/level1.png')

        path = [
            Vector(700, 390),
            Vector(527, 392),
            Vector(493, 491),
            Vector(438, 517),
            Vector(377, 488),
            Vector(346, 393),
            Vector(221, 380),
            Vector(166, 319),
            Vector(202, 272),
            Vector(267, 266),
            Vector(389, 288),
            Vector(452, 256),
            Vector(426, 176),
            Vector(321, 147),
            Vector(308, -10)
        ]
        towers = [
            Vector(438, 458),
            Vector(437, 396),
            Vector(299, 442),
            Vector(247, 330),
            Vector(305, 218),
            Vector(379, 232),
            Vector(390, 122)
        ]
        waves = [
            WavePart([Orc] * 3 + [Shaman] * 2, Vector(710, 390), path),
            WavePart([Bandit] * 15, Vector(710, 390), path, unit_interval=15),
            WavePart([Orc, Orc, Shaman] * 4, Vector(710, 390), path)
        ]
        yield Level(200, towers, WavesManager(waves), 'res/maps/level2.png')

        path1 = [
            Vector(309, 148),
            Vector(472, 155),
            Vector(577, 186),
            Vector(625, 281),
            Vector(592, 383),
            Vector(461, 490),
            Vector(397, 514),
            Vector(402, 624)
        ]
        path2 = [
            Vector(309, 148),
            Vector(144, 281),
            Vector(110, 370),
            Vector(150, 452),
            Vector(244, 503),
            Vector(397, 514),
            Vector(402, 624)
        ]

        towers = [
            Vector(400, 470),
            Vector(318, 470),
            Vector(243, 448),
            Vector(199, 406),
            Vector(192, 346),
            Vector(213, 305),
            Vector(92, 251),
            Vector(511, 382),
            Vector(547, 322),
            Vector(551, 263),
            Vector(495, 215),
            Vector(414, 206),
            Vector(325, 211),
            Vector(474, 110),
            Vector(586, 128)
        ]
        waves = [
            WavePart([Orc] * 3 + [Shaman] * 2, Vector(300, -20), path1),
            WavePart([Bandit] * 15, Vector(300, -20), path2, unit_interval=15),
            WavePart([Orc, Orc, Shaman] * 4, Vector(300, -20), path1)
        ]
        yield Level(200, towers, WavesManager(waves), 'res/maps/level3.png')
示例#15
0
class WorldModel(object):

    DEBUG = False

    physWorld = None
    vel_iters, pos_iters = 6, 2
    debugRender = None;
    player = None
    body = None
    dynamic_enities = []
    mFirstUpdate = True
    mEntityToFollow = None
    mTimer = None
    mDeathTimer = 1.0

    mSwitch = None


    def __init__(self, camera, luObserver, fxObserver, lvl):
        self.mSwitch = True
        self.mTimer = 0.0
        self.mLevelDone = False
        self.mCamera = camera
        self.mLuObs = luObserver
        self.mFxObs = fxObserver
        self.contactListener = ContactListener()
        self.gravity = Gravity()
        self.physWorld = b2World(gravity=(0,0),doSleep=True, contactListener=self.contactListener)
        self.level = Level(self.physWorld, self.gravity, lvl)
        self.player = Player(self.level.mStartPos, self.physWorld, self.gravity)
        self.mEntityToFollow = self.player

    def __resetWorld(self):
        self.mSwitch = True
        self.mDeathTimer = 1.0
        self.mTimer = 0.0
        self.dynamic_enities = []
        self.mFirstUpdate = True
        self.gravity.reset()
        self.player.reset(b2Vec2(self.level.mStartPos.x + self.player.size.x/3, self.level.mStartPos.y + self.player.size.y/2))
        self.mLuObs.levelChanged(self.level)

    def restart(self):
        self.mFxObs.addFx(BloodSplatter(self.physWorld, self.gravity.get(), self.player.position))
        self.level.retryLevel()
        self.__resetWorld()

    def update(self, delta):
        self.mTimer += delta

        #step the physicsworld
        self.physWorld.Step(delta, self.vel_iters, self.pos_iters)
        self.physWorld.ClearForces()

        for body in self.physWorld.bodies:
            #dynamic body
            if body.type == b2_dynamicBody:
                if self.mFirstUpdate:
                    if isinstance(body.userData, Player):
                        self.dynamic_enities.append(body)

                    # body.userData.update(delta)
                if isinstance(body.userData, Player):
                    body.userData.update(delta)
                elif isinstance(body.userData, Enemy):
                    body.userData.update(delta)
                elif isinstance(body.userData, PickableObject):
                    body.userData.update(delta)
                elif isinstance(body.userData, Particle):
                    body.userData.update(delta)


        if self.mFirstUpdate == True:
            self.mFirstUpdate = False

        #update level, if level is done, returns true
        if self.level.update(delta, self.player.position):
            self.mLevelDone = True

        #is player dead?
        if not self.player.alive:

            if self.mSwitch:
                SoundManager.getInstance().playSound(SoundID.FLESHEXPLOSION)
                self.mFxObs.addFx(BloodSplatter(self.physWorld, self.gravity.get(), self.player.position))
                self.mSwitch = False

            self.player.stopMovement()
            self.mDeathTimer -= delta

            if self.mDeathTimer < 0:
                self.level.retryLevel()
                self.__resetWorld()


    def changeGravity(self, gravitydirection):
        if self.player.isOnGround() == True:
            self.gravity.set(gravitydirection)

            for body in self.dynamic_enities:
                if not body.userData.isInGravityZone():
                    body.userData.flip(gravitydirection)