ZX81の回想禄

PR

×

プロフィール

ZX81

ZX81

カレンダー

コメント新着

コメントに書き込みはありません。

キーワードサーチ

▼キーワード検索

2026.06.27
XML

衝突判定はtypeを元に判定予定でしたが
よく考えるとactive_tblにアクセスするのでactive_tblの番号を返すようにしました。

以下変更点です。

ーーーーーmain.c
objects_contactの戻り値をtypeではなく番号を返すよう変更。

また、objects_contact判定より前にmap_drawを行う事で
見た目での描画と接触判定のずれをなくしました。

void main()
{
   :
        // 衝突以外の描画
        objects_render(RENDER_CONTACT);
        // 全体描画
        map_draw();
        // 接触判定
        int act_no = objects_contact();
        if (act_no < ACTIVE_MAX)
        {
            switch (active_tbl[act_no].type)
            {
            case OBJ_WHIRL:
                // 渦処理
                break;
            case OBJ_CROC:
                // ワニ処理
                break;
            case OBJ_DRIFTER:
                // 漂流者処理
                break;
            default:
                break;
            }
        }
        // 衝突判定
        if (collision == 1)
        {
            // 衝突処理
//            break;
        }


ーーーーーobjects.h
active_tblを他から参照可能としました。

// active table
#define ACTIVE_MAX   5
struct ACTIVE_TBL {
    int y;                  // 画面上のY座標
    int x;                  // 画面上のX座標
    int h;                  // 描画文字の高さ
    int w;                  // 描画文字の幅
    int area;               // w * h のキャッシュ
    unsigned char *p;       // 描画文字のポインタ
    ObjectType type;        // オブジェクト種別
    int speed_step;         // Y移動速度(0=移動しない、1=毎回, 2=2回に1回)
    int speed_cnt;          // カウンタ(speed_y で初期化)
    int contacted;          // 1度だけ接触判定するためのフラグ
};
extern struct ACTIVE_TBL active_tbl[ACTIVE_MAX];

ーーーーーobjects.c
接触判定時にactive_tblの番号を返すようにしました。

// ----------------------------------------------------------
// 接触
// ----------------------------------------------------------
int  objects_contact(void)
{
    int  act_no;
    for (act_no = 0; act_no < ACTIVE_MAX; act_no++)
    {
        if (active_tbl[act_no].type > OBJ_RAFT)
        {
            if (active_tbl[act_no].contacted == 0)
            {
                active_tbl[act_no].contacted = boat_contact(&active_tbl[act_no]);
                if (active_tbl[act_no].contacted != 0)
                {
                    return (act_no);
                }
            }
        }
    }
    return (act_no);
}

ーーーーーboat.h


int  boat_contact(struct ACTIVE_TBL *active_tblp);

ーーーーーboat.c
追加したボートの接触判定関数にて、
渡されたテーブルの座標と自船の座標を比較して
接触判定を行っています。

下記の値を返します。
・0 … 接触なし
・1 … 接触あり
・2 … センターで接触(※)
※船がセンター(傾いていない)時に
 オブジェクトと船のX座標センター差がー1、0、+1の時

int  boat_contact(struct ACTIVE_TBL *actp)
{
    // オブジェクトの矩形(左下基準)
    int obj_w = (actp->w * 2)-1;
    int obj_h = (actp->h * 2)-1;
    int obj_left = actp->x;
    int obj_top  = actp->y - obj_h;
    int obj_right  = obj_left + obj_w - 1;
    int obj_bottom = obj_top  + obj_h - 1;
    // ボートの矩形(左上基準)
    int boat_w = 5;
    int boat_h = 5;
    int boat_left   = boat_x+2;
    int boat_top    = boat_y+2;
    int boat_right  = boat_left + boat_w - 1;
    int boat_bottom = boat_top  + boat_h - 1;
    // 接触判定
    if (boat_left   <= obj_right  &&
        boat_right  >= obj_left   &&
        boat_top    <= obj_bottom &&
        boat_bottom >= obj_top)
    {
        // X方向センター接触判定
        int boat_cx = (boat_left + boat_right) / 2;
        int obj_cx  = (obj_left  + obj_right) / 2;
//        if ((abs(boat_cx - obj_cx) < 2) &&
        int diff = boat_cx - (obj_cx - 1);
        if ((diff >= 0 && diff <= 2) &&
            (boat_tilt == TILT_CENTER))
        {
            return 2;   // 直進状態でXセンター接触
        }
        return 1;
    }
    return 0;
}
(absを使いたくなかったので、少し小細工をしています。)







お気に入りの記事を「いいね!」で応援しよう

最終更新日  2026.06.27 16:12:55
コメント(0) | コメントを書く
[ZX81C言語でのプログラム開発] カテゴリの最新記事


【毎日開催】
15記事にいいね!で1ポイント
10秒滞在
いいね! -- / --
おめでとうございます!
ミッションを達成しました。
※「ポイントを獲得する」ボタンを押すと広告が表示されます。
x
X

© Rakuten Group, Inc.
X
Design a Mobile Website
スマートフォン版を閲覧 | PC版を閲覧
Share by: