ほんの少し手を入れるだけで、画像が移動するようにできます。
その方法のご説明です。
今回は修正箇所以外は、文字色をグレーにしてみました。
---
; クリックした2点間で絵を移動する2(画像編)
; クリックフラグ [ 1回目のクリック:1 | 2回目以降のクリック:0 ]
bIsFirstClick = 1
; クリック座標(x,y)の2次元
dim naPoints, 2, 2
naPoints(0,0) = 0 ; 始点初期化(0,0)
naPoints(0,1) = 0
naPoints(1,0) = 0 ; 終点初期化(0,0)
naPoints(1,1) = 0
; 絵を描く点(x,y)(WriteImageで利用する)
dim naImagePoints, 2
naImagePoints = 0, 0 ; 初期化(0,0)
; 絵を読み込む
celload "Pacman.bmp" ; 画像ファイル
imgPac = stat ; 画像のIDを保存
; 背景
color 0, 0, 0
boxf
onclick gosub *DoClickEvent
stop
; クリックイベント
*DoClickEvent
if( bIsFirstClick=1 ){
; 1回目のクリック
; 画面をクリア
color 255,255,255
boxf
; 始点座標
naPoints(0,0) = mousex
naPoints(0,1) = mousey
; スタート地点に画像を書く
naImagePoints = mousex, mousey
gosub *WriteImage
bIsFirstClick = 0
}else{
; 2回目以降のクリック
; 終点座標
naPoints(1,0) = mousex
naPoints(1,1) = mousey
; 始点から終点に移動
gosub *MoveImage
; 終点を始点に
naPoints(0,0) = naPoints(1,0)
naPoints(0,1) = naPoints(1,1)
}
return
; 画像を移動
*MoveImage
; クリックイベントをオフ
onclick 0
; ループカウント(10回で移動する)
i = 0
max_i = 10
; 移動距離を計算
dim naDistance, 2
naDistance(0) = int((naPoints(1,0) - naPoints(0,0)) / max_i)
naDistance(1) = int((naPoints(1,1) - naPoints(0,1)) / max_i)
; 開始位置を設定
naImagePoints = naPoints(0)
; 移動ループ
for i, 0, max_i, 1
; 移動距離を加算
naImagePoints(0) = naImagePoints(0) + naDistance(0)
naImagePoints(1) = naImagePoints(1) + naDistance(1)
; 画像を描画
gosub *WriteImage
await 40
next
; クリックイベントをオン(復活)
onclick 1
return
; naImagePointsに画像を描く
*WriteImage
; 描画停止
redraw 0
; 背景
color 0, 0, 0
boxf
; 画像
gmode 2 ; 透明色ありの指定
pos naImagePoints(0)-8, naImagePoints(1)-8
; 表示位置の設定
celput imgPac ; 画像コピー
; 描画再開
redraw 1
return
---
修正箇所は3箇所です。
1.
初期処理で画像を読み込んでおきます。
こうすることで、後から何度も読み直す必要がなくなり、
パフォーマンスがよくなります。
(ファイルを読むことはコンピューターの世界ではかなり遅い処理)
2.
boxfしていた箇所を消しました。
理由は3.
3.
下記の処理に変更しました。
描画を停止
boxfで背景を塗る
画像を表示
描画を再開
描画の停止/再開は、画面のちらつき防止です。
(ですが今回のような簡単な絵のケースでは、ちらつきません。。
だからどっちでもいいけど、絵を描くときはやるもんだと思っていた方がよさげです。)
boxfで背景を塗るのをこの間に入れました。
画像の表示は、一度覚えておけばずっと使える技です。
と、予想通り、簡単にできちゃいました。