PyGame Неверная позиция для Blit

Я создаю небольшой дизайнер уровней на Python (используя PyGame). Программа должна просто позволить вам разместить изображение, переключаться между изображениями, экспортировать в файл PNG и экспортировать путь и координаты изображения туда, где оно было размещено в текстовом документе. Я заставил все эти компоненты работать, но я застрял на одном последнем компоненте, а именно на чтении текстового документа обратно в PyGame и повторном размещении всех изображений в правильных местах с правильными спрайтами.

Текущий способ (который был переписан и Почти работает) выдает ошибку всякий раз, когда я пытаюсь прочитать из одного из экспортированных файлов.

Ошибка конечно:

stamped_surface.blit(image, (xcrds, ycrds))
TypeError: invalid destination position for blit

Вот мой код:

import pygame as pg
import threading
import time
import pygame
from random import *
from tkinter.filedialog import askopenfilename
from tkinter.filedialog import asksaveasfile
image_file = "../res/ExampleProject/TankGame/TankGameImg/tileGrass_transitionE.png"


f = open("../Saves/Backups/FailSafe.txt", "a+")
f.write("""
#################################################
#          PyEngine             #
#          FailSafe         #
#                File           #   
#       By MouseBatteries           #   
#################################################

""")


pg.init()

xcrds = 17
ycrds = 13
black = (0,0,0)
sw = 1280
sh = 720

screen = pg.display.set_mode((sw, sh))
pg.display.set_caption('thing')
image = pg.image.load(image_file).convert()

start_rect = image.get_rect()
image_rect = start_rect
running = True

stamped_surface = pg.Surface((sw, sh))




while running:
    event = pg.event.poll()
    keyinput = pg.key.get_pressed()

    # Escape Program
    if keyinput[pg.K_ESCAPE]:
        fname = "../Saves/Design_complete.png"

        pg.image.save(stamped_surface, fname)
        print("File saved at {} ".format(fname))
        quit()

    #Save Work In Project File
    if keyinput[pg.K_s]:
        fname = "../Saves/LevelSave.png"

        pg.image.save(stamped_surface, fname)
        print("File saved at {} ".format(fname))


    #Open New Selectable
    if keyinput[pg.K_n]:

        image_file = askopenfilename()
        image = pg.image.load(image_file).convert()
        print("Placable Updated!")


    if keyinput[pg.K_e]:

        fname = "../Saves/Export.png"

        pg.image.save(stamped_surface, fname)
        print("File saved at {} ".format(fname))
        pg.quit()


    #Recreate Terrain From File
    if keyinput[pg.K_o]:

        fileDest = askopenfilename()
        openFile = open(fileDest, "r")
        for line in openFile:
            li = line.strip()
            if li.startswith("Pec:"): #pec stands for "PyEngineCoords"
                reimgpath = (line.rstrip())
                nopecimgpath = reimgpath.replace("Pec:", "")
                print(nopecimgpath)
                image = pg.image.load(nopecimgpath).convert()
                pg.display.update()

            if li.startswith("Crdsx:"):
                xposcrds = (line.rstrip())
                xcrds = xposcrds.replace("Crdsx:", "")
                x = int(xcrds)
                print(x)
                pg.display.update()

            if li.startswith("Crdsy:"):
                yposcrds = (line.rstrip())
                ycrds = yposcrds.replace("Crdsy:", "")
                y = int(ycrds)
                print(y)
                pg.display.update()

                stamped_surface.blit(image, (xcrds, ycrds))



    elif event.type == pg.QUIT:
        running = False

    elif event.type == pg.MOUSEMOTION:
        image_rect = start_rect.move(event.pos)

    elif event.type == pg.MOUSEBUTTONDOWN:
        stamped_surface.blit(image, event.pos)
        print("Image Placed!")
        print(image_file, event.pos)
        f.write("\nPec:" + image_file + "\nCrdsx:")
        print(event.pos)

        xpos_str = str(pg.mouse.get_pos()[0])
        ypos_str = str(pg.mouse.get_pos()[1])

        f.write(xpos_str)
        f.write("\nCrdsy:")
        f.write(ypos_str)
        f.flush()



    screen.fill(black)
    screen.blit(stamped_surface, (0, 0))
    screen.blit(image, image_rect)
    pg.display.flip()

У этой программы есть файловая система и определенные элементы управления, чтобы все происходило, вот они:

См. также:  Работа с политиками безопасности в Compute Engine API в Python

ESC KEY — программа автоматического экспорта для справки и выхода из программы

Клавиша S — сохраняет поверхность как файл PNG.

Клавиша N — предлагает пользователю выбрать новый спрайт для использования.

Клавиша E — экспорт изображения в PNG с запросом файла

Клавиша O — открывает файл с данными координат и данными пути к изображению.

Образ корневой файловой системы: /wp-content/uploads/2018/11/53494553-im-1.png

A Несколько вещей, которые вы должны знать: Эта программа автоматически сохраняет каждую позицию файла в файл, который содержит координаты и пути к изображениям.

С файловой системой относительно просто работать, взглянув на код, но если вам нужна помощь, спросите.

Используйте print, чтобы распечатать xcrds и ycrds перед строкой, вызывающей исключение. Затем, когда возникает исключение, вы можете увидеть, какие значения неверны.   —  person Mouse Batteries    schedule 27.11.2018

@sloth все значения кажутся мне правильными .. i.imgur.com/BcNb3sH.png   —  person Mouse Batteries    schedule 28.11.2018

Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. Mouse Batteries

    blits ((source, dest, area), …)) -> (Rect, …) вам не хватает места назначения. Прочтите здесь

    А если вы используете координаты, используйте квадратные скобки [x-co, y-co] следующим образом:

    block.blit(image,[0,0])
    

    Вам не нужно использовать []s; на самом деле более эффективно за пределами Python 2 использовать ()s. person Mouse Batteries; 27.11.2018

    Это по-прежнему не работает, но если я изменю свой код на stamped_image(image, [0,0], используя статические INTS (я имею в виду INTS, которые никогда не изменятся), он работает и загружается во все изображения, за исключением того, что все они сложены друг на друга. Если я использую свои переменные (которые преобразуются в целые числа), это не сработает. Интересно. person Mouse Batteries; 27.11.2018

    @MouseBatteries Ваши цифры, вероятно, слишком велики, и они, вероятно, появляются за кадром. person Mouse Batteries; 27.11.2018

    @ wizzwizz4 Возможно. Но все изображения размещаются в том же пространстве отображения, в котором они были созданы. person Mouse Batteries; 28.11.2018

    @MouseBatteries Я не понимаю, что вы имеете в виду, говоря, что это не работает … person Mouse Batteries; 28.11.2018

    @ wizzwizz4 Не работает, как задумано, работает, но не правильно. Правильные изображения размещаются на экране, но не в правильном положении / с правильными координатами. person Mouse Batteries; 28.11.2018

    @MouseBatteries можешь поделиться скриншотом? person Mouse Batteries; 28.11.2018

    @HarshitAgrawal Да. Что бы вы хотели сделать на скриншоте? person Mouse Batteries; 29.11.2018

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: