我制作了一个游戏,其中敌人追逐玩家,而玩家通过地图收集硬币。当我在空闲时运行它时它工作正常,但是当我将它作为应用程序运行时(使用 auto-py-to-exe),敌人的运动已经随机改变了......现在他们正在以非常高的速度移动。我不确定错误可能在哪里。我发现更改屏幕大小或添加打印语句也会以某种方式影响这一点。你能提出一个解释吗?...我是 pygame 的新手,并且通过文档逐步完成了大部分游戏
这是我的完整代码
import sys, pygame,time
import numpy as np
import math
pygame.init()
size = width, height = 410,310
screen = pygame.display.set_mode(size)
screen.set_colorkey((255,255,255))
pygame.display.set_caption('Game')
player = pygame.Surface((68,72))
player.set_colorkey((0,0,0))
bg=pygame.image.load("vf.jpg").convert_alpha()
bg.set_colorkey((255,255,255))
bgrect = bg.get_rect()
ash=pygame.image.load("ash.png").convert_alpha()
ashrect = ash.get_rect()
ashrect.x,ashrect.y=205,155
ashrect.w,ashrect.h=10,10
en1=pygame.image.load("charmander.png").convert_alpha()
en1rect = en1.get_rect()
en1rect.x,en1rect.y=500,200
en1rect.w,en1rect.h=10,10
en2=pygame.image.load("squirtle.png").convert_alpha()
en2rect = en2.get_rect()
en2rect.x,en2rect.y=500,700
en2rect.w,en2rect.h=10,10
en3=pygame.image.load("bulbasaur.png").convert_alpha()
en3rect = ash.get_rect()
en3rect.x,en3rect.y=100,500
en3rect.w,en3rect.h=10,10
poke=pygame.image.load("poke.png").convert_alpha()
pokerect = poke.get_rect()
pokerect.x,pokerect.y=100,100
score=0
x,y=0,0
def enSpeed(enx,eny,asx,asy,bs):
if asx==enx and asy==eny:
return [0,0]
else:
dirvect=pygame.math.Vector2(asx-enx,asy-eny)
if dirvect.magnitude()<=200 or not bgrect.collidepoint((enx,eny)):
dirvect.normalize_ip()
dirvect.scale_to_length(5)
spd=pygame.math.Vector2(dirvect[0]-bs[0],dirvect[1]-bs[1])
spd.scale_to_length(5)
return spd
else:
print("test print")
return [-bs[0],-bs[1]]
bgspd=[0,0]
while 1:
keys=pygame.key.get_pressed()
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
pygame.mixer.music.stop()
if bgrect.colliderect(ashrect):
if keys[pygame.K_d]:
bgspd=[10,0]
bgrect.move_ip([-10,0])
pokerect.move_ip([-10,0])
player.fill((0,0,0))
x,y=-1,-2
if keys[pygame.K_a]:
bgspd=[-10,0]
bgrect.move_ip([10,0])
pokerect.move_ip([10,0])
player.fill((0,0,0))
x,y=-1,-1
if keys[pygame.K_s]:
bgspd=[0,10]
bgrect.move_ip([0,-10])
pokerect.move_ip([0,-10])
player.fill((0,0,0))
x,y=-1,0
if keys[pygame.K_w]:
bgspd=[0,-10]
bgrect.move_ip([0,10])
pokerect.move_ip([0,10])
player.fill((0,0,0))
x,y=-3,-3
if event.type==pygame.KEYUP:
x+=1
bgspd=[0,0]
if pokerect.colliderect(ashrect):
pokerect.x=np.random.randint(bgrect.x,bgrect.x+900)
pokerect.y=np.random.randint(bgrect.y,bgrect.y+1100)
score+=1
if en1rect.colliderect(ashrect) or en2rect.colliderect(ashrect)or en3rect.colliderect(ashrect) :
gameOver()
else:
gameOver()
if en1rect.colliderect(en2rect):
en1rect.move_ip([np.random.randint(-100,100),np.random.randint(-100,100)])
en2rect.move_ip([np.random.randint(-100,100),np.random.randint(-100,100)])
if en2rect.colliderect(en3rect):
en3rect.move_ip([np.random.randint(-100,100),np.random.randint(-100,100)])
en2rect.move_ip([np.random.randint(-100,100),np.random.randint(-100,100)])
if en3rect.colliderect(en1rect):
en3rect.move_ip([np.random.randint(-100,100),np.random.randint(-100,100)])
en1rect.move_ip([np.random.randint(-100,100),np.random.randint(-100,100)])
en1rect.move_ip(enSpeed(en1rect.x,en1rect.y,ashrect.x,ashrect.y,bgspd))
en2rect.move_ip(enSpeed(en2rect.x,en2rect.y,ashrect.x,ashrect.y,bgspd))
en3rect.move_ip(enSpeed(en3rect.x,en3rect.y,ashrect.x,ashrect.y,bgspd))
screen.blit(bg,bgrect)
player.blit(ash,(68*x,72*y))
screen.blit(player,(205,155))
screen.blit(poke,pokerect)
screen.blit(en1,en1rect)
screen.blit(en2,en2rect)
screen.blit(en3,en3rect)
screen.blit(pygame.font.Font.render(ft,"SCORE: "+str(score),True,(255,255,255)),dest=(200,0))
pygame.display.flip()
对预期游戏的粗略描述是玩家可以在整个地图上向任何方向移动并收集精灵球(硬币)以获得分数。如果玩家在敌人范围内,敌人将开始追逐玩家,否则敌人仍然存在静止的。当玩家被抓住或玩家离开背景地图时游戏结束