本家掲示板に投稿したものに少し手を加えたもの。
説明用なので読みやすくするべく、本来は必要ない変数を多用している。#const WAIT_TIME 3 // ウェイト[10ms]
#const SPEED 5 // 移動スピード
#const CHARACTER_SIZE 5 // キャラクタの描画サイズ
#const BLANK 100 // マップスクロールが始まる位置
screen 0, 480, 240, SCREEN_NORMAL
x = 0 : y = ginfo_winy / 2 // キャラクタの位置
scrollX = 0 : scrollY = 0 // 画面左上のマップ上での位置(=スクロール量)
mapWidth = 750 // マップの幅
// 適当にマップを準備
buffer 1, mapWidth, ginfo_winy, SCREEN_NORMAL
repeat 20
hsvcolor rnd(192), 100, 255
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 - BLANK, 0, mapWidth - ginfo_winx)
}
if ginfo_winx - BLANK < x - scrollX {
// キャラクタが(ginfo_winx - BLANK)より右側に移動した場合、カメラを移動させる
scrollX = limit(x + BLANK - ginfo_winx, 0, mapWidth - ginfo_winx)
}
return
//いろんな描画処理
*draw
redraw 0
gosub *drawMap // マップを描画する
gosub *drawCharacter // キャラクタを描画する
redraw 1
return
// マップを描画する
*drawMap
pos 0, 0 : gcopy 1, scrollX, scrollY, ginfo_winx, ginfo_winy
return
// キャラクタを描画する
*drawCharacter
drawX = x - scrollX : drawY = y
boxf drawX - CHARACTER_SIZE, y - CHARACTER_SIZE, drawX + CHARACTER_SIZE, drawY + CHARACTER_SIZE
return
2007年7月1日日曜日
マップのスクロール
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿