Anonymous
Pygame унаследовал классы, действующие по-другому
Сообщение
Anonymous » 30 окт 2024, 18:46
Я делаю школьный проект на 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]
1730303196
Anonymous
Я делаю школьный проект на Python и создал общий класс врагов, который затем будет унаследован всеми общими врагами. Я создал класс гоблинов, который наследует это, и он работает так, как ожидалось, поэтому я создал еще один для класса орков, который также наследует класс врага, но изображение орка перемещается в неправильное положение. Инициализация для обеих функций абсолютно одинакова, даже при использовании той же таблицы спрайтов, которую я пытался отладить, поэтому единственная разница - это имя класса, но проблема все еще существует. enemy.py: [code]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]