距離感の実験

遠近法の続き - 永字八法の続き。
結局、距離感の演出に角度を計算する必要はないことがわかった。つうか、考えた結果、そういう結論に。
プレイヤーの視点から、立ち絵までの距離を任意に設定する(たとえば、100。単位はよくわからんが)。この時、距離が2倍になれば、みかけの大きさは半分になり、3倍になれば3分の1になる。数式で表すと、

大きさへの修正(比率)=基本距離/距離

となる。
これを利用して、実験的にスクリプトを組んでみた。

00.txt

;mode800
*define
mov %0,100
numalias cursor_x,%0:inc %0
numalias sp_x,%0:inc %0
numalias sp_y,%0:inc %0
numalias sp_width,%0:inc %0
numalias sp_height,%0:inc %0
numalias sp_mul,%0:inc %0
numalias sp_rl,%0:inc %0

numalias standard_distance,%0:inc %0
numalias distance,%0:inc %0

usewheel
game
*start
saveoff
caption "距離感の実験"

; スプライトのサイズを取得。
lsph 0,":a;t.bmp",0,0
getspsize 0,%sp_width,%sp_height
csp 0

; 初期設定
mov %standard_distance,100 ; 基準距離は100
mov %distance,100 ; 彼我の距離の初期値

; スプライトを表示しておく。
lsp2 1,":a;t.bmp",0,0,100,100,0
lsp2 2,":a;t.bmp",0,0,100,100,0
*main
; 倍率を計算する。
mov %sp_mul,100*%standard_distance/%distance
; 位置を決定する。
mov %sp_x,600+%cursor_x*%sp_mul/100
mov %sp_y,600-%sp_height*%sp_mul/200
; 表示する。
amsp2 1,%sp_x,%sp_y,%sp_mul,%sp_mul,0,255
amsp2 2,200,600-%sp_height/2,100,100,0,255
itoa2 $distance,%distance
mov $0,":s/26,26,0;#FFFFFF彼我の距離:"+$distance
lsp2 0,$0,400,26,100,100,0

print 1
; ボタンモード
btndef ""
getcursor
btnwait2 %0 ; 入力待ち
if %0=-2 inc %distance
if %0=-3 dec %distance
if %0=-40 inc %distance
if %0=-42 dec %distance
if %0=-41 inc %cursor_x
if %0=-43 dec %cursor_x
if %distance<1 mov %distance,1
goto *main

※t.bmpは適当なアルファブレンドの立ち絵とする。

説明

同じ立ち絵が二つ並ぶ。左は不変で、右はマウスホイールの上下やカーソルの上下によって仮想の距離を変更できる。距離を変更すると、大きさも変化する。

感想

理論は色々あるが、実際にプログラムにしてみると驚くほど簡単だったりするものだなあ。フックの法則みてー。