Pygame移动图像速度

2024-10-04 11:28:58 发布

您现在位置:Python中文网/ 问答频道 /正文

在编程方面我是个新手,但到目前为止我学到了很多东西,我正在努力制作一个非常基本的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

Tags: rect图像imageimportselfeventgetdisplay
1条回答
网友
1楼 · 发布于 2024-10-04 11:28:58

你的设计有一些缺陷。在

您只对MOUSEBUTTONDOWN事件调用clock.tick()。它应该在每一帧上调用。在

你的闪电和显示.更新也应该在循环中完成,而不是在事件队列中。在

播放器更新也应该在循环中调用。在

每次调用“绘制”时都要缩放图像。我想您可能只想在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方程。在

在时钟滴答声()方法返回自上次调用tick()以来经过的毫秒数。 如果将此传递给“更新”方法,则可以将移动方程更改为:

^{pr2}$

然后选择适合你的球员速度。在

相关问题 更多 >