微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

制造克隆敌人

如何解决制造克隆敌人

我正在 pygame 中制作一个简单的游戏,在该游戏中,您应该躲避或射击穿过屏幕的目标。到目前为止,我已经创建了船舶运动、子弹运动和第一个敌人出现。但是,我完全不知道如何在屏幕上每 3 秒生成一次新敌人。我做了一个计时器,但我仍然不知道触发计时器后如何生成敌人。当计时器达到 3 秒时,它会重新启动并将“has_passed”变量设置为 True,这允许我绘制克隆敌人。但很明显,这不起作用,因为之后变量立即设置为 False。我真的不知道如何继续,特别是因为我是一个初学者,所以这种类型的问题超出了我的范围,关于 python 和 pygame 知识。任何帮助将不胜感激。

df['idx'] = df.groupby('group_name').cumcount()
df.pivot(index='group_name',columns='idx')[['data_source_palma_id']]
    data_source_palma_id
idx 0   1   2   3
group_name              
ACE ACE(SIS)    ACE(MAG)    ACE(EPAM)   ACE(SWEPAM)

解决方法

不要使用time.time()。使用 pygame.time.get_ticks() 返回自调用 pygame.init() 以来的毫秒数。定义下一个敌人必须出现的时间。当前时间超过计算时间时创建一个新的敌人,并按持续创建新敌人的时间间隔增加时间:

next_enemy_time = 0
while True:
    # [...]

    current_time = pygame.time.get_ticks()
    if current_time > next_enemy_time:
        next_enemy_time = current_time + 3000 # 3000 milliseconds == 3 seconds
        
        # [...] create new enemy

您根本不需要敌对克隆。使用列表管理多个敌人:


class ENEMY(ROCKET):
    # [...]

    def draw_enemy(self,rocket,bullet):
        pygame.draw.rect(screen,enemy_color,self.enemy_rect)
        self.enemy_y += self.enemy_speed
        self.enemy_rect.topleft = (self.enemy_x,self.enemy_y)
enemies = []

while True:
    # [...]

    if current_time > next_enemy_time:
        next_enemy_time = current_time + 3000
        enemies.insert(0,ENEMY())

    # [...]

如果y坐标大于屏幕高度,则循环绘制敌人并从列表中删除敌人:

while True:
    # [...]

    for enemy in enemies:
        enemy.draw_enemy(rocket,bullet)

    for i,enemy in enumerate(enemies):
        if enemy.enemy_y > screen_height:
            del enemies[i:]
            break 

    # [...]

完整示例:

import pygame,sys
import random
import time
pygame.init()

clock = pygame.time.Clock()
time0 = time.time()

has_passed = False

screen_width = 600
screen_height = 800

enemyWidth = 30
enemyHeight = 10

bg_color = (94,50,50)
enemy_color = (0,0)

screen = pygame.display.set_mode((screen_width,screen_height))
pygame.display.set_caption("Space Race Game")

class ROCKET:
    def __init__(self):
        self.rocketImg = pygame.image.load("spaceship.png")
        self.rocket_x = screen_width/2 - 32
        self.rocket_y = screen_height/2 + 150

    def draw_rocket(self):
        screen.blit(self.rocketImg,(self.rocket_x,self.rocket_y))

    def move_rocket(self):
        key = pygame.key.get_pressed()

        if key[pygame.K_LEFT] and self.rocket_x + 15 > 0:
            self.rocket_x -= 5

        if key[pygame.K_RIGHT] and self.rocket_x < screen_width - 40:
            self.rocket_x += 5

class BULLET(ROCKET):
    def __init__(self):
        super().__init__()
        self.bullet_width = 10
        self.bullet_height = 20
        self.bullet_x = self.rocket_x + 25
        self.bullet_y = self.rocket_y
        self.move = [0,0]
        self.bullet_speed = 7
        self.bullet_rect = pygame.Rect(self.bullet_x,self.bullet_y,self.bullet_width,self.bullet_height)

    def draw_bullet(self,bullet):
        key = pygame.key.get_pressed()

        if key[pygame.K_SPACE] and self.move[1] == 0:
            self.bullet_x = rocket.rocket_x + 25
            self.move[1] = -1

        self.bullet_y += self.move[1] * self.bullet_speed
        self.bullet_rect.topleft = (self.bullet_x,self.bullet_y)

        if self.bullet_y < self.rocket_y - 10:
            pygame.draw.rect(screen,(0,0),self.bullet_rect)

        if self.bullet_y < - 20:
            self.bullet_y = self.rocket_y
            self.move[1] = 0

class ENEMY(ROCKET):
    def __init__(self):
        super().__init__()
        self.enemy_width = enemyWidth
        self.enemy_height = enemyHeight
        self.enemy_x = random.randint(self.enemy_width,screen_width - self.enemy_width)
        self.enemy_y = 0
        self.enemy_speed = 1
        self.enemy_rect = pygame.Rect(self.enemy_x,self.enemy_y,self.enemy_width,self.enemy_height)

    def draw_enemy(self,self.enemy_y)


rocket = ROCKET()
bullet = BULLET()

randomNum = random.randint(enemyWidth,screen_width - enemyWidth)

next_enemy_time = 0
enemies = []

while True:

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    current_time = pygame.time.get_ticks()
    if current_time > next_enemy_time:
        next_enemy_time = current_time + 3000
        enemies.insert(0,ENEMY())
        
    screen.fill(bg_color)
    rocket.draw_rocket()
    rocket.move_rocket()
    bullet.draw_bullet(rocket,bullet)
    for enemy in enemies:
        enemy.draw_enemy(rocket,enemy in enumerate(enemies):
        if enemy.enemy_y > screen_height:
            del enemies[i:]
            break 

    pygame.display.flip()
    clock.tick(60)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。