PySDL2问题与SDL_Surface / LP_SDL_Surface

时间:2013-08-19 22:07:18

标签: python sdl geometry-surface pysdl2

我用python 3.3和PySDL2 0.5运行win7。在创建曲面时(无论采用何种方法),我得到的是LP_SDL_Surface而不是SDL_Surface。 LP_SDL_Surface缺少您期望它拥有的任何方法和属性。以下是使用documentation中的示例代码的问题:

import os
os.environ["PYSDL2_DLL_PATH"] = os.path.dirname(os.path.abspath(__file__))

import sys
import ctypes
from sdl2 import *

def main():
    SDL_Init(SDL_INIT_VIDEO)
    window = SDL_CreateWindow(b"Hello World",
                              SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
                              592, 460, SDL_WINDOW_SHOWN)
    windowsurface = SDL_GetWindowSurface(window)

    image = SDL_LoadBMP(b"exampleimage.bmp")
    SDL_BlitSurface(image, None, windowsurface, None)
    print(image.h)

    SDL_UpdateWindowSurface(window)
    SDL_FreeSurface(image)

    running = True
    event = SDL_Event()
    while running:
        while SDL_PollEvent(ctypes.byref(event)) != 0:
            if event.type == SDL_QUIT:
                running = False
                break

    SDL_DestroyWindow(window)
    SDL_Quit()
    return 0

if __name__ == "__main__":
    sys.exit(main())

并且追溯是:

Traceback (most recent call last):
File "C:/.../test.py", line 35, in <module>
sys.exit(main())
File "C:/.../test.py", line 17, in main
print(image.h)
AttributeError: 'LP_SDL_Surface' object has no attribute 'h'

谷歌搜索“LP_SDL_Surface”会带来0(!)结果。

1 个答案:

答案 0 :(得分:2)

如果使用较低级别的SDL方法(例如sdl2.SDL_LoadBMP),则必须处理ctypes转换,引用(byref)和解除引用指针(.contents,{{ 1}})。

对于具体问题,正如您已经评论过的那样,使用.value就足够了。

pysdl2(print(image.contents.h))提供了一些更高级别的类和方法,但是,如果需要,可以为您完成大部分转换。下面的代码实现了相同的目标,而无需触及ctypes:

sdl2.ext

它还使用纹理渲染,使用硬件加速,而不是表面blitting(基于软件)。

最后,使用更高级别import os os.environ["PYSDL2_DLL_PATH"] = os.path.dirname(os.path.abspath(__file__)) import sys import sdl2 import sdl2.ext def main(): sdl2.ext.init() window = sdl2.ext.Window( title="Hello World!", size=(592, 460), flags=sdl2.SDL_WINDOW_SHOWN, position=(sdl2.SDL_WINDOWPOS_CENTERED, sdl2.SDL_WINDOWPOS_CENTERED)) window.show() renderer = sdl2.ext.Renderer(window) factory = sdl2.ext.SpriteFactory(sdl2.ext.TEXTURE, renderer=renderer) spriterenderer = factory.create_sprite_render_system(window) image = factory.from_image("exampleimage.bmp") print(image.size[1]) # image.size = (w, h) running = True while running: for event in sdl2.ext.get_events(): if event.type == sdl2.SDL_QUIT: running = False break spriterenderer.render(image) sdl2.ext.quit() return 0 if __name__ == '__main__': sys.exit(main()) ,您还可以实例化类(而不必自己编写一个全新的精灵类),如sdl2.ext,并实现sdl2.ext.sprite.TextureSprite属性:< / p>

h