如何解决为什么当我的敌人的子弹碰到我的播放器时不删除
所以我一直在努力做到当敌人的子弹碰到我的玩家时它会消失。我的问题是,子弹会随机工作几次,然后在下次击中玩家时出现此错误。
eguns.pop(eguns.index(egun))
ValueError: <__main__.main_loop.<locals>.enemybullets object at 0x06F69E50> is not in list
这也是显示正在发生的事情的简短片段。 https://gyazo.com/f7718fd6b1200af3cf2f77d1a559fa46
当我被子弹击中时,我的游戏就冻结了。
这是无效的部分
for egun in eguns:
for one in range(len(eguns)-1-1-1):
if egun.rect.colliderect(playerman.rect):
eguns.pop(eguns.index(egun)) # this is the code that was spouse to make the bullet dissaper
Lives -= 1
text2 = font.render("Lives = "+str(Lives),True,(0,0))
textRect2.center = ((600,65))
我的完整代码
import pygame
pygame.init()
# Build The Screen
window = pygame.display.set_mode((700,500))
fps = (10)
clock = pygame.time.Clock()
# COLORS
white = (255,255,255)
darkred = (200,0)
darkgreen = (0,200,0)
green = (0,0)
red = (255,0)
black = (0,0)
#######
# Start Screen
def text_objects(text,font):
textSurface = font.render(text,black)
return textSurface,textSurface.get_rect()
def button(msg,x,y,w,h,ic,ac,action=None):
mouse = pygame.mouse.get_pos()
click = pygame.mouse.get_pressed()
#print(click)
if x+w > mouse[0] > x and y+h > mouse[1] > y:
pygame.draw.rect(window,(x,h))
if click[0] == 1 and action != None:
action()
else:
pygame.draw.rect(window,h))
smallText = pygame.font.SysFont("comicsansms",40)
textSurf,textRect = text_objects(msg,smallText)
textRect.center = ( (x+(w/2)),(y+(h/2)) )
window.blit(textSurf,textRect)
def quitgame():
pygame.quit()
def game_intro():
intro = True
while intro:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
window.fill((255,255))
largeText = pygame.font.Font('freesansbold.ttf',95)
TextSurf,TextRect = text_objects("AIR FLIGHT",largeText)
TextRect.center = ((700/2),(500/2))
window.blit(TextSurf,TextRect)
button("Fly!",50,350,100,green,darkgreen,main_loop)
button("Land!",450,red,darkred,quitgame)
pygame.display.update()
clock.tick(fps)
# Start Screen
###
def main_loop():
global Dead
# Name Screen
pygame.display.set_caption("Noobs first Game")
bg = pygame.image.load("skybg1.png")
bg_shift = 0
# Class Player
class player:
def __init__(self,width,height,color):
self.x = x
self.y = y
self.width = width
self.height = height
self.speed = 6
self.color = color
self.rect = pygame.Rect(x,height)
self.ss1 = pygame.image.load("heroplane1.png")
self.ss1 = pygame.transform.scale(self.ss1,(self.ss1.get_width()//9,self.ss1.get_height()//9))
def draw(self):
self.rect.topleft=(self.x,self.y)
pygame.draw.rect(window,self.color,self.rect)
player_rect = self.ss1.get_rect(center = self.rect.center)
player_rect.centerx += -7
player_rect.centery += -6
window.blit(self.ss1,player_rect)
# Class Enemy
class Enemy:
def __init__(self,color,imagefile):
self.x = x
self.y = y
self.width = width
self.height = height
self.speed = 4
self.color = color
self.rect = pygame.Rect(x,height)
self.ss1 = pygame.image.load(imagefile)
self.ss1 = pygame.transform.scale(self.ss1,self.ss1.get_height()//9))
self.etimer = 0 # <---
def draw(self):
self.rect.topleft = (self.x,self.rect)
enemy_rect = self.ss1.get_rect(center = self.rect.center)
enemy_rect.centerx += -2
enemy_rect.centery += -6
window.blit(self.ss1,enemy_rect)
# Class Enemy2
class Enemy2:
def __init__(self,self.rect)
enemy_rect = self.ss1.get_rect(center = self.rect.center)
enemy_rect.centerx += -4
enemy_rect.centery += -6
window.blit(self.ss1,enemy_rect)
class enemy3:
def __init__(self,color):
self.x = x
self.y = y
self.width = width
self.height = height
self.color = color
self.rect = pygame.Rect(x,height)
self.ss1 = pygame.image.load("enemyplane3.png")
self.ss1 = pygame.transform.scale(self.ss1,self.ss1.get_height()//9))
def draw(self):
self.rect.topleft = (self.x,self.rect)
enemy3_rect = self.ss1.get_rect(center = self.rect.center)
enemy3_rect.centerx += -4
enemy3_rect.centery += -6
window.blit(self.ss1,enemy3_rect)
# Class Enemy3
class Star:
def __init__(self,height)
self.ss1 = pygame.image.load("skycoin.png")
self.ss1 = pygame.transform.scale(self.ss1,(self.ss1.get_width()//12,self.ss1.get_height()//12))
def draw(self):
self.rect.topleft = (self.x,self.rect)
enemy3_rect = self.ss1.get_rect(center = self.rect.center)
enemy3_rect.centerx += -4
enemy3_rect.centery += -4
window.blit(self.ss1,enemy3_rect)
class projectile(object):
def __init__(self,color):
self.x = x
self.y = y
self.slash = pygame.image.load("herogun1.png")
self.slash = pygame.transform.scale(self.slash,(self.slash.get_width()//11,self.slash.get_height()//11))
self.rect = self.slash.get_rect()
self.rect.topleft = ( self.x,self.y )
self.speed = 10
self.color = color
def draw(self,window):
self.rect.topleft = ( self.x,self.y )
window.blit(self.slash,self.rect)
class enemybullets(object):
def __init__(self,color):
self.x = x
self.y = y
self.slash = pygame.image.load("enemygun1.png")
self.slash = pygame.transform.scale(self.slash,self.rect)
class Power:
def __init__(self,color):
self.x = x
self.y = y
self.width = width
self.height = height
self.color = color
self.speed = 4
self.rect = pygame.Rect(x,height)
def draw(self):
self.topleft = (self.x,self.rect)
import pygame
pygame.init()
# Build The Screen
window = pygame.display.set_mode((700,500))
# Name Screen
pygame.display.set_caption("Noobs first Game")
bg = pygame.image.load("skybg1.png")
bg_shift = 0
# Class Player
class player:
def __init__(self,self.rect)
# Color
white = (255,255)
black = (0,0)
# Draw Player
playerman = player(5,250,90,40,white)
# For Enemy
enemy1 = Enemy(400,white,"enemyplane1.png")
enemy4 = Enemy(400,400,"enemyplane1.png")
# For Enemy2
enemy21 = Enemy2(400,300,"enemyplane2.png")
enemy22 = Enemy2(400,"enemyplane2.png")
# For Coins
star1 = Star(300,45,white)
star2 = Star(300,white)
# For Enemy3
ememy31 = enemy3(400,white)
# For Enemy
enemys = [enemy1,enemy4]
#For Coin
stars = [star1,star2]
# enemys
enemyGroup = pygame.sprite.Group()
level1 = [
" 1 c 1 c 1 c c c "," c 1 1 1 c 1 c 1 1 1 1 1 1 1 c c c c c "," c 1 c 1 1 1 c 1 c 1 c c c "," c 1 c 1 c 1 1 1 c1 c 1 1 1 c 1 c 1 1 c c "," c c c c 1 1 c 1 c1 1 1 1 1 c1 1 c 1 1 c c c c "," c 1 c 1 c c 1 c 1 c c c "," 1 1 c 1 1 c 1 c1 1 c 1 1 cc 1 c 1 1 c 1 c c c c c",]
for iy,row in enumerate(level1):
for ix,col in enumerate(row):
if col == "1":
new_enemy = Enemy(ix*70,iy*70,(255,255),"enemyplane1.png")
enemys.append(new_enemy)
for iy,col in enumerate(row):
if col == "c":
new_stars = Star(ix*70,255))
stars.append(new_stars)
enemy2Group = pygame.sprite.Group()
level2 = [
" "," ",]
for iy,row in enumerate(level2):
for ix,col in enumerate(row):
if col == "2":
new_enemy2 = Enemy2(ix*70,"enemyplane2.png")
Enemy2.append(new_enemy2)
Dead = False
def quitgame():
pygame.quit()
def unpause():
global Dead
Dead = False
def Die():
largeText = pygame.font.SysFont("comicsansms",115)
TextSurf,TextRect = text_objects("You Died!",TextRect)
while Dead:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
button("Fly!",main_loop)
button("Land!",quitgame)
pygame.display.update()
clock.tick(fps)
# Redrawwinodw
def redrawwindow():
window.fill((0,0))
bg_width = bg.get_width()
bg_offset = bg_shift % bg_width
window.blit(bg,(-bg_offset,0))
window.blit(bg,(bg_width - bg_offset,0))
# Draw playerman
playerman.draw()
# Draw enemy
for enemy in enemys:
enemy.draw()
# Draw enemy2
enemy21.draw()
# Draw enemy3
ememy31.draw()
#Draw Coin
for Star in stars:
Star.draw()
# Draw Enemy gun and playergun
for bullet in bullets:
bullet.draw(window)
for egun in eguns:
egun.draw(window)
window.blit(text,textRect)
window.blit(text2,textRect2)
window.blit(text3,textRect3)
# FPS Cnd Clock
fps = (30)
clock = pygame.time.Clock()
font = pygame.font.Font("freesansbold.ttf",30)
score = 0
text = font.render("Coins = "+str(score),0))
textRect = text.get_rect()
textRect.center = ((600,40))
font = pygame.font.Font("freesansbold.ttf",30)
Lives = 10
text2 = font.render("Lives = "+str(Lives),0))
textRect2 = text.get_rect()
textRect2.center = ((600,65))
font = pygame.font.Font("freesansbold.ttf",30)
enemyd = 0
text3 = font.render("Enemys Died = 10/ "+str(enemyd),0))
textRect3 = text.get_rect()
textRect3.center = ((450,95))
# For Bullets List And Timer
bullets = []
btimer = 0
# For Enemy Bullets And Timer
eguns = []
etimer = 0
# Main Loop
run = True
while run:
clock.tick(fps)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
for Star in stars:
for one in range(len(stars)-1,-1,-1):
if playerman.rect.colliderect(stars[one].rect):
del stars[one]
score += 1
text = font.render("Coins = "+str(score),0))
textRect.center = ((600,40))
for enemy in enemys:
for one in range(len(enemys)-1-1-1):
if enemys[one].rect.colliderect(playerman.rect):
del enemys[one]
enemyd += 1
text3 = font.render("Enemys Died = 10/ "+str(enemyd),0))
textRect3.center = ((450,95))
Lives -= 1
text2 = font.render("Lives = "+str(Lives),65))
for Enemys in enemys:
if enemy.x < 0:
enemy.x * playerman.x
for Star in stars:
Star.x -= playerman.speed
ememy31.x -= playerman.speed
# Timer for Bullets
if btimer > 0:
btimer += 1
if btimer > 10:
btimer = 0
# Timer for Enemy Bullets
if etimer > 0:
etimer += 1
if etimer > 13:
etimer = 0
# This Is Keys for bullet
keys = pygame.key.get_pressed()
# This is bullets and when player press Spacebar they come
for bullet in bullets:
if bullet.x < 700 and bullet.x > 0:
bullet.x += bullet.speed
else:
bullets.pop(bullets.index(bullet))
if keys[pygame.K_SPACE] and btimer == 0:
if len(bullets) < 5:
bullets.append(projectile(round(playerman.x+playerman.width//2),round(playerman.y + playerman.height-24),0)))
btimer = 1
# Allow's enemy to disapper when it touches the player bullets
for Enemy in enemys:
for bullet in bullets:
for one in range(len(enemys)-1,-1):
if bullet.rect.colliderect(enemys[one].rect):
del enemys[one]
bullets.pop(bullets.index(bullet))
enemyd += 1
text3 = font.render("Enemys Died = 10/ "+str(enemyd),0))
textRect3.center = ((450,95))
#A PART OF THE Died FUNCTION
if Lives < 1:
Dead = True
Die()
# Timer for Enemy Bullets
for enemy in enemys:
if enemy.etimer > 0:
enemy.etimer += 1
if enemy.etimer > 40:
enemy.etimer = 0
# Allows enemy to shoot
for egun in eguns:
if egun.x < 700 and egun.x > 0:
egun.x -= egun.speed
else:
eguns.pop(eguns.index(egun))
for Enemy in enemys:
if Enemy.x < 700 and Enemy.etimer == 0:
if len(eguns) < 15:
eguns.append(enemybullets(round(Enemy.x+Enemy.width//2),round(Enemy.y + Enemy.height-24),0)))
Enemy.etimer = 1
# What make's the player lose live's when it touch the bullets for enenmy
for egun in eguns:
for one in range(len(eguns)-1-1-1):
if egun.rect.colliderect(playerman.rect):
eguns.pop(eguns.index(egun))
Lives -= 1
text2 = font.render("Lives = "+str(Lives),65))
# Makes enemy move
for Enemy in enemys:
Enemy.x -= Enemy.speed
# For The Background Shifting
bg_shift += round(3/2)
# Keys For Playerman
keys = pygame.key.get_pressed()
if keys[pygame.K_a] and playerman.x > playerman.speed:
playerman.x -= playerman.speed
if keys[pygame.K_d] and playerman.x < 260 - playerman.width - playerman.speed:
playerman.x += playerman.speed
if keys[pygame.K_w] and playerman.y > playerman.speed:
playerman.y -= playerman.speed
if keys[pygame.K_s] and playerman.y < 500 - playerman.height - playerman.speed:
playerman.y += playerman.speed
# Update And Other Sutff
redrawwindow()
pygame.display.update()
pygame.quit()
unpause()
game_intro()
main_loop()
解决方法
嵌套循环是无用的。由于从未使用过one
,因此无论如何都不需要内部循环。
如果要从列表中删除元素,则在迭代它时,必须复制列表(eguns[:]
)。参见How to remove items from a list while iterating?
。遍历副本,但从原始列表中删除元素:
for egun in eguns[:]:
if egun.rect.colliderect(playerman.rect):
eguns.remove(egun)
# [...]
无论如何,这将容易得多,并且分别使用pygame.sprite.Sprite
和pygame.sprite.Group
,pygame.sprite.spritecollide()
,pygame.sprite.Sprite.kill()
和pygame不会遇到麻烦}}。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。