Handel-Cによる ゲーム作成 ーイライラ棒ゲームー ゲーム仕様 画面上にブロックで道が作られる。 マウスでキャラクタを操作し、ブロック に当たらないようにクリア地点までい ければクリアとなりクリア画面へ。 ブロックに当たれば、GAMEOVERと なり、左クリックによりリスタートが出 来る。また2面時にGAMEOVERに なっても右クリックにより2面からのリ スタートも可能。 フローチャート Start 面の表示 ブロック接触? No クリック yes GAMEOVER No ゴール? yes CLEAR プログラム解説 ROMによる画像表示 ブロックによる道や操作す るキャラクタはROMに保存 した画像を読み込むことに より表示。 今回ROMには2ビットで書 き込み、それによりブロック、 道、クリア地点を設定。 マウスによるブロックへの 当たり判定もこのROMを 利用して、ブロック表示上 にマウスポインタがのると 「接触」と判断して次の事 象が起こるよう設定。 苦労、工夫した点 並列処理をRAM(ROM)に対して行うと、並列処 理が上手くいかず、画面出力にエラーが起こる。 ★このエラーを解消するため各々のRAMを読み込 む処理は並列処理にせず、RAMアクセス、ブ ロック配置を切り離し行うことで、同時アクセスを 防ぎ解消した。 あまりにIF文等の条件を加え、複雑にプログラ ムを書きすぎると、出力画面に乱れが生じ、正常 な画面を出力できなくなる。 なので、なるべくプログラムを簡略化して、 正常にキレイに表示させる必要があった。 まとめ 今回のプログラムにおいては、いかに複雑に せず、コンパクトに設計し、複数の画像を乱 れることなく上手く表示させられるか、並列処 理等をいかに利用するかということが問題と なり、ただ漠然とプログラムするのではなく、 理解し、先を考えた設計を行うことの必要さを 考えさせられた。 以下質問用 マウスポインタの当たり判定 (X,Y) (X+α,Y) β 実際にはマウスポインタの 位置は(x,y)であるため、 そのままでは(x,y)の位 置でしか当たり判定は行わ れない。そこで、 (x+α,y) (x,y+β)(x+α,y+β)の 位置でも当たり判定が起こる ようにそれぞれ場合分けを行 (X,Y+β) い、キャラクタに触れた時点で 判定されるよう設定した。 α (X+α,Y+β) 出力画像の切り替え 当たり判定が出た場合それに対応するFlagを立 て画面をROMより読み込む。読み込んだ後Flag は戻す。というのもブロック配置では前に読み込 んだものを配置してる状態で同時に次の表示に 移るとバグが起こる。故に前のROMを読み込ん だものを更新し終わり、Flagが戻った後表示に戻 る。つまり、ROMより画像を取り込んでいる間は 表示は行わず、更新し終わり、Flagが戻った後配 置に移る。 ブロック配置programを簡単に示すと macro proc Display(BallPaddlePtr, GamePtr){ ・・・・while(1) { ↓Flagが立っている状態では実行しない if(OverFlag==0&&ClearFlag==0・・・・){ ・・・・・ブロック判定、配置 } リセットについて ゲームオーバー時、クリア時と同様、出力画 像を初期の1面(もしくは2面)に戻している。 判定をマウスポインタのブロックでの当たり 判定ではなくクリックの操作によって判定。 クリックされたならリセットFlagを立て、ブ ロック配置を行う。ここでは他の画面出力と 同様ROMへの並行アクセスを行わないよう にすることが必要となる。 ※(出力画像の切り替え参照)
© Copyright 2025 ExpyDoc