#!python # -*- mode: python; Encoding: utf-8; coding: utf-8 -*- # Last updated: <2017/04/25 17:12:52 +0900> u""" PySDL2のテスト. SDL_Texture と SD_Renderer を使うと高速描画できるらしいので試す。 sdl2.ext を利用して、少しは行数が減るように書いてみる 動作確認環境: Windows10 x64 + Python 2.7.13 32bit版 + PySDL2 0.9.5 """ import sdl2 import sdl2.ext import math SCREEN_SIZE = (640, 480) # SCREEN_SIZE = (1280, 720) # リソース(画像等)の場所を指定 RESOURCES = sdl2.ext.Resources(__file__, "res") def main(): u"""メイン処理.""" # PySDL2 の初期化 sdl2.ext.init() # ウインドウを作成して表示。 window = sdl2.ext.Window("Hello World", size=SCREEN_SIZE) window.show() # ウインドウから renderer を取得。ウインドウ、インデックス、フラグを渡す。 # インデックスとフラグは省略可能。インデックスのデフォルト値は index=-1 # フラグのデフォルト値は flags=sdl2.SDL_RENDERER_ACCELERATED # fg = sdl2.SDL_RENDERER_PRESENTVSYNC | sdl2.SDL_RENDERER_ACCELERATED fg = sdl2.SDL_RENDERER_ACCELERATED renderer = sdl2.ext.Renderer(window, flags=fg) # テクスチャベースのスプライト、を作成できるクラス?、を生成 factory = sdl2.ext.SpriteFactory(sdl2.ext.TEXTURE, renderer=renderer) # スプライトを1つ生成。画像の読み込みも行う sprite = factory.from_image(RESOURCES.get_path("hello.png")) # スプライト描画用のrendererを生成 spriterenderer = factory.create_sprite_render_system(renderer) # テクスチャサイズを取得しておく w, h = sprite.size print("w,h = %d,%d" % (w, h)) ang = 0 interval = sdl2.SDL_GetPerformanceFrequency() / 60 oldtime = sdl2.SDL_GetPerformanceCounter() running = True while running: # メインループ # イベントを調べる # 閉じるボタンのクリック or ESCキーが押されたらメインループを終了 events = sdl2.ext.get_events() for event in events: if event.type == sdl2.SDL_QUIT: # 閉じるボタンがクリックされた running = False break if event.type == sdl2.SDL_KEYDOWN: # 何かのキーが押し下げられた if event.key.keysym.sym == sdl2.SDLK_ESCAPE: # ESCキーが押された running = False break # テクスチャの表示位置を算出。円運動をさせている rad = math.radians(ang) r = SCREEN_SIZE[0] / 6 x = int(r * math.cos(rad) + (SCREEN_SIZE[0] / 2) - (w / 2)) y = int(r * math.sin(rad) + (SCREEN_SIZE[1] / 2) - (h / 2)) ang = (ang + 3) % 360 # スプライトの表示位置を変更 sprite.position = x, y # 画面をクリア renderer.clear() # スプライトを描画 spriterenderer.render(sprite) # ループの時間待ち while True: if sdl2.SDL_GetPerformanceCounter() - oldtime >= interval: break sdl2.SDL_Delay(0) oldtime = sdl2.SDL_GetPerformanceCounter() # メインループ終了。色々なアレやソレを解放 sdl2.ext.quit() if __name__ == '__main__': main()