タイトル

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への並行アクセスを行わないよう
にすることが必要となる。
※(出力画像の切り替え参照)