2015-05-07 7 views
2
PySDL2 version: 0.9.3 
SDL2 version: 2.0.3 

Я пытаюсь сделать это изображение в качестве текстуры на полигоне в PySDL2 с помощью SDL_gfx(Py) SDL2: Рисунок текстурированного многоугольника

enter image description here

но его дисплей полностью искажен, как может можно увидеть в нижнем правом углу в окне СВД:

enter image description here

у меня есть this python program, в котором я проверяю аль l sdlgfx, которые я реализовал в a FrameBuffer class, который заботится о рисовании и рендеринге. Все они хорошо работают, за исключением сглаженного многоугольника (средний зеленый шестиугольник, но это другой вопрос в другое время) и текстурированный многоугольник.

Чтобы обеспечить более базовый сценарий, я следовал за этими шагами, чтобы нарисовать текстурированный полигон:

# 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() 

Это выше пример сценария просто выводит:

enter image description here

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

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

ответ

1

Я выяснил, что это всего лишь ошибка в базовой библиотеке sdl2_gfx на уровне C/DLL. Версия homebrew sdl2_gfx 1.0.0, а версия 1.0.1 (июнь 15 2014) уже выпущена. Я тестировал его на Windows и Ubuntu, на котором у меня был доступный sdl2_gfx 1.0.1, и текстурированный многоугольник рисуется правильно (хотя использование параметров смещения по-прежнему немного теневое для меня).

Итог: Не используйте sdl2_gfx 1.0.0, если вы хотите использовать текстурированные полигоны, так как он просто не работает. Попробуйте воспользоваться v1.0.1.

0

Ваша проблема заключается в отсутствии цикла цикла событий. TestEventProcessor не обрабатывает обновления на основе текстур, а чистые программные буферы. То, что вы хотите вместо этого, что-то вдоль линий:

## RENDER THE POLYGON WITH TEXTURE 
sdl2.sdlgfx.texturedPolygon(renderer.renderer, vx, vy, n,texture.surface, 0, 0) 

running = True 
while running: 
    events = sdl2.ext.get_events() 
    for event in events: 
     if event.type == sdl2.SDL_QUIT: 
      running = False 
      break 
    # Add some time step here 
    renderer.present() 

sdl2.ext.quit() 

Посмотрите на gfxdrawing.py пример для простой реализации.

+0

Спасибо за ваш ответ! К сожалению, я все еще получаю такое же искаженное отображение текстуры после реализации этого цикла событий. Странно, что отображение изображений и т. Д. Работает, так как я также полагаю, что это делается как рендеринг текстуры под капотом? –