首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SDL_Surface / LP_SDL_Surface的PySDL2问题

SDL_Surface / LP_SDL_Surface的PySDL2问题
EN

Stack Overflow用户
提问于 2013-08-20 06:07:18
回答 1查看 1.6K关注 0票数 5

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

代码语言:javascript
复制
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())

回溯是:

代码语言:javascript
复制
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 (!)结果。

EN

回答 1

Stack Overflow用户

发布于 2016-12-20 13:30:27

如果你使用较低级别的SDL方法(例如sdl2.SDL_LoadBMP),你将不得不处理ctype转换、引用(byref)和取消引用指针(.contents.value)。

因此,对于特定的问题,正如您已经评论的那样,使用print(image.contents.h)就足够了。

但是,如果需要,pysdl2 (sdl2.ext)提供了一些更高级别的类和方法,它们可以为您完成大多数转换。下面的代码实现了相同的目标,而不需要接触ctype:

代码语言:javascript
复制
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一样实例化类(而不是自己编写一个全新的sprite类),并实现一个h属性:

代码语言:javascript
复制
class TextureSprite(sdl2.ext.TextureSprite):

    @property
    def h(self):
        """The height of the TextureSprite."""
        return self.size[1]

    @property
    def w(self):
        """The width of the TextureSprite."""
        return self.size[0]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18323908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档