FUJIさん、こんばんは。
残念ながら(私の知る限りでは)FUJIさんが挙げた変数だけでは実現はできません。
画面のスクロール量を保存する変数が別途必要になります。
> キャラが画面の中程にいる場合は画面を固定して画面の端の方に行くとスクロールが始まる
というのがなんとなくわかったので、スクリプトを用意してみました。
cameraX, cameraYがスクロール量を保存する変数です。
// サンプルスクリプト
#const WAIT_TIME 3 // ウェイト[10ms]
#const SPEED 5 // 移動スピード
#const CHARACTER_SIZE 5 // キャラクタの描画サイズ
screen 0, 480, 240
x = 0 : y = ginfo_winy / 2 // キャラクタの位置
cameraX = 0 : cameraY = 0 // 画面左上のマップ上での位置(=スクロール量)
mapWidth = 750 // マップの幅
blank = 100 // マップスクロールが始まる位置
// 適当にマップを準備
buffer 1, mapWidth, ginfo_winy
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 *setCamera // 描画する位置を決める
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
// 描画する位置を決める
*setCamera
// (x - cameraX)が画面上でのキャラクタの位置になる
if x - cameraX < blank {
// キャラクタがblankより左側に移動した場合、カメラを移動させる
cameraX = limit(x - blank, 0, mapWidth - ginfo_winx)
}
if ginfo_winx - blank < x - cameraX {
// キャラクタが(ginfo_winx - blank)より右側に移動した場合、カメラを移動させる
cameraX = 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, cameraX, cameraY, ginfo_winx, ginfo_winy
return
// キャラクタを描画する
*drawCharacter
drawX = x - cameraX : drawY = y
boxf drawX - CHARACTER_SIZE, y - CHARACTER_SIZE, drawX + CHARACTER_SIZE, drawY + CHARACTER_SIZE
return
FUJIさんが知りたいのはおそらく*setCameraでの処理なのではないかと推測します。簡単にコメントを入れたので参考にしてください。
このスクリプトでは横方向しか考えていませんが、原理が分かれば縦方向も簡単に拡張できると思います。
limit()関数はこうした処理に便利なので、ぜひ利用してみてください。