簡體   English   中英

如何根據角色的旋轉移動角色?

[英]How do I move a character based on it's rotation?

我在 PyGame 中有一個角色,我想根據它的旋轉向前移動。 目前它非常奇怪和不穩定。

這是我所有的代碼: https ://www.toptal.com/developers/hastebin/enapuravet.lua

以下是相關代碼:

    def rotate(self, amount):
        self.rotation += amount
        if self.rotation == 181:
            self.rotation = -180
        elif self.rotation == -181:
            self.rotation = 180
        print(self.rotation)
        self.capybara = pygame.transform.rotate(self.base_capybara, self.rotation)
        self.rect = self.capybara.get_rect(center = self.rect.center)

    def move_forward(self, speed):
        print(self.rotation)
        new_coordinates = calculate_new_xy((self.x, self.y), 2, self.rotation*(math.pi/180))
        self.x = new_coordinates[0]
        self.y = new_coordinates[1]
        self.rect = self.capybara.get_rect(center = (self.x, self.y))

def calculate_new_xy(old_xy,speed,angle_in_radians):
    print(angle_in_radians)
    new_x = old_xy[0] + (speed*math.cos(angle_in_radians))
    new_y = old_xy[1] + (speed*math.sin(angle_in_radians))
    return new_x, new_y

這是它的作用: https ://gyazo.com/3b7bf1c5b2e760a53913b6d3acae6e67

我還嘗試了其他一些 x_y 計算函數,如下所示:

    move_vec = pygame.math.Vector2()
move_vec.from_polar((speed, angle_in_degrees))
return old_xy + move_vec

但他們有相同/非常相似的結果。

這是水豚:

水豚

由於pygame.Rect應該代表屏幕上的一個區域,一個pygame.Rect對象只能存儲整數數據。

Rect 對象的坐標都是整數。 [...]

如果要以浮點精度存儲對象位置,則必須將對象的位置存儲在單獨的變量和屬性中,並同步pygame.Rect對象。將坐標round並將其分配給矩形的位置(例如.center )。

math.sinmath.cos的角度單位是 Randian。 您需要使用math.radians將角度從度數轉換為弧度:

class Capybara:
    def __init__(self, size_multiplier):
        # [...]

        self.x, self.y = 300, 300
        self.rect = self.capybara.get_rect(center = (round(self.x), round(self.y)))

    def rotate(self, amount):
        self.rotation += amount
        ifv self.rotation > 360:
            self.rotation -= 360
        elif self.rotation < 0:
            self.rotation += 360
        self.capybara = pygame.transform.rotate(self.base_capybara, self.rotation)
        self.rect = self.capybara.get_rect(center = (round(self.x), round(self.y)))
        
    def move(self, move):
        self.x += move * math.cos(math.radians(self.rotation + 90))
        self.y -= move * math.sin(math.radians(self.rotation + 90))

另請參閱使用矢量移動角色、移動圖像旋轉如何在使用鍵移動時在 pygame 中轉動精靈


最小的例子:

import pygame, math
pygame.init()

size = width, height = 600, 600
green = 50, 168, 82

screen = pygame.display.set_mode(size)

class Capybara:
    def __init__(self, size_multiplier):
        self.capybara = pygame.image.load('capybara.png')
        self.o_size = 92, 206
        self.new_size = (self.o_size[0] * size_multiplier,self.o_size[1] * size_multiplier)
        self.capybara = pygame.transform.scale(self.capybara, self.new_size)
        self.base_capybara = self.capybara
        self.rotation = 0
        self.x, self.y = 300, 300
        self.rect = self.capybara.get_rect(center = (round(self.x), round(self.y)))

    def rotate(self, amount):
        self.rotation += amount
        if self.rotation > 360:
            self.rotation -= 360
        elif self.rotation < 0:
            self.rotation += 360
        self.capybara = pygame.transform.rotate(self.base_capybara, self.rotation)
        self.rect = self.capybara.get_rect(center = (round(self.x), round(self.y)))
        
    def move(self, move):
        self.x += move * math.cos(math.radians(self.rotation + 90))
        self.y -= move * math.sin(math.radians(self.rotation + 90))


capybara = Capybara(0.8)

fpsClock = pygame.time.Clock()

rotate_l = False
rotate_r = False

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()

            quit()

    keys = pygame.key.get_pressed()
    rotate = keys[pygame.K_RIGHT] - keys[pygame.K_LEFT]
    move = keys[pygame.K_DOWN] - keys[pygame.K_UP]
    capybara.move(-move * 5)
    capybara.rotate(-rotate)

    screen.fill(green)
    screen.blit(capybara.capybara, capybara.rect)
    pygame.display.update()
    fpsClock.tick(60)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM