如何解决如何在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()
解决方法
不要在 player
和 enemy
中连续加载图像。加载图像是一项非常耗时的操作。初始化时加载一次图像。
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 举报,一经查实,本站将立刻删除。