direct режим
В INSTEAD существует режим прямого доступа к графике. В теме он задаётся с помощью параметра:
scr.gfx.mode = direct
Этот параметр можно заранее выставить в theme.ini, или воспользоваться модулем theme. Или (что лучше), специальной функцией:
sprite.direct(true)
Если режим удалось включить -- функция вернёт true. sprite.direct() без параметра -- возвращает текущий режим (true -- если direct включён.)
В этом режиме игра имеет прямой доступ ко всему окну и может выполнять отрисовку в процедуре таймера. Экран представлен специальным спрайтом:
sprite.scr()
Например:
require "sprite"
require "timer"
require "theme"
sprite.direct(true)
local stars = {}
local w, h
local colors = {
"red",
"green",
"blue",
"white",
"yellow",
"cyan",
"gray",
"#002233",
}
function game:timer()
local scr = sprite.scr()
scr:fill 'black'
for i = 1, #stars do
local s = stars[i]
scr:pixel(s.x, s.y, colors[s.dy])
s.y = s.y + s.dy
if s.y >= h then
s.y = 0
s.x = rnd(w) - 1
s.dy = rnd(8)
end
end
end
function start()
w, h = theme.scr.w(), theme.scr.h()
w = std.tonum(w)
h = std.tonum(h)
for i = 1, 100 do
table.insert(stars, { x = rnd(w) - 1, y = rnd(h) - 1, dy = rnd(8) })
end
timer:set(30)
endЕщё один пример:
require "timer"
require "sprite"
require "theme"
local spr = sprite
declare {
fnt = false, ball = false, ballw = 0,
ballh = 0, bg = false, line = false,
G = false, by = false, bv = false,
bx = false, t1 = false,
}
function init()
fnt = spr.fnt(theme.get 'win.fnt.name', 32);
ball = fnt:text("INSTEAD 3.0", 'white', 1);
ballw, ballh = ball:size();
bg = spr.new 'box:640x480,black';
line = spr.new 'box:320x8,lightblue';
spr.direct(true)
end
function start()
timer:set(20)
G = 9.81
by = -ballh
bv = 0
bx = 320
t1 = instead.ticks()
end
function phys()
local t = timer:get() / 1000;
bv = bv + G * t;
by = by + bv * t;
if by > 400 then
bv = - bv
end
end
function game:timer(s)
local i
for i = 1, 10 do
phys()
end
if instead.ticks() - t1 >= 20 then
bg:copy(spr.scr(), 0, 0);
ball:draw(spr.scr(), (640 - ballw) / 2, by - ballh/2);
line:draw(spr.scr(), 320/2, 400 + ballh / 2);
t1 = instead.ticks()
end
endВнимание! direct режим может быть использован для создания простых аркадных игр. В некоторых случаях, вы можете захотеть убрать указатель мыши. Например, когда игра управляется только с клавиатуры.
Для этого воспользуйтесь функцией instead.mouse_show()
instead.mouse_show(false)При этом в меню интерпретатора INSTEAD указатель мыши всё ещё будет виден.