首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不可预知的敌人速度变化

问不可预知的敌人速度变化
EN

Stack Overflow用户
提问于 2021-11-08 04:49:31
回答 1查看 54关注 0票数 0

我做了一个游戏,敌人追逐一个玩家,而玩家通过地图收集硬币。当我在空闲状态下运行它时,它工作正常,但是当我将它作为一个应用程序(使用auto-py-to-exe)运行时,敌方的移动会随机地changed..now,它们正以非常高的速度移动。我不确定错误可能出在哪里。我发现更改屏幕大小或添加一条print语句也会以某种方式影响这一点。你能给我一个解释吗?.我是pygame的新手,大部分的游戏都是一块一块地看文档。

这是我的完整代码

代码语言:javascript
复制
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()

游戏的粗略描述是,玩家可以在地图上向任何方向移动,收集弹珠(硬币)来赢得score.If玩家在敌人的范围内,敌人将开始追赶玩家,否则当玩家被抓住或玩家离开背景地图时,敌人仍然是stationary.The游戏结束。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-08 20:59:42

您的代码当前正在以最快的速度运行。你必须限制你游戏的速度(FPS)。游戏中的FPS (每秒帧数)通常设置为60。幸运的是,这在pygame中很容易做到。

代码语言:javascript
复制
import pygame
from sys import exit

FPS = 60    
clock = pygame.time.Clock()

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

   clock.tick(FPS)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69878773

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档