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.