このような形で改変してみましたが、どうでしょうか。
screen 0, 720, 480
title "RPG タイトルテスト"
//画面の準備
//画面全体は最初に描画しておき、ループ内では必要な部分だけ書き換えた方がよいでしょう。
//picload "gray.png" , 1 //picloadはループのたびに行ってはいけない。(それだと1秒間に何十回とHDDにアクセスすることになるので)
//↑実行する際はこのコメントアウトを解除してください
color 0, 255, 0 : boxf //画像ファイルがないので仮にこうしておきます
color 255, 255, 255
font "DotGothic16" ,40 :pos 230, 100:mes "RPG test"
font "DotGothic16" ,25 :pos 280, 160:mes "〜サブタイトル〜"
font "MS P明朝" ,20, 1 //フォント名もサイズもオプションも変わらないなら何度もfont文を実行する必要はない。
pos 320, 300:mes "はじめから"
pos 320, 330:mes "つづきから"
pos 320, 360:mes "オプション"
cursor_x0 = 300 //カーソル表示欄の左上のX座標
cursor_y0 = 303 //同Y座標
cursor_pos=0 //カーソルがどの項目に合っているか
//以下、カーソルの移動量は30ドットとする
buffer 1,30,90 //カーソルが表示される部分を別の画面に待避
gsel 1 : pos 0,0 : gcopy 0,cursor_x0,cursor_y0,30,90
gsel 0
cursor_pos_old=cursor_pos //移動する前のカーソルの位置
color 0,0,0 : font "MS P明朝" ,15, 1 //カーソルを表示するための準備
pos cursor_x0, cursor_y0+cursor_pos*30 : mes "■"
repeat
stick key
if key & $02{
cursor_pos = limit(cursor_pos-1, 0, 2)
}
if key & $08{
cursor_pos = limit(cursor_pos+1, 0, 2)
}
if key & $80:end
if cursor_pos!=cursor_pos_old {
redraw 0 //画面を更新するのはカーソルが移動した時だけなので、redrawはこの時だけ行えばよい
pos cursor_x0,cursor_y0+cursor_pos_old*30 //移動する前のカーソル位置に待避させた画像をコピーし、カーソルを消す
gcopy 1,0,cursor_pos_old*30,30,30
pos cursor_x0, cursor_y0+cursor_pos*30 : mes "■" //新しい位置にカーソルを表示
cursor_pos_old=cursor_pos
redraw 1
}
await 16 //await 5は短かすぎる。16で60FPS(1秒間に60ループ)相当。
loop