游戏的精灵组问题

import pygame, sys, time, random
from pygame.locals import *
# 敌方飞机
class enemy_ship(pygame.sprite.Sprite):
    # 存放所有飞机的子弹组
    bullets = pygame.sprite.Group()
    def __init__(self, screen):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("feiji/enemy0.png")
        self.rect = self.image.get_rect()
        x = random.randint(0, Manager.bg_size[0]-51)
        self.rect.topleft = [x, 0]  # 方法2
        self.enemy_speed = 3
        # 是否斜飞
        self.a = random.randint(1, 10)
        self.screen = screen
        # 装子弹的列表
        self.bullets = pygame.sprite.Group()  # 方法2
    # 显示飞机
    def display(self):
        # 方法2
        self.screen.blit(self.image, (self.rect.left, self.rect.top))
        # 更新子弹坐标
        self.bullets.update()  # update为Group中方法,不断更新子弹位置
        # 把所有子弹添加到屏幕
        self.bullets.draw(self.screen)  # screen也为Group中方法
    def update(self):
        self.auto_fire()
        self.display()
        if self.rect.top >= 700 + 22:
            self.kill()
    # 敌方自动开火
    def auto_fire(self):
        a = random.randint(0, 100)
        if a == 10:
            bullet = enemy_Bullet(self.screen, self.rect.left, self.rect.top)
            self.bullets.add(bullet)
            # 存放所有飞机子弹的组
            enemy_ship.bullets.add(bullet)
# 敌方子弹
class enemy_Bullet(pygame.sprite.Sprite):
    def __init__(self, screen, x, y):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("feiji/bullet1.png")
        # 获取矩形对象
        self.rect = self.image.get_rect()
        self.rect.topleft = [x + 25 - 4, y + 22]
        self.Bullet_speed = 5
        self.screen = screen
    def update(self):
        self.rect.top += self.Bullet_speed
    def cls(self):
        self.kill()
# 我方飞机
class Player_ship(pygame.sprite.Sprite):
    # 存放所有飞机的子弹组
    bullets = pygame.sprite.Group()
    def __init__(self, screen):
        self.timer = 0
        self.dt = 0
        self.clock = pygame.time.Clock()
        # 精灵初始化方法 必须调用
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("feiji/hero1.png")
        self.rect = self.image.get_rect()
        screen_rect = screen.get_rect()
        self.rect.center = screen_rect.center
        print(self.rect)
        self.rect.topleft = [self.rect.left, self.rect.top + 200]  # 方法2
        self.player_speed = 10
        self.screen = screen
        # 装子弹的列表
        self.bullets = pygame.sprite.Group()  # 方法2
    def key_control(self):
        key_pressed = pygame.key.get_pressed()
        # 方法2
        if key_pressed[K_w]  and self.rect.top>0:
            self.rect.top -= self.player_speed
        if key_pressed[K_s] :
            self.rect.bottom += self.player_speed
        if key_pressed[K_a] and self.rect.left>0:
            self.rect.left -= self.player_speed
        if key_pressed[K_d] and self.rect.right<600:
            self.rect.right += self.player_speed
        if key_pressed[K_SPACE]:
            bullet = Bullet(self.screen, self.rect.left, self.rect.top)
            # 把子弹放列表里
            self.bullets.add(bullet)
            # 存放所有飞机子弹的组
            Player_ship.bullets.add(bullet)
    def update(self):
        self.key_control()
        self.display()
    # 显示飞机
    def display(self):
        # 方法2
        self.screen.blit(self.image, self.rect)
        # 更新子弹坐标
        self.bullets.update()  # update为Group中方法,不断更新子弹位置
        # 把所有子弹添加到屏幕
        self.bullets.draw(self.screen)  # screen也为Group中方法
# 我方子弹
class Bullet(pygame.sprite.Sprite):
    def __init__(self, screen, x, y):
        # 精灵类初始化
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("feiji/bullet.png")
        # 获取矩形对象
        self.rect = self.image.get_rect()
        self.rect.topleft = [x + 50 - 11, y - 22]
        self.Bullet_speed = 20
        self.screen = screen
    def update(self):
        self.rect.top -= self.Bullet_speed
# 管理类
class Manager(object):
    bg_size = (600, 700)
    # 创建敌机定时器
    create_enemy_id = 10  # 自己定义数字
    def __init__(self):
        pygame.init()
        self.score = 0
        # 创建窗口
        self.screen = pygame.display.set_mode(Manager.bg_size, 0, 32)
        # 创建背景图片s
        self.background = pygame.image.load("feiji/img_bg_level_1.jpg")
        self.background = pygame.transform.smoothscale(self.background, (600, 700))
        # 初始化一个装玩家精灵的group
        self.players = pygame.sprite.Group()  # 加s是方便以后多人
        # 初始化一个装敌机精灵的group
        self.enemys = pygame.sprite.Group()
    def exit(self):
        pygame.quit()
        exit()
    def new_player(self):
        player = Player_ship(self.screen)
        self.players.add(player)  # 创建多个直接复制
    def new_enemy(self):
        enemy = enemy_ship(self.screen)
        self.enemys.add(enemy)
    def main(self):
        self.new_player()
        # 创建敌机定时器
        pygame.time.set_timer(Manager.create_enemy_id, 2000)
        while True:
            self.screen.blit(self.background, (0, 0))
            for event in pygame.event.get():  # 事件监听
                if event.type == QUIT:
                    self.exit()
                elif event.type == Manager.create_enemy_id:
                    # 创建一个敌机
                    self.new_enemy()
            if self.players.sprites():
                # 判断一个精灵和一个精灵组之间的碰撞 返回被碰撞的敌方飞机
                # 玩家飞机和敌方子弹 参数一是玩家飞机 参数二是敌方所有飞机的所有的子弹
                isover = pygame.sprite.spritecollide(self.players.sprites()[0], enemy_ship.bullets, True)
                if isover:
                    Manager.is_game_over = True  # 标识游戏结束
                    print('中弹')
                # 玩家所有子弹和所有敌机的碰撞
                is_enemy = pygame.sprite.groupcollide(Player_ship.bullets, self.enemys, True, True)
                if is_enemy:
                    items = list(is_enemy.items())[0]
                    y = items[1][0]
                    self.score+=1
            # 玩家飞机和子弹的显示
            self.players.update()
            # 敌机和子弹的显示
            self.enemys.update()
            # 4刷新显示窗口内容
            pygame.display.update()
            # 取一个合适的值 循环时停一下  单位是秒 减少cpu的消耗
            time.sleep(0.02)
if __name__ == '__main__':
    manager = Manager()
    manager.main()
讨论数量: 2
Jason990420

代码格式错误, 缩格不对, 请参考以下内容, 再重新编辑内容.

代码高亮

```python

你的代码

```

1年前 评论
Godzilla_baobaolong (楼主) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!