ZX81の回想禄

PR

×

プロフィール

ZX81

ZX81

カレンダー

コメント新着

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

キーワードサーチ

▼キーワード検索

2026.06.28
XML

次に接触 判定を元に 漂流者処理を仮実装しました。

以下追加点及び変更点です

mapには、描画する位置datp(VMEMかrender)を指定して


ーーーー ーmap.h
// zx81 write
void zx81_write_str(unsigned char *dstp, const char *asciip);
void zx81_write_num(unsigned char *dstp, int num, int ndigit);

ーーーー ーmap.c
void zx81_write_str(unsigned char *dstp, const char *asciip)
{
    #asm
        ld      ix,2
        add     ix,sp
        ld      c, (ix+0)
        ld      b, (ix+1)       ; asciip
        ld      e, (ix+2)
        ld      d, (ix+3)       ; dstp
zx81_write_str_loop:
        ld      a,(bc)
        cp      0
        ret     z
        sub     ASCII_BGN
        jp      c,zx81_write_str_2
        cp      ZX81CHR_SIZE    ;sizeof(zx81chr)
        jp      nc,zx81_write_str_2
        ld      hl,_zx81chr
        add     a,l
        jp      nc,zx81_write_str_1
        inc     h
zx81_write_str_1:
        ld      l,a
        ld      a,(hl)
        jp      zx81_write_str_3
zx81_write_str_2:
        ld      a,0
zx81_write_str_3:
        ld      (de),a
        inc     bc
        inc     de
        jp      zx81_write_str_loop
    #endasm
}
void zx81_write_num(unsigned char *dstp, int num, int ndigit)
{
    unsigned char ascii[16+1];
    int  i, n;
    memset(ascii, 0, sizeof(ascii));
    if (ndigit > 16) {
        return;
    }
    i = ndigit-1;
    while (i >= 0) {
        n = num % 10;
        num /= 10;
        if (num != 0) {
            ascii[i] = '0' + n;
        }
        else {
            ascii[i] = ((n != 0) || (i == ndigit-1)) ? '0' + n : ' ';
        }
        i--;
    }
    zx81_write_str(dstp, ascii);
}

objetsには、ドクロ描画を追加。
ーーーー ーobjects .h
void objects_draw_skull(int act_no);

ーーーー ーobjects .c
unsigned char skull_chr[DRIFTER_CW*DRIFTER_CH] = {
  0x06,0x07,0x04, 0x84,0x84,0x01, 0x00,0x00,0x00
};
#define D_DX            33      // 32+1(CR)
#define D_DY            24

// ----------------------------------------------------------
// ドクロ描画
// ----------------------------------------------------------
void objects_draw_skull(int act_no)
{
    int obj_y, y, obj_x;
    unsigned char *chrp;
    unsigned char *pos;
    int chrw, chrh, dy;
    obj_y = (active_tbl[act_no].y >> 1) - active_tbl[act_no].h;
    obj_x = active_tbl[act_no].x >> 1;
    chrp = &skull_chr[0];
    pos = getscrnaddr(obj_y, obj_x + 4);
    chrw = active_tbl[act_no].w;
    chrh = active_tbl[act_no].h;
    dy = obj_y;
    for (y = 0; y < chrh; y++)
    {
        memcpy(pos, chrp, chrw);
        pos += D_DX;
        chrp += chrw;
        dy++;
    }
}

mainは、漂流者処理を改造。
ーーーーーmain.c

{
    :
            case OBJ_DRIFTER:   // 漂流者処理
                if (active_tbl[act_no].contacted == 1)
                {
                    // 得点表示
                    int  y = active_tbl[act_no].y - (active_tbl[act_no].h * 2) - 1;
                    int  x = active_tbl[act_no].x;
                    zx81_write_num(getscrnaddr((y >> 1) + 1, (x >> 1) + 4), 100, 3);
                }
                else
                {
                    // ドクロ表示
                    objects_draw_skull(act_no);
                }
                active_tbl[act_no].type = OBJ_NONE;
                for (int i = 0; i < 100; i++)
                {
                    wait_vsync();
                }
                break;
            default:

【正面衝突】
正面からの衝突は3ドット幅としました。
この赤線の間に船首が接触すると。。。


ドクロ表示します。


【救出】
この赤線の以外で船首が接触すると。。。


救出成功となり、得点を表示します。










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

最終更新日  2026.06.28 09:26:30
コメントを書く
[ZX81C言語でのプログラム開発] カテゴリの最新記事


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

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