人工知能に関する断創録スマートフォン用の表示で見るスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。ロボティクス、生物学などに興味を持っています。このブログでは人工知能のさまざまな分野について調査したことをまとめています。Learning、Kerasに関する記事が多いです。2008-06-21キャラクターを追加Pygameプレイヤー1人のさびしい世界でしたがついに王様の登場です。ついでに王様の側近の大臣と王様のまわりをぶらぶらしている護衛である兵士も登場させましょう。今回はこの3人を追加します。プレイヤーを表すPlayerクラスを流用してCharacterクラスを作ることで簡単にキャラを増やせます。今回はオブジェクト指向の威力が存分に味わえます。pyrpg11.zipキャラクターの作成キャラクターを表すCharacterクラスの詳細を説明する前に具体的な使い方から説明します。キャラクターを作成しているのはmain()の下の部分です。MOVE)Characterクラスのコンストラクタには4つの引数を渡します。1つめの引数はキャラクター名(画像ファイル名から拡張子を除いた名前)です。王様だったら画像ファイル名king.pngの拡張子を除いたkingがキャラクター名になります。「すけさん」のような具体的な名前ではありません。2つめの引数はキャラクターの座標(マス単位)です。3つめの引数はキャラクターの向きです。UPのいずれかの値を取ります。4つめの引数は移動タイプです。STOPかMOVEという値を取ります。STOPの場合、キャラクターは動かず同じ場所に静止します。MOVEにするとランダムに動き回ります。王様は静止して大臣(minister)や兵士(soldier)は動き回るようにしてます。こんな感じでCharacterクラスというひな形を作っておくと簡単にキャラクターが増やせます。ここら辺はオブジェクト指向のすごいところです。次に作成したキャラクターをマップに追加します。ここら辺の仕様はだいぶ迷ったのですが、キャラクターの更新(update)や描画(draw)や衝突判定はマップ側で行うことにしました。キャラクターはマップ間移動ができず特定のマップに縛り付けられているからです。map.add_chara(soldier)です。ここでplayerもマップに登録している点に注意してください。プレイヤーはマップ間移動ができるのでどうしようか悩んだのですがとりあえずマップに登録することにしました。後で変更するかもしれません。次にMapクラスを見てみます。Trueself.charasというリストにこのマップに登場するCharacterオブジェクトを登録します。self.charasにキャラクターを追加しています。次にupdate()とdraw()を見てください。self.charasに登録されたキャラクターの更新や描画を行っています。Mapのupdate()やdraw()を呼び出せば、マップ内のすべてのキャラクターのupdate()やdraw()は自動的に行われます。最後にis_movable()で海や岩山などのマップチップとの衝突を調べる処理に加えて、マップ内のキャラクターとも衝突しないか調べています。この処理は少し甘く、2人のキャラクターが同じタイミングで同じマスに移動しようとすると衝突してしまいます。これを回避するには移動前に移動先のマスを予約しておくなど細かい処理が必要になります。この変更にともないmain()側ではplayerのupdate()やdraw()は削除します。mapのupdate()やdraw()だけ呼べばよいわけです。最後にCharacterクラスの詳細を説明します。今まで使っていたPlayerクラスと機能はほぼ同じなのでPlayerクラスの大部分をCharacterクラスに移します。&quot;&quot;&quot;キャラクター状態を更新する。mapは移動可能かの判定に必要。py-offsety))Playerクラスと違うのは、移動タイプを表すself.movetypeと移動を開始する条件です。Playerクラスの移動開始はプレイヤーのキー入力で移動していたのに対し、Characterクラスは移動タイプがMOVEでPROB_MOVE以下の確率で自動的に移動を開始しています。PlayerとCharacterはほとんど同じ機能を持つので継承という仕組みが使えます。Playerを定義します。Pythonでサブクラスを定義するにはクラス名の後に()で親クラス名を書き、コンストラクタ__init__()で親クラスのコンストラクタを呼び出します。&quot;&quot;&quot;プレイヤー状態を更新する。mapは移動可能かの判定に必要。self.images[self.name][self.direction*4+self.frame/self.animcycle%4]PlayerはCharacterのサブクラスなのでCharacterで定義されたインスタンス変数やメソッドは自由に使えます。update()だけは新たに定義してCharacterのupdate()をオーバーライドしています。Playerの場合、移動開始を自動移動ではなく、ユーザのキーボード入力にしたいからです。キャラクターを登録することもできます。ためしに追加してみてください。次回はキャラクターの追加をソースコードに直書きするのではなく、イベントファイルを用いて追加する方法を解説します。フルスクリーンモードピクセルベーススクロール»プロフィールid:aidiary人工知能とその関連分野に興味があります。Blog|ブログを報告する。