画面に線を引くテスト

といっても直接描画命令ではなくてスプライトの矩形塗りつぶしによるものですが。

  • GDIを使った線や矩形や円などの描画関数も実装したい。
NScripter更新予定/シナリオ仕事開始 - 高橋直樹の仕事と日常の日記

が付いたら “○△□” とか描画できるのにっ!*1
(NScripter(Version 2.95)で動かしてみてください)


  • 00.txt
*define
luacall animation
luasub init
luasub animestart
luasub animestop
game

*start
init
animestart
caption "[SHIFT] キーでマウスカーソルの場所に線を表示します"
こんにちは、世界。@
animestop
中に誰もいませんよ。@
end


LINEWIDTH = 50  -- 描画される線の太さ
LINECOLOR = '00FFFF'  -- 線の色(RRGGBB)
LINELIFE = 4000  -- 寿命(ms)

MAX_Y = 480

Sprite = {}
function Sprite:new(number, size, x, y)
    local sprite = {}
    for i, v in pairs(self) do
        sprite[i] = v
    end
    sprite.starttime = NSTimer()
    sprite.number = number
    sprite.x, sprite.y = x, y
    sprite.size = size
    sprite:putsprite(number, size, x, y)
    return sprite
end
function Sprite:animation()
    self.size = math.max(0,
        self.size *  (LINELIFE - (NSTimer() - self.starttime )) / LINELIFE)
    self:putsprite(self.number, self.size, x, y)
end
function Sprite:stop()
    NSExec(string.format('vsp %d, 0', self.number))
end
function Sprite:putsprite()
    local x = self.x - self.size / 2
    local y = 0
    NSExec(string.format('lsp %d, ":c;>%d,%d,#%s", %d, %d',
        self.number, self.size, MAX_Y, LINECOLOR, x, y))
end

SpriteManager = {}
function SpriteManager:init(start_number)
    self.sprites = {}
end
function SpriteManager:newsprite(size, x, y)
    local id = #self.sprites + 1
    for i, v in pairs(self.sprites) do
        if v.size == 0 then
            id = i
            break
        end
    end
    self.sprites[id] = Sprite:new(id, size, x, y)
end
function SpriteManager:animation()
    for i, v in pairs(self.sprites) do
        v:animation()
    end
end
function SpriteManager:stop()
    for i, v in pairs(self.sprites) do
        v:stop()
    end
end

function NSCOM_init()
    SpriteManager:init()
    NSExec('erasetextwindow 0')
    NSExec('print 1')
end

function NSCOM_animestart()
    NSLuaAnimationMode(true);
end

function NSCOM_animestop()
    NSLuaAnimationMode(false);
    SpriteManager:stop()
    NSExec("print 1")
end

OLDKEY = false
function NSCALL_animation ()
    SpriteManager:animation()
    local key = NSGetKey('SHIFT')
    local x, y = NSGetMouse()
    if key and not OLDKEY and x ~= -1 and y ~= -1 then
        SpriteManager:newsprite(LINEWIDTH, x, y)
    end
    OLDKEY = key
    NSExec("print 1")
    return true
end

-- Public Domain. 好きに流用してください。



まだ Lua にも NScripter にも慣れてないのでぐだぐだなソースですがとりあえず。

使ってみた感想ですが。Luaデバッグが手間です。変数名のスペルミスしても Python と違いエラーにならずに nil 返って来ちゃうし。まあこの仕様も、組み込み用途だと下手にエラーで止まるより間違った動作であれ停止しない事を求められる、ということからなのかな? それ考えると一概にどちらが良いとも言えないか。

*1:いや今でも PNG 画像なりで用意すればいいだけだけども、こういう手軽な実験にそれは重いし