Я создаю небольшой дизайнер уровней на 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()
У этой программы есть файловая система и определенные элементы управления, чтобы все происходило, вот они:
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
blits ((source, dest, area), …)) -> (Rect, …) вам не хватает места назначения. Прочтите здесь
А если вы используете координаты, используйте квадратные скобки [x-co, y-co] следующим образом:
Вам не нужно использовать
[]
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