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

如何在pygame中生成具有指定条件的实体?

如何解决如何在pygame中生成具有指定条件的实体?

借助 pygame 模块的一些基本 Python 代码。我希望每次我的前一个敌人在 Y 轴上达到 300px 时都能产生另一个敌人。我试图在线搜索解决方案,但没有找到任何有用的信息。我是一个完整的初学者,所以如果有一个非常明显的答案,请原谅我..

import pygame
import random

pygame.init()


screen_width = 800
screen_height = int(screen_width * 0.8)

def canvas():

    canvas = pygame.display.set_mode((screen_width,screen_height))


    pygame.display.set_caption("Space Invaders")


    icon = pygame.image.load("/Users/yashas/Desktop/python_projects/SpaceInvaders/Images/icon.png")
    pygame.display.set_icon(icon)

# player and enemy coordinates while spawning
playerX = (screen_width / 2) - 35
playerY = screen_height - 100
enemyX = random.randint(0,736)
enemyY = screen_height - (screen_height + 70)
playerSpeedX = 0
enemySpeed = 0.4

def player():
    playerImg = pygame.image.load("/Users/yashas/Desktop/python_projects/SpaceInvaders/Images/player.png")
    canvas.blit(playerImg,(playerX,playerY))

def enemy():
    enemyImg = pygame.image.load("/Users/yashas/Desktop/python_projects/SpaceInvaders/Images/enemy.png")

    # used rotozoom because the img was facing the wrong direction
    enemyImg = pygame.transform.rotozoom(enemyImg,180,1)
    canvas.blit(enemyImg,(enemyX,enemyY))

# supposed to run first
if __name__ == "__main__":
    while True:

        canvas.fill((0,40))


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


            if event.type == pygame.KEYDOWN and event.key == pygame.K_LEFT:
                playerSpeedX = -0.7

            if event.type == pygame.KEYDOWN and event.key == pygame.K_RIGHT:
                playerSpeedX = 0.7



        if playerX <= 0:
            playerX = 0

        elif playerX >= 736:
            playerX = 736



        playerX += playerSpeedX
        enemyY += enemySpeed
        
        player()
        enemy()

   
        pygame.display.update()

解决方法

不要在 playerenemy 中连续加载图像。加载图像是一项非常耗时的操作。初始化时加载一次图像。

playerImg = pygame.image.load("/Users/yashas/Desktop/python_projects/SpaceInvaders/Images/player.png")
enemyImg = pygame.image.load("/Users/yashas/Desktop/python_projects/SpaceInvaders/Images/enemy.png")
# used rotozoom because the img was facing the wrong direction
enemyImg = pygame.transform.rotozoom(enemyImg,180,1)

def player():
    canvas.blit(playerImg,(playerX,playerY))

def enemy():
    canvas.blit(enemyImg,(enemyX,enemyY))

您需要一个敌人列表。在一个列表中,您可以管理多个敌人。

enemy_list = []
enemy_list.append([random.randint(0,736),-70])

循环移动并绘制敌人。当列表中最后一个敌人的 y 坐标大于 300 时,创建一个新的敌人。

while True:
    # [...]

    playerX += playerSpeedX
    
    for enemy_pos in enemy_list[:]:
        enemy_pos[1] += enemySpeed
        if enemy_pos[1] > screen_height:
            enemy_list.remove(enemy_pos)

    if len(enemy_list) == 0 or enemy_list[-1][1] > 300:
        enemy_list.append([random.randint(0,-70])
        
    player()
    for enemy_pos in enemy_list: 
        canvas.blit(enemyImg,enemy_pos)

    pygame.display.update()

最小示例:

import pygame
import random

pygame.init()
screen_width = 800
screen_height = int(screen_width * 0.8)
canvas = pygame.display.set_mode((screen_width,screen_height))
clock = pygame.time.Clock()
pygame.display.set_caption("Space Invaders")
icon = pygame.image.load("/Users/yashas/Desktop/python_projects/SpaceInvaders/Images/icon.png")
pygame.display.set_icon(icon)

# player and enemy coordinates while spawning
playerX = (screen_width / 2) - 35
playerY = screen_height - 100
enemyX = random.randint(0,736)
enemyY = screen_height - (screen_height + 70)
playerSpeedX = 3
enemySpeed = 3

playerImg = pygame.image.load("/Users/yashas/Desktop/python_projects/SpaceInvaders/Images/player.png")
enemyImg = pygame.image.load("/Users/yashas/Desktop/python_projects/SpaceInvaders/Images/enemy.png")
enemyImg = pygame.transform.rotozoom(enemyImg,playerY))
    
enemy_list = []

# supposed to run first
if __name__ == "__main__":
    
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
            if event.type == pygame.KEYDOWN and event.key == pygame.K_LEFT:
                playerSpeedX = -3
            if event.type == pygame.KEYDOWN and event.key == pygame.K_RIGHT:
                playerSpeedX = 3

        playerX = max(0,min(736,playerSpeedX + playerX))
    
        for enemy_pos in enemy_list[:]:
            enemy_pos[1] += enemySpeed
            if enemy_pos[1] > screen_height:
                enemy_list.remove(enemy_pos)

        if len(enemy_list) == 0 or enemy_list[-1][1] > 300:
            enemy_list.append([random.randint(0,-70])

        canvas.fill((0,40))     
        player()
        for enemy_pos in enemy_list:
            canvas.blit(enemyImg,enemy_pos)
        pygame.display.update()

        clock.tick(100)     

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