Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 Pygame 2,7碰撞到3,3_Python 2.7_Python 3.x_Pygame - Fatal编程技术网

Python 2.7 Pygame 2,7碰撞到3,3

Python 2.7 Pygame 2,7碰撞到3,3,python-2.7,python-3.x,pygame,Python 2.7,Python 3.x,Pygame,我最近用pygame在Python2.7.6中制作了一个游戏,现在我正在将所有语法和代码转换为Python3.3.3。但是我有一个关于碰撞的问题。在我转换之前,碰撞工作完美无瑕,但在3.3.3中,所有的碰撞都彻底搞砸了。以下是我当前针对玩家、僵尸和boss冲突的代码: def player_move(self): # Line start self.point = self.player.rect.x + 30, self.player.rect.y + 30 # add

我最近用pygame在Python2.7.6中制作了一个游戏,现在我正在将所有语法和代码转换为Python3.3.3。但是我有一个关于碰撞的问题。在我转换之前,碰撞工作完美无瑕,但在3.3.3中,所有的碰撞都彻底搞砸了。以下是我当前针对玩家、僵尸和boss冲突的代码:

def player_move(self):
    # Line start
    self.point = self.player.rect.x + 30, self.player.rect.y + 30
    # add gravity
    self.player.do_jump()

    # simulate gravity
    self.player.on_ground = False
    if not self.player.on_ground and not self.player.jumping:
        self.player.velY = 4

    if self.player.rect.y >= 680:
        self.player.lives -= 1
        self.player.rect.x = 320
        self.player.rect.y = 320

    # Drops
    for drop in self.gameDrops:
        if pygame.sprite.collide_rect(self.player, drop):
            if type(drop) == HealthDrop:
                self.player.health += 50
                self.gameDrops.remove(drop)
            elif type(drop) == SuperHealthDrop:
                self.player.health += 1000
                self.gameDrops.remove(drop)
            elif type(drop) == TriBullets:
                self.player.power = POWER_TRIBULLETS
                self.gameDrops.remove(drop)
            elif type(drop) == ShieldDrop:
                self.player.power = POWER_SHIELD
                self.gameDrops.remove(drop)

    if self.player.score >= self.next_level_score:
        self.game_state = STATE_VICTORY
        self.player.score = 0
        self.zombieskilled = 0
        self.alivetime = 0
        self.lives = 3
        self.health = 200
        self.player.rect.x = 320
        self.player.rect.y = 320
        for zombie in self.zombies:
            zombie.rect.x = random.randint(0, 1280)
            zombie.rect.y = random.randint(0, 100)

    # Health
    for m in self.meteors:
        if pygame.sprite.collide_rect(self.player, m):
            if self.player.power == POWER_SHIELD:
                self.player.health -= 25
            else:
                self.player.health -= 50

    for zombie in self.zombies:
        if pygame.sprite.collide_rect(self.player, zombie):
            if self.player.power == POWER_SHIELD:
                self.player.health -= 1
            else:
                self.player.health -= 5

    for boss in self.bosses:
        if pygame.sprite.collide_rect(self.player, boss):
            if self.player.power == POWER_SHIELD:
                self.player.health -= 50
            else:
                self.player.health -= 50

    # check if we die
    if self.player.health <= 0:
        self.player.power = POWER_NONE
        self.player.lives -= 1
        self.player.rect.x = 320
        self.player.rect.y = 320
        self.player.health = 200

    if self.player.lives <= 0:
        self.player.lives += 3
        self.player.score = 0
        self.targetscore = 100
        self.player.rect.x = 320
        self.player.rect.y = 320
        self.game_state = STATE_GAMEOVER
        for zombie in self.zombies:
            zombie.rect.x = random.randint(0, 1280)
            zombie.rect.y = random.randint(0, 100)

    # move player and check for collision at the same time
    self.player.rect.x += self.player.velX
    self.check_collision(self.player, self.player.velX, 0)
    self.player.rect.y += self.player.velY
    self.check_collision(self.player, 0, self.player.velY)

def zombie_move(self, zombie_sprite):
    # add gravity
    zombie_sprite.do_jump()
    percentage = random.randint(0, 100)

    # simualte gravity
    zombie_sprite.on_ground = False
    if not zombie_sprite.on_ground and not zombie_sprite.jumping:
        zombie_sprite.velY = 8

    if zombie_sprite.jumping:
        zombie_sprite.velX = 0

    for zombie in self.zombies:
        if zombie.rect.y >= 680:
            self.zombies.remove(zombie)

    dx = zombie_sprite.rect.x - self.player.rect.x
    if dx > 20 and not zombie_sprite.jumping:
        zombie_sprite.velX = -5
    elif dx < 20 and not zombie_sprite.jumping:
        zombie_sprite.velX = +5

    # Zombie damage
    for zombie in self.zombies:
        for m in self.meteors:
            if pygame.sprite.collide_rect(m, zombie):
                zombie.health -= 10                
                if zombie.health <= 0:
                    if (percentage >= 0) and (percentage < 40):
                        self.gameDrops.append(HealthDrop(zombie.rect.x + 10, zombie.rect.y + 30))
                    elif (percentage >= 0) and (percentage < 5):
                        self.gameDrops.append(SuperHealthDrop(zombie.rect.x + 20, zombie.rect.y + 30))
                    elif (percentage >= 1) and (percentage < 20):
                        self.gameDrops.append(TriBullets(zombie.rect.x + 30, zombie.rect.y + 30, self.player.direction))
                    elif (percentage >= 1) and (percentage < 50):
                        self.gameDrops.append(ShieldDrop(zombie.rect.x + 40, zombie.rect.y + 30))
                    self.zombieskilled += 0
                    self.player.score += 0
                    self.meteors.remove(m)
                break

    for zombie in self.zombies:
        for b in self.bullets:
            if pygame.sprite.collide_rect(b, zombie):
                #The same bullet cannot be used to kill
                #multiple zombies and as the bullet was 
                #no longer in Bullet.List error was raised
                zombie.health -= 10                
                self.bullets.remove(b)
                if zombie.health <= 0:
                    if (percentage >= 0) and (percentage < 40):
                        self.gameDrops.append(HealthDrop(zombie.rect.x + 10, zombie.rect.y + 30))
                    elif (percentage >= 0) and (percentage < 5):
                        self.gameDrops.append(SuperHealthDrop(zombie.rect.x + 20, zombie.rect.y + 30))
                    elif (percentage >= 1) and (percentage < 20):
                        self.gameDrops.append(TriBullets(zombie.rect.x + 30, zombie.rect.y + 30, self.player.direction))
                    elif (percentage >= 1) and (percentage < 50):
                        self.gameDrops.append(ShieldDrop(zombie.rect.x + 40, zombie.rect.y + 30))
                    self.zombieskilled += 1
                    self.player.score += 10
                    self.total_score += 10
                    self.zombies.remove(zombie)
                break

    # move zombie and check for collision
    zombie_sprite.rect.x += zombie_sprite.velX
    self.check_collision(zombie_sprite, zombie_sprite.velX, 0)
    zombie_sprite.rect.y += zombie_sprite.velY
    self.check_collision(zombie_sprite, 0, zombie_sprite.velY)

def boss_move(self, boss_sprite):
    # add gravity
    boss_sprite.do_jump()
    percentage = random.randint(0, 100)

    # simualte gravity
    boss_sprite.on_ground = False
    if not boss_sprite.on_ground and not boss_sprite.jumping:
        boss_sprite.velY = 8

    if boss_sprite.jumping:
        boss_sprite.velX = 0

    for boss in self.bosses:
        if boss.rect.y >= 620:
            self.bosses.remove(boss)

    dx = boss_sprite.rect.x - self.player.rect.x
    if dx > 20 and not boss_sprite.jumping:
        boss_sprite.velX = -5
    elif dx < 20 and not boss_sprite.jumping:
        boss_sprite.velX = +5

    # Zombie damage
    for boss in self.bosses:
        for m in self.meteors:
            if pygame.sprite.collide_rect(m, boss):
                boss.health -= 0                
                if boss.health <= 0:
                    if (percentage >= 0) and (percentage < 40):
                        self.gameDrops.append(HealthDrop(boss.rect.x + 10, boss.rect.y + 30))
                    elif (percentage >= 0) and (percentage < 5):
                        self.gameDrops.append(SuperHealthDrop(boss.rect.x + 20, boss.rect.y + 30))
                    elif (percentage >= 1) and (percentage < 20):
                        self.gameDrops.append(TriBullets(boss.rect.x + 30, boss.rect.y + 30, self.player.direction))
                    elif (percentage >= 1) and (percentage < 50):
                        self.gameDrops.append(ShieldDrop(boss.rect.x + 40, boss.rect.y + 30))
                    self.zombieskilled += 0
                    self.player.score += 0
                    self.meteors.remove(m)
                break

    for boss in self.bosses:
        for b in self.bullets:
            if pygame.sprite.collide_rect(b, boss):
                #The same bullet cannot be used to kill
                #multiple bosses and as the bullet was 
                #no longer in Bullet.List error was raised
                boss.health -= 5                
                self.bullets.remove(b)
                if boss.health <= 0:
                    if (percentage >= 0) and (percentage < 50):
                        self.gameDrops.append(SuperHealthDrop(boss.rect.x + 90, boss.rect.y + 90))
                    elif (percentage >= 0) and (percentage < 50):
                        self.gameDrops.append(TriBullets(boss.rect.x + 90, boss.rect.y + 90, self.player.direction))
                    self.zombieskilled += 1
                    self.player.score += 50
                    self.total_score += 50
                    self.bosses.remove(boss)
                break

    # move boss and check for collision
    boss_sprite.rect.x += boss_sprite.velX
    self.check_collision(boss_sprite, boss_sprite.velX, 0)
    boss_sprite.rect.y += boss_sprite.velY
    self.check_collision(boss_sprite, 0, boss_sprite.velY)

def check_collision(self, sprite, x_vel, y_vel):
    # for every tile in Background.levelStructure, check for collision
    for block in self.moon.get_surrounding_blocks(sprite):
        if block is not None:
            if pygame.sprite.collide_rect(sprite, block):
                # we've collided! now we must move the collided sprite a step back
                if x_vel < 0:
                    sprite.rect.x = block.rect.x + block.rect.w

                    if type(sprite) is Zombie:
                        # the sprite is a zombie, let's make it jump
                        if not sprite.jumping:
                            sprite.jumping = True
                            sprite.on_ground = False
                        else:
                            sprite.jumping = False
                            sprite.on_ground = True

                if x_vel > 0:
                    sprite.rect.x = block.rect.x - sprite.rect.w

                    if type(sprite) is Zombie:
                        # the sprite is a zombie, let's make it jump
                        if not sprite.jumping:
                            sprite.jumping = True
                            sprite.on_ground = False
                        else:
                            sprite.jumping = False
                            sprite.on_ground = True

                if y_vel < 0:
                    sprite.rect.y = block.rect.y + block.rect.h

                if y_vel > 0 and not sprite.on_ground:
                    sprite.on_ground = True
                    sprite.rect.y = block.rect.y - sprite.rect.h
def播放器移动(自):
#线路起点
self.point=self.player.rect.x+30,self.player.rect.y+30
#增加重力
self.player.do_jump()
#模拟重力
self.player.on_地面=错误
如果不是赛尔夫球员在地面上,也不是赛尔夫球员跳跃:
self.player.velY=4
如果self.player.rect.y>=680:
self.player.lifes-=1
self.player.rect.x=320
self.player.rect.y=320
#滴落
对于放入self.gameDrops:
如果pygame.sprite.collide_rect(self.player,drop):
如果类型(drop)=HealthDrop:
self.player.health+=50
self.gameDrops.remove(删除)
elif类型(下降)=超健康下降:
self.player.health+=1000
self.gameDrops.remove(删除)
elif类型(跌落)=三角架:
self.player.power=power\u TRIBULLETS
self.gameDrops.remove(删除)
elif类型(下降)=防护罩下降:
self.player.power=电源盾
self.gameDrops.remove(删除)
如果self.player.score>=self.next_level_分数:
self.game\u state=state\u胜利
self.player.score=0
self.zombieskilled=0
self.alivetime=0
self.lifes=3
自我健康=200
self.player.rect.x=320
self.player.rect.y=320
对于self.zombies中的僵尸:
zombie.rect.x=random.randint(01280)
zombie.rect.y=random.randint(01100)
#健康
对于m in self.meteors:
如果pygame.sprite.collide_rect(self.player,m):
如果self.player.power==电源屏蔽:
self.player.health-=25
其他:
self.player.health-=50
对于self.zombies中的僵尸:
如果pygame.sprite.collide_rect(self.player,zombie):
如果self.player.power==电源屏蔽:
self.player.health-=1
其他:
self.player.health-=5
对于self.boss中的boss:
如果pygame.sprite.collide(self.player,boss):
如果self.player.power==电源屏蔽:
self.player.health-=50
其他:
self.player.health-=50
#看看我们是否死了
如果self.player.health 20而不是zombie_sprite.jumping:
僵尸精灵.velX=-5
elif dx<20且不是僵尸精灵。跳跃:
僵尸精灵.velX=+5
#僵尸伤害
对于self.zombies中的僵尸:
对于m in self.meteors:
如果pygame.sprite.collide_rect(m,僵尸):
僵尸。健康-=10
如果zombie.health=0)和(百分比<40):
self.gameDrops.append(HealthDrop(zombie.rect.x+10,zombie.rect.y+30))
elif(百分比>=0)和(百分比<5):
self.gameDrops.append(超级健康下降(zombie.rect.x+20,zombie.rect.y+30))
elif(百分比>=1)和(百分比<20):
self.gameDrops.append(论坛(zombie.rect.x+30,zombie.rect.y+30,self.player.direction))
elif(百分比>=1)和(百分比<50):
self.gameDrops.append(ShieldDrop(zombie.rect.x+40,zombie.rect.y+30))
self.zombieskilleed+=0
self.player.score+=0
自我。流星。移除(m)
打破
对于self.zombies中的僵尸:
对于self.bullets中的b:
如果pygame.sprite.collide_rect(b,僵尸):
#同一颗子弹不能用来杀人
#多个僵尸和子弹一样
#不再在项目符号中。引发列表错误
僵尸。健康-=10
自我。子弹。移除(b)
如果zombie.health=0)和(百分比<40):
self.gameDrops.append(HealthDrop(zombie.rect.x+10,zombie.rect.y+30))
elif(百分比>=0)和(百分比<5):
self.gameDrops.append(超级健康下降(zombie.rect.x+20,zombie.rect.y+30))
elif(百分比>=1)和(百分比<20):
self.gameDrops.append(论坛(zombie.rect.x+30,zombie.rect.y+30,self.player.direction))
elif(百分比>=1)和(百分比<50):
self.gameDrops.append(ShieldDrop(zombie.rect.x+40,zombie.rect.y+30))
self.zombieskilled+=1
self.player.score+=10
自我总分+=10
self.zombies.remove(僵尸)
打破
#移动僵尸并检查碰撞
僵尸精灵.rect.x+=僵尸精灵.velX
self.check_冲突(zombie_sprite,zombie_sprite.velX,0)
僵尸精灵。rect.y+=僵尸精灵
self.check\u冲突(zombie\u sprite,0,zombie\u sprite.velY)
def boss_移动(自我,boss_精灵):
#增加重力
老大,精灵,跳吧
百分比=random.randint(0,100)
#模拟重力
boss\u sprite.on\u ground=错误
如果不是地面上的boss\u sprite,也不是boss\u sprite.jumping:
boss_sprite.velY=8
如果boss\u sprite.jumping:
boss_sprite.velX=0
对于self.boss中的boss:
如果boss.rect.y>=620:
self.boss.remove(boss)
dx=boss\u sprite.rect.x-self.player.rect.x
如果dx>20且不是boss\u sprite.jumping:
boss_sprite.velX=-5
elif dx<20且不是boss_sprite.jumping:
boss_sprite.velX=+5
#僵尸伤害
给老板
def get_surrounding_blocks(self, sprite):
    # calculate the grid position of the sprite
    sprite_x = sprite.rect.x / 64
    sprite_y = sprite.rect.y / 64