Струнная анимация для вращающегося игрока в Pygame - PullRequest
1 голос
/ 01 марта 2020

У меня есть вращающийся игрок вокруг точки. Я хочу, чтобы это выглядело так, как будто игрок привязан к этой строке. Вот мой класс игрока и строки

class Player:
    def __init__(self):
        self.pos = [0, 0]
        self.orbital_angle = 0
        self.player = pygame.Surface((20, 20))
        self.player.fill((100, 200, 100))
        self.radius = [200, 200]
        self.center = [600, 300]
        self.speed = 0.005

    def draw(self):
        D.blit(self.player, (self.pos[0], self.pos[1]))

    def orbit(self):
        self.orbital_angle += self.speed
        self.pos[0] = self.radius[0] * math.cos(self.orbital_angle) + self.center[0]
        self.pos[1] = self.radius[1] * math.sin(self.orbital_angle) + self.center[1]

class String:
    def __init__(self, x, y):
        self.pos = [x, y]

    def get_angle(self):
        return math.degrees((-player.orbital_angle) + math.radians(90))

    def get_length(self):
        dx = player.pos[0] - self.pos[0]
        dy = player.pos[1] - self.pos[1]
        length = math.hypot(dx, dy)
        return length

    def surface(self):
        string = pygame.Surface((2, self.get_length())).convert_alpha()
        string.fill((0, 255, 0))
        return string

    def rotated_surface(self):
        return pygame.transform.rotate(self.surface(), (self.get_angle()))

    def draw(self):
        self.rect = self.rotated_surface().get_rect(center = self.pos)
        D.blit(self.rotated_surface(), (self.rect.centerx, self.rect.centery))

Класс строки просто берет orbital_angle игрока, который находится в радианах, преобразует его в градусы и использует этот угол для поворота строки (что просто pygame.Surface). Насколько мне известно, это должно сработать, но угол не совпадает. Положение строки, по-видимому, меняется на экране по какой-то причине, хотя я никогда не менял ее в коде, и они постоянны, когда я печатаю значения. Спасибо за помощь

Скопируйте и вставьте код, чтобы увидеть, что происходит:

import math, sys, os, pygame
from pygame.locals import *

pygame.init()

win = pygame.display
D = win.set_mode((1200, 600))

class Player:
    def __init__(self):
        self.pos = [0, 0]
        self.orbital_angle = 0
        self.player = pygame.Surface((20, 20))
        self.player.fill((100, 200, 100))
        self.radius = [200, 200]
        self.center = [600, 300]
        self.speed = 0.005

    def draw(self):
        D.blit(self.player, (self.pos[0], self.pos[1]))

    def orbit(self):
        self.orbital_angle += self.speed
        self.pos[0] = self.radius[0] * math.cos(self.orbital_angle) + self.center[0]
        self.pos[1] = self.radius[1] * math.sin(self.orbital_angle) + self.center[1]

class String:
    def __init__(self, x, y):
        self.pos = [x, y]

    def get_angle(self):
        return math.degrees((-player.orbital_angle) + math.radians(90))

    def get_length(self):
        dx = player.pos[0] - self.pos[0]
        dy = player.pos[1] - self.pos[1]
        length = math.hypot(dx, dy)
        return length

    def surface(self):
        string = pygame.Surface((2, self.get_length())).convert_alpha()
        string.fill((0, 255, 0))
        return string

    def rotated_surface(self):
        return pygame.transform.rotate(self.surface(), (self.get_angle()))

    def draw(self):
        self.rect = self.rotated_surface().get_rect(center = self.pos)
        D.blit(self.rotated_surface(), (self.rect.centerx, self.rect.centery))

player = Player()
string = String(600, 300)

while True:
    D.fill((0, 0, 0))
    pygame.event.get()

    string.draw()

    player.draw()
    player.orbit()

    pygame.draw.circle(D, (255, 255, 255), (string.pos[0], string.pos[1]), 2)

    win.flip()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...