【Lua】組み込み系言語総合 その6【Squirrel】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2013/03/10(日) 15:10:32.28使われるプログラミング言語についてのスレッドです
まとめwiki(なにか質問する前に必ずみること!)
http://wikiwiki.jp/lua/
その他の参考URLは>2から
■前スレ
【Lua】組み込み系言語総合 その5【Squirrel】
http://toro.2ch.net/test/read.cgi/tech/1321063450/
■過去スレ
その4 http://hibari.2ch.net/test/read.cgi/tech/1301414458/
その3 http://hibari.2ch.net/test/read.cgi/tech/1272643397/
その2 http://pc12.2ch.net/test/read.cgi/tech/1243210301/
その1 http://pc12.2ch.net/test/read.cgi/tech/1205208141/
プログラミング言語 Lua
その3 http://pc11.2ch.net/test/read.cgi/tech/1160799232/
0260デフォルトの名無しさん
2013/11/03(日) 14:45:33.09可能ならuserdataで確保したメモリそのものに割り当てるか
スマポとかで包んでからuserdataに突っ込む感じになるかと
0261デフォルトの名無しさん
2013/11/03(日) 18:17:24.790262デフォルトの名無しさん
2013/11/03(日) 21:02:45.16リファレンス見ても機能が少ないだけで何が嬉しいか分からなかった。
0263デフォルトの名無しさん
2013/11/04(月) 00:14:11.47そこまでやるならもうAngelScriptの方がいいような気がする。
0264デフォルトの名無しさん
2013/11/04(月) 00:19:18.11ポインタもってるだけだから圧倒的にシンプルだよ。luaがわでは寿命管理しないけどとにかくデータの参照を維持したい場合に使う
0265デフォルトの名無しさん
2013/11/04(月) 00:23:01.58tableじゃなくてuserdataのmetatable使うのか。面白そうなのでやってみた
配置newを定義して__gcをセットしたmetatableを設定する. gcでデストラクタを明示的に呼ぶ
class a{
void *operator new(size_t size, lua_State *L) {
void *p =lua_newuserdata(L, size);
lua_newtable(L);
lua_pushcfunction(L, gc);
lua_setfield(L, -2, "__gc");
lua_setmetatable(L, -2);
return p;
}
static int gc(lua_State *L) {
a *p = static_cast<a *>(lua_touserdata(L, -1));
p->~a();
return 0;
}
};
// newと同時にLUAスタックにプッシュされる
a *a1 = new(L) a;
0266デフォルトの名無しさん
2013/11/04(月) 01:05:41.10lua内の変数のコピーも認識できないとdeleteしていいかわからないなぁ。
0267266
2013/11/04(月) 01:11:07.790268デフォルトの名無しさん
2013/11/04(月) 01:56:57.820269デフォルトの名無しさん
2013/11/04(月) 02:42:16.330270デフォルトの名無しさん
2013/11/04(月) 03:46:09.89あんまりそういう作りになってないなぁ
0271デフォルトの名無しさん
2013/11/04(月) 09:52:17.93newではないコンストラクタを使うからできるんだよ
newを使わない保証があるなら参照カウンタもいらないよ
0272デフォルトの名無しさん
2013/11/04(月) 15:21:11.51> このlua内の変数のスコープがはずれたりしたときに、
0273デフォルトの名無しさん
2013/11/04(月) 15:38:02.02明示的なリソース廃棄処理つくらないと回避できない
0274デフォルトの名無しさん
2013/11/04(月) 16:24:50.58あはは、たしかにw
スコープがはずれたとき
ではなく
スコープがはずれたりしたとき
であるから
結局GCで事足りるなw
0275デフォルトの名無しさん
2013/11/04(月) 18:42:33.31行うなんてのはGC備えてる言語じゃ禁じ手じゃん。
C++オブジェクトに限らず、Luaオブジェクトでもスコープ外れた
タイミングで即解放なんて無理でしょ。
C++と同じようなスコープ外れて即廃棄は無理なので、それの寿命
をLuaオブジェクトで管理しようというなら設計が間違ってる。
0276274
2013/11/04(月) 19:39:14.73このケースは前者でやる必要がないからやらないだけなんだよ。
やればやれるよ?
metatableのdestructorで
時限付きにhookONしてそこでcollectすればいいだけでしょ?
で、それがなんだよって話。
0277デフォルトの名無しさん
2013/11/04(月) 22:38:46.70いやマジで
0278デフォルトの名無しさん
2013/11/04(月) 23:06:44.14http://www.javafesta.jp/2007/pdf/C1.pdf
http://www.infoq.com/jp/news/2010/11/tc-bigmemory
0279デフォルトの名無しさん
2013/11/04(月) 23:17:12.730280デフォルトの名無しさん
2013/11/05(火) 00:28:39.930281デフォルトの名無しさん
2013/11/05(火) 08:03:02.46Javaはチューニングがサーバー用だからアレだが
まあそこまでいかないと性能が出ないなら個人レベルでは無理があるわな
0282デフォルトの名無しさん
2013/11/05(火) 12:38:56.980283デフォルトの名無しさん
2013/11/05(火) 20:08:05.760284デフォルトの名無しさん
2013/11/05(火) 20:24:10.43┼ (\. \! * // ,/) *
+ * (ヽ、 \ + * / /) +
⊂ニ ) * + ( ニ⊃
* + ⊂、 ( ∩___∩ ノ ⊃ + *
(/(/ ヽ | ノ ヽ / 、)ヽ) ┼
+ (/ ∨ ● ●レ /⌒) 、)ヽ)
* (/' | ( _●_) ミ' /、)、)´ +
+ (/'ヽ 彡、 |∪| ノ / AngelScript!!
+ / __ヽノ / * +
┼ (___) / +
/ /
(_ ⌒丶..
| /ヽ }.
し ))
ソ トントン
0285デフォルトの名無しさん
2013/11/05(火) 23:42:30.140286デフォルトの名無しさん
2013/11/06(水) 09:10:15.250287デフォルトの名無しさん
2013/11/07(木) 07:39:13.29参照カウンタって単なるコーディングテクニックみたいなもんだから注釈なしでGCと呼ぶのは抵抗ある
0288デフォルトの名無しさん
2013/11/07(木) 09:59:04.250289デフォルトの名無しさん
2013/11/07(木) 12:43:45.41GCの実装の仕方の一つとして、参照カウントを使うものがある、といった感じ
0290デフォルトの名無しさん
2013/11/07(木) 15:16:54.50狭義では参照カウントとtracingに分けて、tracing型のみをGCとすることもある。
まだ一般的ではないが "A unified theory of garbage collection" という論文によれば、
参照カウントとtracingは双対なんだそうだ。
0291デフォルトの名無しさん
2013/11/07(木) 20:06:48.850292デフォルトの名無しさん
2013/11/15(金) 18:43:55.94つまりどういうことなのかっていうのがイマイチ掴めません
例えば、C/C++コード(DxLibやSDLなど)で適当にゲームウインドウを表示したら
あとはスクリプトコードを呼び出すだけ、という状態のことなのでしょうか?
このときに、最低限としてスクリプト側からC側の
・メインループ毎に必要な処理(DxLibのProcessMessageなど)
・キーボード・マウス・ジョイパッドなどの入力を取得する機能
・画像を表示する機能
など、呼び出すことができれば最低限ゲームっぽいことはできそうでしょうか?
そして、速度の問題がある処理はその都度C側で記述していく、とか
あるいは、あるタイミングの数値計算処理であるとか、RPGのイベントだとか
再コンパイルせずに調節したい場合にスクリプトを用いるということもあると思いますが
この場合、スクリプトを実行するVMをどのインスタンスで保持するのが良いのでしょうか
0293デフォルトの名無しさん
2013/11/15(金) 19:49:12.61それだけの話であって何から何までスクリプトということは無い
0294デフォルトの名無しさん
2013/11/15(金) 20:47:11.590295デフォルトの名無しさん
2013/11/15(金) 21:58:13.61とか、luaとゲームみたいな本には序章あたりにそういうこと書いてあるから、何冊か本屋でみてみたら?
0296デフォルトの名無しさん
2013/11/15(金) 22:02:34.14どうもありがとうございます!
いつもいつもプログラミングのみでミニゲーム作る止まりなので
スクリプト組み込みを勉強してに中規模以上のゲームを作れるようにがんばります
0297デフォルトの名無しさん
2013/12/04(水) 01:39:29.320298デフォルトの名無しさん
2013/12/15(日) 20:30:59.57やり口としてはどういうのが良いでしょうか?
今考えているのは
・会話イベントのひとまとまりごとに1ファイルで記述する
・文章を記述する前に置換文字や会話に使用するキャラクターを定義できる
・会話シーンに必要なアクション(立ち位置、表情変更など)を記述できる
想像してるイメージとしては↓な感じです
(使用スクリプト未定なので文法やメソッド名は適当です。雰囲気が伝わればいいですが・・・)
//event1.txt
//最初に置換文字や、使用キャラクターを定義
player = data.getCharacter("主人公"); //キャラ自体を取得
sub = data.getCharacter("サブキャラ");
city = data.getString("街の名前"); //置換文字として定義
//イベント開始
startEvent();
setCharacter(sub);
message(
"いらっしゃい " + player + "さん。" + BR +
city + "にようこそ。");
//キャラクタークラスはそのまま文字置換にも使えるようにする。
//BRには改行を定義しておく。
endEvent();
//
これだとダブルクォーテーションがクドい気がするので "ようこそ$[player]さん" みたいなやり方にすべきでしょうか?
0299デフォルトの名無しさん
2013/12/15(日) 20:51:22.29安直に汎用スクリプト使おうじゃなくて、まずはユースケースを洗い出してみろ
それほどいろんな機能も自由度もいらないことがわかるはず
0300デフォルトの名無しさん
2013/12/16(月) 00:21:21.85下手に高級言語にすると死ぬ
人に使わせること考えると、プレーンテキストにタグ埋めるスタイル以外はあり得ない
0301デフォルトの名無しさん
2013/12/16(月) 00:49:52.86セーブや細かい制御のことを考えると、汎用言語を使っても結局
言語内DSL的なものでデータとして埋め込むような形にしかならん
汎用言語の機能をほとんど活かせず、インタプリタを作る手間も無くならず、
ただスクリプトを書くのが面倒になるだけ
0302デフォルトの名無しさん
2013/12/16(月) 01:33:50.360303デフォルトの名無しさん
2013/12/16(月) 18:01:34.83ありがとうございます、セーブ完全に考えてませんでした。
途中セーブ考えると難易度かなり上がりますね。
0304デフォルトの名無しさん
2013/12/16(月) 21:48:48.52ADVゲームなんて保存しておくデータは少ないしな
0305デフォルトの名無しさん
2013/12/19(木) 20:06:48.550306デフォルトの名無しさん
2013/12/19(木) 21:22:15.850307デフォルトの名無しさん
2013/12/19(木) 21:35:40.70ADVは普通そんなとこでセーブする必要ないよ
もし必要になってしまってるなら設計がおかしい
0308デフォルトの名無しさん
2013/12/19(木) 21:54:56.69ADVのスクリプトみたいなプル型のインタプリタを作りやすい簡単な言語仕様で
ライブラリにソース渡したら構文解析だけやってくれればいい
0309デフォルトの名無しさん
2013/12/19(木) 22:41:18.53言うのは簡単だしいかにもそれっぽいけど単なる思考停止くさいよね
0310デフォルトの名無しさん
2013/12/19(木) 23:00:23.25EclipseのXtext/Xtendみたいなのでネイティブアプリに組み込める
ものがあったら俺も欲しいな。
0311デフォルトの名無しさん
2013/12/19(木) 23:01:36.14大枠のwhileループとifはあるにせよ、更にその中のwhileの中でセーブはともかくロードはやろうと思わない。
0312デフォルトの名無しさん
2013/12/19(木) 23:38:35.63↓
Object is a String ←設計がおかしい
0313デフォルトの名無しさん
2013/12/20(金) 01:55:56.71フラグでメッセージが変わる、とかいうのを複雑にしちゃったらそういうのが発生しそう。
0314デフォルトの名無しさん
2013/12/20(金) 12:14:01.980315デフォルトの名無しさん
2013/12/20(金) 17:12:52.37flg ? "msg-a" : "msg-b"
って書けるならそのほうがシンプル。
0316デフォルトの名無しさん
2013/12/20(金) 21:11:54.760317デフォルトの名無しさん
2013/12/21(土) 08:21:18.690318デフォルトの名無しさん
2013/12/22(日) 12:54:39.250319デフォルトの名無しさん
2013/12/23(月) 08:32:10.390320デフォルトの名無しさん
2013/12/23(月) 11:28:02.04時間がかかってはダメというのがおかしい
だからゆっくり時間をかけて慣れることが許される
0321デフォルトの名無しさん
2013/12/23(月) 12:34:02.63俺が慣れてないからforもwhileも禁止、全部ifとgotoで、って言ってた人が昔いたぞ。
>>316
既読を管理する関数 mng_read ってのを作って、
flg ? mng_read("msg-a") : mng_read("msg-b")
とするのはどう?
0322デフォルトの名無しさん
2013/12/23(月) 22:24:13.34ADVで文章部分に関数使うとか論外だろ…
それにスクリプト打つのはド素人も想定するもんだ
0323デフォルトの名無しさん
2013/12/23(月) 22:49:00.75そんなBASICでプログラミングを覚えたジジイなんて、
玉切り落としてグズの家系を根絶やしにしてしまえ。
GOTO LESSが推奨されて何年立ってると思っているんだ
0324デフォルトの名無しさん
2013/12/24(火) 09:54:37.590325デフォルトの名無しさん
2013/12/24(火) 13:19:00.89シナリオスクリプトとして考えたらはGOTOは大事だろ
IFとGOTOだけで書けばセーブデータの問題も解決するわけだし
0326デフォルトの名無しさん
2013/12/24(火) 13:43:33.10そういった場合は、遷移は別ファイルにまとめて定義が妥当
0327デフォルトの名無しさん
2013/12/24(火) 17:08:31.18ゲームのシナリオ的にはありそうじゃない。そういうのってどうしてるの?
0328デフォルトの名無しさん
2013/12/24(火) 19:11:38.28逆に言えば終了タグを必ず書くgotoなら使っていいんじゃね
0329デフォルトの名無しさん
2013/12/24(火) 19:40:46.560330デフォルトの名無しさん
2013/12/24(火) 20:16:45.260331デフォルトの名無しさん
2013/12/24(火) 21:28:56.06条件分岐使わずどうやってフラグ分岐するんだ?
>>327
そんなの見たことないが、どういうのだよ?
0332デフォルトの名無しさん
2013/12/24(火) 23:30:35.65だから別ファイル
どのシーンの次にどのシーンになるのかの
状態遷移だけを記述する言語というか
データ構造を別に準備するのさ
0333デフォルトの名無しさん
2013/12/24(火) 23:50:48.99例えばLiveMakerのシナリオ部分は文章とか画像とかの指定で
条件分岐は別になってる
シナリオ書き変えたら分岐も変わってた…なんてことはない
単純に選択肢で話が大きく分岐していくノベル用にはわかりやすくていい
でも細かいフラグ管理やパラメータ要素を入れると難しい
分岐ごとにいちいち分けて考えてたら
バグは出ない以前に途中で投げ出す可能性大
0334デフォルトの名無しさん
2013/12/25(水) 01:12:07.860335デフォルトの名無しさん
2013/12/25(水) 07:14:27.71ノベルゲーって基本テキスト主体でしょ?
逐次処理できるし、ステートの保存はフラグ一式と行番号の保存でいいし
ループ処理の構文をわざわざ用意する必要ないと思うんだけど・・・
0336デフォルトの名無しさん
2013/12/25(水) 10:33:19.18あぁ、なるほどね。
確かにそういう作り方をしてるゲームを見た事があるわ。
0337デフォルトの名無しさん
2013/12/26(木) 01:56:07.590338デフォルトの名無しさん
2013/12/26(木) 10:34:40.60クラスやコルーチンのスクリプトは組み込み言語使えば良かろ
0339デフォルトの名無しさん
2013/12/26(木) 10:38:32.16爆速コンパイルのFPCでいいと思うな
0340デフォルトの名無しさん
2013/12/26(木) 10:48:29.28ゲームのスクリプトとしては需要あるんじゃないかな。
たとえば、ある場所に来るたびに、その場所での「さっきの続き」とか。
0341デフォルトの名無しさん
2013/12/26(木) 11:18:48.57オーソドックスにフラグ立てていくなりstackでやるなりでいけるでしょ
0342デフォルトの名無しさん
2013/12/26(木) 11:41:00.70stateパターンというかインタプリタパターンで、その場用のミニ言語を作るんじゃなくて。
0343デフォルトの名無しさん
2013/12/26(木) 11:56:29.21気分で名前が変わるくらいなら名前つけない方がよいよね
0344デフォルトの名無しさん
2013/12/26(木) 12:15:58.740345デフォルトの名無しさん
2013/12/26(木) 12:24:14.010346デフォルトの名無しさん
2013/12/26(木) 12:28:28.45> 手続き的なものは、スクリプトの手続きとして直接記述したいじゃない。
すればいいじゃない
> stateパターンというかインタプリタパターンで、その場用のミニ言語を作るんじゃなくて。
フラグ立てていくだけだからeval出来るものなら既存の言語で簡単に出来るよ
記述が冗長でという話ならpegかなんかでちょろっとgeneratorを書いてやらいい
0347デフォルトの名無しさん
2013/12/28(土) 02:26:08.74クラスじゃなくって、インスタンスをバインドして
そいつがファクトリ的な関数いっぱい持ってたら
もうスクリプトの中でやりたい放題なんだね
0348デフォルトの名無しさん
2013/12/28(土) 13:42:09.78かつ、お作法も確立してるので楽ちんなんだよな
0349デフォルトの名無しさん
2013/12/29(日) 23:59:20.840350デフォルトの名無しさん
2013/12/30(月) 00:02:51.790351デフォルトの名無しさん
2013/12/30(月) 00:32:29.40メインループ中にスクリプトをどのように組み込んでいけばいいのかまったく検討がつきません。
RPGのマップ上のイベントであれば、マップロード時にスクリプトファイルを読み込んで
イベントを関数化しておく、などは想像できるのですが・・・
それとも、主要クラスをスクリプトエンジンへバインドしてしまって
メインループ自体をスクリプト側で記述するという方法なのでしょうか?
0352デフォルトの名無しさん
2013/12/30(月) 01:54:24.29luaとかsquirrelのようなコルーチンありのスクリプトなら、メインループから、実行中のコルーチンスレッドのresumeを個別に呼び出しする形も作れる
それぞれのスレッドで suspend()するたびに
次のフレームに処理が継続されるので、UI処理書くのにとても便利
両方実装して使い分けるのも有り。いずれの場合も、参照するオブジェクトはスクリプトから見えるようにバインドする必要はでてくる
0353デフォルトの名無しさん
2013/12/30(月) 17:04:01.21ありがとうございます!
コルーチン勉強しようと思います
0354デフォルトの名無しさん
2014/01/15(水) 01:28:40.370355デフォルトの名無しさん
2014/01/15(水) 01:32:56.880356デフォルトの名無しさん
2014/01/15(水) 18:55:31.970357デフォルトの名無しさん
2014/01/16(木) 23:05:15.79Suirrelでインスタンスを生成したとき、
boost::shared_ptrを用いたインスタンスにするにはどうすればいいでしょうか。
C++とSquirrelとで共通の参照カウンタを持たせたいと考えています
0358デフォルトの名無しさん
2014/01/16(木) 23:29:03.57そういうのが必要なケースってあるのかな?
設計を見なおしたほうがいいかも
0359デフォルトの名無しさん
2014/01/17(金) 00:50:30.25こっちでも使いたいなーと思ってました。
・C++でHogeクラス定義、公開
・Squirrelでインスタンス生成
・C++から公開しているオブジェクトマネージャへ登録
・C++側でさっきのHogeインスタンスを更新
みたいな構造を考えてました。
Hogeを継承したFooクラスとかも登録したいと考えてました。
設計考えてきます。
■ このスレッドは過去ログ倉庫に格納されています