Drehen Sie das Bild um die Mitte mit Pygame [Duplikat]
Posted: 17 Feb 2025, 10:29
Ich mache ein Spiel in Pygame und versuche, ein Waffenbild um meinen Spieler um zu drehen, aber derzeit dreht sich das Bild um die obere linke Ecke des Bildes. Daher liegt die einzige korrekte Rotation bei θ = 90, -90 und ist bei θ = 0,180 falsch (umgedreht auf den Spieler anstelle von weg). Ich weiß nicht, wie ich diesen Fehler beheben kann. < /P>
import pygame
from player import Player
from gun import Gun
pygame.init()
screen = pygame.display.set_mode((480, 360))
clock = pygame.time.Clock()
running = True
dt = 0
player = Player(screen)
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
screen.fill("purple")
dt = clock.tick(60) / 1000
player.move(dt)
player.draw(screen)
pygame.display.flip()
pygame.quit()
< /code>
I tried adjusting the angle by adding to it at certain degrees, but it just reversed the problem. I've asked ChatGPT to see if it could fix the issue, but it results in the same problem, unable to fix the issue. I tried using solutions from similar problems, but to no avail.
Code: Select all
gun.py
Code: Select all
import pygame
import math
pygame.init()
class Gun:
def __init__(self, screen, size_multiplier=2):
self.screen_width = screen.get_width()
self.screen_height = screen.get_height()
self.original_gun_img = pygame.image.load("images/gun.png").convert_alpha()
original_width, original_height = self.original_gun_img.get_size()
new_width = int(original_width * size_multiplier)
new_height = int(original_height * size_multiplier)
self.gun_img = pygame.transform.scale(self.original_gun_img, (new_width, new_height))
self.gun_rect = self.gun_img.get_rect()
self.gun_pos = pygame.Vector2(self.screen_width / 2, self.screen_height / 2)
self.gun_distance = 32
self.speed = 300
self.dt = 0
self.angle = 0
self.rotated_gun_img = self.gun_img
@staticmethod
def rot_center(image, angle):
orig_rect = image.get_rect()
rot_image = pygame.transform.rotate(image, angle)
rot_rect = rot_image.get_rect()
rot_rect.center = orig_rect.center
return rot_image, rot_rect
def move(self, player_pos: pygame.Vector2):
mouse_pos = pygame.mouse.get_pos()
direction = pygame.Vector2(mouse_pos) - player_pos
if direction.length() != 0:
direction = direction.normalize()
self.gun_pos = player_pos + direction * self.gun_distance
angle = math.degrees(math.atan2(direction.y, direction.x))
if angle != self.angle:
self.angle = angle
self.rotated_gun_img, self.gun_rect = self.rot_center(self.gun_img, self.angle)
self.gun_rect.center = self.gun_pos
def draw(self, screen):
screen.blit(self.rotated_gun_img, self.gun_rect)
< /code>
player.py
Code: Select all
import pygame
from gun import Gun
pygame.init()
class Player:
def __init__(self, screen, size_multiplier=2):
self.screen = screen
self.screen_width = screen.get_width()
self.screen_height = screen.get_height()
self.player_img = pygame.image.load("images/player.png").convert_alpha()
original_width, original_height = self.player_img.get_size()
new_width = int(original_width * size_multiplier)
new_height = int(original_height * size_multiplier)
self.player_img = pygame.transform.scale(self.player_img, (new_width, new_height))
self.player_rect = self.player_img.get_rect()
self.player_pos = pygame.Vector2(self.screen_width / 2, self.screen_height / 2)
self.speed = 300
self.dt = 0
self.gun = Gun(screen)
def move(self, dt):
self.keys = pygame.key.get_pressed()
if self.keys[pygame.K_w]:
if self.player_pos.y - self.player_rect.height / 2 > 0:
self.player_pos.y -= self.speed * dt
if self.keys[pygame.K_s]:
if self.player_pos.y + self.player_rect.height / 2 < self.screen_height:
self.player_pos.y += self.speed * dt
if self.keys[pygame.K_a]:
if self.player_pos.x - self.player_rect.width / 2 > 0:
self.player_pos.x -= self.speed * dt
if self.keys[pygame.K_d]:
if self.player_pos.x + self.player_rect.width / 2 < self.screen_width:
self.player_pos.x += self.speed * dt
def draw(self, screen):
self.player_rect.center = (self.player_pos.x, self.player_pos.y)
screen.blit(self.player_img, self.player_rect)
self.gun.move(self.player_pos)
self.gun.draw(screen)
< /code>
main.py
from player import Player
from gun import Gun
pygame.init()
screen = pygame.display.set_mode((480, 360))
clock = pygame.time.Clock()
running = True
dt = 0
player = Player(screen)
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
screen.fill("purple")
dt = clock.tick(60) / 1000
player.move(dt)
player.draw(screen)
pygame.display.flip()
pygame.quit()
< /code>
I tried adjusting the angle by adding to it at certain degrees, but it just reversed the problem. I've asked ChatGPT to see if it could fix the issue, but it results in the same problem, unable to fix the issue. I tried using solutions from similar problems, but to no avail.