Pygame: спрайты рисуют только последний из трех объектов - PullRequest
1 голос
/ 07 апреля 2020

Я пытаюсь создать сценический конструктор, который облегчит разработку добавления объектов, индивидуальной проверки их столкновения и т. Д. Для каждого отдельного объекта, я добавляю код.

Моя идея заключается в том, помещать объекты в группы и получать их данные из JSON данных. Хотя казалось, что он работает от сбора и размещения данных, как я кодировал, он просто хочет нарисовать самый последний объект там. То есть, если бы у меня было

100 объектов с соответствующими данными в *, будет вытянут только 100-й объект. *1003*

В этом случае я, конечно, хочу, чтобы все 99-е другие объекты были также drawled.

Из кода, который я разместил ниже, я проверил в заявлении на печать, что я действительно получил данные трех объектов, ''. Это должно означать, что сами данные JSON не являются проблемой.

Если мне нужно угадать, я думаю, что проблема заключается в преобразовании отдельных лиц и добавлении их в группы (); Может быть проблема с функцией StartHorizontObjectRepeats ().

Вот минимальный воспроизводимый код, воссозданный из моей основной программы.

Коды:

main.py

import pygame
from settings import StartupSettings
import mechanic as m
from object import HorizontalObject
from pygame.sprite import Group

if __name__ == "__main__":
    pygame.init()
    Settings = StartupSettings()

    Objects = HorizontalObject(Settings.screen)
    Objects = Group()

    m.HorizontalObjectRepeats(Settings.screen, Objects)

    while True:
        m.Refresh(Settings, Objects)

settings.py

import pygame

class StartupSettings():
    def __init__(self):
        self.screen = pygame.display.set_mode((800,600))
        self.background = [70,70,70]

object.py

import pygame
from pygame.sprite import Sprite

class HorizontalObject(Sprite):
    def __init__(self, screen):
        super().__init__()

        self.screen = screen
        self.screen_rect = self.screen.get_rect()

        self.image = pygame.image.load('img_test_object.png')
        self.rect = self.image.get_rect()

mechani c .py

import pygame
import json
from object import HorizontalObject

def HorizontalObjectRepeats(screen, ObjectExport):
    '''Initates the repeats of given horizontal test objects.'''
    NumberOfObjects = ReadJSONFileGeneral(1)
    for PlacementsofObjects in range(NumberOfObjects):
        StartHorizontalObjectRepeats(screen, ObjectExport, NumberOfObjects)

def StartHorizontalObjectRepeats(screen, ObjectExport, NumberOfObjects):
    '''Starts the repeat.'''
    Object = HorizontalObject(screen)

    for i in range(NumberOfObjects):
        Object.rect = ReadJSONFileObject(0, i)

    ObjectExport.add(Object)
    print(ObjectExport)

def StageBuilderTemplate(templateKeycode):
    '''Template data when starting out the stage builder.'''
    dictObjects = {"HorizontalObjectsData": {0: (50, 50, 308, 76), 1: (100, 100, 308, 76), 2: (150, 150, 308, 76)}}
    dictGeneral = {"BackgroundColor": (255, 0, 255), "HorizontalObjects": len(dictObjects["HorizontalObjectsData"].keys())}

    if templateKeycode == 0:
        return dictGeneral        
    elif templateKeycode == 1:
        return dictObjects

def CreateJSONFile(jsonCreationKeycode):
    '''Dumps data to the specified json based on the sented keycode.'''
    if jsonCreationKeycode == 0:
        with open('General.json', 'w') as f:
            json.dump(StageBuilderTemplate(0), f)
    elif jsonCreationKeycode == 1:
        with open('Object.json', 'w') as f:
            json.dump(StageBuilderTemplate(1), f)     

def ReadJSONFileObject(keycode, Repeats):
    '''Attempts to read Object.json file. It will create Object.json
    if it does not exist.

    After reading and extracting the entire data from Object.json,
    it will sent on specific data based on the sented keycode.'''
    try:
        with open("Object.json", 'r') as f:
            data = json.load(f)

            if keycode == 0:
                return data["HorizontalObjectsData"].get(str(Repeats))
    except FileNotFoundError:
        CreateJSONFile(1)

def ReadJSONFileGeneral(jsonGeneralKeycode):
    '''Attempts to read General.json file. It will create General.json
    if it does not exist.

    After reading and extracting the entire data from General.json,
    it will sent on specific data based on the sented keycode.'''
    try:
        with open("General.json", 'r') as f:
            data = json.load(f)

            if jsonGeneralKeycode == 0:
                return data.get('BackgroundColor')
            elif jsonGeneralKeycode == 1:
                return data.get('HorizontalObjects')
    except FileNotFoundError:
            CreateJSONFile(0)

def Refresh(Settings, Objects):
    '''Updates the screen'''
    Settings.screen.fill(Settings.background)
    Objects.draw(Settings.screen)
    pygame.display.flip()

General. json

{"BackgroundColor": [255, 0, 255], "HorizontalObjects": 3}

Объект. json

{"HorizontalObjectsData": {"0": [50, 50, 308, 76], "1": [100, 100, 308, 76], "2": [150, 150, 308, 76]}}

Изображение объекта:

Object Image

Выход:

Output

Примечания:

  • Я понимаю, что для создания новых файлов JSON, в частности General. json, придется cra sh один раз, прежде чем программа вернется в нормальное состояние. Это не связано с этой текущей проблемой, о которой я прошу помощи.
  • Для вывода (не отвечает) также не может быть связано, так как у меня нет такого похожего вхождения на моей главной программа.

Ответы [ 2 ]

3 голосов
/ 07 апреля 2020

В функции StartHorizontalObjectRepeats, когда вы получаете прямоугольник для объекта, вы пропускаете oop через все объекты и получаете прямоугольник, то есть все они имеют одинаковый прямоугольник и находятся в одном и том же месте.

Чтобы исправить это:

def HorizontalObjectRepeats(screen, ObjectExport):
    '''Initates the repeats of given horizontal test objects.'''
    NumberOfObjects = ReadJSONFileGeneral(1)
    for PlacementsofObjects in range(NumberOfObjects):
        StartHorizontalObjectRepeats(screen, ObjectExport, PlacementsofObjects) #changed the last parameter

def StartHorizontalObjectRepeats(screen, ObjectExport, objNum):
    '''Starts the repeat.'''
    Object = HorizontalObject(screen)

    Object.rect = ReadJSONFileObject(0, objNum) # get the nth objects rect

    ObjectExport.add(Object)
0 голосов
/ 07 апреля 2020

В первой функции в mechani c .py первая функция имеет диапазон для l oop в диапазоне (бла), который вызывает вторую функцию, которая снова выполняет циклы в диапазоне (бла) и на основании вашего описания isn ' Реализовано правильно. Можете ли вы получить только один из json файлов для отображения отдельно? Я попытался бы начать с этого, и как только у вас все заработает, реализация новых функций будет завершена. И оттуда постарайтесь выяснить, использовать ли классы и спрайты

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...