2014-03-02 125 views
0

我是一個新手當談到編程,但我學到了很多,我試圖做一個非常基本的RPG。Pygame移動圖像速度

我想用鼠標單擊來移動我的圖像對象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 

回答

1

您的設計有一些缺陷。

僅在MOUSEBUTTONDOWN事件中致電clock.tick()。它應該在每一幀都被調用。

你的bliting和display.update也應該在循環中完成,而不是在事件隊列中完成。

玩家更新也應在循環中調用。

您每次調用draw時都會縮放圖像。我想你可能只想在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的東西,會適合你。