2013-08-19 1 views
4

Python 3.3 및 PySDL2 0.5로 win7을 실행하는 Im입니다. 표면을 만들 때 (어떤 방법이든 상관없이) 나는 SDL_Surface 대신 LP_SDL_Surface를 얻습니다. LP_SDL_Surface에는 사용자가 기대할 수있는 메소드 및 속성이 없습니다. 여기 documentation에서 예제 코드를 사용하여 문제 :SDL_Surface/LP_SDL_Surface의 PySDL2 문제

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 결과를 제공합니다.

+3

을 (http://stackoverflow.com/questions/1413851/expected-lp-c-double-instance-instead-of-c-double-array-python-ctypes-error) LP_ *는 ctypes이고 의미는 (long) 포인터 *. 이것을 실현하기 위해 파이썬 ctypes 문서를 확인한 후 이제 content 속성을 사용하여 서페이스 자체에 도달합니다. 그래서 나는 문제가 해결 된 것 같아요, 메신저 아직도 의도 된 동작이 확실하지. – user2697966

+0

솔루션에 대해 자세히 설명해 주시겠습니까? 나는이 문제를 또한 가지고있다. 'surface.contents'를 사용하면 널 포인터 액세스 오류가 발생합니다. –

+0

확신, 또는 더 나은, 내가 마커스 폰 Appen에서 얻은 설명을 참조하십시오 나는 SD 포럼에있어 : ​​http://forums.libsdl.org/viewtopic.php?t=9419 – user2697966

답변

1

당신은 낮은 수준의 SDL 방법으로 작업하는 경우 (예를 들어 sdl2.SDL_LoadBMP) 당신이 (.value.contents) (byref) 참조와 포인터의 역 참조,하는 ctypes 변환을 처리해야합니다.

특정 질문에 대해서는 이미 언급했듯이 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()) 

또한 (기반 소프트웨어) 대신 블리트 표면의 하드웨어 가속을 이용하여 텍스쳐 렌더링을 이용한다.

마지막으로, 당신은 또한 h 특성 sdl2.ext.sprite.TextureSprite처럼 (대신 완전히 새로운 스프라이트 클래스를 직접 작성하는 데의) 클래스를 인스턴스화하고 구현할 수 sdl2.ext 높은 수준을 사용 : 내가 [발견] 한

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]