Pygame унаследовал классы, действующие по-другомуPython

Программы на Python
Ответить
Anonymous
 Pygame унаследовал классы, действующие по-другому

Сообщение Anonymous »

Я делаю школьный проект на Python и создал общий класс врагов, который затем будет унаследован всеми общими врагами. Я создал класс гоблинов, который наследует это, и он работает так, как ожидалось, поэтому я создал еще один для класса орков, который также наследует класс врага, но изображение орка перемещается в неправильное положение. Инициализация для обеих функций абсолютно одинакова, даже при использовании той же таблицы спрайтов, которую я пытался отладить, поэтому единственная разница - это имя класса, но проблема все еще существует.
enemy.py:

Код: Выделить всё

import pygame
from settings import *
import random

red = (255, 0, 0)
green = (0, 255, 0)
blue = (0, 0, 255)
transparent = (0, 0, 0, 0)

class Enemy(pygame.sprite.Sprite):
def __init__(self, width, height, health, rect_width, start_pos, group, animation_incrementer = 36, attack_range = 54, attack_damage = 10):
super().__init__(group)

self.velocity_x = 0
self.velocity_y = 0

self.player_in_alert_range = False
self.trigger_range = 160 * 0 * (screen_width / 640)
self.attack_range = attack_range * (screen_width / 640)

self.state = "idle"
self.timeout = 0.3
self.attack_cooldown = 0.2
self.speed = base_speed

self.los_blocked = False
self.target_seen = False
self.target_last_location = None

self.color = green

self.action = "idle"
self.facing = "right"

self.width = width * (screen_width / 640)
self.height = height * (screen_width / 640)
self.rect_width = rect_width * (screen_width / 640)

self.max_health = health
self.health = self.max_health

self.can_move = True
self.can_attack = True
self.attack_started = False
self.attack_finished = False
self.attack_damage = attack_damage
self.dealt_damage = False
self.target_dead = False

self.hurt = False
self.hurt_started = False
self.hurt_finished = False
self.damaged = False

self.dead = False
self.end_of_death = False

# Knockback variables
self.knockback_active = False
self.knockback_direction = pygame.math.Vector2(0, 0)
self.knockback_speed = 1000  # Adjust for desired knockback speed
self.knockback_duration = 0.1  # Knockback effect duration in seconds
self.knockback_timer = 0  # Tracks the time remaining for knockback

# Frame &  Animation variables
self.frame_counter = 0
self.current_frame = 0
self.animation_incrementer = animation_incrementer

self.home_pos = (start_pos[0] * (screen_width / 640), start_pos[1] * (screen_width / 640))
self.wander_pos = None
self.wander_range = 128
self.pos = pygame.math.Vector2(start_pos[0] * (screen_width / 640), start_pos[1] * (screen_width / 640))

def add_to_camera_group(self, group):
super().__init__(group)

def extract_frames(self, frame_width, frame_height, current_sprite_sheet, frames_array):
frame_width = frame_width
frame_height = frame_height

for y in range(0, current_sprite_sheet.get_height(), frame_height):
for x in range(0, current_sprite_sheet.get_width(), frame_width):
frame = current_sprite_sheet.subsurface(pygame.Rect(x, y, frame_width, frame_height))
frame = pygame.transform.scale(frame, (self.width, self.height))
frames_array.append(frame)

def draw(self, screen, offset, target):
adjusted_rect = self.rect.move(-offset.x, -offset.y)
adjusted_img_rect = self.image_rect.move(-offset.x, -offset.y)
adjusted_circ = [int(self.pos[0] - offset.x) + (self.rect_width / 2), int(self.pos[1] - offset.y) + (self.height / 2)]

# Calculate the center of the circle
centercirc = (adjusted_circ[0], adjusted_circ[1])

# Create a new Surface with per-pixel alpha
circle_surface = pygame.Surface((self.trigger_range * 2, self.trigger_range * 2), pygame.SRCALPHA)
circle_surface = circle_surface.convert_alpha()

adjusted_player_rect = target.move(-offset.x, -offset.y)

# Draw the semi-transparent circle on the new Surface
# pygame.draw.circle(circle_surface, (0, 0, 255, 100), (self.trigger_range, self.trigger_range), self.trigger_range)

# Blit the new Surface with the semi-transparent circle onto the screen
# screen.blit(circle_surface, (adjusted_circ[0] - self.trigger_range, adjusted_circ[1] - self.trigger_range))

self.line_to_player = (adjusted_rect.center, adjusted_player_rect.center)

# pygame.draw.line(screen, self.color, *self.line_to_player, width=4)
pygame.draw.rect(screen, blue, adjusted_img_rect, 2, 1)
pygame.draw.rect(screen, green, adjusted_rect, 2, 1)

if self.player_in_alert_range:
self.color = red
elif self.state == "searching":
self.color = blue
else:
self.color = green

def check_collision_with_player(self, target):
distance = pygame.math.Vector2(target.center).distance_to(self.rect.center)

if self.health > 0:
if distance 

Подробнее здесь: [url]https://stackoverflow.com/questions/79141859/pygame-inherited-classes-acting-differently[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»