PySDL2 version: 0.9.3
SDL2 version: 2.0.3
Я пытаюсь отобразить это изображение как текстуру на многоугольнике в PySDL2, используя sdl_gfx.
но его отображение полностью искажено, как видно в правом нижнем углу в окне SDL:
У меня есть эта программа на Python, в которой я тестирую все функции рисования sdlgfx, которые Я реализовал в класс FrameBuffer, который заботится о рисовании и рендеринг. Все они работают хорошо, за исключением сглаженного полигона (средний зеленый шестиугольник, но это другой вопрос, в другой раз) и текстурированного полигона.
Чтобы предоставить более простой сценарий, я выполнил следующие шаги, чтобы нарисовать текстурированный многоугольник:
# Initialize SDL2 and window
import sdl2
import sdl2.ext
import sdl2.sdlgfx
import ctypes
sdl2.ext.init()
window = sdl2.ext.Window(size=(800,600))
window.show()
# Create renderer and factories
renderer = sdl2.ext.Renderer(window)
renderer.clear(0)
renderer.present()
# Create sprite factory to create textures with later
texture_factory = sdl2.ext.SpriteFactory(renderer=renderer)
# Create sprite factory to create surfaces with later
surface_factory = sdl2.ext.SpriteFactory(sdl2.ext.SOFTWARE)
# Determine path to image to use as texture
RESOURCES = sdl2.ext.Resources(__file__, "LSD/resources")
image_path = RESOURCES.get_path("Memory.jpeg")
# set polygon coordinates
x = 100
row4 = 470
vx = [x, x+200, x+200, x]
vy = [row4-50, row4-50, row4+50, row4+50]
# Calculate the length of the vectors (which should be the same for x and y)
n = len(vx)
# Make sure all coordinates are integers
vx = map(int,vx)
vy = map(int,vy)
# Cast the list to the appropriate ctypes vectors reabable by
# the sdlgfx polygon functions
vx = ctypes.cast((sdl2.Sint16*n)(*vx), ctypes.POINTER(sdl2.Sint16))
vy = ctypes.cast((sdl2.Sint16*n)(*vy), ctypes.POINTER(sdl2.Sint16))
# Load the image on an SoftwareSprite
# The underlying surface is available at SoftwareSprite.surface
texture = surface_factory.from_image(image_path)
## RENDER THE POLYGON WITH TEXTURE
sdl2.sdlgfx.texturedPolygon(renderer.renderer, vx, vy, n,\
texture.surface, 0, 0)
# Swap buffers
renderer.present()
# Handle window close events
processor = sdl2.ext.TestEventProcessor()
processor.run(window)
sdl2.ext.quit()
Этот приведенный выше пример сценария просто выводит:
Я считаю, что работать с SDL2 с преобразованиями ctype и всем остальным довольно сложно, и я очень рад, что продвинулся так далеко, но, похоже, мне не удается решить эту проблему самостоятельно. Кто-нибудь знает, на каком этапе я делаю ошибку, или кто-нибудь может указать мне правильное направление?
В качестве примечания я знаю, что PySDL имеет фабричные функции для рендеринга изображений, и они работают очень хорошо, но я действительно хочу, чтобы опция текстурирования полигонов тоже работала.