2007年7月1日日曜日

マップのスクロール

本家掲示板に投稿したものに少し手を加えたもの。
説明用なので読みやすくするべく、本来は必要ない変数を多用している。#const WAIT_TIME      3         // ウェイト[10ms]
#const SPEED          5         // 移動スピード
#const CHARACTER_SIZE 5         // キャラクタの描画サイズ
#const BLANK          100       // マップスクロールが始まる位置

    screen 0480240SCREEN_NORMAL
    x = 0 : y = ginfo_winy / 2  // キャラクタの位置
    scrollX = 0 : scrollY = 0   // 画面左上のマップ上での位置(=スクロール量)
    mapWidth = 750              // マップの幅

    // 適当にマップを準備
    buffer 1, mapWidth, ginfo_winySCREEN_NORMAL
    repeat 20
        hsvcolor rnd(192), 100255
        boxf rnd(ginfo_winx), rnd(ginfo_winy), rnd(ginfo_winx), rnd(ginfo_winy)
    loop
    gsel 0

// ★メインループ★
*main
    gosub *moveCharacter    // キャラクタを動かす
    gosub *setScroll        // 描画する位置を決める
    gosub *draw             // いろんな描画処理
    wait WAIT_TIME
    goto *main

// キャラクタを動かす
*moveCharacter
    stick key, 5 : speedX = SPEED * ((key >> 2 & 1) - (key & 1))
    x = limit(x + speedX, 0, mapWidth)
    return

// 描画する位置を決める
*setScroll
    // (x - scrollX)が画面上でのキャラクタの位置になる
    if x - scrollX < BLANK{
        // キャラクタがBLANKより左側に移動した場合、カメラを移動させる
        scrollX = limit(x - BLANK0, mapWidth - ginfo_winx)
    }
    if ginfo_winx - BLANK < x - scrollX {
        // キャラクタが(ginfo_winx - BLANK)より右側に移動した場合、カメラを移動させる
        scrollX = limit(x + BLANK - ginfo_winx0, mapWidth - ginfo_winx)
    }
    return

//いろんな描画処理
*draw
    redraw 0
    gosub *drawMap          // マップを描画する
    gosub *drawCharacter    // キャラクタを描画する
    redraw 1
    return

// マップを描画する
*drawMap
    pos 00 : gcopy 1, scrollX, scrollY, ginfo_winxginfo_winy
    return

// キャラクタを描画する
*drawCharacter
    drawX = x - scrollX : drawY = y
    boxf drawX - CHARACTER_SIZE, y - CHARACTER_SIZE, drawX + CHARACTER_SIZE, drawY + CHARACTER_SIZE
    return

0 件のコメント: