したらばTOP ■掲示板に戻る■ 全部 1-100 最新50 | |

RCのためのLuaの関数を集めるスレ

1name=NONE:2005/06/03(金) 13:35:07
Luaの関数はスクリプトより汎用性高いから、実はプログラミング初心者にはLuaを薦めたほうがいいんじゃないか?とおもった。
そこで、このスレに使いやすい関数を集めてみませんか?

2name=NONE:2005/06/06(月) 02:43:27
試しに作った十字ライン描画関数
意外に使いやすそうなのでのせてみる。
チップの半分が0.3であることに注意。

-- CrossLine() 十字ラインの描画
-- chip : 原点となるチップ番号
-- dis : 原点からのZ軸方向の距離
-- width : 幅
-- height: 高さ
-- col : 色
-- 使用例 : CrossLine(2, 1.5, 0.3, 0.3, 16711680)

function CrossLine(chip, dis, width, height, col)
dummy=_SETCOLOR(col)

dx=-_ZX(chip)*dis
dy=-_ZY(chip)*dis
dz=-_ZZ(chip)*dis

x=_XX(chip)*width
y=_XY(chip)*width
z=_XZ(chip)*width
dummy=_MOVE3D(_X(chip)+dx+x,_Y(chip)+dy+y,_Z(chip)+dz+z)
dummy=_LINE3D(_X(chip)+dx-x,_Y(chip)+dy-y,_Z(chip)+dz-z)
x=_YX(chip)*height
y=_YY(chip)*height
z=_YZ(chip)*height
dummy=_MOVE3D(_X(chip)+dx+x,_Y(chip)+dy+y,_Z(chip)+dz+z)
dummy=_LINE3D(_X(chip)+dx-x,_Y(chip)+dy-y,_Z(chip)+dz-z)
end

3name=NONE:2005/06/06(月) 03:04:58
いきおいで載せてしまったが、もう少しだけすっきりさせときます。
Z方向の距離は好みで前方をプラスにしてあります。
使いやすいように適当に変えて使ってください。
ライン描画を使用しているので15B11に対応

-- CrossLine() 十字ラインの描画
-- chip : 原点となるチップ番号
-- dis : 原点からのZ軸方向の距離
-- width : 幅
-- height: 高さ
-- col : 色
-- 使用例 : CrossLine(2, 1.5, 0.3, 0.3, 16711680)
function CrossLine(chip, dis, width, height, col)
-- 色
dummy=_SETCOLOR(col)

-- 描画原点
cx=_X(chip)-_ZX(chip)*dis
cy=_Y(chip)-_ZY(chip)*dis
cz=_Z(chip)-_ZZ(chip)*dis

-- 横ライン
x=_XX(chip)*width
y=_XY(chip)*width
z=_XZ(chip)*width
dummy=_MOVE3D(cx+x, cy+y, cz+z)
dummy=_LINE3D(cx-x, cy-y, cz-z)

-- 縦ライン
x=_YX(chip)*height
y=_YY(chip)*height
z=_YZ(chip)*height
dummy=_MOVE3D(cx+x, cy+y, cz+z)
dummy=_LINE3D(cx-x, cy-y, cz-z)
end

4name=NONE:2005/06/07(火) 20:43:08
ボタン2個同時押しにも対応した、モード切替関数です。
この関数を使うときは、main関数の最後のほうに下の一行を入れてください。

for i = 0,16,1 do mem[i]=_KEY(i) end

-- m:現在のモード max:モードの最大個数(モード(m)は0から1ずつ増えていって、最大max-1まで増えた後に0にもどる)
-- ki1,ki2:モード変更キー(キー一個の場合は両方に同じ数字を入れる)
-- mem[n] = 1フレーム前の_KEY(n)(グローバル変数として定義してやってください)
-- 使用例 mode = function mode_change(mode,4,5,3)
-- この使用例だと、最初にmode=0だとして、ZとXを同時押しするごとに、modeが0→1→2→0→・・・と変わってゆく

mem={} -- キー状態記憶用行列

function mode_change(m,ki1,ki2,max)--2個同時押し対応モード変更関数--
if ((_KEY(ki1)==1) and (_KEY(ki2)==1) and (mem[ki1]==0) and (mem[ki2]==0)) then-- 現在キー押下され、前フレームで押されていない場合
m=math.mod(m+1,max)
end
return m
end


-- うーん、グローバル変数必須だったり、main関数にも変更加えないといけなかったり、ちょっと使いにくいかなぁ・・・

5name=NONE:2005/06/17(金) 09:39:32
Luaの練習に作ってみる。といっても全体的にCrossLineのパクリっぽい
Ctrl+F10視点でX,Y(32,32が右上、-32,-32が左下)指定すると
線が描けるって奴です
一応ZOOMを変えても同じ大きさに見える様にしてあります
disは0.3固定でいいかも
k=set2D()
_SETCOLOR(16711680)
move2D(21, 0.3, 1.5, k)
line2D(32, 32, 1.5, k)
line2D(0, -32, 1.5, k)
・・・
みたいな感じで使います

-- set2D() 開始点初期化
--move2D、line2Dに必要な引数を作成、1フレームに一回だけでOK
function set2D()
--視野角取得
zo=_ZOOM(0)/2
--初期化計算
k=math.tan(math.rad(zo))/10
--move2D,line2D用戻り値
return k
end

6name=NONE:2005/06/17(金) 09:43:46
-- move2D() 開始点設置
-- dis : 原点からのZ軸方向の距離(0.3〜600程度)
-- width : X軸(-32〜32)
-- height: Y軸(-32〜32)
-- k:set2Dの戻り値
-- 使用例 : move2D(0.3, 0.3, 1.5, k)
function move2D(width, height, dis, k)
-- 原点
cx=_X(0)-_ZX(0)*dis
cy=_Y(0)-_ZY(0)*dis
cz=_Z(0)-_ZZ(0)*dis
--描画開始点計算
w=k*(-width)/dis
h=k*(-height)/dis
x=_XX(0)*w+_YX(0)*h
y=_XY(0)*w+_YY(0)*h
z=_XZ(0)*w+_YZ(0)*h
--開始点設置
dummy=_MOVE3D(cx+x, cy+y, cz+z)

end

7name=NONE:2005/06/17(金) 09:45:39
-- line2D() 線を描画(0.3〜600程度)
-- dis : 原点からのZ軸方向の距離
-- width : X軸(-32〜32)
-- height: Y軸(-32〜32)
-- k:set2Dの戻り値
-- 使用例 : line2D(0.3, 0.3, 1.5, k)

function line2D(width, height, dis, k)

-- 原点
cx=_X(0)-_ZX(0)*dis
cy=_Y(0)-_ZY(0)*dis
cz=_Z(0)-_ZZ(0)*dis

--描画目標点計算

w=k*(-width)/dis
h=k*(-height)/dis

x=_XX(0)*w+_YX(0)*h
y=_XY(0)*w+_YY(0)*h
z=_XZ(0)*w+_YZ(0)*h

--描画開始
dummy=_LINE3D(cx+x, cy+y, cz+z)
end

8name=NONE:2005/06/17(金) 17:59:31
--棒グラフ表示関数(値、値の最大値)
function bargraph(value, max)
local maxlength = 10 --グラフの最大長
local point = "*" --ポイントに使う文字
local bar = ""
length = maxlength * value / max
for i=0, length-1 do
bar = bar..point
end
return bar
end
--

--使用例 Basicに組み込む場合
out(10, bargraph(-ENGINE, 2500))

98:2005/06/17(金) 18:59:47
function bargraph(value, max)
local maxlength = 10
local point = "*"
length = maxlength * value / max
return string.rep (point, length)
end
もっと簡潔に書けた。

108:2005/06/17(金) 21:07:04
--16進数を10進数に変換
function hextodec(x)
local n = tonumber(string.sub(x, -1, -1))
if n == nil then n = hextable[string.sub(x, -1, -1)] end
if string.len(x) == 1 then return n
else return hextodec(string.sub(x, 1, -2)) * 16 + n end
end
hextable = { a = 10, b = 11, c = 12, d = 13, e = 14, f = 15 }
使用例
out(1, hextodec("ffffff"))
_SETCOLOR(hextodec("ffcc99")))
色の16進指定にも使える。

11name=NONE:2005/06/18(土) 03:55:55
-- LongValue() 小数第三位以上の数値を文字列として得る
-- 使用例: out(0,LongValue(_FPS()))
function LongValue(num)
local ret = string.gsub(string.format("%q",num),"%p(%d*)(.*)(%d*)%p","%1 %2%3")
return ret
end

10進数値文字列を表示しようとすると小数二桁に丸められてしまうのを回避する。
%1と%2の間にスペースが一つ入ってるのがミソであり肝であり苦肉の作。

12name=NONE:2006/03/21(火) 18:28:35
age


新着レスの表示


名前: E-mail(省略可)

※書き込む際の注意事項はこちら

※画像アップローダーはこちら

(画像を表示できるのは「画像リンクのサムネイル表示」がオンの掲示板に限ります)

掲示板管理者へ連絡 無料レンタル掲示板