2013年3月21日木曜日

gameover() 関数の作成

 どの位置からでも呼び出せるgameover()関数というのを作成して利用しようと思います。これまではゲーム終了のタイミングが一箇所だったので必要ありませんでしたが、ともかく前置きはよしてコードを見て行きましょう。

def gameover():
    game.run = False
    pygame.time.delay(2000)

ちなみに他の部分は毎回一緒です。game.runはレコード型ですね、宣言わかりますか。
 敵キャラが消えた瞬間にゲームを終了させたいので作って見ました。これまではwhile timer():とやってメイン関数のループから抜けていました。
変更のあったtimer()関数です。戻り値がなくなっています。

def timer():
    temp = pygame.time.get_ticks()
    if game.time+300 < temp:
        game.time = temp
        if cap.visible == True:
            move(K_DOWN)           
        else:           
            cap.start()           
            if checkcap() == False:
                gameover()



メイン関数を次のように書き換えれば、どの関数からgameover()を呼び出しても直感的に即座に終了させることができます。

def main():
    start()
    while game.run:
        keydown()
        draw()
        timer()

2013年3月20日水曜日

Python pygame.image.load()

 日記としてつけ始めたこのブログですが、Webに貢献できるようにProgramming Tipsも載せていこうと思います。そのほうがページランクも上がるでしょうから。

Python+Pygameで画像を読み込む方法です。代表的なのがウェブに乗っています。例えば次のようなもの。

import pygame

image = pygame.image.load('picture.bmp').convert()

このコードでimageプロパティに画像が代入されます。convert()することによってSurfaceに貼り付けるときに機械の処理が楽になるそうです。

pygame.init()
screen = pygame.display.set_mode((200,100))
screen.blit(image,(0,0))

ウィンドウを作って先ほどの変数に格納した画像を書き込んでいます。pygame.init()をまず最初に呼び出して初期化してからscreenを作るみたいですね。

さて、今回一番重要なイメージの読み込みですが、実はネットに書かれている上記の方法ではWindowsでは動作してもLinuxではファイルをみつけることができません。ですので以下のように書き換えておくのが良いと思います。記入例では.pyファイルと同階層にあるdataディレクトリに画像を格納してある設定です。
 import sys,os

image = pygame.image.load(os.path.join(path(),'data','picture.bmp').convert()

def path():
    for name in sys.argv:
        if os.path.exists(name) == True:
            return os.path.dirname(name)
    return ''

一行で書くべき文は改行を入れないでください。Pythonの基本です。path()というのは自作関数です。このようにすれば実行時引数から絶対パスを取得します。カレントディレクトリがどこであっても絶対パスを返すらしく、今のところ問題は出ていません。あしからず。
ところで、関数の使い方については検索してウェブで調べてご覧になってください。