поверхность pygame обрезается посередине, несмотря на то, что она имеет тот же размер, что и экран

#python #pgzero

Вопрос:

 screen = pygame.display.set_mode((WIDTH,HEIGHT))
canvas = pygame.Surface((WIDTH,HEIGHT))
 
 def makefunnytiles(saice):
    global WIDTH
    global HEIGHT
    global screen
    global roomdata
    global tiledefinitions
    print("Baking Tiles")
    print(roomdata)
    index = 0
    index2 = 0
    for symbolic in saice:
        index2 = 0
        symbolic = symbolic.strip()
        print("sanity")
        for symbol in list(symbolic):
            print(symbol)
            if symbol in tiledefinitions:
                canvas.blit(pygame.image.load("sprites/"   str(roomdata['area'])   "/"   str(tiledefinitions[symbol])   ".png").convert_alpha(), ((32 * index2),(32 * index)))
            index2  = 1
        index  = 1
    screen.blit(canvas, (0,0))
    pygame.display.flip()
    print("drew screen")
    print(str(canvas.get_width))
 

У меня возникла проблема с этим, когда по какой-то причине холст обрывается в середине экрана.

Изображение отрезанного

Еще одна проблема, с которой я сталкиваюсь, заключается в том, что pgzrun.go() в конце файла происходит сбой программы с этой ошибкой:

 Traceback (most recent call last):
  File "C:UsersRushVisorDocumentsGlamoremain.py", line 100, in <module>
    pgzrun.go()
  File "E:Python39libsite-packagespgzrun.py", line 31, in go
    run_mod(mod)
  File "E:Python39libsite-packagespgzerorunner.py", line 113, in run_mod
    PGZeroGame(mod).run()
  File "E:Python39libsite-packagespgzerogame.py", line 217, in run
    self.mainloop()
  File "E:Python39libsite-packagespgzerogame.py", line 225, in mainloop
    self.reinit_screen()
  File "E:Python39libsite-packagespgzerogame.py", line 73, in reinit_screen
    self.mod.screen.surface = self.screen
AttributeError: 'pygame.Surface' object has no attribute 'surface'
 

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

Я ценю любую помощь, которую кто-либо может мне оказать.

ИЗМЕНИТЬ: Код здесь https://paste.pythondiscord.com/tetogequze.py

Комментарии:

1. Зачем иметь отдельную canvas поверхность? Просто побыстрее screen ?

2. Почему вы загружаете изображения каждый раз, когда переносите их на холст? Загрузите изображения отдельно в список или словарь и выделите их таким образом, иначе вы будете загружать их каждый раз, что не является правильным способом. Мы не можем помочь с другой проблемой, так как мы не видим вашего main.py файл.

3. Каков размер растровых изображений плитки (png)?

4. 32 пикселя также извините за код. paste.pythondiscord.com/tetogequze.py

Ответ №1:

Ошибка

 self.mod.screen.surface = self.screen
 

Переменная self.mod.screen должна быть объектом класса pygame.Поверхность. Объекты этого класса не имеют переменной с именем surface , AttributeError: 'pygame.Surface' object has no attribute 'surface' из-за которой, по-видимому, произошла ошибка.

Это должно решить проблему, если вы не хотите реализовывать дополнительный класс с атрибутом поверхности: self.mod.screen = self.screen . Но не забывайте , что это не копирует поверхность self.screen , если вы хотите, чтобы вам понадобилось что-то вроде этого: self.mod.screen = self.screen.copy() .

Прокрутка

Ваша идея-один из возможных способов реализации прокрутки. Еще один-это то, что вы храните какое-то происхождение и уничтожаете плитки на основе того, что. Если вы теперь хотите прокрутить, вам просто нужно изменить этот источник, который вы определили ранее.

Определение происхождения

 origin = [10,10]  # or use pygame.math.Vector2 or something else
 

Блит-код

 index = 0
index2 = 0
for symbolic in saice:
    index2 = 0
    symbolic = symbolic.strip()
    print("sanity")
    for symbol in list(symbolic):
        print(symbol)
        if symbol in tiledefinitions:
            screen.blit(pygame.image.load("sprites/"   str(roomdata['area'])   "/"   str(tiledefinitions[symbol])   ".png").convert_alpha(), ((32 * index2) origin[0],(32 * index) origin[1]))
        index2  = 1
    index  = 1
 

Теперь вам просто нужно вызывать код blit один раз в каждом кадре. Если теперь вы хотите прокрутить, просто сделайте что-то вроде этого: origin[0] = 10 (чтобы переместить все символы вправо)

Приведенный выше blit-код не самый быстрый, так как он должен загружать все изображения на каждый кадр, но это только пример того, как прокрутка может работать с этой другой идеей

РЕДАКТИРОВАТЬ: Я не очень хорошо знаком с Pygame-Zero, так что это просто основано на том, что я знаю о стандартной Pygame.