- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我用 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'
Google 搜索“LP_SDL_Surface”得到 0 (!) 个结果。
最佳答案
如果您使用较低级别的 SDL 方法(例如 sdl2.SDL_LoadBMP
),您将不得不处理 ctypes 转换、引用 (byref
) 和取消引用指针 ( .contents
, .value
).
因此对于特定问题,正如您已经评论过的那样,使用 print(image.contents.h)
就足够了。
pysdl2 (sdl2.ext
) 提供了一些更高级别的类和方法,但是,如果需要,它们可以为您完成大部分转换。下面的代码无需触及 ctypes 即可实现相同的目标:
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())
它还利用纹理渲染,使用硬件加速,而不是表面 block 传输(基于软件)。
最后,使用更高级别的 sdl2.ext
您还可以实例化类(而不是必须自己编写一个全新的 Sprite 类),如 sdl2.ext.sprite.TextureSprite
,并实现一个h
属性:
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]
关于python - SDL_Surface/LP_SDL_Surface 的 PySDL2 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18323908/
我用 python 3.3 和 PySDL2 0.5 运行 win7。创建曲面时(无论使用何种方法),我得到的是 LP_SDL_Surface 而不是 SDL_Surface。 LP_SDL_Surf
我是一名优秀的程序员,十分优秀!