Спрайты мерцают при наличии двух или более объектов.Python

Программы на Python
Anonymous
Спрайты мерцают при наличии двух или более объектов.

Сообщение Anonymous »

У меня проблема с классом сущности. Ниже приведен скрипт для класса сущности:

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

import uuid, pyglet, random

class overworld_0001():

resources = {}

def __init__(self, engine, position, type_p, gender, **kwargs):
super(overworld_0001, self).__init__(**kwargs)
self.engine = engine

self.type_entity = "pk"
self.id = uuid.uuid4()
self.type_p = type_p
self.gender = gender

self.x = position[0]
self.y = position[1]
self.target_x = self.x
self.target_y = self.y
self.stat = "stand"
self.direction = 3
self.overworld = True

self.speed = engine.dict_pokemon["0001"]["overworld"]["speed"]

resource = engine.resouces["0001"]
self.resources["overworld"] = {}
if not type_p + "-" + gender in resource["overworld"]:
typ = resource["overworld"][type_p]
else:
typ = resource["overworld"][type_p + "-" + gender]
for stat in typ:
self.resources["overworld"][stat] = {}
for count in typ[stat]:
sprite = pyglet.sprite.Sprite(img=typ[stat][count], x=self.x, y=self.y)
sprite.target_x = self.target_x
sprite.target_y = self.target_y
self.resources["overworld"][stat][count] = sprite

self.current_sprite = self.resources["overworld"][self.stat][self.direction]
self.width = self.current_sprite.width
self.height = self.current_sprite.height
self.size = max(self.width, self.height)

def update(self, dt):
self.entity = self.engine.list_sprite_layers["3"]
if self.overworld:
self.update_overworld(dt)

def is_tile_free(self, x, y):
for entity in self.engine.list_sprite_layers["3"]:
if entity.id != self.id:
if (x < entity.x + entity.width and
x + self.width > entity.x and
y < entity.y + entity.height and
y + self.height > entity.y):
return False
return True

def update_overworld(self, dt):
if self.stat == "stand":
directions = {
0: (0, self.size),
1: (self.size, 0),
2: (-self.size, 0),
3: (0, -self.size)
}
possible_moves = []

for direction, (dx, dy) in directions.items():
new_x = self.x + dx
new_y = self.y + dy
if self.is_tile_free(new_x, new_y):
possible_moves.append((direction, new_x, new_y))

if possible_moves:
chosen_move = random.choice(possible_moves)
self.direction, self.target_x, self.target_y = chosen_move
self.stat = "run"
self.current_sprite.x = self.x
self.current_sprite.y = self.y
else:
self.stat = "stand"

if self.stat == "run":
if self.target_x != self.x:
direction_x = (self.target_x - self.x) / abs(self.target_x - self.x)
self.x += direction_x * self.speed * dt
if abs(self.target_x - self.x) < self.speed * dt:
self.x = self.target_x

if self.target_y != self.y:
direction_y = (self.target_y - self.y) / abs(self.target_y - self.y)
self.y += direction_y * self.speed * dt
if abs(self.target_y - self.y) <  self.speed * dt:
self.y = self.target_y

if self.x == self.target_x and self.y == self.target_y:
self.stat = "stand"
self.current_sprite.x = self.x
self.current_sprite.y = self.y

#self.current_sprite = self.resources["overworld"][self.stat][self.direction]
self.current_sprite.x = self.x
self.current_sprite.y = self.y

def on_draw(self):
self.current_sprite.draw()
Я знаю, что правила предписывают поместить скрипт с ошибкой, чтобы воспроизвести ее, и я хотел бы это сделать, но, к сожалению, не знаю, в чем заключается ошибка.
Как есть, работает и проблем нет: Изображение
Но если в update_overworld я вставляю self.current_sprite = self.resources["overworld" ][self.stat][self.direction] вот что я получаю: Изображение
Я не знаю, в чем ошибка, но предполагаю, что она могла быть быть двумя, это потому, что сущность работает, когда она одна, но когда я создаю две или более, она начинает делать то, что вы видите на изображении (и чем больше я создаю сущностей, тем хуже становится).
  • Или в инициализации, когда текстура, взятая из загруженных ресурсов, берется и преобразуется в спрайт, вместо создания одного спрайта каждая сущность разделяет спрайт и каждый объект изменяет данные других.
  • В функции update_overworld каждого объекта, помимо изменения самого себя, он также изменяет функции обновления_overworld каждого объекта. другие.
Эти две гипотезы приходят мне в голову, главным образом потому, что если сущность одна, проблема не возникает. Есть ли у вас какие-либо мнения или помощь? Я использую Pyglet 2.0.16 и Python 3.12

Подробнее здесь: https://stackoverflow.com/questions/788 ... e-entities

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