在编程方面,我是一个新手,但到目前为止我学到了很多东西,而且我正在尝试制作一个非常基本的RPG。
我想用鼠标点击移动我的图像对象oPC。我已经能够通过下面分享的代码实现这一点,但是,无论我在屏幕上点击什么,图像都需要相同的步骤/时间才能到达目的地。例如,如果我点击距离物体几英寸的距离,它将逐渐移过屏幕朝向目标位置,就像我点击图像一样快。
过去几天我一直试图想办法解决这个问题。是否有时间使用时间进行运动而不是我使用的步骤?
谢谢!
import pygame, sys
import oPC
pygame.init()
WINDOWSIZE = (1000, 800)
BLACK = (0, 0, 0)
screen = pygame.display.set_mode((WINDOWSIZE))
pygame.display.set_caption("Game")
screen.fill(BLACK)
terrain = pygame.image.load("terrain.jpg").convert()
terrainRect = terrain.get_rect()
terrain = pygame.transform.scale(terrain, ((WINDOWSIZE)))
screen.blit(terrain, terrainRect)
oPC = oPC.Player()
oPC.draw(screen)
pygame.display.flip()
running = True
n_steps = 80
while running == True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.MOUSEBUTTONDOWN:
mlocX, mlocY = pygame.mouse.get_pos()
while mlocX != oPC.rect.x and mlocY != oPC.rect.y:
clock.tick(60)
oPC.update(mlocX, mlocY, n_steps)
if n_steps > 1:
screen.fill(BLACK)
screen.blit(terrain, terrainRect)
n_steps -= 1
oPC.draw(screen)
pygame.display.flip()
n_steps = 80
pygame.quit()
#sys.exit()
import pygame, sys
class Player(object):
def __init__(self):
self.image = pygame.image.load("tipping over s0000.bmp").convert()
self.rect = self.image.get_rect()
self.name = " "
self.stats = [0, 0, 0, 0, 0] #str, int, dex, health, mana
self.admin = False # False = Member / True = Administrator
def draw(self, screen):
self.image = pygame.transform.scale(self.image, (75, 75))
screen.blit(self.image, (self.rect.x, self.rect.y))
def update(self, mlocX, mlocY, n_steps):
self.rect.x += (mlocX - self.rect.x) / n_steps
self.rect.y += (mlocY - self.rect.y) / n_steps
答案 0 :(得分:1)
你的设计有一些缺陷。
您仅在clock.tick()
事件中致电MOUSEBUTTONDOWN
。它应该在每一帧都被调用。
你的bliting和display.update也应该在循环中完成,而不是在事件队列中完成。
也应该在循环中调用播放器更新。
每次调用绘图时都可以缩放图像。我想你可能只想在init方法中这样做。因为应该在循环中重复调用draw。
对于计步器,我建议有一个玩家状态,并在那里有一个计步器。像这样:
# for easier state access
def enum(*sequential, **named):
enums = dict(zip(sequential, range(len(sequential))), **named)
return type('Enum', (), enums)
player_states = enum('STATIONARY', 'MOVING')
STEPS = 30
def __init__(self):
self.state = player_states.STATIONARY
self.steps = 0
self.dest = None
def move(self,mlocX,mlocY):
if self.state != player_states.MOVING:
self.state = player_state.MOVING
self.steps = STEPS
self.dest = (mlocX,mlocY)
def update(self):
if self.steps != 0:
self.rect.x += (self.dest[0] - self.rect.x) / STEPS
self.rect.y += (self.dest[1] - self.rect.y) / STEPS
self.steps -= 1
else:
self.state = player_states.STATIONARY
关于步骤的问题,你可以使用物理学和着名的distance = velocity * time
方程式。
clock.tick()方法返回自上次调用tick()以来传递的ms数。 如果将此传递给更新方法,则可以将移动方程更改为:
def update(self,delta):
self.rect.x += PLAYER_SPEED * direction * delta
然后选择适合你的PLAYER_SPEED。