読者です 読者をやめる 読者になる 読者になる

人工知能に関する断創録

人工知能、認知科学、心理学、ロボティクス、生物学などに興味を持っています。このブログでは人工知能のさまざまな分野について調査したことをまとめています。最近は、機械学習、Deep Learning、Kerasに関する記事が多いです。



Pygame

Pythonでゲーム作りますが何か?のGitHubリポジトリをEclipseで読み込む

Javaでゲーム作りますが何か?のGitHubリポジトリをEclipseで読み込む(2014/9/6)に引き続き、Pythonでゲーム作りますが何か?の全スクリプトもGitHub上で公開しました。 Pythonでゲーム作りますが何か? - 人工知能に関する断創録 この記事では、GitHubの…

フォントファイルのロード

pygameではデフォルトのフォントで日本語を表示することができません。MSゴシックなどを指定すればOKかもしれませんが、OSによって使用できるフォントが違うので環境依存になってしまいます。この解決策としてゲームにフリーのフォントファイルを添付すると…

マップスクロール

今回は少し大きめのマップを読み込んでみます。画面内には収まりきらないためプレイヤーの移動に応じて画面をスクロールする必要が出てきます。マップスクロールの方針は、 マップ全体(キャラクターやアイテム含む)をSurfaceに描画 オフセットに合わせてマ…

マップファイル

ファイルからマップを読み込んでみます。基本的にRPG編のマップのロード(2008/6/1)とほとんど同じです。load_map.zip Mapクラス マップを表すMapというクラスを新たに追加します。Mapクラスはマップ内のプレイヤースプライト、まだ登場してませんが敵スプ…

二段ジャンプ

二段ジャンプというのはジャンプ中に空中でもう一回ジャンプできるアクションです。スペースキーでジャンプして空中にいる間にもう一度スペースキーを押すとさらにジャンプできます。これで高いところにも上れます。double_jump.zip ジャンプ回数 変更はPyth…

ブロックとの衝突判定

ブロックを作成します。パイソンはブロックと衝突するのでぶつかったり、乗ったりできるようになります。block.zip ブロッククラス まずブロックを表すクラスを作成します。ブロックもスプライトなのでSpriteを継承して作ります。 class Block(pygame.sprite…

ジャンプ

上キーでジャンプできるようにしてきます。ジャンプをかっこよく見せるには重力を実装する必要があります。jump.zip ジャンプ処理 Pythonのupdate()をみてください。 JUMP_SPEED = 8.0 # ジャンプの初速度 GRAVITY = 0.2 # 重力加速度 def __init__(self): .…

左右移動

蛇(パイソン)を左キー、右キーで左右に移動できます。アクションゲームではキャラクターの微妙な動きが必要なので移動は小数で計算し、画面に描画するときに整数座標に戻しています。move.zip サンプルスクリプト #!/usr/bin/env python #coding: utf-8 im…

ファイアボール

ここでは始点から終点へ向けて弾をまっすぐ飛ばす方法を説明します。1945では敵機が自機に向けてまっすぐ弾を飛ばす際に同じアルゴリズムを使っています。サンプルスクリプトでは、画面の中央(始点)からマウスでクリックした方向(終点)にファイアボール…

キーボードの利用

キーボードを使う方法です。ティーポットがキーボードによって回転します。上下左右キーで回転速度が上がります。また、Lキーを押すとライティングのオンオフを切り替えます。照明をオフにするとマテリアルが無効になるのでglColor3f()で設定した青色が見え…

1945

縦スクロールのシューティングゲームです。このゲームは、Game Programming at scriptedfunさんのページを参考にしています。カテゴリの1945に作り方のチュートリアルがあります。素材は、FLYING YOGI(リンク切れ)さん、効果音はザ・マッチメイカァズさん…

ゲームオーバー画面

タイトル画面とゲームオーバー画面を追加します。画面間の遷移はゲーム状態を導入するとわりと簡単にできます。invader07.zip ゲームのクラス化 前回までと違ってmain()に書いていた処理をInvaderクラスに変えました。 START, PLAY, GAMEOVER = (0, 1, 2) # …

爆発エフェクト

ミサイルがエイリアンに当たったときに爆発エフェクトが出るようにします。爆発エフェクトもスプライトとして実装するのでエイリアンやミサイルと作り方はほとんど同じです。invader06.zip 爆発アニメーション 爆発には上の画像を使います。キャラクターアニ…

ライティング

ライティングとは3次元空間に光源を置いてオブジェクトを照らすことをいいます。光が当たると陰ができて3次元っぽく見えるようになります。ライティングしてないティーポット(2008/9/6)と比べてみると違いは明らかだと思います。また、3次元オブジェクトの…

エイリアンの反撃

エイリアンがビームを撃つようにします。invader05.zip ビームクラス エイリアンが発射するビームを実装します。まずShotクラスを全部コピーしてください。これで9割完成です(笑)プレイヤーが発射する弾とエイリアンが発射するビームはほとんど同じです。…

プレイヤーの攻撃

自機から発射したミサイルでエイリアンを倒せるようにします。そのためには、ミサイルとエイリアンが衝突したかを検出する必要があります。Pygameには衝突判定の簡単な方法がたくさんあります。ここではスプライトグループ同士の衝突判定を使います。invader…

惑星

恒星のまわりを回る惑星とその衛星です。太陽と地球と月をイメージしてますが縮尺はめちゃくちゃです。実際、太陽はもっとずっと大きいです。月を太陽ではなく地球を中心にして回すのに苦労しました・・・座標変換は慣れないと難しい。このプログラムはOpenG…

神々のトライフォース

某ゲームのあれです。三角形を3つ書いて回転させるだけです。何かなつかしい。triforce.py 神々のトライフォース #!/usr/bin/env python #coding:utf-8 from OpenGL.GL import * from OpenGL.GLU import * from OpenGL.GLUT import * import sys angle = 0.0…

回転キューブ

OpenGLに慣れるためにここまでの知識を使っていろいろ作ってみます。まずは、立方体の描画(2008/8/31)で作ったカラフルな立方体(カラーキューブ)を回転させてみます。スクリーンショットは何か歪んでますが立方体です。rotating_cube.py 回転キューブ #!…

平行移動・回転・拡大縮小

ティーポットのような3次元オブジェクトを平行移動、回転、拡大縮小する方法です。平行移動、回転、拡大縮小は3次元オブジェクトの頂点座標を変換することで実現できるのでモデリング変換とかアフィン変換と呼ばれます。数学的には頂点の座標にある行列をか…

ライフゲーム

人工知能というより人工生命の分野ですが最初はライフゲームを作ってみます。ライフは人生という意味もありますがライフゲームは人生ゲームとはまったく関係ありません。まず、フィールド(黒い部分)をマウスクリックすると、黄色い■が出てきます。もう一度…

エイリアン襲来

を実装します。invader03.zip エイリアンクラス エイリアンも自機、ミサイルと同様にスプライトなので作り方はほとんど同じです。 class Alien(pygame.sprite.Sprite): """エイリアン""" speed = 2 # 移動速度 animcycle = 18 # アニメーション速度 frame = …

ミサイルの発射

スペースキーを押すと自機からミサイルが発射できるようにします。invader02.zip ミサイルクラス まず発射されるミサイルを表すクラスShotを作成します。これもスプライトで実装します。 class Shot(pygame.sprite.Sprite): """プレイヤーが発射するミサイル…

ティーポット

立方体の描画(2008/8/31)では、四角形プリミティブを6枚使って自分で立方体を作ったわけですが、3次元オブジェクトを作るコマンドがあらかじめ用意されています。今回はそれを使って3次元オブジェクトを描画してみます。サンプルは有名なティーポットと呼…

立方体の描画

プリミティブの描画(2008/8/24)で使った四角形を6枚張り合わせて立方体を作ってみます。いよいよ3次元空間へ突入。cube.py サンプルスクリプト #!/usr/bin/env python #coding:utf-8 from OpenGL.GL import * from OpenGL.GLU import * from OpenGL.GLUT i…

自機を動かす

まず、プレイヤーである自機をキーボードで動かせるようにします。ブロック崩し編のパドルの移動(2008/8/9)で解説したパドルと作り方はほとんど同じです。だだし、今回はキーボードで左右に移動するようにします。invader01.zip 自機スプライト まず自機Pl…

プリミティブの描画

プリミティブを描くサンプルです。プリミティブとはOpenGLで使える図形のことで、点、線、三角形、四角形、ポリゴンなどがあります。primitive.py サンプルスクリプト #!/usr/bin/env python #coding:utf-8 from OpenGL.GL import * from OpenGL.GLU import …

OpenGLウィンドウの表示

PyOpenGLで遊ぶためのウィンドウを表示するところまで。OpenGL自体にはウィンドウを表示する関数はないためGLUTと呼ばれる拡張ツールキットを使います。以下のサンプルを実行するにはPyOpenGLとGLUTのインストールが必要です。PyOpenGLのインストール(2008/…

スコアの表示

ゲームスコアが画面の中央に表示されるようにします。ブロックを連続して壊すことで高得点が狙えるようにしました。ボールを落としてしまうと減点です。breakout06.zip スコアの表示 まず、スコアボードを表すクラスScoreBoardを作ります。 class ScoreBoard…

反射方向の調整

前回までのプログラムを実行してしばらく遊んでみるとわかりますが、ボールがいつも同じ方向に跳ね返るためまったく面白くありません。プレイヤーができるのはボールを落とさないようにすることだけです。今回は、ボールがパドルに当たる位置によって反射方…

ボールの反射音

ボールがブロックやパドルに当たったとき音が鳴るように改良します。効果音はザ・マッチメイカァズさんからお借りしています。breakout04.zip 効果音のロード まず効果音をロードします。効果音はすべてBallのクラス変数へセットします。クラス変数なのでボ…

ブロックを壊す

ブロックを配置してボールが当たると壊れるようにします。ブロックをブロックグループに追加し、ボールスプライトとブロックグループの衝突判定を行います。Spriteの衝突判定機能を使うと簡単にできます。ここまでくるとゲームっぽくなってきます。breakout0…

ボールの反射

次に画面内を跳ね回るボールを実装します。パドルにボールを当てると跳ね返ります。breakout02.zip ボールスプライト まずボールを表すクラスです。これもパドルと同じくSpriteを継承してデフォルトスプライトグループ(containers)も指定します。 class Ba…

パドルの移動

これから数回にわたってブロック崩しを作ろうと思います。今回は、ボールを跳ね返すラケット(パドル)をマウスで動かせるところまで作ります。ブロック崩しの素材は、FLYING YOGI(リンク切れ)さんからお借りしています。breakout01.zip パドルスプライト …

戦闘画面

まだ戦えるわけではありませんが、戦闘画面を実装してみました。フィールドを歩いていると何か強そうな(笑)モンスターに襲われます。コマンドの選択などはすべてスペースキーを使います。とりあえずにげることしかできません。モンスターのグラフィックは…

ゲーム状態の導入

今回はタイトル画面をつけます。タイトル画面のように別の画面が入ってくると実装がこんがらがってくるため、ゲーム状態によって更新・描画・イベントハンドラを分離するようにスクリプトを修正します。また、今までmain()に書いていた処理をクラス化します…

パーティー

今までずっとプレイヤーは1人だったので仲間を増やしてパーティを組みます。説明を読む前にスクリプトを動かしてパーティの各プレイヤーの動きがどうなっているか観察してみることをおすすめします。観察のポイントは、先頭ではないプレイヤーは1人前にいる…

町をつくる

今回は新しい町のマップを追加します。新しいマップを追加するためにはスクリプトを書き換える必要はないです。マップエディタでtown.mapを作る、イベントファイルtown.evtを作る、field.evtに町へ移動する移動イベントを配置するだけです。それとは別に町の…

コマンドウィンドウ

コマンドウィンドウを実装します。メッセージウィンドウの表示で説明したWindowクラスを拡張してCommandWindowクラスを作ります。コマンドは、はなす、つよさ、そうび、とびら、じゅもん、どうぐ、さくせん、しらべるの8つです。ドラクエと同じか(笑)スペ…

宝箱と扉を開ける

今回は3つのイベントを追加します。宝箱と扉と一般オブジェクトです。宝箱と扉はスクリーンショットで見えますね。扉は前に立ってスペースキーを押すと開きます。宝箱は上に乗ってスペースキーを押すと調べます。一般オブジェクトとは玉座・いす・机などの特…

デバッグ情報の表示

今回はちょっと簡単ですが、画面上にデバッグ情報が表示されるようにします。下のスクリーンショットのように画面の左上にマップ名、プレイヤー名、プレイヤー座標(単位:マス)を表示します。せっかくなので前に作ったメッセージエンジン(2008/6/28)を使…

効果音を鳴らす

マップ間移動するときにザッザッザッと鳴るようにしてみます。いずれは宝箱を開けるときにガチャ、扉を開けるときにバタンと鳴るようにしますが今回はザッザッザッだけです。効果音はザ・マッチメイカァズさんからお借りしています。効果音入るとリアルにな…

BGMを鳴らす

無音の世界で寂しかったので今回はBGMを鳴らしてみます。現在の仕様ではBGMイベントを作り、マップをロードするときにBGMを鳴らすようにしています。音楽の再生の方法はBGMと効果音の再生(2008/5/11)で解説してるので参照してください。BGMはTAM Music Fac…

マップ間移動

別のマップに移動できるようにします。王様たちも待っていることですし、今回はお城でも作りましょう。pyrpg18.zip 移動イベント キャラクターイベント(2008/6/22)と同じように移動イベントを配置することでマップ間移動を行います。プレイヤーが移動イベ…

マップの読み込み

マップの保存で作成したバイナリ形式のマップを読み込めるようにします。マップの読み込みはLキーを押してください。ウィンドウが開くのでマップ名を入力します。マップファイルの拡張子を除いて大文字にした名前がマップ名です。たとえば、field.mapを読み…

マップの保存

作ったマップを保存できるようにしましょう。マップは1マス8bitのバイナリ形式でファイルに保存します。1マス8bitで表現するので256種類までマップチップが使える計算です。マップの保存はSキーを押してください。ウィンドウが開くのでマップ名を入力します…

バイナリマップのロード

マップエディタ編のマップの保存で作成したバイナリマップを読み込めるようにします。またキャラクターチップとマップチップを大幅強化してキャラクターチップとマップチップ(2008/6/24)がすべて使えるように拡張します。pyrpg17.zip キャラクターチップの…

マップの新規作成

今回は新しいマップを作れるようにします。新しいマップを作るときはマップの名前、行数、列数、デフォルトマップチップを指定します。これらの情報を入力する必要がありますが、Pygameにはテキストボックスが用意されていません。自作する必要があります。R…

選択マップチップの表示

今回はちょっとした修正です。画面の左上に現在選択中のマップチップとマウスの座標を表示してみます。また、Gキーを押すとグリッドが表示されるようにします。pymap04.zip 選択中マップチップとマウス座標の表示 main()の下の部分です。 while True: clock.…

マップチップパレット

前回は草地マップでしか描画できませんでしたが、今回はいろんなマップチップが使えるように拡張します。スペースキーを押すと下図のように画面がマップチップパレットに切り替わり、マウスクリックで使いたいマップチップを選択できるようにします。またマ…