TIC-80 テクスチャーマッピングの例題


まだ、ひっそりとTIC-80をやってます。

TIC-80 Rubber Texture Mapping #TIC80
https://tic.computer/play?cart=509


「textri」を使ったテクスチャーマッピングの例題です。
マウスでドラッグすると画像がグニャグニャに動きます。

元画像は0x4000~のスプライト領域に貼ってますが、
どうも関数の動きがイマイチです?・・・

lua言語を勉強しませんか?
TIC-80、日本でやってる人ほぼゼロかも?

チャレンジャー求む!


============================================
以下ソースコードです。
============================================

-- title: Rubber
-- author: Time Tripper
-- desc: Rubber Texture Mapping
-- script: lua

pic_data={
"000000
:
【省略】
:
0000000"
}

pal={
"000000",
"070707",
"0E0E0E",
"151515",
"1C1C1C",
"232323",
"2A2A2A",
"313131",
"383838",
"3F3F3F",
"464646",
"4D4D4D",
"545454",
"5B5B5B",
"626262",
"696969"
}

function pallet()
i=0x3FC0
for y=1,16 do
for x=1,6,2 do
poke(i,tonumber(string.sub(pal[y],x,x+1),16))
i=i+1
end
end
end

function draw_pic()
cls()
i=0x4000
for sy=0,16 do
for sx=5,20 do
for iy=0,7 do
for ix=0,3 do
x=sx*8+ix*2+1
y=sy*8+iy+1
poke(i,tonumber(string.sub(pic_data[y],x+1,x+1)..string.sub(pic_data[y],x,x),16))
i=i+1
end
end
end
end
end


sqrt=math.sqrt
max=math.max
min=math.min
abs=math.abs
rand=math.random


function len(x1,y1,x2,y2)
return sqrt((x1-x2)^2+(y1-y2)^2)
end

par={}
function make_data()
for y=-10,150,5 do
for x=-10,250,5 do
local p={}
p.px=x
p.py=y
p.vx=0
p.vy=0
p.pc=15
table.insert(par,p)
end
end
end

function move()
for y=1,31 do
for x=2,52 do
i=x+y*53
local p=par[i]
p.px=p.px+p.vx
p.py=p.py+p.vy
p.vx=p.vx*0.93
p.vy=p.vy*0.93
p.vx=p.vx+(par[i-1].px-p.px)/50
p.vx=p.vx+(par[i+1].px-p.px)/50
p.vx=p.vx+(par[i-53].px-p.px)/50
p.vx=p.vx+(par[i+53].px-p.px)/50
p.vy=p.vy+(par[i-1].py-p.py)/50
p.vy=p.vy+(par[i+1].py-p.py)/50
p.vy=p.vy+(par[i-53].py-p.py)/50
p.vy=p.vy+(par[i+53].py-p.py)/50
end
end
end

function draw()
--cls()
for y=0,31 do
for x=1,52 do
i=x+y*53
local p=par[i]
textri(par[i].px,par[i].py,
par[i+1].px,par[i+1].py,
par[i+53].px,par[i+53].py,
(x-1)*5,y*5,
x*5,y*5,
(x-1)*5,(y+1)*5,
false,
0)
textri(par[i+54].px,par[i+54].py,
par[i+1].px,par[i+1].py,
par[i+53].px,par[i+53].py,
x*5,(y+1)*5,
x*5,y*5,
(x-1)*5,(y+1)*5,
false,
0)
--pix(p.px,p.py,15)
end
end
end

function init()
draw_pic()
pallet()
make_data()
end


init()


function TIC()
mx,my,md=mouse()
if md then
for i=1,#par do
local p=par[i]
w=len(mx,my,p.px,p.py)
if w<10 then
p.px=mx
p.py=my
end
end
end
move()
draw()
end