Пример #1
0
 def init(self):
     self.fighterGroup = pygame.sprite.Group(Fighter(self.width//2,self.height//2,0),
                                             Fighter(self.width//2,self.height//2,1))
     self.HealthBars = [HealthBar(0), HealthBar(1)]
     self.attackGroup0 = pygame.sprite.Group()
     self.attackGroup1 = pygame.sprite.Group()
     self.attacks = [self.attackGroup0, self.attackGroup1]
Пример #2
0
 def __init__(self, screen, level, number_level, save):
     self.save = save
     saved_time = self.save[str(number_level)]['last_time_start']
     self.game_start_time = time.time(
     ) if saved_time is None else saved_time
     self.number_level = number_level
     self.screen = screen
     self.level_pre = level
     self.hb_gr = pygame.sprite.Group()
     self.hb = HealthBar(self.hb_gr, (20, 20), 4)
     self.clock_t = pygame.time.Clock()
     self.clock = [0]
     self.all_tiles = pygame.sprite.Group()
     self.background_group = pygame.sprite.Group()
     self.player, x_max, y_max = generate_level(
         level,
         self.all_tiles,
         self.clock,
         self.background_group,
         pos_pl=self.save[str(number_level)]['last_pos'])
     self.spites_start()
     self.background = ForrestBackgroundMain(self.screen,
                                             self.background_group,
                                             self.clock, x_max)
     self.background_front = ForrestBackgroundFront(self.screen,
                                                    self.background_group,
                                                    self.clock, x_max)
     self.ifpause = False
Пример #3
0
    def renderBlue(self, AIworld):
        if not self._is_dead:
            self.AIbehaviors.removeAi("pursue")
            self.npc.detachNode()

        print "Started delete procedure for npc ",
        print self.id
        self.npc.delete()
        self.npc = Actor(
            "models/priest", {
                "walk": "models/priest-walk",
                "attack": "models/priest-attack",
                "hurt": "models/priest-hit",
                "die": "models/priest-die"
            })
        self.npcTex = loader.loadTexture("models/tex/guard_blue.png")
        self.npc.setTexture(self.npcTex)
        self.npc.setScale(0.5, 0.5, 0.5)
        self.npc.clearColor()
        self.npc.clearColorScale()
        self.npc.setColor(255, 0, 0, 0)
        self.npc.setColorScale(255, 0, 0, 0)
        self.npc.reparentTo(self.render)
        self.npc.setPos(self.anchorx, self.anchory, self.anchorz)

        AIworld.removeAiChar("npc" + str(self.id))
        self.AIchar = AICharacter("npc" + str(self.id), self.npc, 100, 0.05, 5)
        self.AIbehaviors = self.AIchar.getAiBehaviors()
        AIworld.addAiChar(self.AIchar)

        self.hb = HealthBar(1.5, value=self.health)
        self.hb.setPos(0, 0, 18.1)
        self.hb.reparentTo(self.npc)
Пример #4
0
    def __init__(self, *args):
        super(Swordsman, self).__init__(*args)
        Character.set_health(self, Swordsman.MAX_HEALTH)
        Character.set_speed(self, Swordsman.MOVE_SPEED)
        actor = Actor(
            "models/swordsman", {
                "idle": "models/swordsman-idle",
                "walk": "models/swordsman-walk",
                "run": "models/swordsman-run",
                "hurt": "models/swordsman-hurt",
                "die": "models/swordsman-die",
                "attack": "models/swordsman-attack"
            })

        team = Character.get_team(self)
        if team == 0:
            """
			actor = Actor("models/swordsman_red", 
						{"idle": "models/swordsman-idle", 
						 "walk": "models/swordsman-walk", 
						 "run": "models/swordsman-run", 
						 "hurt": "models/swordsman-hurt", 
						 "die": "models/swordsman-die", 
						 "attack": "models/swordsman-attack"})
			"""
            tex = loader.loadTexture("models/textures/swordsman_red.png")
            ts = actor.findTextureStage('*')
            actor.setTexture(ts, tex, 1)
            #ts = actor.findTextureStage('ts')
            #actor.setTexture(ts, tex)
        elif team == 1:
            """
			actor = Actor("models/swordsman_blue", 
						{"idle": "models/swordsman-idle", 
						 "walk": "models/swordsman-walk", 
						 "run": "models/swordsman-run", 
						 "hurt": "models/swordsman-hurt", 
						 "die": "models/swordsman-die", 
						 "attack": "models/swordsman-attack"})
			"""
            tex = loader.loadTexture("models/textures/swordsman_blue.png")
            ts = actor.findTextureStage('*')
            actor.setTexture(ts, tex, 1)
            #ts = actor.findTextureStage('ts')
            #actor.setTexture(ts, tex)

        Character.set_actor(self, actor)
        self.hb = HealthBar(1.5, value=Swordsman.MAX_HEALTH)
        self.hb.reparentTo(self._floater)
        self.hb.setValue(self.get_health())

        self.model = loader.loadModel("models/circle")
        self.model.setTransparency(True)
        self.model.reparentTo(self._character)
        self.model.setAlphaScale(0.5)
        self.model.setScale(2)
        self.model.setPos(0, 0, -10)
Пример #5
0
 def renderBlue(self,AIworld):
     if not self._is_dead:
         self.AIbehaviors.removeAi("pursue")
         self.npc.detachNode()
     
     print "Started delete procedure for npc ",
     print self.id    
     self.npc.delete()
     self.npc = Actor("models/priest",
                             {"walk": "models/priest-walk", "attack":"models/priest-attack", "hurt":"models/priest-hit", "die":"models/priest-die"})
     self.npcTex = loader.loadTexture("models/tex/guard_blue.png")
     self.npc.setTexture(self.npcTex)
     self.npc.setScale(0.5, 0.5, 0.5)
     self.npc.clearColor()
     self.npc.clearColorScale()
     self.npc.setColor(255, 0, 0, 0)
     self.npc.setColorScale(255, 0, 0, 0)
     self.npc.reparentTo(self.render)
     self.npc.setPos(self.anchorx,self.anchory,self.anchorz)
     
     AIworld.removeAiChar("npc"+str(self.id))
     self.AIchar = AICharacter("npc"+str(self.id),self.npc, 100, 0.05, 5)
     self.AIbehaviors = self.AIchar.getAiBehaviors()
     AIworld.addAiChar(self.AIchar)
     
     self.hb = HealthBar(1.5, value=self.health)
     self.hb.setPos(0, 0, 18.1)
     self.hb.reparentTo(self.npc)
Пример #6
0
 def __init__(self):
     Globals.PLAYER_HEALTH = 100
     Globals.PLAYER_SCORE = 0
     Globals.REMAINING_TIME = 30000
     self.tileEngine = TileEngine("test_def.txt", "test_map.txt", 1, 3)
     self.camera = Camera(self.tileEngine, pygame.Rect(
         0, 0, Globals.WIDTH, Globals.HEIGHT))
     self.keyCode = None
     self.testPoint = []
     self.object_radius = \
         self.camera.tileEngine.get_tile_rect().height * 1.5
     self.direction = -1
     self.has_collided = False
     self.enemySprites = pygame.sprite.Group()
     self.playerSprites = pygame.sprite.Group()
     self.health = HealthBar()
     self.score_timer = ScoreTimer()
     for x in range(TileTest.NUM_ENEMY):
         # fix the positions they are added in and everything else
         # should work
         self.enemySprites.add(Enemy(Globals.WIDTH, Globals.HEIGHT,
                                     self.camera))
     player_x = Globals.WIDTH / 2
     player_y = int(Globals.HEIGHT -
                    self.camera.tileEngine.get_tile_rect().height * 3.5)
     self.player = Player(
         Globals.WIDTH,
         Globals.HEIGHT,
         player_x,
         player_y,
         self.score_timer
     )
     self.playerSprites.add(self.player)
Пример #7
0
    def __init__(self, *args):
        super(Axeman, self).__init__(*args)
        Character.set_health(self, Axeman.MAX_HEALTH)
        actor = Actor("models/axeman", {"idle": "models/axeman-idle", 
                                        "walk": "models/axeman-walk", 
                                        "run": "models/axeman-run" ,
                                        "hurt": "models/axeman-hurt", 
                                        "die": "models/axeman-die", 
                                        "attack": "models/axeman-swing", 
                                        "special":"models/axeman-special-attack"})
        Character.set_speed(self, Axeman.MOVE_SPEED)

        # loda texture based on team 
        team = Character.get_team(self)
        if team == 0:
            tex = loader.loadTexture("models/textures/axeman_red.png")
            ts = actor.findTextureStage("*")
            actor.setTexture(ts, tex, 1)
        elif team == 1:
            tex = loader.loadTexture("models/textures/axeman_blue.png")
            ts = actor.findTextureStage('*')
            actor.setTexture(ts, tex, 1)

        Character.set_actor(self, actor)

        #attach axe 
        rightHand = self._character.exposeJoint(None, 'modelRoot', 'hand_ctrl_r')
        axe = loader.loadModel("models/axe")
        axe_tex = loader.loadTexture("models/textures/axe.png")
        axe.setTexture(axe_tex, 1)
        axe.setPos(-3.0, 0.6, -0.2)
        axe.setHpr(0, -90, -90)
        axe.setScale(10)
        axe.reparentTo(rightHand)
        axe.show()

        self.hb = HealthBar(1.5, value=Axeman.MAX_HEALTH)
       	self.hb.reparentTo(self._floater)

	self.hb.setValue(self.get_health())
		
        model = loader.loadModel("models/circle")
        model.setTransparency(True)
        model.reparentTo(self._character)
        model.setAlphaScale(0.5)
        model.setScale(2)
        model.setPos(0, 0, -10)
Пример #8
0
    def __init__(self, controlPointId, id, anchorx, anchory, anchorz, render,
                 team):
        self.id = id
        self.anchorx = anchorx
        self.anchory = anchory
        self.anchorz = anchorz
        self.controlPointId = controlPointId
        self.target = None
        self.isMoving = False
        self.health = 200
        self.isCurrentUser = False
        self.damage = 8
        self.attackTimer = 0
        self._is_dead = False
        self._team = team

        self.render = render
        '''Initializing NPC actors'''
        self.npc = Actor(
            "models/priest", {
                "walk": "models/priest-walk",
                "attack": "models/priest-attack",
                "hurt": "models/priest-hit",
                "die": "models/priest-die"
            })
        if self._team == 0:
            self.npcTex = loader.loadTexture("models/tex/guard_red.png")
        else:
            self.npcTex = loader.loadTexture("models/tex/guard_blue.png")
        self.npc.setTexture(self.npcTex)
        self.npc.setScale(0.5, 0.5, 0.5)
        self.npc.clearColor()
        self.npc.clearColorScale()
        self.npc.setColor(255, 0, 0, 0)
        self.npc.setColorScale(255, 0, 0, 0)
        self.npc.reparentTo(self.render)
        self.npc.setPos(anchorx, anchory, anchorz)

        self.AIchar = AICharacter("npc" + str(self.id), self.npc, 100, 0.05, 5)
        self.AIbehaviors = self.AIchar.getAiBehaviors()

        self.hb = HealthBar(1.5, value=self.health)
        #self._floater = NodePath(PandaNode("char_info"))
        #self._floater.reparentTo(self.npc)
        self.hb.setPos(0, 0, 11.9)
        self.hb.reparentTo(self.npc)
Пример #9
0
	def __init__(self, *args):
		super(Swordsman, self).__init__(*args)
		Character.set_health(self, Swordsman.MAX_HEALTH)
		Character.set_speed(self, Swordsman.MOVE_SPEED)
		actor = Actor("models/swordsman", 
						{"idle": "models/swordsman-idle", 
						 "walk": "models/swordsman-walk", 
						 "run": "models/swordsman-run", 
						 "hurt": "models/swordsman-hurt", 
						 "die": "models/swordsman-die", 
						 "attack": "models/swordsman-attack"})

		team = Character.get_team(self)
		if team == 0:
			"""
			actor = Actor("models/swordsman_red", 
						{"idle": "models/swordsman-idle", 
						 "walk": "models/swordsman-walk", 
						 "run": "models/swordsman-run", 
						 "hurt": "models/swordsman-hurt", 
						 "die": "models/swordsman-die", 
						 "attack": "models/swordsman-attack"})
			"""
			tex = loader.loadTexture("models/textures/swordsman_red.png")
			ts = actor.findTextureStage('*')
			actor.setTexture(ts, tex, 1)
			#ts = actor.findTextureStage('ts')
			#actor.setTexture(ts, tex)
		elif team == 1:
			"""
			actor = Actor("models/swordsman_blue", 
						{"idle": "models/swordsman-idle", 
						 "walk": "models/swordsman-walk", 
						 "run": "models/swordsman-run", 
						 "hurt": "models/swordsman-hurt", 
						 "die": "models/swordsman-die", 
						 "attack": "models/swordsman-attack"})
			"""
			tex = loader.loadTexture("models/textures/swordsman_blue.png")
			ts = actor.findTextureStage('*')
			actor.setTexture(ts, tex, 1)
			#ts = actor.findTextureStage('ts')
			#actor.setTexture(ts, tex)
		
		Character.set_actor(self, actor)
		self.hb = HealthBar(1.5, value=Swordsman.MAX_HEALTH)
		self.hb.reparentTo(self._floater)
		self.hb.setValue(self.get_health())
		
		self.model = loader.loadModel("models/circle")
		self.model.setTransparency(True)
		self.model.reparentTo(self._character)
		self.model.setAlphaScale(0.5)
		self.model.setScale(2)
		self.model.setPos(0, 0, -10)
Пример #10
0
    def __init__(self, *args):
        super(Axeman, self).__init__(*args)
        Character.set_health(self, Axeman.MAX_HEALTH)
        actor = Actor("models/axeman", {"idle": "models/axeman-idle", 
                                        "walk": "models/axeman-walk", 
                                        "run": "models/axeman-run" ,
                                        "hurt": "models/axeman-hurt", 
                                        "die": "models/axeman-die", 
                                        "attack": "models/axeman-swing", 
                                        "special":"models/axeman-special-attack"})
        Character.set_speed(self, Axeman.MOVE_SPEED)

        # loda texture based on team 
        team = Character.get_team(self)
        if team == 0:
            tex = loader.loadTexture("models/textures/axeman_red.png")
            ts = actor.findTextureStage("*")
            actor.setTexture(ts, tex, 1)
        elif team == 1:
            tex = loader.loadTexture("models/textures/axeman_blue.png")
            ts = actor.findTextureStage('*')
            actor.setTexture(ts, tex, 1)

        Character.set_actor(self, actor)

        #attach axe 
        rightHand = self._character.exposeJoint(None, 'modelRoot', 'hand_ctrl_r')
        axe = loader.loadModel("models/axe")
        axe_tex = loader.loadTexture("models/textures/axe.png")
        axe.setTexture(axe_tex, 1)
        axe.setPos(-3.0, 0.6, -0.2)
        axe.setHpr(0, -90, -90)
        axe.setScale(10)
        axe.reparentTo(rightHand)
        axe.show()

        self.hb = HealthBar(1.5, value=Axeman.MAX_HEALTH)
        self.hb.reparentTo(self._character)
		
        model = loader.loadModel("models/circle")
        model.setTransparency(True)
        model.reparentTo(self._character)
        model.setAlphaScale(0.5)
        model.setScale(2)
        model.setPos(0, 0, -10)
Пример #11
0
 def __init__(self,controlPointId,id, anchorx, anchory, anchorz,render,team):
     self.id = id
     self.anchorx = anchorx
     self.anchory = anchory
     self.anchorz = anchorz
     self.controlPointId = controlPointId
     self.target = None
     self.isMoving = False
     self.health = 200
     self.isCurrentUser = False
     self.damage = 8
     self.attackTimer = 0
     self._is_dead = False
     self._team = team
     
     self.render = render
     '''Initializing NPC actors'''
     self.npc = Actor("models/priest",
                             {"walk": "models/priest-walk", "attack":"models/priest-attack", "hurt":"models/priest-hit", "die":"models/priest-die"})
     if self._team==0:
         self.npcTex = loader.loadTexture("models/tex/guard_red.png")
     else:
         self.npcTex = loader.loadTexture("models/tex/guard_blue.png")
     self.npc.setTexture(self.npcTex)
     self.npc.setScale(0.5, 0.5, 0.5)
     self.npc.clearColor()
     self.npc.clearColorScale()
     self.npc.setColor(255, 0, 0, 0)
     self.npc.setColorScale(255, 0, 0, 0)
     self.npc.reparentTo(self.render)
     self.npc.setPos(anchorx,anchory,anchorz)
     
     self.AIchar = AICharacter("npc"+str(self.id),self.npc, 100, 0.05, 5)
     self.AIbehaviors = self.AIchar.getAiBehaviors()
     
     self.hb = HealthBar(1.5, value=self.health)
     #self._floater = NodePath(PandaNode("char_info"))
     #self._floater.reparentTo(self.npc)
     self.hb.setPos(0, 0, 11.9)
     self.hb.reparentTo(self.npc)
Пример #12
0
class Swordsman(Character):
	ATK_RANGE = 8
	BASIC_ATK_DMG = 15
	SPECIAL_ATK_DMG = 30
	MOVE_SPEED = 10
	CHARGE_SPEED = 15
	MAX_HEALTH = 100
	FOV = 60

	def __init__(self, *args):
		super(Swordsman, self).__init__(*args)
		Character.set_health(self, Swordsman.MAX_HEALTH)
		Character.set_speed(self, Swordsman.MOVE_SPEED)
		actor = Actor("models/swordsman", 
						{"idle": "models/swordsman-idle", 
						 "walk": "models/swordsman-walk", 
						 "run": "models/swordsman-run", 
						 "hurt": "models/swordsman-hurt", 
						 "die": "models/swordsman-die", 
						 "attack": "models/swordsman-attack"})

		team = Character.get_team(self)
		if team == 0:
			"""
			actor = Actor("models/swordsman_red", 
						{"idle": "models/swordsman-idle", 
						 "walk": "models/swordsman-walk", 
						 "run": "models/swordsman-run", 
						 "hurt": "models/swordsman-hurt", 
						 "die": "models/swordsman-die", 
						 "attack": "models/swordsman-attack"})
			"""
			tex = loader.loadTexture("models/textures/swordsman_red.png")
			ts = actor.findTextureStage('*')
			actor.setTexture(ts, tex, 1)
			#ts = actor.findTextureStage('ts')
			#actor.setTexture(ts, tex)
		elif team == 1:
			"""
			actor = Actor("models/swordsman_blue", 
						{"idle": "models/swordsman-idle", 
						 "walk": "models/swordsman-walk", 
						 "run": "models/swordsman-run", 
						 "hurt": "models/swordsman-hurt", 
						 "die": "models/swordsman-die", 
						 "attack": "models/swordsman-attack"})
			"""
			tex = loader.loadTexture("models/textures/swordsman_blue.png")
			ts = actor.findTextureStage('*')
			actor.setTexture(ts, tex, 1)
			#ts = actor.findTextureStage('ts')
			#actor.setTexture(ts, tex)
		
		Character.set_actor(self, actor)
		self.hb = HealthBar(1.5, value=Swordsman.MAX_HEALTH)
		self.hb.reparentTo(self._floater)
		self.hb.setValue(self.get_health())
		
		self.model = loader.loadModel("models/circle")
		self.model.setTransparency(True)
		self.model.reparentTo(self._character)
		self.model.setAlphaScale(0.5)
		self.model.setScale(2)
		self.model.setPos(0, 0, -10)
		
	def basic_attack(self):
		total_dmg = Swordsman.BASIC_ATK_DMG
		swing_sound = loader.loadSfx("sound/Swoosh.mp3")

		if self._atk_buff==1:
			total_dmg *= 1.1
		elif self._atk_buff==2:
			total_dmg *= 1.25

		sound_interval = SoundInterval(
    								swing_sound,
    								loop = 2 ,
    								duration = 0.6,
    								volume = 0.7,
    								startTime = 0
									)
		atk_interval1 = self._character.actorInterval("attack", startFrame=1, endFrame=26)
		atk_interval2 = self._character.actorInterval("attack", startFrame=56, endFrame=80)
		seq = Sequence(atk_interval1, atk_interval2)
		if self._is_moving:
			seq.append(Func(self.animate, 2))
		seq2 = Sequence(Wait(0.5), sound_interval, sound_interval)
		seq.start()
		seq2.start()
		
		return total_dmg

	def special_attack(self):
		total_dmg = Swordsman.SPECIAL_ATK_DMG
		swing_sound = loader.loadSfx("sound/Swoosh.mp3")
			
		if self._atk_buff==1:
			total_dmg *= 1.1
		elif self._atk_buff==2:
			total_dmg *= 1.25

		sound_interval = SoundInterval(
    							swing_sound,
    							loop = 2 ,
    							duration = 0.8,
    							volume = 0.7,
    							startTime = 0
								)
		atk_interval1 = self._character.actorInterval("attack", startFrame=1, endFrame=13)
		atk_interval2 = self._character.actorInterval("attack", startFrame=38, endFrame=80)
		seq = Sequence(atk_interval1, atk_interval2)
		if self._is_moving:
			seq.append(Func(self.animate, 2))
		seq2 = Sequence(Wait(0.5), sound_interval, sound_interval)
		seq.start()
		seq2.start()
		
		return total_dmg

	def take_damage(self, health_change):
		health = Character.get_health(self)
		if health < health_change and not self._is_dead:
			Character.set_health(self, 0)
			self.hb.setValue(0)
			hurt_interval = self._character.actorInterval("hurt")
			death_interval = self._character.actorInterval("die")
			seq = Sequence(hurt_interval, death_interval)
			seq.append(Wait(2))
			# add Func interval to place the character at a new location
			seq.append(Func(self.respawn))
			seq.start()
			self._is_dead = True
			#self._is_moving=2
		else:
			Character.set_health(self, health-health_change)
			#self.hb.setValue(Character.get_health(self)-health_change)
			self.hb.setValue(Character.get_health(self))
			self._character.play("hurt")

	def apply_def_buff(self):
		if not self._is_dead:
			health = Character.get_health(self)
			if self._def_buff==1:
				Character.set_health(self, health*1.1)
				Swordsman.MAX_HEALTH = Swordsman.MAX_HEALTH*1.1
			elif self._def_buff==2:
				Character.set_health(self, health*1.25)
				Swordsman.MAX_HEALTH = Swordsman.MAX_HEALTH*1.25

	def unapply_def_buff(self):
		if not self._is_dead:
			if self._def_buff==0:
				Swordsman.MAX_HEALTH = 100
			elif Swordsman.MAX_HEALTH==125 and self._def_buff==1:
				Swordsman.MAX_HEALTH = 110

			health = Character.get_health(self)
			if health > Swordsman.MAX_HEALTH:
					health = Swordsman.MAX_HEALTH

	def animate(self, anim_type):
		if anim_type==0:
			self._character.loop("idle")
		elif anim_type==1:
			self._character.loop("walk")
		elif anim_type==2:
			self._character.loop("run")
		elif anim_type==3:
			atk_interval1 = self._character.actorInterval("attack", startFrame=1, endFrame=26)
			atk_interval2 = self._character.actorInterval("attack", startFrame=56, endFrame=80)
			seq = Sequence(atk_interval1, atk_interval2)
			seq.start()
		elif anim_type==4:
			atk_interval1 = self._character.actorInterval("attack", startFrame=1, endFrame=13)
			atk_interval2 = self._character.actorInterval("attack", startFrame=38, endFrame=80)
			seq = Sequence(atk_interval1, atk_interval2)
			seq.start()
		elif anim_type==5:
			self._character.play("hurt")
		elif anim_type==6:
			self._character.play("die")

	def respawn(self):
		self._is_moving=2
		self._character.loop("idle")
Пример #13
0
 def redrawAll(self, screen):
     self.fighterGroup.draw(screen)
     for HealthBar in self.HealthBars:
         HealthBar.drawHealth(screen)
     for group in self.attacks:
         group.draw(screen)
Пример #14
0
class Npc():

    def __init__(self,controlPointId,id, anchorx, anchory, anchorz,render,team):
        self.id = id
        self.anchorx = anchorx
        self.anchory = anchory
        self.anchorz = anchorz
        self.controlPointId = controlPointId
        self.target = None
        self.isMoving = False
        self.health = 200
        self.isCurrentUser = False
        self.damage = 8
        self.attackTimer = 0
        self._is_dead = False
        self._team = team
        
        self.render = render
        '''Initializing NPC actors'''
        self.npc = Actor("models/priest",
                                {"walk": "models/priest-walk", "attack":"models/priest-attack", "hurt":"models/priest-hit", "die":"models/priest-die"})
        if self._team==0:
            self.npcTex = loader.loadTexture("models/tex/guard_red.png")
        else:
            self.npcTex = loader.loadTexture("models/tex/guard_blue.png")
        self.npc.setTexture(self.npcTex)
        self.npc.setScale(0.5, 0.5, 0.5)
        self.npc.clearColor()
        self.npc.clearColorScale()
        self.npc.setColor(255, 0, 0, 0)
        self.npc.setColorScale(255, 0, 0, 0)
        self.npc.reparentTo(self.render)
        self.npc.setPos(anchorx,anchory,anchorz)
        
        self.AIchar = AICharacter("npc"+str(self.id),self.npc, 100, 0.05, 5)
        self.AIbehaviors = self.AIchar.getAiBehaviors()
        
        self.hb = HealthBar(1.5, value=self.health)
        #self._floater = NodePath(PandaNode("char_info"))
        #self._floater.reparentTo(self.npc)
        self.hb.setPos(0, 0, 11.9)
        self.hb.reparentTo(self.npc)
        #self.hb.reparentTo(self.npc)
        
    def renderBlue(self,AIworld):
        if not self._is_dead:
            self.AIbehaviors.removeAi("pursue")
            self.npc.detachNode()
        
        print "Started delete procedure for npc ",
        print self.id    
        self.npc.delete()
        self.npc = Actor("models/priest",
                                {"walk": "models/priest-walk", "attack":"models/priest-attack", "hurt":"models/priest-hit", "die":"models/priest-die"})
        self.npcTex = loader.loadTexture("models/tex/guard_blue.png")
        self.npc.setTexture(self.npcTex)
        self.npc.setScale(0.5, 0.5, 0.5)
        self.npc.clearColor()
        self.npc.clearColorScale()
        self.npc.setColor(255, 0, 0, 0)
        self.npc.setColorScale(255, 0, 0, 0)
        self.npc.reparentTo(self.render)
        self.npc.setPos(self.anchorx,self.anchory,self.anchorz)
        
        AIworld.removeAiChar("npc"+str(self.id))
        self.AIchar = AICharacter("npc"+str(self.id),self.npc, 100, 0.05, 5)
        self.AIbehaviors = self.AIchar.getAiBehaviors()
        AIworld.addAiChar(self.AIchar)
        
        self.hb = HealthBar(1.5, value=self.health)
        self.hb.setPos(0, 0, 18.1)
        self.hb.reparentTo(self.npc)
        #self.hb.reparentTo(self.npc)
        
    def renderRed(self,AIworld):
        if not self._is_dead:
            self.AIbehaviors.removeAi("pursue")
            self.npc.detachNode()
            
        self.npc.delete()
        self.npc = Actor("models/priest",
                                {"walk": "models/priest-walk", "attack":"models/priest-attack", "hurt":"models/priest-hit", "die":"models/priest-die"})
        self.npcTex = loader.loadTexture("models/tex/guard_red.png")
        self.npc.setTexture(self.npcTex)
        self.npc.setScale(0.5, 0.5, 0.5)
        self.npc.clearColor()
        self.npc.clearColorScale()
        self.npc.setColor(255, 0, 0, 0)
        self.npc.setColorScale(255, 0, 0, 0)
        self.npc.reparentTo(self.render)
        self.npc.setPos(self.anchorx,self.anchory,self.anchorz)
        
        AIworld.removeAiChar("npc"+str(self.id))
        self.AIchar = AICharacter("npc"+str(self.id),self.npc, 100, 0.05, 5)
        self.AIbehaviors = self.AIchar.getAiBehaviors()
        AIworld.addAiChar(self.AIchar)
        AIworld.update()
        
        self.hb = HealthBar(1.5, value=self.health)
        self.hb.setPos(0, 0, 8.1)
        self.hb.reparentTo(self.npc)
        
    def switchTeam(self,AIworld):
        print self.id,
        print " from team ",
        print self._team,
        print " getting deleted."
        if self._team==0:
            self._team=1
            self.renderBlue(AIworld)
        else:
            self._team=0
            self.renderRed(AIworld)
            
        if self.isCurrentUser:
            main.freeDeadNpc(self.id)
            
        self.target = None
        self.isMoving = False
        self.health = 200
        self.isCurrentUser = False
        self.damage = 8
        self.attackTimer = 0
        self._is_dead = False
            
        
    def set_health(self, health):
        self.health = health
        
    def take_damage(self, health_change):
        health = self.health
        if health <= health_change and not self._is_dead:
            self.killNpc()
        else:
            health = health-health_change
            self.set_health(health)
            self.hb.setValue(self.health)
            self.npc.play("hurt")
            
    def killNpc(self):
        self.set_health(0)
        self.hb.setValue(0)
        self.AIbehaviors.removeAi("pursue")
        hurt_interval = self.npc.actorInterval("hurt")
        death_interval = self.npc.actorInterval("die")
        seq = Sequence(hurt_interval, death_interval)
        seq.start()
        self.npc.pose("die",45)
        self._is_dead = True
        self.npc.detachNode()
        if self.isCurrentUser:
            main.freeDeadNpc(self.id)
            #main.cManager.sendRequest(Constants.CMSG_NPCDEATH, [self.id])
            print Constants.CMSG_NPCDEATH,
            print " + ",
            print self.id
            
            
    def chaseTarget(self, target, status = False):
        if(not self.isMoving):
            self.target = target
            self.AIbehaviors.pursue(self.target)
            self.npc.loop("walk")
            self.isMoving = True
            self.isCurrentUser = status
            
    def stopChase(self):
        
        #self.AIbehaviors.pauseAi("pursue")
        if not self._is_dead:
            self.AIbehaviors.removeAi("pursue")
            p1 = LerpHprInterval(self.npc, 4, Point3(180,0,0))
            p2 = LerpPosInterval(self.npc, 4, Point3(self.anchorx, self.anchory, self.anchorz))
            animInterval = self.npc.actorInterval("walk", loop = 1, duration=4)
            p2.start()
            p1.start()
            animInterval.start()
            self.isMoving = False
            self.target = None
            self.isCurrentUser = False
        
    def givNPCDistance(self,charachter):
        x = self.npc.getX()
        y = self.npc.getY()
        z = self.npc.getZ()
        minDist = math.sqrt( (charachter.getX()-x)*(charachter.getX()-x) + (charachter.getY()-y)*(charachter.getY()-y) + (charachter.getZ()-z)*(charachter.getZ()-z) )
        return minDist
    
    def checkNpcIsAlive(self):
        if(self.health>0):
            return True
        else:
            return False
                         
    def shouldAttack(self,currentTime,cManager):
        if not self._is_dead:
            if self.isMoving:
                if self.attackTimer>0:
                    self.attackTimer = self.attackTimer-currentTime
                    #print self.attackTimer
                if self.AIbehaviors.behaviorStatus("pursue")=="done":
                    #self.npc.stop("walk")
                    #print self.npc.getAnimControl("walk")
                    if self.attackTimer<=0:
                            if self.npc.getAnimControl("walk").isPlaying():
                                self.npc.stop("walk")
                            if not self.npc.getAnimControl("attack").isPlaying():
                                #self.npc.loop("attack")
                                self.npc.play("attack")
                                self.attackTimer = 2
                                #myInterval = self.npc.actorInterval("attack")
                                #seq = Sequence(myInterval)
                                #seq.append(Wait(3))
                                #seq.start()
                            if self.isCurrentUser:
                                cManager.sendRequest(Constants.CMSG_NPCATTACK, [self.id, self.damage])
                
                if self.AIbehaviors.behaviorStatus("pursue")=="active":
                    if self.npc.getAnimControl("attack").isPlaying():
                        self.npc.stop("attack")
                    if not self.npc.getAnimControl("walk").isPlaying():
                        self.npc.loop("walk") 
Пример #15
0
    #----------------characters/environment-------------------
    man = Man(4, [40, 40])
    man.haveNothing = True
    zombies = []
    robots = []
    stick = Stick([125, 125])
    stick2 = Stick([50, 420])
    stick3 = Stick([660, 120])
    stick4 = Stick([500, 450])
    electricitys = []
    maxelectricitys = 2
    pistols = []
    maxPistols = 5
    projectiles = []
    maxProjectiles = 2
    healthBar = HealthBar([695, 2])
    winBlock = WinBlock([790, 560])

    if mode == "":
        maxZombies = 15
        maxRobots = 15
        mode = "medium"
        medium.clicked = True
        medium.select()

    while not run and not man.living and not man.win and not difficultyScreen:
        for event in pygame.event.get():
            if event.type == pygame.QUIT: sys.exit()
            elif event.type == pygame.MOUSEBUTTONDOWN:
                if event.button == 1:
                    if singlePlayer.collidePt(event.pos):
Пример #16
0
 def __init__(self,
              definition_path,
              map_path,
              init_music_path=None,
              music_path=None,
              music_loops=-1,
              has_timer=True,
              should_fade_in=True,
              mid=0):
     self.has_timer = has_timer
     self.keyCode = None
     self.definition_path = definition_path
     self.map_path = map_path
     self.tile_engine = TileEngine(join(Level.MAP_BASE, definition_path),
                                   join(Level.MAP_BASE, map_path))
     self.camera = Camera(self.tile_engine,
                          pygame.Rect(0, 0, Globals.WIDTH, Globals.HEIGHT))
     self.tile_rect = self.tile_engine.get_tile_rect()
     self.enemySprites = pygame.sprite.Group()
     self.playerSprites = pygame.sprite.Group()
     self.turrets = list()
     self.lights = list()
     self.init_player()
     self.init_enemies()
     self.timer = None
     if Globals.HEALTH_BAR is None:
         Globals.HEALTH_BAR = HealthBar()
     if Globals.HUD_MANAGER is None:
         Globals.HUD_MANAGER = HUDManager()
     self.black_surf = pygame.Surface(
         (Globals.WIDTH, Globals.HEIGHT)).convert()
     self.black_surf.fill((0, 0, 0))
     self.fade_in = False
     self.fade_out = False
     self.showing_subtitle = False
     self.alpha_factor = 300
     self.should_fade_in = should_fade_in
     self.pausing = False
     self.going_back = False
     self.score_counted = False
     self.respawn_coords = [-1, -1]
     self.timer = None
     self.first_occur = True
     self.find_respawn()
     self.loader = AssetLoader('images', 'sounds')
     self.switch_sound = self.loader.load_sound(Level.SWITCH_SOUND_PATH)
     self.channel = None
     self.music_loops = music_loops
     self.music_handle = None
     if music_path is not None:
         self.background_music_handle = self.loader.load_sound(music_path)
         self.music_handle = self.background_music_handle
     else:
         self.background_music_handle = None
     if init_music_path is not None:
         self.init_music_handle = self.loader.load_sound(init_music_path)
         self.music_handle = self.init_music_handle
     else:
         self.init_music_handle = None
     self.time_init = 0
     self.start_on_stop = True
     self.switched_sound = False
     self.music_end_id = Level.MUSIC_END_ID_BASE + mid
     self.can_open_doors = True
Пример #17
0
class Axeman(Character):
    BASIC_ATK_DMG = 12
    SPECIAL_ATK_DMG = 40
    MAX_HEALTH = 120
    ATK_RANGE = 8
    MOVE_SPEED = 8
    FOV = 60
    
    def __init__(self, *args):
        super(Axeman, self).__init__(*args)
        Character.set_health(self, Axeman.MAX_HEALTH)
        actor = Actor("models/axeman", {"idle": "models/axeman-idle", 
                                        "walk": "models/axeman-walk", 
                                        "run": "models/axeman-run" ,
                                        "hurt": "models/axeman-hurt", 
                                        "die": "models/axeman-die", 
                                        "attack": "models/axeman-swing", 
                                        "special":"models/axeman-special-attack"})
        Character.set_speed(self, Axeman.MOVE_SPEED)

        # loda texture based on team 
        team = Character.get_team(self)
        if team == 0:
            tex = loader.loadTexture("models/textures/axeman_red.png")
            ts = actor.findTextureStage("*")
            actor.setTexture(ts, tex, 1)
        elif team == 1:
            tex = loader.loadTexture("models/textures/axeman_blue.png")
            ts = actor.findTextureStage('*')
            actor.setTexture(ts, tex, 1)

        Character.set_actor(self, actor)

        #attach axe 
        rightHand = self._character.exposeJoint(None, 'modelRoot', 'hand_ctrl_r')
        axe = loader.loadModel("models/axe")
        axe_tex = loader.loadTexture("models/textures/axe.png")
        axe.setTexture(axe_tex, 1)
        axe.setPos(-3.0, 0.6, -0.2)
        axe.setHpr(0, -90, -90)
        axe.setScale(10)
        axe.reparentTo(rightHand)
        axe.show()

        self.hb = HealthBar(1.5, value=Axeman.MAX_HEALTH)
       	self.hb.reparentTo(self._floater)

	self.hb.setValue(self.get_health())
		
        model = loader.loadModel("models/circle")
        model.setTransparency(True)
        model.reparentTo(self._character)
        model.setAlphaScale(0.5)
        model.setScale(2)
        model.setPos(0, 0, -10)
		
        
    def basic_attack(self):
        total_dmg = Axeman.BASIC_ATK_DMG
        swing_sound = loader.loadSfx("sound/Woosh.wav")
        
        if self._atk_buff==1:
            total_dmg *= 1.1
        elif self._atk_buff==2:
            total_dmg *= 1.25
        # play animation
        sound_interval1 = SoundInterval(
                                    swing_sound,
                                    loop = 1 ,
                                    duration = 0,
                                    volume = 0.7,
                                    startTime = 0
                                    )
        seq2 = Sequence(Wait(0.5),sound_interval1, sound_interval1)
        #self._character.play("attack")
        atk_interval = self._character.actorInterval("attack")
        seq = Sequence(atk_interval)
        if self._is_moving:
            seq.append(Func(self.animate, 2))
        seq.start()
        seq2.start()

        return total_dmg

          
    def special_attack(self):
        total_dmg = Axeman.SPECIAL_ATK_DMG
        
        if self._atk_buff==1:
            total_dmg *= 1.1
        elif self._atk_buff==2:
            total_dmg *= 1.25
         
        #self._character.play("special",fromFrame = 10)
        atk_interval = self._character.actorInterval("special", startFrame=10)
        seq = Sequence(atk_interval)
        if self._is_moving:
            seq.append(Func(self.animate, 2))
        seq.start()

        return total_dmg

    def apply_def_buff(self):
        if not self._is_dead:
            health = Character.get_health(self)
            if self._def_buff==1:
                Character.set_health(self, health*1.1)
                Axeman.MAX_HEALTH = Axeman.MAX_HEALTH*1.1
            elif self._def_buff==2:
                Character.set_health(self, health*1.25)
                Axeman.MAX_HEALTH = Axeman.MAX_HEALTH*1.25
        
    def unapply_def_buff(self):
        if not self._is_dead:
            if self._def_buff==0:
                Axeman.MAX_HEALTH = 100
            elif Axeman.MAX_HEALTH==140 and self._def_buff==1:
                Axeman.MAX_HEALTH = 110

            health = Character.get_health(self)
            if health > Axeman.MAX_HEALTH:
                    health = Axeman.MAX_HEALTH
        pass
       
    def take_damage(self, health_change):
        health = Character.get_health(self)
        if health <= health_change and not self._is_dead:
            Character.set_health(self, 0)
            self.hb.setValue(0)
            hurt_interval = self._character.actorInterval("hurt")
            death_interval = self._character.actorInterval("die")
            seq = Sequence(hurt_interval, death_interval)
            seq.append(Wait(2))
            seq.append(Func(self.respawn))
            seq.start()
            self._is_dead = True
        else:
            Character.set_health(self, health-health_change)
            #self.hb.setValue(Character.get_health(self)-health_change)
            self.hb.setValue(Character.get_health(self))
            self._character.play("hurt")

    def animate(self, anim_type):
        if anim_type==0:
            self._character.loop("idle")
        elif anim_type==1:
            self._character.loop("walk")
        elif anim_type==2:
            self._character.loop("run")
        elif anim_type==3:
            self._character.play("attack")
        elif anim_type==4:
            self._character.play("special",fromFrame = 10)
        elif anim_type==5:
            self._character.play("hurt")
        elif anim_type==6:
            self._character.play("die")

    def respawn(self):
        self._is_moving=2
        self._character.loop("idle")
Пример #18
0
class Game(PygameGame):
    def levelUpInit(self):
        self.letterX = 0
        self.lvl = 1
        self.letterLst = ["%s" % self.lvl, ":", "l", "e", "v", "e", "L"]
        self.letterIndex = -1
        self.letters = []
        self.letterCounter = 0
        self.letterNum = 0
        self.lvlUp = True
        self.letterTimer = 0

    GameDrops = pygame.sprite.Group()

    def init(self):
        self.levelUpInit()
        super(Game, self).__init__()
        self.s = StartScreen()
        self.bgColor = (0, 0, 0)
        Enemy.poses()
        self.startWall = Wall(0, 360, 400, 360)
        self.endWall = Wall(1600, 360, 400, 360)
        self.bulletGroup = pygame.sprite.Group()
        self.player = Player(50, 340, "Stand", False)
        self.players = pygame.sprite.GroupSingle(self.player)
        self.enemies = pygame.sprite.Group()
        self.gravity = True
        self.walls = [
            self.startWall,
            Slant(400, 360, 800, 300, 800, 360),
            Wall(800, 300, 400, 360),
            Slant(1200, 300, 1600, 360, 1200, 360), self.endWall
        ]
        self.BackGround = Background("background")
        self.jumpingUp = False
        self.jumpCounter = 0
        self.runCounter = 0
        self.dir = "Right"
        self.jumpingCounter = 0
        self.shooting = False
        self.shootCounter = 0
        self.falling = None
        self.jumpingRight = False
        self.jumpingLeft = False

        self.enemyRunCounter = 0
        self.homingMissles = pygame.sprite.GroupSingle()
        self.rotateCount = 1
        self.aimMode = False
        self.target = Target()
        self.rotatedTarget = self.target.rotate(self.rotateCount)
        self.targetX, self.targetY = 100, 100
        self.healthBar = HealthBar(0, 0, self.width, self.height)
        self.homing = False
        self.isKilled = False
        self.enemyBulletGroup = pygame.sprite.Group()
        self.bloodGroup = pygame.sprite.Group()
        self.scrollX = 0
        self.lockedOn = False
        self.missiles = 0
        self.spawnCounter, self.spawnTrigger = 0, random.randint(5, 25)
        self.health = 160
        self.enemiesSpawned = 0
        self.enemyLimit = 10
        self.enemyNum = 10
        self.myfont = pygame.font.SysFont('Comic Sans MS', (30))
        self.text = self.myfont.render('Enemies:  %s' % self.enemyNum, False,
                                       (0, 0, 0))
        self.textW, self.textH = self.text.get_size()
        self.enemyLevel = 0
        self.gameOver = False
        self.jumping = False
        self.v = 6.5
        self.gameWon = False
        self.Flash = False
        self.gameOverScreen = Background("Gameover")
        self.gameOverText = self.myfont.render('Press X to Restart', False,
                                               (0, 0, 0))
        self.gameWonScreen = Background("Gamewon")
        pygame.mixer.set_num_channels(2)
        pygame.mixer.init()
        pygame.mixer.music.load('images/backMusic.ogg')
        pygame.mixer.music.play()
        self.actived = pygame.mixer.Sound('images/missileActivated.ogg')
        self.endMusic = False
        self.pause = False
        self.pauseImage = pygame.transform.scale(
            pygame.image.load('images/pause.png'), (200, 200))

    def findY(self, x):  #enable running over slopes and hills
        for wall in self.walls:
            if type(wall).__name__ == "Wall":
                if wall.x1 <= x < wall.x1 + wall.x2:
                    slope = 0

                    return wall.y1

            else:
                if wall.x1 <= x < wall.x2:

                    slope = ((500 - wall.y2) -
                             (500 - wall.y1)) / (wall.x2 - wall.x1)

                    y = 500 - ((slope * (x - wall.x1)) + (500 - wall.y1))
                    if slope < 0:
                        y = 500 - ((slope * (x - wall.x1)) + (500 - wall.y1))
                    return y

    def checkBounds(self):
        x = random.randrange(0, self.width)
        if x < self.player.x - 50 or x > self.player.x + 50:
            return x
        else:
            return self.checkBounds()

    def spawn(self):
        self.spawnCounter += 1
        if self.spawnCounter == self.spawnTrigger and self.enemiesSpawned < self.enemyLimit:
            x = self.checkBounds() + self.scrollX
            for wall in self.walls:

                if type(wall).__name__ == "Wall":
                    if wall.x1 < x < wall.x1 + wall.x2:

                        slope = ((500 - wall.y2) - (500 - wall.y1)) / (wall.x2)

                        y = wall.y1
                        if x > self.player.x + self.scrollX:

                            self.enemies.add(Enemy(x, y - 20, False, "Right"))

                        else:
                            self.enemies.add(Enemy(x, y - 20, True, "Left"))

                elif type(wall).__name__ == "Slant":
                    if wall.x1 < x < wall.x2:
                        slope = ((500 - wall.y2) -
                                 (500 - wall.y1)) / ((wall.x2) - (wall.x1))

                        y = 500 - ((slope * (x - wall.x1)) + 140)
                        if slope < 0:
                            y = 500 - ((slope * (x - wall.x1)) + 300)
                        if x > self.player.x + self.scrollX:

                            self.enemies.add(Enemy(x, y - 20, False, "Right"))

                        else:
                            self.enemies.add(Enemy(x, y - 20, True, "Left"))

            self.spawnCounter = 0
            self.spawnTrigger = random.randint(35, 55)
            self.enemiesSpawned += 1

    def keyPressed(self, keyCode, modifier):
        if keyCode == "START":
            self.pause = not self.pause

        if not self.gameOver and not self.pause:
            if keyCode == "Circle":
                self.Flash = True
            if keyCode == pygame.K_3:
                pass

            if keyCode == pygame.K_2 or keyCode == "L1" and self.missiles > 0:
                self.aimMode = not self.aimMode
                if self.aimMode:

                    pygame.mixer.music.pause()
                    self.actived.play()
                else:
                    if not pygame.mixer.get_busy:
                        pygame.mixer.music.unpause()

            if self.aimMode and self.joystickMode:
                for e in self.enemies:
                    if e.rect.collidepoint(self.targetX,
                                           self.targetY) and keyCode == "X":
                        self.ex, self.ey = self.targetX + self.scrollX, self.targetY
                        e.lockedOn = True
                        self.lockedOn = True
                        self.aimMode = False
                        pygame.mixer.music.unpause()

            #lets character move jump with momentum

            else:

                if keyCode == pygame.K_UP or keyCode == "X":

                    self.jumping = True

                elif keyCode == pygame.K_SPACE or keyCode == "R2":
                    self.shooting = True

                    if self.dir == "Right":

                        self.bulletGroup.add(Bullet(self.player.x+ self.player.width//4 ,\
                            self.player.y-self.player.height//6-4, self.dir))

                    else:
                        self.bulletGroup.add(Bullet(self.player.x- self.player.width//2 ,\
                            self.player.y-self.player.height//6-4, self.dir))

                elif keyCode == pygame.K_1 or keyCode == "R1" and self.missiles > 0:
                    #self.coor = self.player.missile()
                    if self.lockedOn:

                        self.homingMissles.add(
                            HomingMissle(self.player.x + self.scrollX,
                                         self.player.y))

                        self.lockedOn = False
                        if self.missiles > 0:
                            self.missiles -= 1
                        print(self.missiles)

                        self.homing = True
        else:
            if keyCode == "X":
                self.gameOver = False
                self.init()

    def isKeyPressed(self, key):
        return self._keys.get(key, False)

    def moveTarget(self, dir):
        if self.aimMode and self.joystickMode:
            if dir == "Left":
                self.targetX -= 5
            elif dir == "Right":
                self.targetX += 5
            elif dir == "Up":
                self.targetY -= 5
            elif dir == "Down":
                self.targetY += 5

    def mouseMotion(self, x, y):
        if self.aimMode and not self.joystickMode:
            self.targetX, self.targetY = x, y

    def mousePressed(self, x, y):
        #spawn enemy at mouse xy

        if not self.gameOver:
            if self.aimMode:
                for e in self.enemies:
                    if e.rect.collidepoint(x, y):
                        e.lockedOn = True
                        self.aimMode = False

    def followPlayer(self):

        for e in self.enemies:
            x = e.x
            if e.x > self.player.x + self.scrollX:
                x = x - 5
            else:
                x = x + 5

    def enemyTimerFired(self):

        for enemy in pygame.sprite.groupcollide(self.enemies, self.bulletGroup,
                                                False, True):

            enemy.health -= 20

            if enemy.health <= 0:
                if enemy.lockedOn:
                    self.homingMissles.empty()

                drop = enemy.drop()
                if drop != None:
                    Game.GameDrops.add(drop)

                else:
                    self.bloodGroup.add(Blood(enemy.x, enemy.y))

                enemy.kill()
                self.enemyNum -= 1

        for enemy in self.enemies:

            if self.player.zoneRect.colliderect(enemy.rect):
                enemy.change(self.scrollX, "attack")

                if enemy.shoot():
                    if enemy.x < self.player.x + self.scrollX:
                        self.enemyBulletGroup.add(
                            Fireball(enemy.x, enemy.y - 12, "Right"))
                    elif enemy.x > self.player.x + self.scrollX:
                        self.enemyBulletGroup.add(
                            Fireball(enemy.x, enemy.y - 12, "Left"))

            else:
                enemy.move(self.scrollX, self.player.x + self.scrollX,
                           self.walls)
                enemy.change(self.scrollX)
                self.followPlayer()
        for bullet in self.enemyBulletGroup:
            bullet.move(self.width, self.scrollX)

    def levelUp(self):
        if self.lvlUp:
            if self.letterNum < 7:

                self.letterCounter += 1
                if self.letterCounter == 5:

                    self.letterIndex += 1
                    self.letterX -= 40

                    self.letters.append(
                        Letter(self.letterX, 100,
                               self.letterLst[self.letterIndex]))
                    self.letterNum += 1

                    self.letterCounter = 0
            else:

                self.letterTimer += 1
                if self.letterTimer == 40:

                    self.lvlUp = False
                    self.letters = []
                    self.letterNum = 0
                    self.letterIndex = -1
                    self.letterTimer = 0
                    self.letterX = 0

            for l in self.letters:
                l.move()

    def timerFired(self, dt):
        if self.health <= 0:
            self.gameOver = True
            pygame.mixer.music.stop()

        if self.lvl == 3:
            self.gameWon = True

        if not self.gameOver and not self.gameWon and not self.pause:

            self.text = self.myfont.render('Enemies:  %s' % self.enemyNum,
                                           False, (0, 0, 0))
            self.BackGround.image = self.BackGround.backs[
                self.BackGround.change()]

            if self.enemyNum == 0:
                self.lvl += 1

                i = random.randint(self.enemyLimit + 1, self.enemyLimit + 10)
                self.enemyNum, self.enemyLimit = i, i
                self.enemiesSpawned = 0
                self.spawnCounter = 0

                self.lvlUp = True

                self.letterLst = [
                    "%s" % self.lvl, ":", "l", "e", "v", "e", "L"
                ]
            self.levelUp()

            for enemy in self.enemies:
                enemy.updateImage(self.scrollX)

            if self.aimMode:

                Target.count += 1
                if Target.count == 4:
                    self.rotateCount += 1
                    Target.count = 0
                    if self.rotateCount == 5:
                        self.rotateCount = 1

                self.rotatedTarget = self.target.rotate(self.rotateCount)

            else:
                self.spawn()

                for bullet in self.enemyBulletGroup:

                    if self.player.hitMarker.colliderect(bullet.rect):
                        self.Flash = True
                        bullet.kill()
                        self.healthBar.hit()
                        self.health -= 10

                for p in self.homingMissles:
                    for e in self.enemies:
                        if e.lockedOn:

                            p.move(e.x - 20, e.y + 10, self.scrollX,
                                   self.walls)

                            if e.missileRect.colliderect(p.missileRect):

                                self.homing = False
                                self.homingMissles.empty()
                                e.kill()
                                self.enemyNum -= 1

                for player in self.players:
                    for drop in Game.GameDrops:
                        if player.dropRect.colliderect(drop.missileRect):
                            if type(drop).__name__ == "HomingMissle":

                                self.missiles += 1
                            else:
                                self.healthBar.regain()
                                self.health += 10
                            drop.kill()

                if not self.jumping:
                    y = self.findY(self.player.x + self.scrollX)

                    if self.player.y != y:
                        self.player.y = y - 15
                else:
                    self.player.y -= (self.v**2)
                    self.v -= 1
                    if self.v <= 0:
                        self.player.y += (self.v**2)
                        self.v -= 1

                    y = self.findY(self.player.x + self.scrollX)
                    if self.player.y >= y:
                        self.player.y = y - 15
                        self.jumping = False
                        self.v = 6.5

                self.enemyTimerFired()

                for bullet in self.bulletGroup:
                    bullet.move(self.width, self.scrollX)

                for bullet in self.enemyBulletGroup:
                    if bullet.y > self.findY(bullet.x):
                        bullet.kill()

                if self.shooting:
                    self.shootCounter += 1
                    if self.dir == "Right":
                        self.player.change("Shoot", self.dir, self.scrollX)
                    else:
                        self.player.change("Shoot", self.dir, self.scrollX)

                    if self.shootCounter == 10:
                        self.shootCounter = 0
                        self.shooting = False

                else:
                    #chnage pose to running rightb
                    if self.isKeyPressed(
                            pygame.K_RIGHT) or self.moveRight("Right"):
                        self.dir = "Right"
                        self.runCounter += 1
                        if (self.endWall.x1 + self.endWall.x2 -
                                self.scrollX) > 800 and self.player.x > 100:
                            self.scrollX += 10
                        if self.runCounter == 0:

                            self.player.change("Stand", self.dir, self.scrollX)

                        else:
                            if self.runCounter > 5:
                                self.runCounter = 1
                            state = "run%s" % self.runCounter
                            self.player.change(state, self.dir, self.scrollX)
                        self.player.move(5, "x", self.scrollX)

                        #change pose to running left
                    elif self.isKeyPressed(pygame.K_LEFT) or self.moveLeft(
                            "Left"):  #method for switching run image state
                        self.dir = "Left"
                        self.runCounter += 1
                        if (self.startWall.x1 -
                                self.scrollX) < 0 and self.player.x < 700:
                            self.scrollX -= 10
                        if self.runCounter == 0:

                            self.player.change("Stand", self.dir, self.scrollX)

                        else:
                            if self.runCounter > 5:
                                self.runCounter = 1
                            state = "run%s" % self.runCounter
                            self.player.change(state, self.dir, self.scrollX)
                        self.player.move(-5, "x", self.scrollX)

                    #change pose to standing left or right
                    elif not self.isKeyPressed(
                            pygame.K_LEFT) and self.dir == "Left":
                        self.player.change("Stand", self.dir, self.scrollX)
                    elif not self.isKeyPressed(
                            pygame.K_RIGHT) and self.dir == "Right":
                        self.player.change("Stand", self.dir, self.scrollX)

        elif self.gameOver:
            self.gameOverScreen.image = self.gameOverScreen.backs[
                self.gameOverScreen.change()]

        elif self.gameWon:
            self.gameWonScreen.image = self.gameWonScreen.backs[
                self.gameWonScreen.change(1)]

            #   self.player = Player(self.player.x,self.player.y,"fall", False)

    def redrawAll(self, screen):

        if not self.gameOver and not self.gameWon:
            #draw all walls,players, enemies, and bullets
            screen.blit(self.BackGround.image, (0 - self.scrollX, 0))
            screen.blit(self.BackGround.image, (800 - self.scrollX, 0))
            screen.blit(self.BackGround.image, (1600 - self.scrollX, 0))
            for wall in self.walls:
                wall.draw(screen, self.scrollX)

            for drop in Game.GameDrops:
                screen.blit(drop.image, (drop.x - self.scrollX, drop.y))

            self.player.draw(screen, self.scrollX)

            for bullet in self.bulletGroup:
                bullet.draw(screen, self.scrollX)
            for b in self.enemyBulletGroup:
                b.draw(screen, self.scrollX)

            for enemy in self.enemies:
                screen.blit(enemy.image,
                            (enemy.x - self.scrollX - enemy.w // 2,
                             enemy.y - enemy.h // 2))

            for blood in self.bloodGroup:
                screen.blit(
                    blood.image,
                    (blood.x - self.scrollX - blood.w // 2, blood.y + 5))
            #self.enemies.draw(screen)

            if self.homing:
                #print("HOMINGGGGGG")
                for h in self.homingMissles:
                    h.draw(screen, self.scrollX)

            self.healthBar.draw(screen, self.missiles)
            if self.aimMode:
                screen.blit(self.rotatedTarget,
                            (self.targetX - self.target.width // 2,
                             self.targetY - self.target.height // 2))

            screen.blit(self.text,
                        (400 - self.textW // 2, 470 - self.textH // 2))

            if self.lvlUp:
                for l in self.letters:
                    l.draw(screen)
            if self.Flash:
                screen.fill((255, 0, 0))
                self.Flash = False
            if self.pause:
                screen.blit(self.pauseImage, (300, 150))
        elif self.gameOver:
            screen.fill((0, 0, 0))
            screen.blit(self.gameOverScreen.image, (0, 0))
            screen.blit(self.gameOverText, (300, 400))
        elif self.gameWon:
            screen.fill((
                0,
                0,
                0,
            ))
            screen.blit(self.gameWonScreen.image, (0, 0))
            text = Letter(100, 100, "You Are A God!!!!", False,
                          'Comic Sans MS')
            text.draw(screen)
            if not self.endMusic:
                pygame.mixer.music.load('images/kanye.ogg')
                pygame.mixer.music.play(-1)
                self.endMusic = True

    @staticmethod
    def runGame():

        t, s, c = StartScreen(800, 500).run()

        Game(800, 500).run(t, c, s)
Пример #19
0
class TileTest(GameState):
    MAX_OFFSET_X = 150
    MAX_OFFSET_Y = 75
    FACTOR = 10
    INDEX_DOWN = 0
    INDEX_UP = 1
    INDEX_LEFT = 2
    INDEX_RIGHT = 3

    NUM_ENEMY = 13
    WALL_WIDTH = 50

    def __init__(self):
        Globals.PLAYER_HEALTH = 100
        Globals.PLAYER_SCORE = 0
        Globals.REMAINING_TIME = 30000
        self.tileEngine = TileEngine("test_def.txt", "test_map.txt", 1, 3)
        self.camera = Camera(self.tileEngine, pygame.Rect(
            0, 0, Globals.WIDTH, Globals.HEIGHT))
        self.keyCode = None
        self.testPoint = []
        self.object_radius = \
            self.camera.tileEngine.get_tile_rect().height * 1.5
        self.direction = -1
        self.has_collided = False
        self.enemySprites = pygame.sprite.Group()
        self.playerSprites = pygame.sprite.Group()
        self.health = HealthBar()
        self.score_timer = ScoreTimer()
        for x in range(TileTest.NUM_ENEMY):
            # fix the positions they are added in and everything else
            # should work
            self.enemySprites.add(Enemy(Globals.WIDTH, Globals.HEIGHT,
                                        self.camera))
        player_x = Globals.WIDTH / 2
        player_y = int(Globals.HEIGHT -
                       self.camera.tileEngine.get_tile_rect().height * 3.5)
        self.player = Player(
            Globals.WIDTH,
            Globals.HEIGHT,
            player_x,
            player_y,
            self.score_timer
        )
        self.playerSprites.add(self.player)

    def render(self):
        self.camera.render(Globals.SCREEN)
        self.enemySprites.draw(Globals.SCREEN)
        self.playerSprites.draw(Globals.SCREEN)
        self.health.render(Globals)
        self.score_timer.render(Globals)

    def update(self, time):
        self.player.update(time, self.camera, self.enemySprites)
        self.enemySprites.update(time, self.camera)
        self.checkCameraPosition()
        if pygame.sprite.spritecollideany(self.player, self.enemySprites):
            Globals.PLAYER_HEALTH -= .5

    def checkCameraPosition(self):
        dist_x = self.camera.container.centerx - self.player.rect.centerx
        dist_y = self.camera.container.centery - self.player.rect.centery
        if abs(dist_x) > TileTest.MAX_OFFSET_X:
            diff = abs(dist_x) - TileTest.MAX_OFFSET_X
            # player is to the right of center
            if dist_x < 0:
                pass
            # player is to the left of center
            else:
                diff *= -1
            self.camera.move(diff, 0)
            self.player.rect.centerx -= diff
            for enemy in self.enemySprites:
                enemy.rect.centerx -= diff
        if abs(dist_y) > TileTest.MAX_OFFSET_Y:
            diff = abs(dist_y) - TileTest.MAX_OFFSET_Y
            # player is below center
            if dist_y < 0:
                pass
            # player is above center
            else:
                diff *= -1
            self.camera.move(0, diff)
            self.player.rect.centery -= diff
            for enemy in self.enemySprites:
                enemy.rect.centery -= diff

    def event(self, event):
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                Globals.STATE = Menu.Menu()
            elif event.key == pygame.K_r or event.key == pygame.K_F5:
                self.reloadCamera()
            else:
                self.keyCode = event.key
        elif event.type == pygame.KEYUP and event.key == self.keyCode:
            self.keyCode = None

        if event.type == pygame.KEYDOWN:
            for p in self.playerSprites:
                p.keyPressed(event.key)
        if event.type == pygame.KEYUP:
            for p in self.playerSprites:
                p.keyReleased(event.key)

    def reloadCamera(self):
        try:
            self.tileEngine = TileEngine("test_def.txt", "test_map.txt", 1, 3)
            self.camera.tileEngine = self.tileEngine
            print "Reloaded Tile Engine"
        except Exception as e:
            print "Reload failed: ", e
Пример #20
0
class GamePlayMain:
    def __init__(self, screen, level, number_level, save):
        self.save = save
        saved_time = self.save[str(number_level)]['last_time_start']
        self.game_start_time = time.time(
        ) if saved_time is None else saved_time
        self.number_level = number_level
        self.screen = screen
        self.level_pre = level
        self.hb_gr = pygame.sprite.Group()
        self.hb = HealthBar(self.hb_gr, (20, 20), 4)
        self.clock_t = pygame.time.Clock()
        self.clock = [0]
        self.all_tiles = pygame.sprite.Group()
        self.background_group = pygame.sprite.Group()
        self.player, x_max, y_max = generate_level(
            level,
            self.all_tiles,
            self.clock,
            self.background_group,
            pos_pl=self.save[str(number_level)]['last_pos'])
        self.spites_start()
        self.background = ForrestBackgroundMain(self.screen,
                                                self.background_group,
                                                self.clock, x_max)
        self.background_front = ForrestBackgroundFront(self.screen,
                                                       self.background_group,
                                                       self.clock, x_max)
        self.ifpause = False

    def spites_start(self):
        for t in self.all_tiles:
            try:
                t.drop_down()
            except Exception as e:
                continue

    def terminate(self):
        self.save_data()
        sys.exit()
        pygame.quit()

    def save_data(self):
        t, pos_pl = self.game_start_time, (self.player.pos_rel_x,
                                           self.player.pos_rel_y)
        self.save[str(self.number_level)]['last_pos'] = pos_pl
        self.save[str(self.number_level)]['last_time_start'] = t
        with open(SAVE_PATH, 'w') as f:
            json.dump(self.save, f)

    def pygame_events(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                self.terminate()
            if event.type == pygame.KEYDOWN:
                key = event.key
                if key == pygame.K_ESCAPE:
                    pass

    def keyboard_events(self):
        key = pygame.key.get_pressed()
        for i in slugs:
            i.stay()
        for j in bees:
            j.stay()
        for z in piranhas:
            z.stay()
        for u in stars:
            u.stay()
        if key[pygame.K_ESCAPE]:
            print(
                pygame.sprite.spritecollide(self.player, self.all_tiles,
                                            False))
        if key[pygame.K_LEFT]:
            self.player.event_handler(MOVE_LEFT)
        elif key[pygame.K_RIGHT]:
            self.player.event_handler(MOVE_RIGHT)
        elif key[pygame.K_UP]:
            jump_music()
            self.player.event_handler(MOVE_UP)
            self.clock_t.tick(40)
            background_music()
        elif key[pygame.K_f]:
            hurt_music()
            self.player.event_handler(ATTACK)
            self.clock_t.tick(40)
            background_music()
        else:
            self.player.event_handler(None)

    def event_handler(self):
        self.pygame_events()
        self.keyboard_events()
        self.player.render()
        [
            t.damage_check(self.player) for t in self.all_tiles
            if isinstance(t, Enemy)
        ]
        self.hb.red_inner(self.player.hp)
        if self.player.hp == 0:
            self.running = False
        self.camera_events()

    def camera_events(self):
        self.camera.update(self.player)
        for el in self.all_tiles:
            self.camera.apply(el)

    def drawing(self):
        self.screen.fill((255, 255, 255))
        self.background_group.draw(self.screen)
        self.all_tiles.draw(self.screen)
        self.hb_gr.draw(self.screen)
        pygame.display.flip()

    def rendering(self):
        self.running = True
        self.passed_level = False
        self.camera = Camera(self.background_front)
        while self.running:
            self.clock[0] = self.clock_t.tick()
            self.event_handler()
            if any(
                    isinstance(t, Tiles.House)
                    for t in pygame.sprite.spritecollide(
                        self.player, self.all_tiles, False)):
                self.running = False
                self.passed_level = True

                self.save[str(self.number_level)]['last_pos'] = None
                self.save[str(self.number_level)]['last_time_start'] = None
                with open(SAVE_PATH, 'w') as f:
                    json.dump(self.save, f)

                break
            if self.player.game_over:
                self.running = False
                break
            self.drawing()
        if self.passed_level:
            return True, time.time() - self.game_start_time
        else:
            game_over = GameOver(self.screen)
            result = game_over.rendering()
            if result is False:
                return False, None
            else:
                again = GamePlayMain(self.screen, self.level_pre)
                return again.rendering()

    def pause(self):
        Pause(self.screen)
Пример #21
0
class Swordsman(Character):
    ATK_RANGE = 8
    BASIC_ATK_DMG = 15
    SPECIAL_ATK_DMG = 30
    MOVE_SPEED = 10
    CHARGE_SPEED = 15
    MAX_HEALTH = 100
    FOV = 60

    def __init__(self, *args):
        super(Swordsman, self).__init__(*args)
        Character.set_health(self, Swordsman.MAX_HEALTH)
        Character.set_speed(self, Swordsman.MOVE_SPEED)
        actor = Actor(
            "models/swordsman", {
                "idle": "models/swordsman-idle",
                "walk": "models/swordsman-walk",
                "run": "models/swordsman-run",
                "hurt": "models/swordsman-hurt",
                "die": "models/swordsman-die",
                "attack": "models/swordsman-attack"
            })

        team = Character.get_team(self)
        if team == 0:
            """
			actor = Actor("models/swordsman_red", 
						{"idle": "models/swordsman-idle", 
						 "walk": "models/swordsman-walk", 
						 "run": "models/swordsman-run", 
						 "hurt": "models/swordsman-hurt", 
						 "die": "models/swordsman-die", 
						 "attack": "models/swordsman-attack"})
			"""
            tex = loader.loadTexture("models/textures/swordsman_red.png")
            ts = actor.findTextureStage('*')
            actor.setTexture(ts, tex, 1)
            #ts = actor.findTextureStage('ts')
            #actor.setTexture(ts, tex)
        elif team == 1:
            """
			actor = Actor("models/swordsman_blue", 
						{"idle": "models/swordsman-idle", 
						 "walk": "models/swordsman-walk", 
						 "run": "models/swordsman-run", 
						 "hurt": "models/swordsman-hurt", 
						 "die": "models/swordsman-die", 
						 "attack": "models/swordsman-attack"})
			"""
            tex = loader.loadTexture("models/textures/swordsman_blue.png")
            ts = actor.findTextureStage('*')
            actor.setTexture(ts, tex, 1)
            #ts = actor.findTextureStage('ts')
            #actor.setTexture(ts, tex)

        Character.set_actor(self, actor)
        self.hb = HealthBar(1.5, value=Swordsman.MAX_HEALTH)
        self.hb.reparentTo(self._floater)
        self.hb.setValue(self.get_health())

        self.model = loader.loadModel("models/circle")
        self.model.setTransparency(True)
        self.model.reparentTo(self._character)
        self.model.setAlphaScale(0.5)
        self.model.setScale(2)
        self.model.setPos(0, 0, -10)

    def basic_attack(self):
        total_dmg = Swordsman.BASIC_ATK_DMG
        swing_sound = loader.loadSfx("sound/Swoosh.mp3")

        if self._atk_buff == 1:
            total_dmg *= 1.1
        elif self._atk_buff == 2:
            total_dmg *= 1.25

        sound_interval = SoundInterval(swing_sound,
                                       loop=2,
                                       duration=0.6,
                                       volume=0.7,
                                       startTime=0)
        atk_interval1 = self._character.actorInterval("attack",
                                                      startFrame=1,
                                                      endFrame=26)
        atk_interval2 = self._character.actorInterval("attack",
                                                      startFrame=56,
                                                      endFrame=80)
        seq = Sequence(atk_interval1, atk_interval2)
        if self._is_moving:
            seq.append(Func(self.animate, 2))
        seq2 = Sequence(Wait(0.5), sound_interval, sound_interval)
        seq.start()
        seq2.start()

        return total_dmg

    def special_attack(self):
        total_dmg = Swordsman.SPECIAL_ATK_DMG
        swing_sound = loader.loadSfx("sound/Swoosh.mp3")

        if self._atk_buff == 1:
            total_dmg *= 1.1
        elif self._atk_buff == 2:
            total_dmg *= 1.25

        sound_interval = SoundInterval(swing_sound,
                                       loop=2,
                                       duration=0.8,
                                       volume=0.7,
                                       startTime=0)
        atk_interval1 = self._character.actorInterval("attack",
                                                      startFrame=1,
                                                      endFrame=13)
        atk_interval2 = self._character.actorInterval("attack",
                                                      startFrame=38,
                                                      endFrame=80)
        seq = Sequence(atk_interval1, atk_interval2)
        if self._is_moving:
            seq.append(Func(self.animate, 2))
        seq2 = Sequence(Wait(0.5), sound_interval, sound_interval)
        seq.start()
        seq2.start()

        return total_dmg

    def take_damage(self, health_change):
        health = Character.get_health(self)
        if health < health_change and not self._is_dead:
            Character.set_health(self, 0)
            self.hb.setValue(0)
            hurt_interval = self._character.actorInterval("hurt")
            death_interval = self._character.actorInterval("die")
            seq = Sequence(hurt_interval, death_interval)
            seq.append(Wait(2))
            # add Func interval to place the character at a new location
            seq.append(Func(self.respawn))
            seq.start()
            self._is_dead = True
            #self._is_moving=2
        else:
            Character.set_health(self, health - health_change)
            #self.hb.setValue(Character.get_health(self)-health_change)
            self.hb.setValue(Character.get_health(self))
            self._character.play("hurt")

    def apply_def_buff(self):
        if not self._is_dead:
            health = Character.get_health(self)
            if self._def_buff == 1:
                Character.set_health(self, health * 1.1)
                Swordsman.MAX_HEALTH = Swordsman.MAX_HEALTH * 1.1
            elif self._def_buff == 2:
                Character.set_health(self, health * 1.25)
                Swordsman.MAX_HEALTH = Swordsman.MAX_HEALTH * 1.25

    def unapply_def_buff(self):
        if not self._is_dead:
            if self._def_buff == 0:
                Swordsman.MAX_HEALTH = 100
            elif Swordsman.MAX_HEALTH == 125 and self._def_buff == 1:
                Swordsman.MAX_HEALTH = 110

            health = Character.get_health(self)
            if health > Swordsman.MAX_HEALTH:
                health = Swordsman.MAX_HEALTH

    def animate(self, anim_type):
        if anim_type == 0:
            self._character.loop("idle")
        elif anim_type == 1:
            self._character.loop("walk")
        elif anim_type == 2:
            self._character.loop("run")
        elif anim_type == 3:
            atk_interval1 = self._character.actorInterval("attack",
                                                          startFrame=1,
                                                          endFrame=26)
            atk_interval2 = self._character.actorInterval("attack",
                                                          startFrame=56,
                                                          endFrame=80)
            seq = Sequence(atk_interval1, atk_interval2)
            seq.start()
        elif anim_type == 4:
            atk_interval1 = self._character.actorInterval("attack",
                                                          startFrame=1,
                                                          endFrame=13)
            atk_interval2 = self._character.actorInterval("attack",
                                                          startFrame=38,
                                                          endFrame=80)
            seq = Sequence(atk_interval1, atk_interval2)
            seq.start()
        elif anim_type == 5:
            self._character.play("hurt")
        elif anim_type == 6:
            self._character.play("die")

    def respawn(self):
        self._is_moving = 2
        self._character.loop("idle")
Пример #22
0
    def init(self):
        self.levelUpInit()
        super(Game, self).__init__()
        self.s = StartScreen()
        self.bgColor = (0, 0, 0)
        Enemy.poses()
        self.startWall = Wall(0, 360, 400, 360)
        self.endWall = Wall(1600, 360, 400, 360)
        self.bulletGroup = pygame.sprite.Group()
        self.player = Player(50, 340, "Stand", False)
        self.players = pygame.sprite.GroupSingle(self.player)
        self.enemies = pygame.sprite.Group()
        self.gravity = True
        self.walls = [
            self.startWall,
            Slant(400, 360, 800, 300, 800, 360),
            Wall(800, 300, 400, 360),
            Slant(1200, 300, 1600, 360, 1200, 360), self.endWall
        ]
        self.BackGround = Background("background")
        self.jumpingUp = False
        self.jumpCounter = 0
        self.runCounter = 0
        self.dir = "Right"
        self.jumpingCounter = 0
        self.shooting = False
        self.shootCounter = 0
        self.falling = None
        self.jumpingRight = False
        self.jumpingLeft = False

        self.enemyRunCounter = 0
        self.homingMissles = pygame.sprite.GroupSingle()
        self.rotateCount = 1
        self.aimMode = False
        self.target = Target()
        self.rotatedTarget = self.target.rotate(self.rotateCount)
        self.targetX, self.targetY = 100, 100
        self.healthBar = HealthBar(0, 0, self.width, self.height)
        self.homing = False
        self.isKilled = False
        self.enemyBulletGroup = pygame.sprite.Group()
        self.bloodGroup = pygame.sprite.Group()
        self.scrollX = 0
        self.lockedOn = False
        self.missiles = 0
        self.spawnCounter, self.spawnTrigger = 0, random.randint(5, 25)
        self.health = 160
        self.enemiesSpawned = 0
        self.enemyLimit = 10
        self.enemyNum = 10
        self.myfont = pygame.font.SysFont('Comic Sans MS', (30))
        self.text = self.myfont.render('Enemies:  %s' % self.enemyNum, False,
                                       (0, 0, 0))
        self.textW, self.textH = self.text.get_size()
        self.enemyLevel = 0
        self.gameOver = False
        self.jumping = False
        self.v = 6.5
        self.gameWon = False
        self.Flash = False
        self.gameOverScreen = Background("Gameover")
        self.gameOverText = self.myfont.render('Press X to Restart', False,
                                               (0, 0, 0))
        self.gameWonScreen = Background("Gamewon")
        pygame.mixer.set_num_channels(2)
        pygame.mixer.init()
        pygame.mixer.music.load('images/backMusic.ogg')
        pygame.mixer.music.play()
        self.actived = pygame.mixer.Sound('images/missileActivated.ogg')
        self.endMusic = False
        self.pause = False
        self.pauseImage = pygame.transform.scale(
            pygame.image.load('images/pause.png'), (200, 200))
Пример #23
0
class Npc():
    def __init__(self, controlPointId, id, anchorx, anchory, anchorz, render,
                 team):
        self.id = id
        self.anchorx = anchorx
        self.anchory = anchory
        self.anchorz = anchorz
        self.controlPointId = controlPointId
        self.target = None
        self.isMoving = False
        self.health = 200
        self.isCurrentUser = False
        self.damage = 8
        self.attackTimer = 0
        self._is_dead = False
        self._team = team

        self.render = render
        '''Initializing NPC actors'''
        self.npc = Actor(
            "models/priest", {
                "walk": "models/priest-walk",
                "attack": "models/priest-attack",
                "hurt": "models/priest-hit",
                "die": "models/priest-die"
            })
        if self._team == 0:
            self.npcTex = loader.loadTexture("models/tex/guard_red.png")
        else:
            self.npcTex = loader.loadTexture("models/tex/guard_blue.png")
        self.npc.setTexture(self.npcTex)
        self.npc.setScale(0.5, 0.5, 0.5)
        self.npc.clearColor()
        self.npc.clearColorScale()
        self.npc.setColor(255, 0, 0, 0)
        self.npc.setColorScale(255, 0, 0, 0)
        self.npc.reparentTo(self.render)
        self.npc.setPos(anchorx, anchory, anchorz)

        self.AIchar = AICharacter("npc" + str(self.id), self.npc, 100, 0.05, 5)
        self.AIbehaviors = self.AIchar.getAiBehaviors()

        self.hb = HealthBar(1.5, value=self.health)
        #self._floater = NodePath(PandaNode("char_info"))
        #self._floater.reparentTo(self.npc)
        self.hb.setPos(0, 0, 11.9)
        self.hb.reparentTo(self.npc)
        #self.hb.reparentTo(self.npc)

    def renderBlue(self, AIworld):
        if not self._is_dead:
            self.AIbehaviors.removeAi("pursue")
            self.npc.detachNode()

        print "Started delete procedure for npc ",
        print self.id
        self.npc.delete()
        self.npc = Actor(
            "models/priest", {
                "walk": "models/priest-walk",
                "attack": "models/priest-attack",
                "hurt": "models/priest-hit",
                "die": "models/priest-die"
            })
        self.npcTex = loader.loadTexture("models/tex/guard_blue.png")
        self.npc.setTexture(self.npcTex)
        self.npc.setScale(0.5, 0.5, 0.5)
        self.npc.clearColor()
        self.npc.clearColorScale()
        self.npc.setColor(255, 0, 0, 0)
        self.npc.setColorScale(255, 0, 0, 0)
        self.npc.reparentTo(self.render)
        self.npc.setPos(self.anchorx, self.anchory, self.anchorz)

        AIworld.removeAiChar("npc" + str(self.id))
        self.AIchar = AICharacter("npc" + str(self.id), self.npc, 100, 0.05, 5)
        self.AIbehaviors = self.AIchar.getAiBehaviors()
        AIworld.addAiChar(self.AIchar)

        self.hb = HealthBar(1.5, value=self.health)
        self.hb.setPos(0, 0, 18.1)
        self.hb.reparentTo(self.npc)
        #self.hb.reparentTo(self.npc)

    def renderRed(self, AIworld):
        if not self._is_dead:
            self.AIbehaviors.removeAi("pursue")
            self.npc.detachNode()

        self.npc.delete()
        self.npc = Actor(
            "models/priest", {
                "walk": "models/priest-walk",
                "attack": "models/priest-attack",
                "hurt": "models/priest-hit",
                "die": "models/priest-die"
            })
        self.npcTex = loader.loadTexture("models/tex/guard_red.png")
        self.npc.setTexture(self.npcTex)
        self.npc.setScale(0.5, 0.5, 0.5)
        self.npc.clearColor()
        self.npc.clearColorScale()
        self.npc.setColor(255, 0, 0, 0)
        self.npc.setColorScale(255, 0, 0, 0)
        self.npc.reparentTo(self.render)
        self.npc.setPos(self.anchorx, self.anchory, self.anchorz)

        AIworld.removeAiChar("npc" + str(self.id))
        self.AIchar = AICharacter("npc" + str(self.id), self.npc, 100, 0.05, 5)
        self.AIbehaviors = self.AIchar.getAiBehaviors()
        AIworld.addAiChar(self.AIchar)
        AIworld.update()

        self.hb = HealthBar(1.5, value=self.health)
        self.hb.setPos(0, 0, 8.1)
        self.hb.reparentTo(self.npc)

    def switchTeam(self, AIworld):
        print self.id,
        print " from team ",
        print self._team,
        print " getting deleted."
        if self._team == 0:
            self._team = 1
            self.renderBlue(AIworld)
        else:
            self._team = 0
            self.renderRed(AIworld)

        if self.isCurrentUser:
            main.freeDeadNpc(self.id)

        self.target = None
        self.isMoving = False
        self.health = 200
        self.isCurrentUser = False
        self.damage = 8
        self.attackTimer = 0
        self._is_dead = False

    def set_health(self, health):
        self.health = health

    def take_damage(self, health_change):
        health = self.health
        if health <= health_change and not self._is_dead:
            self.killNpc()
        else:
            health = health - health_change
            self.set_health(health)
            self.hb.setValue(self.health)
            self.npc.play("hurt")

    def killNpc(self):
        self.set_health(0)
        self.hb.setValue(0)
        self.AIbehaviors.removeAi("pursue")
        hurt_interval = self.npc.actorInterval("hurt")
        death_interval = self.npc.actorInterval("die")
        seq = Sequence(hurt_interval, death_interval)
        seq.start()
        self.npc.pose("die", 45)
        self._is_dead = True
        self.npc.detachNode()
        if self.isCurrentUser:
            main.freeDeadNpc(self.id)
            #main.cManager.sendRequest(Constants.CMSG_NPCDEATH, [self.id])
            print Constants.CMSG_NPCDEATH,
            print " + ",
            print self.id

    def chaseTarget(self, target, status=False):
        if (not self.isMoving):
            self.target = target
            self.AIbehaviors.pursue(self.target)
            self.npc.loop("walk")
            self.isMoving = True
            self.isCurrentUser = status

    def stopChase(self):

        #self.AIbehaviors.pauseAi("pursue")
        if not self._is_dead:
            self.AIbehaviors.removeAi("pursue")
            p1 = LerpHprInterval(self.npc, 4, Point3(180, 0, 0))
            p2 = LerpPosInterval(
                self.npc, 4, Point3(self.anchorx, self.anchory, self.anchorz))
            animInterval = self.npc.actorInterval("walk", loop=1, duration=4)
            p2.start()
            p1.start()
            animInterval.start()
            self.isMoving = False
            self.target = None
            self.isCurrentUser = False

    def givNPCDistance(self, charachter):
        x = self.npc.getX()
        y = self.npc.getY()
        z = self.npc.getZ()
        minDist = math.sqrt((charachter.getX() - x) * (charachter.getX() - x) +
                            (charachter.getY() - y) * (charachter.getY() - y) +
                            (charachter.getZ() - z) * (charachter.getZ() - z))
        return minDist

    def checkNpcIsAlive(self):
        if (self.health > 0):
            return True
        else:
            return False

    def shouldAttack(self, currentTime, cManager):
        if not self._is_dead:
            if self.isMoving:
                if self.attackTimer > 0:
                    self.attackTimer = self.attackTimer - currentTime
                    #print self.attackTimer
                if self.AIbehaviors.behaviorStatus("pursue") == "done":
                    #self.npc.stop("walk")
                    #print self.npc.getAnimControl("walk")
                    if self.attackTimer <= 0:
                        if self.npc.getAnimControl("walk").isPlaying():
                            self.npc.stop("walk")
                        if not self.npc.getAnimControl("attack").isPlaying():
                            #self.npc.loop("attack")
                            self.npc.play("attack")
                            self.attackTimer = 2
                            #myInterval = self.npc.actorInterval("attack")
                            #seq = Sequence(myInterval)
                            #seq.append(Wait(3))
                            #seq.start()
                        if self.isCurrentUser:
                            cManager.sendRequest(Constants.CMSG_NPCATTACK,
                                                 [self.id, self.damage])

                if self.AIbehaviors.behaviorStatus("pursue") == "active":
                    if self.npc.getAnimControl("attack").isPlaying():
                        self.npc.stop("attack")
                    if not self.npc.getAnimControl("walk").isPlaying():
                        self.npc.loop("walk")
Пример #24
0
class Axeman(Character):
    BASIC_ATK_DMG = 12
    SPECIAL_ATK_DMG = 40
    MAX_HEALTH = 120
    ATK_RANGE = 3
    MOVE_SPEED = 8
    FOV = 45
    
    def __init__(self, *args):
        super(Axeman, self).__init__(*args)
        Character.set_health(self, Axeman.MAX_HEALTH)
        actor = Actor("models/axeman", {"idle": "models/axeman-idle", 
                                        "walk": "models/axeman-walk", 
                                        "run": "models/axeman-run" ,
                                        "hurt": "models/axeman-hurt", 
                                        "die": "models/axeman-die", 
                                        "attack": "models/axeman-swing", 
                                        "special":"models/axeman-special-attack"})
        Character.set_speed(self, Axeman.MOVE_SPEED)

        # loda texture based on team 
        team = Character.get_team(self)
        if team == 0:
            tex = loader.loadTexture("models/textures/axeman_red.png")
            ts = actor.findTextureStage("*")
            actor.setTexture(ts, tex, 1)
        elif team == 1:
            tex = loader.loadTexture("models/textures/axeman_blue.png")
            ts = actor.findTextureStage('*')
            actor.setTexture(ts, tex, 1)

        Character.set_actor(self, actor)

        #attach axe 
        rightHand = self._character.exposeJoint(None, 'modelRoot', 'hand_ctrl_r')
        axe = loader.loadModel("models/axe")
        axe_tex = loader.loadTexture("models/textures/axe.png")
        axe.setTexture(axe_tex, 1)
        axe.setPos(-3.0, 0.6, -0.2)
        axe.setHpr(0, -90, -90)
        axe.setScale(10)
        axe.reparentTo(rightHand)
        axe.show()

        self.hb = HealthBar(1.5, value=Axeman.MAX_HEALTH)
        self.hb.reparentTo(self._character)
		
        model = loader.loadModel("models/circle")
        model.setTransparency(True)
        model.reparentTo(self._character)
        model.setAlphaScale(0.5)
        model.setScale(2)
        model.setPos(0, 0, -10)
		
        
    def basic_attack(self):
        total_dmg = Axeman.BASIC_ATK_DMG
        swing_sound = loader.loadSfx("sound/Woosh.wav")
        
        if self._atk_buff==1:
            total_dmg *= 1.1
        elif self._atk_buff==2:
            total_dmg *= 1.25
        # play animation
        sound_interval1 = SoundInterval(
                                    swing_sound,
                                    loop = 1 ,
                                    duration = 0,
                                    volume = 0.7,
                                    startTime = 0
                                    )
        seq2 = Sequence(Wait(0.5),sound_interval1, sound_interval1)
        #self._character.play("attack")
        atk_interval = self._character.actorInterval("attack")
        seq = Sequence(atk_interval)
        if self._is_moving:
            seq.append(Func(self.loop_run))
        seq.start()
        seq2.start()

        return total_dmg

          
    def special_attack(self):
        total_dmg = Axeman.SPECIAL_ATK_DMG
        
        if self._atk_buff==1:
            total_dmg *= 1.1
        elif self._atk_buff==2:
            total_dmg *= 1.25
         
        #self._character.play("special",fromFrame = 10)
        atk_interval = self._character.actorInterval("special", startFrame=10)
        seq = Sequence(atk_interval)
        if self._is_moving:
            seq.append(Func(self.loop_run))
        seq.start()

        return total_dmg
             
    def loop_run(self):
        self._character.loop("run")

    def apply_def_buff(self):
        if not self._is_dead:
            health = Character.get_health(self)
            if self._def_buff==1:
                Character.set_health(self, health*1.1)
                Axeman.MAX_HEALTH = Axeman.MAX_HEALTH*1.1
            elif self._def_buff==2:
                Character.set_health(self, health*1.25)
                Axeman.MAX_HEALTH = Axeman.MAX_HEALTH*1.25
        
    def unapply_def_buff(self):
        if not self._is_dead:
            if self._def_buff==0:
                Axeman.MAX_HEALTH = 100
            elif Axeman.MAX_HEALTH==140 and self._def_buff==1:
                Axeman.MAX_HEALTH = 110

            health = Character.get_health(self)
            if health > Axeman.MAX_HEALTH:
                    health = Axeman.MAX_HEALTH
        pass
       
    def take_damage(self, health_change):
        health = Character.get_health(self)
        if health <= health_change and not self._is_dead:
            Character.set_health(self, 0)
            self.hb.setValue(0)
            hurt_interval = self._character.actorInterval("hurt")
            death_interval = self._character.actorInterval("die")
            seq = Sequence(hurt_interval, death_interval)
            seq.start()
            self._is_dead = True
        else:
            Character.set_health(self, health-health_change)
            self.hb.setValue(Character.get_health(self)-health_change)
            self._character.play("hurt")

    def animate(self, anim_type):
        if anim_type==0:
            self._character.loop("idle")
        elif anim_type==1:
            self._character.loop("walk")
        elif anim_type==2:
            self._character.loop("run")
        elif anim_type==3:
            self._character.play("attack")
        elif anim_type==4:
            self._character.play("special",fromFrame = 10)
        elif anim_type==5:
            self._character.play("hurt")
        elif anim_type==6:
            self._character.play("die")
Пример #25
0
 def __init__(self, map_path):
     super(CustomLevel, self).__init__(CustomLevel.DEF_NAME,
                                       map_path,
                                       music_path=CustomLevel.MUSIC_PATH)
     Globals.Globals.HEALTH_BAR = HealthBar()