pyglet

クロスプラットフォームのゲーム開発等用ライブラリ

参考Webサイト

テキストの表示

   1 import pyglet
   2 
   3 window = pyglet.window.Window()
   4 l_text = u'こんにちは世界'
   5 label = pyglet.text.Label(l_text, font_name='vlgothic', font_size=36,
   6                           x=window.width/2, y=window.height/2,
   7                           anchor_x='center', anchor_y='center')
   8 # x/y はテキストのウィンドウ内表示位置(anchor_x/anchor_yでテキスト内位置と関連付けられる)
   9 
  10 @window.event
  11 def on_draw():
  12     window.clear()
  13     label.draw()
  14 
  15 pyglet.app.run()
  16 

   1 import pyglet
   2 
   3 window = pyglet.window.Window()
   4 
   5 l_text = u'<font face="vlgothic" color="#00FF00">さようなら言葉</font>'
   6 label = pyglet.text.HTMLLabel(l_text,
   7                           x=window.width/2, y=window.height/2,
   8                           anchor_x='center', anchor_y='center')
   9 # HTML 4.01準拠の書式タグが使える
  10 
  11 @window.event
  12 def on_draw():
  13     window.clear()
  14     l.draw()
  15 
  16 pyglet.app.run()
  17 

   1 import pyglet
   2 
   3 window = pyglet.window.Window(style=pyglet.window.Window.WINDOW_STYLE_BORDERLESS)
   4 l_deco = """
   5 {font_name 'vlgothic'}{color (255, 0, 0, 170)}
   6 I am the bone of my sword. 
   7 
   8 Steel is my body,and fire is my blood. 
   9 
  10 I have created over a thousand blades.
  11 
  12 Unknown to Death.
  13 
  14 Nor known to Life.
  15 
  16 Have withstood pain to create many weapons.
  17 
  18 Yet,those hands will never hold anything.
  19 
  20 So as I pray,unlimited blade works.
  21 """
  22 
  23 document = pyglet.text.decode_attributed(l_deco)
  24 # 書式化されたテキストからDocument生成
  25 layout = pyglet.text.layout.TextLayout(document, width=window.width, height=window.height, multiline=True)
  26 # DocumentからLayout生成(描画はLayoutが行う)
  27 layout.x = 10
  28 layout.y = -10
  29 # Layoutの微妙な調整
  30 
  31 @window.event
  32 def on_draw():
  33     window.clear()
  34     layout.draw()
  35 
  36 pyglet.app.run()
  37 

画像の表示

   1 import pyglet
   2 
   3 window = pyglet.window.Window()
   4 image = pyglet.resource.image('gazou.jpg')
   5 # 画像リソースの読み込み
   6 
   7 # image = pyglet.image.load('gazou.jpg')
   8 # 画像ファイルの読み込み
   9 
  10 # image_stream = open('gazou.jpg', 'rb')
  11 # image = pyglet.image.load('gazou.jpg', file=image_stream)
  12 # 画像をファイルストリームとして読み込み
  13 
  14 # image_part = image.get_region(x=10, y=10, width=100, height=100)
  15 # 左下(10, 10)から(100, 100)の長方形に画像を切り取り
  16 
  17 @window.event
  18 def on_draw():
  19     window.clear()
  20     image.blit(0, 0)
  21     # 読み込んだ画像をウィンドウ位置(0, 0)から流し込む(転送する)
  22 
  23 pyglet.app.run()
  24 

   1 import pyglet
   2 
   3 window = pyglet.window.Window()
   4 
   5 image = pyglet.image.load('gazou.jpg')
   6 sprite = pyglet.sprite.Sprite(image)
   7 # 画像をスプライトに変換
   8 
   9 @window.event
  10 def on_draw():
  11     window.clear()
  12     sprite.draw()
  13     # スプライトを表示
  14 
  15 pyglet.app.run()
  16 

   1 import pyglet
   2 
   3 window = pyglet.window.Window()
   4 
   5 image = pyglet.image.load('gazou.jpg')
   6 
   7 image.save('image2.png')
   8 # 画像を保存
   9 
  10 # image_stream = open('image.png', 'wb')
  11 # image.save('image2.png', file=image_stream)
  12 # 画像をファイルストリームとして書き込み
  13 
  14 # pyglet.image.get_buffer_manager().get_color_buffer().save('screenshot.png')
  15 # Windowのスクリーンショットを画像として保存する
  16 
  17 pyglet.app.run()
  18 

音声/動画の再生

   1 import pyglet
   2 
   3 music = pyglet.resource.media('piano.ogg')
   4 # music = pyglet.media.load('piano.ogg')
   5 print music.duration
   6 # 音声ファイルの長さ(秒)
   7 music.play()
   8 
   9 pyglet.app.run()
  10 

   1 import pyglet
   2 
   3 music1 = pyglet.media.load('piano.ogg')
   4 music2 = pyglet.media.load('piano.ogg')
   5 
   6 player = pyglet.media.Player()
   7 # Playerの生成
   8 player.queue(music1)
   9 player.queue(music2)
  10 # Playerの再生キューに追加
  11 player.play()
  12 # 再生
  13 # player.pause()
  14 # 一時停止
  15 # player.next()
  16 # 次のメディアへ
  17 # player.seek(1.0)
  18 # メディア内の指定位置(秒)にシーク
  19 
  20 pyglet.app.run()
  21 

   1 import pyglet
   2 
   3 window = pyglet.window.Window()
   4 
   5 video = pyglet.media.load('douga.avi')
   6 print video.duration
   7 # 動画ファイルの長さ(秒)
   8 print video.video_format.width
   9 # 動画ファイルの横幅
  10 print video.video_format.height
  11 # 動画ファイルの縦幅
  12 
  13 player = pyglet.media.Player()
  14 player.queue(video)
  15 
  16 @window.event
  17 def on_draw():
  18     player.play()
  19     player.get_texture().blit(0, 0)
  20     # 動画内の音声を再生しながらWindowにテクスチャ(動画画像)を流す
  21 
  22 pyglet.app.run()
  23 

OpenGLを活用する

参考Webサイト

Platform/Display/Screenの取得

   1 >>> import pyglet
   2 >>> platform = pyglet.window.get_platform()
   3 >>> platform
   4 <pyglet.window.xlib.XlibPlatform object at 0x835532c>
   5 # Platformは複数のDisplayを管理する(常に1つ)
   6 >>> display = platform.get_default_display()
   7 >>> display
   8 <pyglet.window.xlib.XlibDisplayDevice object at 0x834a1ec>
   9 # DisplayはScreenを管理し、複数あり得る(ディスプレイデバイスと同一の解釈で可)
  10 >>> for screen in display.get_screens():
  11 ...  print screen
  12 ... 
  13 XlibScreen(screen=0, x=0, y=0, width=1024, height=768, xinerama=1)
  14 XlibScreen(screen=0, x=0, y=0, width=1024, height=768, xinerama=1)
  15 # 1つのDisplayには複数のScreenがあり得る
  16 # ノートPCにディスプレイを繋ぎ、クローンディスプレイにしているためscreenナンバは同じ
  17 >>> screen = display.get_default_screen()
  18 >>> screen
  19 XlibScreen(screen=0, x=0, y=0, width=1024, height=768, xinerama=1)
  20 

Config/Context

   1 >>> config = pyglet.gl.Config(alpha_size=8)
   2 >>> window = pyglet.window.Window(config=config)
   3 # アルファチャネルが8のWindowの(Configを用いた)生成
   4 

   1 >>> platform = pyglet.window.get_platform()
   2 >>> display = platform.get_default_display()
   3 >>> screen = display.get_default_screen()
   4 >>> template = pyglet.gl.Config(alpha_size=8)
   5 # alpha_size以外のConfigの値はNone
   6 >>> config = screen.get_best_config(template)
   7 # Templateを用いた完全なConfigの生成
   8 # alpha_size以外のConfigの値はbuffer_size=32, red_size=green_size=blue_size=8, 他が0
   9 >>> context = config.create_context(None)
  10 # ConfigからContextを生成
  11 >>> window = pyglet.window.Window(context=context)
  12 # アルファチャネルが5のWindowの(Contextを用いた)生成
  13 

OpenGLのAPI

glVertex{n}{t}という命名規則: {n}は引数の数(2~4)、{t}は引数の型(d=double、f=float、i=int、s=short、v=配列)

   1 import pyglet
   2 
   3 window = pyglet.window.Window()
   4 
   5 @window.event
   6 def on_draw():
   7     pyglet.gl.glClear(pyglet.gl.GL_COLOR_BUFFER_BIT)
   8     # クリアする対象バッファを指定してクリア
   9     pyglet.gl.glLoadIdentity()
  10     # 単位行列の設定
  11     pyglet.gl.glBegin(pyglet.gl.GL_TRIANGLES)
  12     # 三角形を描くことを指示して描画開始
  13     pyglet.gl.glVertex2f(0, 0)
  14     # Windowの左下
  15     pyglet.gl.glVertex2f(window.width, 0)
  16     # Windowの右下
  17     pyglet.gl.glVertex2f(window.width, window.height)
  18     # Windowの右上
  19     pyglet.gl.glEnd()
  20     # 描画終了
  21 
  22 pyglet.app.run()
  23 

   1 import pyglet
   2 
   3 window = pyglet.window.Window()
   4 
   5 @window.event
   6 def on_draw():
   7     pyglet.graphics.draw(4, pyglet.gl.GL_LINES,
   8                          ('v2i', (100, 100, 150, 100, 150, 150, 200, 200))
   9                          )
  10     # 線を描く(頂点数, 基本命令モード, 頂点書式, 頂点タプル)
  11     pyglet.graphics.draw(3, pyglet.gl.GL_TRIANGLES,
  12                          ('v2i', (200, 200, 250, 200, 250, 250))
  13                          )
  14     # 三角形を描く
  15     vertex_list = pyglet.graphics.vertex_list(2,
  16                                               ('v2i', (300, 315, 330, 335))
  17                                               )
  18     # 頂点リストを生成
  19     vertex_list.draw(pyglet.gl.GL_LINE_LOOP)
  20     # 頂点リストから線を描く
  21     batch = pyglet.graphics.Batch()
  22     # 描画バッチ生成
  23     vertex_list = batch.add(3, pyglet.gl.GL_TRIANGLE_FAN, None,
  24                             ('v2i', (400, 400, 430, 400, 430, 450)),
  25                             )
  26     # 描画する命令をバッチに追加
  27     batch.draw()
  28     # バッチ内の命令をまとめて描画
  29 
  30 pyglet.app.run()
  31 

キーボードとマウスイベント

   1 import pyglet
   2 
   3 window = pyglet.window.Window()
   4 
   5 @window.event
   6 def on_key_press(symbol, modifiers):
   7 # キーコードと修飾キーコードを取る
   8     if symbol == pyglet.window.key.A:
   9         print '"A" was pressed'
  10     elif symbol == pyglet.window.key.SPACE:
  11         print '"Space" was pressed'
  12     else:
  13         print str(symbol) + " was pressed"
  14 
  15 @window.event
  16 def on_text(text):
  17 # Unicodeテキストの連続入力イベント
  18     pass
  19 
  20 @window.event
  21 def on_text_motion(motion):
  22 # テキスト入力のカーソル動作を意図
  23     pass
  24 
  25 @window.event
  26 def on_mouse_press(x, y, button, modifiers):
  27 # マウスボタンが押された位置(x, y)とボタンコード、修飾キーコードを取る
  28     if button == pyglet.window.mouse.LEFT:
  29         print "Left mouse button was pressed"
  30     else:
  31         print str(button) + " was pressed"
  32 
  33 @window.event
  34 def on_mouse_motion(x, y, dx, dy):
  35 # マウスの移動
  36     pass
  37 
  38 @window.event
  39 def on_mouse_drag(x, y, dx, dy, buttons, modifiers):
  40 # マウスドラッグ
  41     pass
  42 
  43 @window.event
  44 def on_mouse_enter(x, y):
  45 # Window内にマウスが入る
  46     pass
  47 
  48 @window.event
  49 def on_mouse_leave(x, y):
  50 # Window外にマウスが出る
  51     pass
  52 
  53 @window.event
  54 def on_mouse_scroll(x, y, scroll_x, scroll_y):
  55 # マウスホイール
  56     pass
  57 
  58 @window.event
  59 def on_draw():
  60     window.clear()
  61 
  62 pyglet.app.run()
  63 

Window

   1 import pyglet
   2 
   3 platform = pyglet.window.get_platform()
   4 display = platform.get_default_display()
   5 screens = display.get_screens()
   6 window = pyglet.window.Window(fullscreen=True, screen=screens[1])
   7 # フルスクリーンのWindowを生成/表示
   8 
   9 # window = pyglet.window.Window(screen=screens[1])
  10 # window.set_fullscreen(True)
  11 # Windowを生成してからフルスクリーンに設定
  12 
  13 pyglet.app.run()
  14 

   1 import pyglet
   2 
   3 platform = pyglet.window.get_platform()
   4 display = platform.get_default_display()
   5 screens = display.get_screens()
   6 window = pyglet.window.Window(width=800, height=600)
   7 # デフォルトは640x480、リサイズ不可
   8 
   9 # window = pyglet.window.Window()
  10 # window.set_size(800, 600)
  11 # Window生成後にサイズを設定
  12 
  13 window.set_minimum_size(320, 200)
  14 # Windowの最小サイズを設定
  15 window.set_maximum_size(1024, 768)
  16 # Windowの最大サイズを設定
  17 
  18 window.set_location(20, 20)
  19 # Windowの位置を設定(スクリーン左上が(0, 0))
  20 
  21 pyglet.app.run()
  22 

   1 import pyglet
   2 
   3 platform = pyglet.window.get_platform()
   4 display = platform.get_default_display()
   5 screens = display.get_screens()
   6 window = pyglet.window.Window(resizable=True)
   7 # ユーザによるリサイズ可能なWindow
   8 
   9 @window.event
  10 def on_resize(width, height):
  11     print 'The window was resized to %dx%d' % (width, height)
  12 # Windowのリサイズでイベント発生
  13 
  14 pyglet.app.run()
  15 

   1 import pyglet
   2 
   3 platform = pyglet.window.get_platform()
   4 display = platform.get_default_display()
   5 screens = display.get_screens()
   6 
   7 window = pyglet.window.Window(caption=u'僕はウィンドウ')
   8 # Windowのキャプション設定
   9 
  10 # window.set_caption(u'僕はウィンドウ')
  11 # Window生成後にキャプション設定
  12 
  13 pyglet.app.run()
  14 

スケジューリング

   1 import pyglet
   2 
   3 def update_interval(dt):
   4     print "Lan",
   5 pyglet.clock.schedule_interval(update_interval, 0.1)
   6 # 0.1秒毎に関数update_intervalを実行
   7 
   8 def update(dt):
   9     print "Run", 
  10 pyglet.clock.schedule(update)
  11 # Displayフレッシュレートで関数updateを実行
  12 
  13 def update_once(dt):
  14     print "Hi!"
  15     pyglet.app.exit()
  16 pyglet.clock.schedule_once(update_once, 3.0)
  17 # 3.0秒後に関数update_onceを実行
  18 
  19 pyglet.app.run()
  20 


CategoryProgramming CategoryPython

pyglet (last edited 2008-09-26 13:46:01 by yoshiyasu)