试图在 pygame 中为我的游戏生成多个敌人
Trying to spawn multiple enemies for my game in pygame
我试图在我的 space 入侵者类型游戏中生成多个敌人,但我没有任何运气。我尝试以几种不同的方式附加到列表,但都没有成功。我也不想创建多个角色,但想生成同一个角色的不同版本。我不介意是设定数量的敌人还是每隔几秒生成一次敌人。到目前为止,这是我的代码:
import pygame
import sys
import random
pygame.init()
#window of game
window = pygame.display.set_mode((550,550))
#character image
character = pygame.image.load('gg/New Piskel-1.png.png')
clock = pygame.time.Clock()
score = 0
# character
class player(object):
def __init__(self, x, y, width, height):
self.x = x
self.y = y
self.width = width
self.height = height
self.speed = 5
self.hitbox = (self.x + 10, self.y + 15, 33, 43)
self.health = 10
self.visible = True
def draw(self , window):
if self.visible == True:
if left:
window.blit(character, (self.x ,self.y))
elif right:
window.blit(character, (self.x,self.y))
elif up:
window.blit(character, (self.x,self.y))
elif down:
window.blit(character, (self.x,self.y))
else:
window.blit(character, (self.x,self.y))
self.hitbox = (self.x + 10, self.y + 15, 33, 43)
if self.visible == False:
font_display = pygame.font.SysFont('comicsans', 100)
text = font_display.render('YOU ARE DEAD' , 1 , (255, 0, 0))
window.blit(text , (275 - (text.get_width()/2), 275))
pygame.display.update()
#pygame.draw.rect(window , (255, 0 , 0), self.hitbox , 2) # hitbox
pygame.display.update()
def hit(self):
if self.health > 0:
self.health -= 1
else:
self.visible = False
font_display = pygame.font.SysFont('comicsans', 100)
text = font_display.render('YOU ARE DEAD' , 1 , (255, 0, 0))
window.blit(text , (275 - (text.get_width()/2), 275))
pygame.display.update()
class shot(object):
def __init__(self , x , y , radius, color):
self.x = x
self.y = y
self.radius = radius
self.color = color
self.speed = 10
def draw(self , window):
pygame.draw.circle(window, self.color ,(self.x , self.y), self.radius)
class enemy(object):
enemy_img = pygame.image.load('gg/alien.png')
def __init__(self , x , y , width , height , end):
self.x = x
self.y = y
self.width = width
self.height = height
self.end = end
self.speed = 1
self.path = [self.y , self.end]
self.hitbox = (self.x + 7, self.y, 13, 20)
self.health = 14
self.visible = True
def draw(self, window):
self.move()
if self.y > 548:
self.visible = False
if self.visible:
if self.speed > 0:
window.blit(self.enemy_img, (self.x , self.y))
pygame.draw.rect(window, (255, 0, 0), (self.hitbox[0], self.hitbox[1] - 20, 14 , 10))
pygame.draw.rect(window, (0, 255, 0), (self.hitbox[0], self.hitbox[1] - 20, 14 - ((14/7) * (14 - self.health)) , 10))
self.hitbox = (self.x + 7, self.y, 13, 20)
pygame.draw.rect(window , (255, 0 , 0), self.hitbox , 2)# hitbox
def move(self):
if self.y + self.speed < self.path[1]:
self.y += self.speed
def hit(self):
if self.health > 0:
self.health -= 2
else:
self.visible = False
print('hit')
begin = True
bullets = []
enemy_list = []
#animation/character display
def drawing_window():
window.fill((0,0,0))
text = font.render('Score: ' + str(score), 1, (255,0,0))
window.blit(text, (390, 10))
space_ship.draw(window)
for bullet in bullets :
bullet.draw(window)
aliens.draw(window)
pygame.display.update()
#movement and other repeating data (i.e bullets)
font = pygame.font.SysFont('comicsans', 30 , True)
space_ship = player(250 , 460 , 45 , 50)
aliens = enemy(random.randint(10 , 540) , 200, 15 , 25 , 550 )
while begin:
clock.tick(50)
if aliens.visible == True:
if space_ship.hitbox[1] < aliens.hitbox[1] + aliens.hitbox[3] and space_ship.hitbox[1] + space_ship.hitbox[3] > aliens.hitbox[1]:
if space_ship.hitbox[0] + space_ship.hitbox[2] > aliens.hitbox[0] and space_ship.hitbox[0] < aliens.hitbox[0] + aliens.hitbox[2]:
space_ship.hit()
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
for bullet in bullets:
if aliens.visible == True:
if bullet.y - bullet.radius < aliens.hitbox[1] + aliens.hitbox[3] and bullet.y + bullet.radius > aliens.hitbox[1]:
if bullet.x + bullet.radius > aliens.hitbox[0] and bullet.x - bullet.radius < aliens.hitbox[0] + aliens.hitbox[2]:
aliens.hit()
score += 1
bullets.pop(bullets.index(bullet))
if bullet.y > 0:
bullet.y = bullet.y - 10
else:
bullets.pop(bullets.index(bullet))
keys = pygame.key.get_pressed()
if keys[pygame.K_SPACE]:
if len(bullets) < 11:
bullets.append(shot(round(space_ship.x + space_ship.width //2), round(space_ship.y + space_ship.height//2), 3 , (255,0,0,)))
if keys[pygame.K_LEFT] and space_ship.x > space_ship.speed:
space_ship.x -= space_ship.speed
left = True
right = False
up = False
down = False
elif keys[pygame.K_RIGHT] and space_ship.x < 550 - space_ship.width -space_ship.speed:
space_ship.x += space_ship.speed
left = False
right = True
up = False
down = False
if keys[pygame.K_UP] and space_ship.y > space_ship.speed:
up = True
down = False
left = False
right = False
space_ship.y -= space_ship.speed
if keys[pygame.K_DOWN] and space_ship.y <550 - space_ship.height - space_ship.speed:
up = False
down = True
left = False
right = False
space_ship.y += space_ship.speed
else:
left = False
right = False
up = False
down = False
drawing_window()
pygame.quit()
删除变量 aliens
,但将敌人添加到 enemy_list
。您可以添加多个敌人:
no_of_enemies = 3
for _ in range(no_of_enemies):
x = None
while (x == None or any(enemy_rect.colliderect(e.hitbox) for e in enemy_list)):
x = random.randint(10 , 540)
enemy_rect = pygame.Rect(x , 200, 15 , 25)
enemy_list.append(enemy(x, 200, 15, 25, 550))
循环绘制列表中的所有敌人:
#animation/character display
def drawing_window():
window.fill((0,0,0))
text = font.render('Score: ' + str(score), 1, (255,0,0))
window.blit(text, (390, 10))
space_ship.draw(window)
for bullet in bullets:
bullet.draw(window)
for aliens in enemy_list:
aliens.draw(window)
pygame.display.update()
在(嵌套)循环中进行碰撞测试。不要迭代列表,而是列表的浅层 cpies(参见 How to remove items from a list while iterating?)。
使用 pygame.Rect.colliderect
to detect the collision (see How do I detect collision in pygame?):
while begin:
clock.tick(50)
ship_rect = pygame.Rect(space_ship.hitbox)
for aliens in enemy_list[:]:
if ship_rect.colliderect(aliens.hitbox):
space_ship.hit()
for event in pygame.event.get():
if event.type == pygame.QUIT:
begin = False
for bullet in bullets[:]:
if bullet.y > 0:
for aliens in enemy_list[:]:
bullet_rect = pygame.Rect(0, 0, bullet.radius*2, bullet.radius*2)
bullet_rect.center = (bullet.x, bullet.y)
if bullet_rect.colliderect(aliens.hitbox):
score += 1
bullets.remove(bullet)
aliens.hit()
if aliens.health <= 0:
enemy_list.remove(aliens)
bullet.y = bullet.y - 10
else:
bullets.remove(bullet)
# [...]
我试图在我的 space 入侵者类型游戏中生成多个敌人,但我没有任何运气。我尝试以几种不同的方式附加到列表,但都没有成功。我也不想创建多个角色,但想生成同一个角色的不同版本。我不介意是设定数量的敌人还是每隔几秒生成一次敌人。到目前为止,这是我的代码:
import pygame
import sys
import random
pygame.init()
#window of game
window = pygame.display.set_mode((550,550))
#character image
character = pygame.image.load('gg/New Piskel-1.png.png')
clock = pygame.time.Clock()
score = 0
# character
class player(object):
def __init__(self, x, y, width, height):
self.x = x
self.y = y
self.width = width
self.height = height
self.speed = 5
self.hitbox = (self.x + 10, self.y + 15, 33, 43)
self.health = 10
self.visible = True
def draw(self , window):
if self.visible == True:
if left:
window.blit(character, (self.x ,self.y))
elif right:
window.blit(character, (self.x,self.y))
elif up:
window.blit(character, (self.x,self.y))
elif down:
window.blit(character, (self.x,self.y))
else:
window.blit(character, (self.x,self.y))
self.hitbox = (self.x + 10, self.y + 15, 33, 43)
if self.visible == False:
font_display = pygame.font.SysFont('comicsans', 100)
text = font_display.render('YOU ARE DEAD' , 1 , (255, 0, 0))
window.blit(text , (275 - (text.get_width()/2), 275))
pygame.display.update()
#pygame.draw.rect(window , (255, 0 , 0), self.hitbox , 2) # hitbox
pygame.display.update()
def hit(self):
if self.health > 0:
self.health -= 1
else:
self.visible = False
font_display = pygame.font.SysFont('comicsans', 100)
text = font_display.render('YOU ARE DEAD' , 1 , (255, 0, 0))
window.blit(text , (275 - (text.get_width()/2), 275))
pygame.display.update()
class shot(object):
def __init__(self , x , y , radius, color):
self.x = x
self.y = y
self.radius = radius
self.color = color
self.speed = 10
def draw(self , window):
pygame.draw.circle(window, self.color ,(self.x , self.y), self.radius)
class enemy(object):
enemy_img = pygame.image.load('gg/alien.png')
def __init__(self , x , y , width , height , end):
self.x = x
self.y = y
self.width = width
self.height = height
self.end = end
self.speed = 1
self.path = [self.y , self.end]
self.hitbox = (self.x + 7, self.y, 13, 20)
self.health = 14
self.visible = True
def draw(self, window):
self.move()
if self.y > 548:
self.visible = False
if self.visible:
if self.speed > 0:
window.blit(self.enemy_img, (self.x , self.y))
pygame.draw.rect(window, (255, 0, 0), (self.hitbox[0], self.hitbox[1] - 20, 14 , 10))
pygame.draw.rect(window, (0, 255, 0), (self.hitbox[0], self.hitbox[1] - 20, 14 - ((14/7) * (14 - self.health)) , 10))
self.hitbox = (self.x + 7, self.y, 13, 20)
pygame.draw.rect(window , (255, 0 , 0), self.hitbox , 2)# hitbox
def move(self):
if self.y + self.speed < self.path[1]:
self.y += self.speed
def hit(self):
if self.health > 0:
self.health -= 2
else:
self.visible = False
print('hit')
begin = True
bullets = []
enemy_list = []
#animation/character display
def drawing_window():
window.fill((0,0,0))
text = font.render('Score: ' + str(score), 1, (255,0,0))
window.blit(text, (390, 10))
space_ship.draw(window)
for bullet in bullets :
bullet.draw(window)
aliens.draw(window)
pygame.display.update()
#movement and other repeating data (i.e bullets)
font = pygame.font.SysFont('comicsans', 30 , True)
space_ship = player(250 , 460 , 45 , 50)
aliens = enemy(random.randint(10 , 540) , 200, 15 , 25 , 550 )
while begin:
clock.tick(50)
if aliens.visible == True:
if space_ship.hitbox[1] < aliens.hitbox[1] + aliens.hitbox[3] and space_ship.hitbox[1] + space_ship.hitbox[3] > aliens.hitbox[1]:
if space_ship.hitbox[0] + space_ship.hitbox[2] > aliens.hitbox[0] and space_ship.hitbox[0] < aliens.hitbox[0] + aliens.hitbox[2]:
space_ship.hit()
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
for bullet in bullets:
if aliens.visible == True:
if bullet.y - bullet.radius < aliens.hitbox[1] + aliens.hitbox[3] and bullet.y + bullet.radius > aliens.hitbox[1]:
if bullet.x + bullet.radius > aliens.hitbox[0] and bullet.x - bullet.radius < aliens.hitbox[0] + aliens.hitbox[2]:
aliens.hit()
score += 1
bullets.pop(bullets.index(bullet))
if bullet.y > 0:
bullet.y = bullet.y - 10
else:
bullets.pop(bullets.index(bullet))
keys = pygame.key.get_pressed()
if keys[pygame.K_SPACE]:
if len(bullets) < 11:
bullets.append(shot(round(space_ship.x + space_ship.width //2), round(space_ship.y + space_ship.height//2), 3 , (255,0,0,)))
if keys[pygame.K_LEFT] and space_ship.x > space_ship.speed:
space_ship.x -= space_ship.speed
left = True
right = False
up = False
down = False
elif keys[pygame.K_RIGHT] and space_ship.x < 550 - space_ship.width -space_ship.speed:
space_ship.x += space_ship.speed
left = False
right = True
up = False
down = False
if keys[pygame.K_UP] and space_ship.y > space_ship.speed:
up = True
down = False
left = False
right = False
space_ship.y -= space_ship.speed
if keys[pygame.K_DOWN] and space_ship.y <550 - space_ship.height - space_ship.speed:
up = False
down = True
left = False
right = False
space_ship.y += space_ship.speed
else:
left = False
right = False
up = False
down = False
drawing_window()
pygame.quit()
删除变量 aliens
,但将敌人添加到 enemy_list
。您可以添加多个敌人:
no_of_enemies = 3
for _ in range(no_of_enemies):
x = None
while (x == None or any(enemy_rect.colliderect(e.hitbox) for e in enemy_list)):
x = random.randint(10 , 540)
enemy_rect = pygame.Rect(x , 200, 15 , 25)
enemy_list.append(enemy(x, 200, 15, 25, 550))
循环绘制列表中的所有敌人:
#animation/character display
def drawing_window():
window.fill((0,0,0))
text = font.render('Score: ' + str(score), 1, (255,0,0))
window.blit(text, (390, 10))
space_ship.draw(window)
for bullet in bullets:
bullet.draw(window)
for aliens in enemy_list:
aliens.draw(window)
pygame.display.update()
在(嵌套)循环中进行碰撞测试。不要迭代列表,而是列表的浅层 cpies(参见 How to remove items from a list while iterating?)。
使用 pygame.Rect.colliderect
to detect the collision (see How do I detect collision in pygame?):
while begin:
clock.tick(50)
ship_rect = pygame.Rect(space_ship.hitbox)
for aliens in enemy_list[:]:
if ship_rect.colliderect(aliens.hitbox):
space_ship.hit()
for event in pygame.event.get():
if event.type == pygame.QUIT:
begin = False
for bullet in bullets[:]:
if bullet.y > 0:
for aliens in enemy_list[:]:
bullet_rect = pygame.Rect(0, 0, bullet.radius*2, bullet.radius*2)
bullet_rect.center = (bullet.x, bullet.y)
if bullet_rect.colliderect(aliens.hitbox):
score += 1
bullets.remove(bullet)
aliens.hit()
if aliens.health <= 0:
enemy_list.remove(aliens)
bullet.y = bullet.y - 10
else:
bullets.remove(bullet)
# [...]