python - 一个简单函数中的意外行为,找不到原因
问题描述
我正在尝试使用Pygame Lib 编写一个简单的游戏。为了跟随玩家,我编写了一个非常简单的“敌人”行为。
当我运行游戏时,问题就出现了,“敌人”对象在向右移动时移动得更快,向左移动时移动得更慢。
我已经查找了可能影响功能的任何数字或错误输入的运算符。我还跟踪了速度和时间值(我用它来添加或减去“距离”)并且它们没有改变(它们应该不会改变)。
import os
import sys
import pygame as py
from pygame.locals import *
# Constantes
w = 500
h = 300
clock = py.time.Clock()
active_surf = py.Surface((500, 30))
active_surf.fill((255, 255, 0))
ground_surf = py.Surface((500, 50))
ground_surf.fill((127, 127, 127))
# Clases
class Robbie(py.sprite.Sprite):
def __init__(self, ):
py.sprite.Sprite.__init__(self)
self.image = py.Surface((30, 30))
self.rect = self.image.get_rect()
self.rect.bottom = 250
self.rect.centerx = 230
self.speed = 0.2
def move(self, keys, time):
if self.rect.left >= 0:
if keys[K_LEFT]:
self.rect.centerx -= self.speed * time
if self.rect.right <= w:
if keys[K_RIGHT]:
self.rect.centerx += self.speed * time
def shoot(self, keys, time):
pass
class Enemy(py.sprite.Sprite):
def __init__(self):
py.sprite.Sprite.__init__(self)
self.image = py.Surface((25, 25))
self.rect = self.image.get_rect()
self.rect.bottom = 250
self.rect.centerx = 260
self.speed = 0.1
def move(self, player, time):
if player.rect.centerx > self.rect.centerx:
self.rect.centerx += self.speed * time
if player.rect.centerx < self.rect.centerx:
self.rect.centerx -= self.speed * time
# Funciones
def img_load(img_name):
img_path = os.path.join((os.path.dirname(__file__)), "Images", (img_name + ".png"))
sprite_obj = py.image.load(img_path).convert_alpha()
return sprite_obj
def main():
screen = py.display.set_mode((w, h))
py.display.set_caption("RobbiShoot")
screen.blit(ground_surf, (0, 250))
player = Robbie()
enemy = Enemy()
while True:
time = clock.tick(60)
keys = py.key.get_pressed()
for events in py.event.get():
if events.type == QUIT:
sys.exit()
screen.blit(active_surf, (0, 220))
player.move(keys, time)
enemy.move(player, time)
screen.blit(player.image, player.rect)
screen.blit(enemy.image, enemy.rect)
py.display.flip()
return 0
if __name__ == '__main__':
py.init()
main()
我认为这可能是一些简单的数学问题,但如果是这样,我看不到它。
解决方案
这是将浮点值转换为整数值的问题:
def move(self, player, time):
if player.rect.centerx > self.rect.centerx:
self.rect.centerx = (self.rect.centerx + self.speed * time + 0.5)
if player.rect.centerx < self.rect.centerx:
self.rect.centerx = (self.rect.centerx - self.speed * time + 0.5)
或者
def move(self, player, time):
if player.rect.centerx > self.rect.centerx:
self.rect.centerx = round(self.rect.centerx + self.speed * time)
if player.rect.centerx < self.rect.centerx:
self.rect.centerx = round(self.rect.centerx - self.speed * time)
请注意,如果将 0.1 转换为整数值而不是 0,但如果转换 0.9,它也是 0。x坐标计算的浮点结果必须四舍五入为0.5。
在答案的代码中,x 坐标总是被截断,这导致位置倾向于向左。
推荐阅读
- opencart - 编辑文本并
在 opencart 页脚内容中添加标签 - bootstrap-select - Bootstrap-select 1.13.9 添加新项目选项
- dns - 将合成记录动态分配给 Google Domain
- android - 查找 String[] 是否在 Room 数据库 Android 中包含字符串
- php - Laravel 无法使用模拟的服务和对象测试作业。Mockery 间谍无法检测到被调用的方法
- macos - MacOS 无线诊断 802.11 报告
- php - Laravel 存储库模式 - 关系错误
- azure - 如何使用 Azure 集成运行时设置 Azure 数据工厂的高可用性?
- android - Play Billing - 实施应用内购买以解锁内容并移除广告
- javascript - 反应原生:有办法显示 Ionicon 吗?