写真の描写

写真の描写をします.
これはゲーム作成の際に非常に重要です.
背景やキャラクターを思うように扱うことができます.


import pygame
from pygame.locals import *
import sys

SCREEN_SIZE = (1000, 750)

pygame.init()
screen = pygame.display.set_mode(SCREEN_SIZE)
pygame.display.set_caption("イメージの描画")

# イメージを用意
backImg = pygame.image.load("hakusuiko.jpg").convert() #背景
pythonImg2 = pygame.image.load("kappa2.png").convert()
colorkey = pythonImg2.get_at((0,0))  # 左上の色を透明色に
pythonImg2.set_colorkey(colorkey, RLEACCEL)
pythonImg3 = pygame.image.load("kappa2.png").convert()
colorkey = pythonImg3.get_at((0,0))  # 左上の色を透明色に
pythonImg3.set_colorkey(colorkey, RLEACCEL)
while True:
    screen.blit(backImg, (0,0))        #背景を描画
    screen.blit(pythonImg2, (450,300))#カッパを描画
    screen.blit(pythonImg3, (700,600))

    pygame.display.update()

    for event in pygame.event.get():
        if event.type == QUIT:
            sys.exit()

pygamebmp, gif, jpe, png 等メジャーな拡張子のほかにマイナーな拡張子も対応しています.

最初に背景とキャラクターを設定します.

pygame.image.load()

画像のロードにはこの関数を使います.
引数にファイル名を指定します.
次にロードした画像をディスプレイと同じ形式に変換するための処理を行います.

Surface.convert()
Surface.convert_alpha()

convert()は画像に透明色は指定されていない時に使用します.
alphaがついたら透明色が指定されている場合です.
今回は透明色の指定はしてないのでalphaは付きません.
その代わり, キャラクターの周りの余白を消してあげる(透明色の指定)処理をしてあげます.

pythonImg2 = pygame.image.load("kappa2.png").convert()
colorkey = pythonImg2.get_at((0,0))  # 左上の色を透明色に
pythonImg2.set_colorkey(colorkey, RLEACCEL)

透明色はWindowsのペイントというツールで設定できるのですが, スクリプト中でも設定できます.
透明色を指定するには画像にカラーキー(透明色)を設定します.
Surface.set_colorkey()でカンタンに設定できます.
第一引数は色のタプルです.
第二引数はRLEACCELを指定します.
RLEACCELとは、RLE(Run Length Encoding)アクセラレーションのことを指します. 画像用のバッファだと思います...
今回は色のタプルの設定を左上隅(0,0)の色をSurface.get_at()関数で取得しています.
あとは今まで通りです.

図形の描写

GUIで図形を書きたいと思います.
ウィンドウの作成は前回と同じです.

import pygame
from pygame.locals import *
import sys

SCREEN_SIZE = (700, 400)
def main():
    pygame.init()
    screen = pygame.display.set_mode(SCREEN_SIZE)
    pygame.display.set_caption("picture")

    while True:
        screen.fill((255,255,255))
        # 四角
        pygame.draw.rect(screen, (0,255,255), Rect(5,3,300,200))
        pygame.draw.rect(screen, (0,255,0), Rect(450,40,200,100),2)
        # 円
        pygame.draw.circle(screen, (50,100,150), (350,200), 90,5)
        # 楕円
        pygame.draw.ellipse(screen, (255,0,255), (450,250,200,100),5)
        pygame.draw.ellipse(screen, (255,255,0), (100,250,100,150),5)
        # 線
        pygame.draw.line(screen, (0,0,0), (0,0), (700,400),5)
        pygame.draw.line(screen, (0,0,0), (700,0), (0,400),5)

        pygame.display.update()
        for event in pygame.event.get():
            if event.type == QUIT:
                sys.exit()


if __name__ == "__main__":
    main()

まずは四角を描きます.四角形は,

pygame.draw.rect()

この関数で描くことができます.
第一引数はSurfaceの指定です. 今回は, screenと設定されます.
第二引数は図形の色を設定します.
第三引数は左上の点から大きさを設定できます.
第四引数は線の太さを設定します. これを設定しない場合は, 図形を塗り潰します.
塗りつぶす場合はSurface.fill()を使うこともできます.

つぎに円を描きます. 円は,

pygame.draw.circle()

この関数で描くことができます.
第一引数はSurfaceの指定です.
第二引数は図形の色を設定します.
第三引数は円の中心の設定をします.
第四引数は円の直径の指定です.
第五引数は線の太さを設定します.これも四角と同様に設定しない場合は塗りつぶします.

楕円という似たような図形もかけます.

pygame.draw.ellipse()

この関数は特徴として第三引数に中心の点と高さと幅も設定できます.
もちろん高さと幅の長さを等しくして円を描くこともできます.

最後に直線です.

pygame.draw.line()

この関数によって線を描くことができます.
この関数も特徴として第三引数に線の出発地点, 第四引数に線のゴール地点を設定できます.
第五引数に線の太さも設定できます.

バッファ

CでもJavaでも聞いたことあります.
僕は今まで理解をしていなかったので, この機会にちゃんと理解しようと思います.

そもそもバッファとはデータのことです.
表示したい図や絵のデータです.
ウィンドウ作成のプログラムのときにバックバッファという言葉が出てきましたが, バッファにはフロントバッファとバックバッファの2つがあります.
フロントバッファに歩いている主人公の絵のデータが入っているなら, ウィンドウにも主人公が歩いている絵が映ります.
バックバッファには次に映す絵のデータを入れておきます.
フロントバッファはたくさんの画像を貼り付けている場合が多いので, バックバッファという違うステージなどのデータをあらかじめ用意する必要があります.
ウィンドウを書き換えるときに, バックバッファをフロントバッファにすればいいのです.

ウィンドウの作成

GUIのはじめとして, ウィンドウの作成をします.
関数でウィンドウを呼びます.

#Pygameを使う場合に必須のモジュールをインポート
import pygame
from pygame.locals import *
import sys

SCREEN_SIZE = (300, 480)  # 画面サイズ
def main():
    # Pygameを初期化.Pygameのモジュールを使う前に実行する必要がある.
    pygame.init()
    # SCREEN_SIZEの画面を作成
    screen = pygame.display.set_mode(SCREEN_SIZE)
    # タイトルバーの文字列をセット
    sysfont = pygame.font.SysFont(None, 40)
    pygame.display.set_caption("ウィンドウ")
    hello = sysfont.render(u"Hello,world!",True, (0,0,255))
    hello1 = sysfont.render(u"Hello,world!",True, (0,0,205))
    hello2 = sysfont.render(u"Hello,world!",True, (0,0,155))
    hello3 = sysfont.render(u"Hello,world!",True, (0,0,105))
    hello4 = sysfont.render(u"Hello,world!",True, (0,0,55))
    hello5 = sysfont.render(u"Hello,world!",True, (0,0,5))
    # ゲームループ
    while True:
        screen.fill((255,255,255))
        screen.blit(hello,(50,20))
        screen.blit(hello1,(50,70))
        screen.blit(hello2,(50,120))
        screen.blit(hello3,(50,170))
        screen.blit(hello4,(50,220))
        screen.blit(hello5,(50,270))
        pygame.display.update()  # 画面を更新
        # イベント処理
        for event in pygame.event.get():
            if event.type == QUIT:  # 終了イベント
                sys.exit()

if __name__ == "__main__":
    main()

わかりにくいところをそれぞれ紹介していきます.

pygame.display.set_mode()

これでメイン画面の作成をします. 引数には画面のサイズをタプルで入れてあげます.

pygame.display.set_caption()

という関数で, メイン画面のタイトルバーにキャプションの設定ができます.
次にフォントの設定です.

pygame.font.SysFont()

この関数で設定できます. フォント名にNoneを入れてあげるとデフォルトのフォントを使います.

Font.render()

この関数でテキストのレンダリングをします.
第一引数に表示させたい文字列.
第二引数にアンチエイリアシングを使うかどうかです. Trueにすると文字がなめらかになります.
アンチエイリアシングとは同じ画素数でも文字をなめらかに表示する工夫のことです.
第三引数は文字の色です.
第四引数は背景の色です. 今回のように書いていないと透明になります.

Surface.blit()

によってウィンドウに描写します.
次に, このプログラムの一番重要なところです.
プログラム上のゲームループでくくられている箇所です.
これがないとスクリプトが一瞬で終わってしまいます.
ゲームループは無限ループです.
while文の中で回っています.

while True:
        screen.fill((255,255,255))
        screen.blit(hello,(50,20))
        screen.blit(hello1,(50,70))
        screen.blit(hello2,(50,120))
        screen.blit(hello3,(50,170))
        screen.blit(hello4,(50,220))
        screen.blit(hello5,(50,270))
        pygame.display.update()  # 画面を更新
        # イベント処理
        for event in pygame.event.get():
            if event.type == QUIT:  # 終了イベント
                sys.exit()

pygame.display.update()

この関数は画面を更新する関数です.
>|python|
for event in pygame.event.get():
            if event.type == QUIT:  # 終了イベント
                sys.exit()

最期のこの処理で終了イベント(QUIT)がきたときにスクリプトを終了することができます.
QUITはウィンドウの×を押したときに発生します.
これによって無限ループから脱することができます.

ゲームループの流れは一般に以下のとおりです.

 while True:
        ゲームオブジェクトの更新
        ゲームオブジェクトのレンダリング(描画)
        画面の更新
        イベント処理

ゲームオブジェクトの更新で, ゲームのキャラクターの位置の移動を行います.
レンダリングでメモリ上のSurface(メインウィンドウのこと.今回はscreen)にゲームオブジェクトを配置します.(まだ私自身完全に理解していないので, 今後更新します)
最後にウィンドウに表示させます.
2番目の過程のバックバッファをはさむことで, 動作をなめらかにします.

pygame

現在, pygameを勉強しています.
今までpythonCUIとして勉強してきました.
まだ, 今までやったことも完璧にできなかったり, 標準ライブラリ等何ができるかまだわからないのですが, 並行してGUIという次のステップに移ろうかと思います.
理由として, オブジェクト指向の具体例を実際に体験してみたいことととなにかアプリケーションを作成することで楽しさも味わいたいなと思っています.
年内に簡単なアプリを作成したいです.

階段

階段を作成するプログラムです.

これも九九のプログラム同様, for文を2つ重ねます.

a = '#'
k=range(10)
for j in range(10):
    for i in k:
        print a,
    print
    del k[-1]

実行結果は,

# # # # # # # # # #
# # # # # # # # #
# # # # # # # #
# # # # # # #
# # # # # #
# # # # #
# # # #
# # #
# #
#

逆の階段を作成します.

a = '#'
k=[1]
for j in range(10):
    for i in k:
        print a,
    print
    k.append('q')

実行結果は,

#
# #
# # #
# # # #
# # # # #
# # # # # #
# # # # # # #
# # # # # # # #
# # # # # # # # #
# # # # # # # # # #

となります.

九九

九九を作るプログラムをプログラムを作成しました.
for文を二つ重ねて作成します.

for i in range(1,10):
    for j in range(1,10):
        print i*j,
    print

3行目のコンマをつけないと, それぞれの掛け算を縦に表示させてしまいます.
一つ目のfor文で縦に9個, 二つ目の掛け算で横に9個の要素を取り出します.
3行目では, まずはじめに一つ目のfor文で1を取り出し(1の段), 横の要素をそれぞれかけていきます.
4行目のprint文で空白を表示し, 2の段に進みます.

実行結果は,

1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81

となります.