У меня есть вращающийся игрок вокруг точки. Я хочу, чтобы это выглядело так, как будто игрок привязан к этой строке. Вот мой класс игрока и строки
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()