人工知能に関する断創録スマートフォン用の表示で見るスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。ロボティクス、生物学などに興味を持っています。このブログでは人工知能のさまざまな分野について調査したことをまとめています。Learning、Kerasに関する記事が多いです。2008-06-30マップチップパレットPygame前回は草地マップでしか描画できませんでしたが、今回はいろんなマップチップが使えるように拡張します。スペースキーを押すと下図のように画面がマップチップパレットに切り替わり、マウスクリックで使いたいマップチップを選択できるようにします。マップ上で右クリックするとマウスの位置にあるマップチップを選択できます。使えるマップチップはキャラクターチップとマップチップにまとめてあります。pymap03.zipマップチップデータこれからマップエディタを使っていろんなマップを作っていくわけですがそのためにはどんなマップチップが使えるかきちんと定義しておく必要があります。このRPG編で使うマップチップはキャラクターチップとマップチップ(2008/6/24)にまとめましたが、その情報をファイルに格納したのがmapchip.datです。マップエディタはこのファイルをロードして使えるマップチップやマップチップの上に移動可能かなどをセットします。このファイルはRPG編のバイナリマップのロード(2008/7/5)以降でも共通して使います。mapchip.datは下のようなデータです。1行が1つのマップチップを表しています。左からマップチップID、マップチップ名、移動可能か?、背景を透明色にするか?を表しています。10,desert,1,0マップチップIDはバイナリマップの各マスに入る値です。後で詳しく説明しますが、バイナリマップは1マス8ビット(1バイト)で表すため0から255までの256種類のマップチップが使えます。今回は55種類なのでまだまだ余裕があります。マップチップ名はファイル名と同じです。マップチップ名に.pngをつけたものがファイル名になります。移動可能か?はプレイヤーが徒歩でそのマップチップに乗れるかを表します。0は移動不可、1は移動可能です。最後の背景を透明色にするか?ですが0のとき透明色を使わない、1のとき使うです。草地は全部草地の色で塗りつぶされているので背景色を透明にする必要はありません。町は背景の茶色がむき出しになっているのでそこは透明にする必要があります。一般的に背景がむき出しになっているマップチップはマップエディタでベタ描きしません。ベタ描きした他のマップチップの上に重ねてイベントとして配置します。草地の上に町を配置すれば草原の町に砂漠の上に町を配置すれば砂漠の町に見えます。イベントとして配置する方法はRPG編のマップ間移動を参照してください。マップチップのロードはload_mapchips()です。マップチップ名から該当するファイル名を求めて画像をロードし、Map.imagesに格納してます。これはRPG編でも使います。fp.close()マップチップパレット次にマップチップパレット画面を実装したMapchipPaletteクラスを見ていきます。self.WIDTH)ROWとCOLですが、マップチップパレットに配置できるマップチップの数です。この計算でいくと20x25で500個のマップチップが使えることになりますが、実際は1マス8ビットしか使わないので2の8乗で256個までしか使えません。256個よりたくさん使いたかったら1マスを16ビットで表現する必要があります。16ビットなら2の16乗で65535種類(多すぎ!)使えます。ここらへんはマップの保存(2008/7/5)で詳しく説明します。コンストラクタのdisplay_flagは、マップチップパレットの表示、非表示を切り替えるフラグです。これがTrueのときマップチップパレット画面でFalseのときマップ画面になります。selected_mapchipは現在選択中のマップチップIDです。ここで選択されたマップチップでお絵描きできます。update()はマウスでクリックしたマップチップを選択してselected_mapchipに番号をセットする処理です。display_flagをFalseにしてマップチップパレットを閉じています。その後のpygame.time.wait(500)はパレットを閉じた後にそのマップチップですぐ描いてしまうのを防いでいます。コメントアウトしてみるとどうして必要かわかります。これはあまりよい方法ではないと思います・・・draw()はマップチップを順番に描画しているだけです。画像はMapクラスのimagesにすべて登録してあるのでそれを流用しています。登録されていなかったらIndexErrorの例外が起きるのでその場合はで描画してます。実際55個しか登録してないので大部分がになってますね。マップとマップチップパレットの切り替え最後にマップ画面とマップチップパレット画面を切り替えるmain()の処理です。palette.display_flagスペースキーを押したときpaletteのdisplay_flagを切り替えています。palette.display_flagはフラグを切り替えるときの定石です。palette.display_flagがTrueのときはFalseに切り替わり、FalseのときはTrueに切り替わります。今回は1つ便利な機能を追加しています。マップ画面上で右クリックするとマウス位置にあるマップチップが選択されます。マップチップパレットで選択する必要がないので非常に便利です。この処理は、Mapクラスのupdate()です。self.map[selecty][selectx]マウスの位置のマップチップ(self.map[selecty][selectx])をpaletteのselected_mapchipに格納してるだけですね。»プロフィールid:aidiary人工知能とその関連分野に興味があります。Blog|ブログを報告する。