pyglet
クロスプラットフォームのゲーム開発等用ライブラリ
Contents
参考Webサイト
pyglet プログラミングガイド(自作翻訳)
テキストの表示
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
