2013-04-29 84 views
1

我正在Pygame寫一個小海盜遊戲。如果你在帝國全面戰爭中玩過海戰,你就會明白我想達到的目標:讓精靈一步一步移動到鼠標點擊位置

該船的精靈在位置(x1|y1)。玩家現在點擊屏幕上的位置(x2|y2)。這個精靈現在應該以(x2|y2)作爲新的職位 - 一步一步地去那裏,而不是立即在那裏發光。

我想通了,它有事情做對角矩形(x1|y1)(x1|y2)(x2|y2)(x2|y1),但我無法弄清楚,特別是沒有維持該速度相同的問題上沒有什麼角度對角線已經並且考慮到xy的值(發貨或點擊)可能會大於或小於相應的其他值。

這個小片段是我最後一次嘗試寫一個工作職能:

def update(self, new_x, new_y, speed, screen, clicked): 

    if clicked: 
     self.xshift = (self.x - new_x) 
     self.yshift = ((self.y - new_y)/(self.x - new_x)) 

    if self.x > (new_x + 10): 
     self.x -= 1 
     self.y -= self.yshift 
    elif self.x > new_x and self.x < (new_x + 10): 
     self.x -= 1 
     self.y -= self.yshift 
    elif self.x < (new_x - 10): 
     self.x += 1 
     self.y += self.yshift 
    elif self.x < new_x and self.x < (new_x - 10): 
     self.x += 1 
     self.y += self.yshift 
    else: 
     self.x += 0 
     self.y += 0 

    screen.set_at((self.x, self.y), (255, 0, 255)) 

「船」就是在這裏一個粉紅色的像素。它在我點擊屏幕時顯示的反應是大致朝着我的咔嗒聲移動,但是停在我點擊的點的看似隨機的距離處。

的變量是:鼠標點擊
speed =恆定速度的

new_xnew_y =位置取決於船舶類型
clicked =設定trueMOUSEBUTTONDOWN事件,以確保XSHIFT和自我YSHIFT是隻有當玩家點擊時才定義,而不是每個幀。

如何使船舶從當前位置平穩移動到玩家點擊的位置?

回答

0

假設當前位置是pos,並且玩家點擊的點是target_pos,則取postarget_pos之間的向量。

現在你知道如何從postarget_pos,但要以恆定速度移動(而不是一次移動整個距離),必須對矢量進行歸一化,並通過標量乘法應用速度常數。

就是這樣。


完整的示例:(相關代碼在Ship.update法)

import pygame 
import math 

# some simple vector helper functions, stolen from http://stackoverflow.com/a/4114962/142637 
def magnitude(v): 
    return math.sqrt(sum(v[i]*v[i] for i in range(len(v)))) 

def add(u, v): 
    return [ u[i]+v[i] for i in range(len(u)) ] 

def sub(u, v): 
    return [ u[i]-v[i] for i in range(len(u)) ]  

def dot(u, v): 
    return sum(u[i]*v[i] for i in range(len(u))) 

def normalize(v): 
    vmag = magnitude(v) 
    return [ v[i]/vmag for i in range(len(v)) ] 

class Ship(object): 
    def __init__(self): 
     self.x, self.y = (0, 0) 
     self.set_target((0, 0)) 
     self.speed = 0.7 

    @property 
    def pos(self): 
     return self.x, self.y 

    # for drawing, we need the position as tuple of ints 
    # so lets create a helper property 
    @property 
    def int_pos(self): 
     return map(int, self.pos) 

    @property 
    def target(self): 
     return self.t_x, self.t_y 

    @property 
    def int_target(self): 
     return map(int, self.target) 

    def set_target(self, pos): 
     self.t_x, self.t_y = pos 

    def update(self): 
     # if we won't move, don't calculate new vectors 
     if self.int_pos == self.int_target: 
      return 

     target_vector = sub(self.target, self.pos) 

     # a threshold to stop moving if the distance is to small. 
     # it prevents a 'flickering' between two points 
     if magnitude(target_vector) < 2: 
      return 

     # apply the ship's speed to the vector 
     move_vector = [c * self.speed for c in normalize(target_vector)] 

     # update position 
     self.x, self.y = add(self.pos, move_vector) 

    def draw(self, s): 
     pygame.draw.circle(s, (255, 0 ,0), self.int_pos, 2) 

pygame.init() 
quit = False 
s = pygame.display.set_mode((300, 300)) 
c = pygame.time.Clock() 
ship = Ship() 

while not quit: 
    quit = pygame.event.get(pygame.QUIT) 
    if pygame.event.get(pygame.MOUSEBUTTONDOWN): 
     ship.set_target(pygame.mouse.get_pos()) 
    pygame.event.poll() 
    ship.update() 
    s.fill((0, 0, 255)) 
    ship.draw(s) 
    pygame.display.flip() 
    c.tick(60) 
+0

我哥哥的名字也是 「多米尼克」(但以 「K」 而不是 「C」): D 非常感謝!我想,我想出了我的問題:)你的回答說清楚了 – 2013-04-30 12:49:20

+0

完成:)還有一件事:我在哪裏可以在文檔中找到@property? pygame是否具體?在python的文檔中找不到一個單詞(或者我忽略它?) – 2013-04-30 23:07:37

+0

@patrichartmann http://docs.python.org/2/library/functions.html#property – sloth 2013-05-01 12:04:54