【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/
0298デフォルトの名無しさん
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クラスとかも登録したいと考えてました。
設計考えてきます。
0360デフォルトの名無しさん
2014/01/17(金) 02:10:14.78squirrel側の参照カウンタとはダブるだけで共通にはならんけど動作自体は問題ない
0361デフォルトの名無しさん
2014/01/17(金) 04:46:37.29g_HogeManagerをC++で定義、インスタンスをSquirrelへ公開。
で、次のスクリプト関数実行。
function Func(){
local inst = Hoge()
g_HogeManager.add(inst)
}
で、C++側でg_HogeManagerの要素に対してupdateとか呼び出したいです。
Funcのスコープ抜けた時点でSquirrel側のinstの参照カウンタが0になり、
望まない形でインスタンスが破棄されてるようです。
ので、共通の形を取りたいと考えてました。
設計が悪いってのは、この周りの考え方が怪しいのかと。
0362デフォルトの名無しさん
2014/01/17(金) 04:48:04.700363デフォルトの名無しさん
2014/01/17(金) 08:09:28.29/ / パカッ
//⌒)∩__∩
/.| .| ノ ヽ
/ | | ● ● |
/ | 彡 ( _●_) ミ Lua!!
/ | ヽ |∪| /_
// │ ヽノ \/
" ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ
0364デフォルトの名無しさん
2014/01/17(金) 16:23:55.46そりやsquirrel側はC++側の参照を知らないもの。当然かと
squirrelから渡されたものは、HSQOBJECT のかたちで取得して、保持するときには sq_addref()して、不要になったら sq_release() するのが正解
0365デフォルトの名無しさん
2014/01/17(金) 18:31:37.39メモリリークの原因になりやすい
0366デフォルトの名無しさん
2014/01/22(水) 20:05:40.980367デフォルトの名無しさん
2014/01/31(金) 16:55:15.38自分で関数を作るしかない?
0368デフォルトの名無しさん
2014/02/01(土) 23:19:13.62現在、threadをidle状態にさせるために、wakeupで終了条件を渡して
threadとして実行する関数内でreturnなりさせてidle状態にさせていますが面倒です。
0369368
2014/02/02(日) 00:01:58.470370デフォルトの名無しさん
2014/02/02(日) 00:31:12.85┼ (\. \! * // ,/) *
+ * (ヽ、 \ + * / /) +
⊂ニ ) * + ( ニ⊃
* + ⊂、 ( ∩___∩ ノ ⊃ + *
(/(/ ヽ | ノ ヽ / 、)ヽ) ┼
+ (/ ∨ ● ●レ /⌒) 、)ヽ)
* (/' | ( _●_) ミ' /、)、)´ +
+ (/'ヽ 彡、 |∪| ノ / AngelScript!!
+ / __ヽノ / * +
┼ (___) / +
/ /
(_ ⌒丶..
| /ヽ }.
し ))
ソ トントン
0371デフォルトの名無しさん
2014/02/03(月) 05:51:52.940372デフォルトの名無しさん
2014/02/05(水) 23:25:39.46sqstd_printcallstackをラップしたのをバインドしてthreadの関数内で呼び出しても、
thread.callとかthread.wakeupんとこまでのスタックしか見れなくてデバッグが面倒
0373デフォルトの名無しさん
2014/02/06(木) 01:00:28.570374デフォルトの名無しさん
2014/02/06(木) 13:14:51.80ってことはsq_getthreadとかと組み合わせれば出来んのかな。
助かったよ、ありがとう
0375デフォルトの名無しさん
2014/02/06(木) 16:31:10.120376デフォルトの名無しさん
2014/02/06(木) 16:34:11.87スレッド制御してるVMがグローバルに一つなら、そのwakeup呼び出ししてる間は
とくに変化無いから、もうグローバルに直接参照して表示してしまうってのも一つの手だね
俺はそれぞれのスレッドのwakeupは、全部C++のメインの一カ所からしか呼ばない(親VMは登録とかにしか使わない)から上をたぐる必要は特に無い
0377デフォルトの名無しさん
2014/02/06(木) 19:41:13.19で、早速また分からんことが。
・スクリプトでnewthreadで生成したスレッドをC++にてsq_getthreadで取得
・取得したvmに対してsq_newclosure,sq_seterrorhandlerで
ランタイムエラーハンドラを設定したんだけど、
スレッド実行中にエラー出ても呼ばれないんですが原因なんでしょう。
同じノリでC++からsq_setprintfuncで出力関数をセットすると期待通りに動作するんだけど。
0378デフォルトの名無しさん
2014/02/06(木) 20:13:41.720379デフォルトの名無しさん
2014/02/06(木) 20:42:06.750380デフォルトの名無しさん
2014/02/10(月) 11:35:20.59トゥイッターで「#squirrel」を検索するとマジもんのリスばっか出てくる。
どのハッシュタグならココで扱ってるSquirrel拾えるの?
0381デフォルトの名無しさん
2014/02/10(月) 11:43:35.220382デフォルトの名無しさん
2014/02/28(金) 21:55:32.80アイテムデータを打ち込むためのフォームなどを自作しておかないと、
スクリプトの良さを生かせないなぁ、というところに行き着いてしまうのですが、
個人製作の方々はそういったものを自作していたりするんでしょうか?
むしろ、そんなところに拘るくらいならUnityや他のゲーム製作ツールについて
勉強してた方がマシでしょうか?
0383デフォルトの名無しさん
2014/02/28(金) 22:11:10.98一般的なものならinport/exportで定番どころのフォーマットは対応してるので困ることはないのではないかな
対応してないとしてもconverterを書くだけだから簡単に書ける
0384デフォルトの名無しさん
2014/02/28(金) 22:15:28.12既に道を踏み外している
ゲームを完成させたいなら計画を立て直せ
そうでないなら合理性なんか考えず好きなように楽しめ
0385デフォルトの名無しさん
2014/02/28(金) 22:17:33.95まあいいや
0386デフォルトの名無しさん
2014/02/28(金) 22:31:38.48既存のモノで、マップエディタならJsonあたりで出力できるものや、
データ入力ならCSVエディタや、既存DB用ファイルを出力するエディタあたりでしょうか?
>>384
確かに、そうですね・・・
まだ数回しかチャレンジしてないのですが、どうしても毎回、
「プログラムで直書きしたのと変わらんやんけ!」か、
「CSVで十分やんけ!」という状況ばかりになってしまって、
そこから一歩ステップアップできない感じなのです
0387デフォルトの名無しさん
2014/02/28(金) 23:01:28.08RegisterObjectType に asOBJ_POD を渡すとコンストラクタ、
代入演算子その他諸々が自動生成されるって話だけど、
asOBJ_POD | asOBJ_APP_CLASS_CONSTRUCTOR みたいにして
コンストラクタだけ独自拡張する使い方は仕様的にできるようになってるの?
0388デフォルトの名無しさん
2014/03/01(土) 07:44:24.61目的と手段が逆になってんじゃないの?
0389デフォルトの名無しさん
2014/03/01(土) 10:43:43.37普通にコンストラクタも登録できるから
公式リファレンス見ろ
0390デフォルトの名無しさん
2014/03/01(土) 11:25:09.70もしC++を使ってる人がLuaは不要だと言えば、C++の方が不要だと言い返される気がする
0391デフォルトの名無しさん
2014/03/01(土) 12:09:22.88コンシューマだったり、プログラマ以外の作業員がいたり
アドベンチャーゲームみたいなジャンルだったらメリットが大きいと思うけど
個人製作だったら別に無理して活かす必要は無いような
0392デフォルトの名無しさん
2014/03/01(土) 13:21:37.93個人製作だとスクリプトファイルとかその他リソースを再読み込みする時間の方が
長かったりするのは俺だけ?てかみんなはスクリプトファイルどれくらい分割してる?
0393デフォルトの名無しさん
2014/03/01(土) 15:07:27.08ゲームは再起動するんだから、
他のリソースふくめたロード時間は
スクリプトつかっててもつかってなくても大差ないかと
スクリプト単体のロード時間は誤差の範囲だよ。確実にコンパイル&リンク時間のが長い
0394デフォルトの名無しさん
2014/03/01(土) 15:08:56.520395デフォルトの名無しさん
2014/03/01(土) 15:29:29.09修正したファイルだけ再読み込みできるようにしておくといい感じ
0396デフォルトの名無しさん
2014/03/01(土) 15:29:47.45392じゃないけど
どのリソースを読み込むかスクリプトで指示されているから
スクリプトの再読み込みはその他リソースの再読み込みとほぼ同義で
時間がかかるって話じゃないの
だから
スクリプト単体のロード時間が誤差の範囲なのは自明で
それをコンパイル&リンク時間と比較するのはこの文脈ではナンセンス
0397デフォルトの名無しさん
2014/03/01(土) 15:47:17.62スクリプトがコンパイル時間がかからなくて便利って話は、そもそもその単純比較の場合の話だから、そのメリットが得られてないならそれは作りが悪いってことだよね。結局のところ
0398デフォルトの名無しさん
2014/03/01(土) 15:47:27.35それを実現するためには副作用を減らす設計が重要で
とりあえずスクリプトで実装して
重い処理はホスト言語で実装しなおす
みたいなボトムアップな作り方してると困っちゃうんだよね
というか困った
■ このスレッドは過去ログ倉庫に格納されています