Я 17-летний программист, пытаюсь запрограммировать изометрическую игру на питоне с помощью pygame. После завершения тайлового движка, работающего с не очень красивыми PNG-файлами, нарисованными с помощью GIMP, я подумал, можно ли будет визуализировать некоторые тайлы по текстуре. Я надеюсь, что предоставил все, что нужно, чтобы понять, в чем моя проблема, и, пожалуйста, извините мой не идеальный английский.
Просто то, что я хочу сделать, это создать изображение шириной 128 на 128 пикселей изометрической плитки, используя следующее изображение в качестве текстуры для всех трех сторон блока:
(Ссылки здесь, потому что мне еще не разрешено вставлять изображения, так как это мой первый пост)
Чтобы лучше объяснить, что я пытаюсь сделать, я нарисовал эту маленькую картинку:
Я уже порылся в интернете около 2 часов и так и не пришел к решению, кроме верхней части Плитки, вот что я уже получил в Коде:
Это модуль обработки изображений, метод transformToRightPart(), в котором мне нужна помощь:
import pygame
class Image(object):
'''
Use this Module to create Tiles by Texture to use them later in the Tileengine.
It is important to run pygame.init() before creating objects of this class!
Contains unfinished Elements!
'''
def __init__(self, path):
self.loadFromPath(path)
def getIMG(self):
assert self.originalIMG is not None, "No picture to return"
if not self.IMG == None:
return self.IMG
else:
return self.originalIMG
def loadFromPath(self, path):
'''
Don't do convert() or convert_alpha() here,
as Objects of this class are created during the loading process,
with no pygame.display() created.
'''
self.originalIMG = pygame.image.load(path)
self.IMG = None
def transformToTopPart(self):
'''
Transforms the loaded Image to the Top Part of an Isometric Tile, with the Dimensions 2:1,
said in Pixels: 128 px Width by 64 px Height.
'''
self.IMG = pygame.transform.rotate(self.originalIMG, 45)
self.IMG = pygame.transform.scale(self.IMG, (128, 64))
def transformToRightPart(self):
'''
TODO!! Don't ask how (X.X)
Transforms the loaded Image to the right Part of an Isometric Tile.
'''
assert False, "This method isn't finished, try something different ;)"
def transformToLeftPart(self):
'''
Transforms the loaded Image to the left Part of an Isometric Tile.
Due to the nice geometric fact, that the shape of the left part,
is just the flipped right part shape and we don't lose quality by flipping,
we do this little trick, to enshorten the code.
'''
self.originalIMG = pygame.transform.flip(self.originalIMG, True, False)
self.transformToRightPart()
self.IMG = pygame.transform.flip(self.IMG, True, False)
self.originalIMG = pygame.transform.flip(self.originalIMG, True, False)
А это модуль, который создает окно с тайлом для рендеринга:
import pygame, sys
from ImageManipulation import Image
from pygame.locals import *
if __name__ == '__main__':
pygame.init()
FPS=20
fpsClock = pygame.time.Clock()
picture = Image("Stone_Floor_texture.png")
picture.transformToTopPart()
DISPLAY = pygame.display.set_mode((400,400),0,32)
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
DISPLAY.blit(picture.getIMG(),(0,0))
pygame.display.update()
fpsClock.tick(FPS)
Вывод кода выглядит так:
Я пытаюсь добиться того, чтобы это выглядело примерно так:
[render sprite]
что вам нужно знать, чтобы понять код, это то, что:ptxr[y][x]
это пиксель вx,y
в текстуре иpspr[y][x]
это пиксель вx,y
в спрайте ... я перебираю все пиксели в текстуре вычисляя соответствующие координаты в спрайте и скопируйте пиксель, это все .... вы также можете добавить немного освещения, чтобы улучшить 3D-вид - person Spektre   schedule 20.06.2017