スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

カテゴリ : スポンサー広告

吉里吉里を簡単に再起動する方法

吉里吉里/KAGでゲームを作っていると、本体を再起動する必要が結構あったりします。
いちいち既に起動している吉里吉里を終了して、起動しなおすのは面倒です。
windowsのバッチファイルを使って簡単に再起動できるようにしてみます。

参考:Windows でアプリケーションを再起動するバッチ処理 - タスクの強制終了、タスクリスト、エラーレベルによる条件分岐
バッチファイルの内容は参考リンクそのままです。

バッチファイルというのは拡張子が.batのファイルで、windowsのコマンドを自動実行することができます。
今回は吉里吉里本体の再起動するためにコマンドを使います。


吉里吉里本体(krkr.exe)とKAGのプロジェクトフォルダ(dataフォルダ)は同じフォルダにあることが前提です。
そのフォルダに新しく「再起動.bat」ファイルを作成して、テキストエディタで開いて以下のコマンドを書きます。
@echo off

tasklist | findstr "krkr.exe"

if errorlevel 1 goto START
if errorlevel 0 taskkill /f /im "krkr.exe"

:START
start "" "krkr.exe"
保存して、「再起動.bat」を実行すれば吉里吉里が再起動されます。
テキストエディタのマクロやショートカットなどに登録しておくと便利かと思います。

簡単に解説すると、「tasklist | findstr "krkr.exe"」でkrkr.exeが起動しているか調べています。
「if errorlevel 1 goto START」では、起動していない場合に「:START」の行までジャンプします。
「if errorlevel 0 taskkill /f /im "krkr.exe"」で、起動していた場合にkrkr.exeを強制終了します。
最後の「start "" "krkr.exe"」でkrkr.exeを起動しています。

もし「krkr.exe」の名前を「ゲーム名.exe」と変更しているのであれば、3つある"krkr.exe"を全て"ゲーム名.exe"」と書き換えます。

また、プロジェクトフォルダについてです。
吉里吉里本体と同じフォルダに"data"フォルダがあれば、自動的にプロジェクトフォルダとして読み込まれます。
ない場合は「フォルダ/アーカイブの選択」ウィンドウが出てきてめんどくさいです。
プロジェクトフォルダは"data"フォルダとして置いておくのを推奨しますが、何らかの信念があって他の場所にプロジェクトフォルダを起きたい場合、バッチファイルでそのプロジェクトフォルダを指定できます。
例えばプロジェクトフォルダが「C:\krkr\project」フォルダなら、最後の「start」のコマンドが「start "" "krkr.exe" "C:\krkr/project"」のようになります。


解説はここまで。残りは再起動について補足なので上記のバッチファイル使うだけなら読まなくても大丈夫。

先の方法だとtaskkillで強制終了しているのでセーブデータが書き出されなかったりして問題あったりします。
実際は開発中ならそれほど困らないと思います。

/fをはずすと通常の終了になりますが、終了確認ダイアログがでてきて嬉しくありません。
正しく動作させるならKAGに手を入れて確認ダイアログを飛ばすようにするといいかもしれないですね。
それなら通常終了でセーブも大丈夫な気がします。

もっと頑張るなら再起動時のみ確認ダイアログ省略するように?
既存のmessenger.dllあたり使うと比較的簡単にできそうです。
通信させる必要があるのでちょっと面倒ですが。

普段はデバッグモードで起動させておいて、デバッグモード時のみダイアログ飛ばすようにする、くらいがちょうど良さそうです。


そもそも開発中に再起動する事自体が無駄なので、そこから何とかしたいですね。
現状のKAGEX/KAGEZレベルでも再起動が必要になる場面はほとんどありません。

続きを閉じる▲

スポンサーサイト

タグ : 吉里吉里 KAG

カテゴリ : KAG

KAGEXを使わない人へ、KAGEXの使い方

使ってみるととても便利なKAGEXですが、問題が無いわけでもありません。
説明が少ないだったりバグが多いだったり、敢えてKAGを使うという方もいると思います。

ただし直接使うのはKAGだとしても、まだKAGEXにも利用価値があります。

KAGを使うコツはマクロを上手に作ることです。
しかし、これがどうにも難しいです。
どんなマクロを作れば便利になるのか、実際に作ってみて経験値がたまらないとわかりません。

マクロの作り方はリファレンスに載っています。
でも、実際にどう使えばいいのかは自分で考えなければなりません。

ここでKAGEXを見てみるとヒントが得られます。
ノベルゲームを作るのに役立つ機能がたくさん詰め込まれているので、それを真似してみるとどんどん使いやすくなってきます。


ということでKAGEXの文法を参考に、少しだけKAGのマクロを組んでみました。
http://www.biscrat.com/krkr/files/kag_macro_sample.zip

立ち絵、背景、BGM、効果音、ボイスなどのマクロがついています。
KAGのタグを直接使うよりは圧倒的に便利なはずです。
出来る限りTJSの知識は使っていないので、KAGしか分からない方でも参考になるかと思います。
もしTJSが使えればもっと色々と出来るようになってきます。

同梱のKAGParserExb.dllはこちらからダウンロードできます。
TJSを使わずとも簡単に省略表記が実現できたりして便利です。

続きを閉じる▲

タグ : 吉里吉里 KAG

カテゴリ : KAG

KAGのバックログをフェードイン/フェードアウト

吉里吉里/KAGでバックログ(履歴)を表示または非表示にするときに、フェードイン/アウトできるスクリプト。
欲しいという人がいたのでやってみたら案外すぐ出来た。

afterinit.tjsに下のスクリプトを貼り付ければOK。
最初の『kag.historyFadeTime = 200;』の数字を変えればフェードの時間を調整できます。
kag.historyFadeTime = 2000// バックログのフェード時間
kag.historyFading = 0// バックログをフェード中か。-1の時隠し中。1のとき表示中
kag.historyFadingStopFlag = false// フェードを停止するか
// 表示するときにフェードをかけるように書き換え
kag.showHistory_org = kag.showHistory;
kag.showHistory = function() {
  showHistory_org(...);
  historyLayer.opacity = 0;
  this.historyActionStartTime = System.getTickCount();
  System.removeContinuousHandler(historyFadeFunction);
  System.addContinuousHandler(historyFadeFunction);
  historyFading = 1;
incontextof kag;
// 隠すときにフェードをかけるように書き換え
kag.hideHistory_org = kag.hideHistory;
kag.hideHistory = function() {
  historyLayer.opacity = 255;
  this.historyActionStartTime = System.getTickCount();
  System.removeContinuousHandler(historyFadeFunction);
  System.addContinuousHandler(historyFadeFunction);
  historyFading = -1;
incontextof kag;
// バックログフェード用の関数。opacityを徐々に上げるor下げる
kag.historyFadeFunction = function(now) {
  if (historyFading < 0) { // 隠す
    historyLayer.opacity = 255 - (((now - historyActionStartTime) / historyFadeTime) * 255);
    if (historyFadingStopFlag || historyLayer.opacity <= 0) {
      historyFadingStopFlag = false;
      historyLayer.opacity = 0;
      System.removeContinuousHandler(historyFadeFunction);
      hideHistory_org(...);
      historyFading = 0;
    }
  } else { // 表示する
    historyLayer.opacity = ((now - historyActionStartTime) / historyFadeTime) * 255;
    if (historyFadingStopFlag || historyLayer.opacity >= 255) {
      historyFadingStopFlag = false;
      historyLayer.opacity = 255;
      System.removeContinuousHandler(historyFadeFunction);
      historyFading = 0;
    }
  }
incontextof kag;
// ホイールが回った時にフェードを停止
kag.historyLayer.windowMouseWheel_org = kag.historyLayer.windowMouseWheel;
kag.historyLayer.windowMouseWheel = function() {
  if (window.historyFading) { window.historyFadingStopFlag = true; }
  else { windowMouseWheel_org(...); }
incontextof kag.historyLayer;
// マウスが押された時にフェードを停止
kag.historyLayer.onMouseDown_org = kag.historyLayer.onMouseDown;
kag.historyLayer.onMouseDown = function() {
  if (window.historyFading) { window.historyFadingStopFlag = true; }
  else { onMouseDown_org(...); }
incontextof kag.historyLayer;
// キーが押された時にフェードを停止
kag.historyLayer.onKeyDown_org = kag.historyLayer.onKeyDown;
kag.historyLayer.onKeyDown = function() {
  if (window.historyFading) { window.historyFadingStopFlag = true; }
  else { onKeyDown_org(...); }
incontextof kag.historyLayer;


以下余談。
画面遷移でエフェクトかかるゲームは嫌いです。
オプション画面がでる時に一瞬エフェクトかけるくらいなら許します。
が、バックログは比較的使用回数多いので減点大。
上のだとクリック、ホイール、キーボードでエフェクトスキップできるのでまあマシなはず。
どうしてもエフェクトかけたいならスキップ出来るようにしてほしい。

続きを閉じる▲

タグ : 吉里吉里 KAG TJS プラグイン

カテゴリ : KAG

吉里吉里のタグについて

吉里吉里のタグの基本的なことについて。

タグ名、属性
タグ名はタグの名前です
属性はタグのオプションを指定するものです。
@trans time=0 rule=trans vague=1

この例ではタグ名が「trans」属性名が「time」「rule」「vague」です。


ダブルクォートについて
リファレンス:http://devdoc.kikyou.info/tvp/docs/kag3doc/contents/Tags.html#tag_overview
>属性の値は "" で囲んでも囲まなくてもおなじです。
@trans time=0 rule=trans vague=1
@trans time="0" rule="trans" vague="1"

上の二行はおなじ動作になります。
>ただし、属性の値に空白をふくむような場合は、"" で囲まなければなりません。たとえば、[font face="MS Pゴシック"] です。


エンティティ
リファレンス:http://devdoc.kikyou.info/tvp/docs/kag3doc/contents/Var.html#id339
>エンティティは、& の後に書かれた属性の値の内容を、TJS2 式として実行して、その結果で属性の値を置き換える機能です。
@trans time=0 rule=trans vague=1
@trans time=&100-100 rule=trans vague=&5/5

上の二行はおなじ動作になります。
「100-100」は&がついているのでTJS式として実行され、結果は0となります。
「5/5」についてもTJS式として実行され、結果は1となります。
&のあとにはTJS式なら何でも書けます。

変数も書けます。
@eval exp="f.time = 0"
@trans time=&f.time method=crossfade vague=1

[eval]タグでゲーム変数f.timeに0を代入しています。
※exp属性の値は=をふくむのでダブルクォートで囲んでいます。
二行目のf.timeには&がついているので「f.time」がTJS式として実行され結果は0となります。

[eval]タグのexp属性には&をつけていません。
これはexp属性がもともとTJS式の値を指定する属性だからです。
リファレンス:http://devdoc.kikyou.info/tvp/docs/kag3doc/contents/Tags.html#eval
値の項目がTJS式となっていることに注意してください。
[eval]タグ以外にも[button]タグの「exp」「onenter」「onleave」属性、[emb]タグの「exp」属性などがTJS式を直接指定する属性となっています。


属性値の省略
属性値を省略して属性名だけ書くと自動的にtrueが指定されます。
@current layer=message0 page=fore withback=true
@current layer=message0 page=fore withback

上の二行はおなじ動作になります。

続きを閉じる▲

タグ : 吉里吉里 KAG 講座

カテゴリ : KAG

画像をぼかす

吉里吉里で画像をぼかします。

ぼかしたい画像を準備します。(image.jpg)
blur1.jpg

Photoshopか何かでぼかした画像を準備します。(image_blur.jpg)
blur2.jpg

自分で用意するのが面倒ならダウンロードして使ってください。
背景写真補完の会から持ってきました。

スクリプトは以下のようになります。
; 画像表示
@image layer="base" page="fore" storage="image"
@image layer="base" page="back" storage="image_blur"
; トランジションで切り替え
@trans method="crossfade" time="1000"
@wt

表ページにぼかす前の画像、裏ページにぼかした後の画像を設定してトランジションします。
この例だと1000msかけてじわじわとぼけていきます。
以上です。

凄い単純な方法ですがぼかし以外のエフェクトにも応用できます。
大抵の場合はこれでなんとかできるんじゃないでしょうか。


せっかくなので吉里吉里の機能を使ってぼかす方法も紹介しておきます。
ぼかす前の画像だけ準備します。(image.jpg)

スクリプトは以下のようになります。
; マクロ定義
@macro name="blur"
@eval exp="(kag.getLayerFromElm(mp)).doBoxBlur()"
@endmacro
; 画像表示
@image layer="base" page="fore" storage="image"
; じわじわとぼかしていく
@wait time="200"
@blur layer="base" page="fore"
@wait time="200"
@blur layer="base" page="fore"
@wait time="200"
@blur layer="base" page="fore"
@wait time="200"
@blur layer="base" page="fore"
@wait time="200"
@blur layer="base" page="fore"

[blur]は指定したレイヤをぼかすマクロです。
レイヤはlayer属性とpage属性で指定します。
繰り返し実行すればするほどぼけぼけになっていきます。
マクロの内容は解説しません。

ここでは[wait]を使って200msごとに[blur]を実行しています。
結果的に1000msかけてじわじわとぼけていきます。

じわじわといっても、ぼけた画像を準備してトランジションで切り替える方法よりは汚くなってしまいます。
トランジションでは200msの間をあけずに切り替えることができるからです。

ではどうするか。こっちでもトランジションを使います。
; マクロ定義
@macro name="blur"
@eval exp="(kag.getLayerFromElm(mp)).doBoxBlur()"
@endmacro
; 画像表示
@image layer="base" page="fore" storage="image"
@image layer="base" page="back" storage="image"
; 裏ページの画像をぼかす
@blur layer="base" page="back"
@blur layer="base" page="back"
@blur layer="base" page="back"
@blur layer="base" page="back"
@blur layer="base" page="back"
; トランジション
@trans method="crossfade" time="1000"
@wt

裏ページにも表ページと同じ画像を設定して、それをぼかします。
それからトランジションをかければ、ぼかした画像も準備する方法と同じような効果を得ることができます。
ぼかす回数([blur]の回数)は試しながら適当に調整してください。

続きを閉じる▲

タグ : 吉里吉里 KAG TJS 講座

カテゴリ : KAG

KAGで配列を使う(5) - 二次元配列

前回 KAGで配列を使う(4) - 配列の初期化

KAGで配列を使う(1)で、「配列とは変数が何個もつらなったもの」と説明しました。
配列の変数の中にさらに配列をつくることができます。

; 配列を作る
@eval exp="f.hairetu = []"
; 配列の変数に数字を代入
@eval exp="f.hairetu[0] = 0"
; 配列の変数に配列を作る
@eval exp="f.hairetu[1] = []"
; 配列の配列の変数に数字を代入
@eval exp="f.hairetu[1][0] = 10"
@eval exp="f.hairetu[1][1] = 11"

一行ずつ追っていきます。

 @eval exp="f.hairetu = []"
まずはいつもどおり配列を作ります。

 @eval exp="f.hairetu[0] = 0"
いつもの配列の使い方です。
配列名(f.hairetu)に添え字([0])をつけるとただの変数として扱えるのでした。
特に意味はありませんが、ここではf.hairetu[0]に0を代入しています。

 @eval exp="f.hairetu[1] = []"
f.hairetu[1]も、f.hairetu[0]とおなじく変数です。
変数に[]を代入すると配列をつくることができます。
f.hairetu[1] = []で、f.hairetu[1]が配列として使えるようになります。

 @eval exp="f.hairetu[1][0] = 10"
 @eval exp="f.hairetu[1][1] = 11"
f.hairetu[1]を配列として使っています。
配列名はf.hairetu[1]なので、それに添え字をつけるとただの変数として扱えます。
ここではf.hairetu[1][0]に10、f.hairetu[1][1]に11を代入しています。

一応図示してみると↓のようになります(四角いのが配列、丸いのは変数)
2Darray.png
配列の変数の中にさらに配列が入っているのがわかると思います。

「配列の変数の中に配列が入っている配列」を二次元配列といったりします。
いつも使っていた配列は一次元配列です。

二次元配列の実際の使い道はべつの記事で。

続きを閉じる▲

タグ : 吉里吉里 KAG TJS 講座

カテゴリ : KAG

pbgmマクロ(3) - 配列の利用

前回 pbgmマクロ(2) - ファイル名を変えてしまう

前回はファイル名を変えて[pbgm]タグを作りました。
今回は配列を利用してファイル名を変えなくても済むようにします。

配列については「KAGで配列を使う(1) - 配列とは?」を参照


配列にファイル名を代入しておき、その配列を使ってファイル名を指定します。
; 配列(sf.music_list)を準備
@eval exp="sf.music_list = ['innocent.oog', 'AtoZ.ogg', 'ASAP.ogg']"
; マクロ定義
@macro name="pbgm"
@playbgm storage="&sf.music_list[+mp.no]"
@endmacro

マクロ定義の前で配列(sf.music_list)を準備します。(KAGで配列を使う(4) - 配列の初期化)
※ sf.music_list[0]に'innocent.ogg', sf.music_list[1]に'AtoZ.ogg', sf.music_list[2]に'ASAP.ogg'が代入されます。
fではなくsfを使っています。セーブデータごとに曲リストは変わらないはずだからです。
これをfにしてしまうと、後でパッチを出して曲リストを変えたときに、困ったことになります。
セーブデータごとに流れる曲が変わったりしてしまうかもしれません。

マクロ自体は前回と同様に簡単です。
配列を使って曲を指定します。配列の添え字は+mp.noとしています。(mpについては⇒マクロでmpを使う)

例えば@pbgm no="1"のとき
sf.music_list[+mp.no]のmp.noは'1'です。
 ↓ []の中が先に評価されます
sf.music_list[+'1']
 ↓ 単項+演算子によって'1'が変換されます(+については⇒文字列を数値に変換する - 単項+演算子)
sf.music_list[1]
 ↓
'AtoZ.ogg'
結局"AtoZ.ogg"が再生されます。

番号ごとに流す曲を替えるには、f.music_listの部分にファイル名を追加するだけなので簡単です。



ところで[eval]タグを使うと、曲数が増えた時にその行が横に長くなって大変です。
そこで[iscript]タグが使えます。([iscript]については⇒[iscript] [endscript]タグを使う)
[iscript][endscript]の間のTJSスクリプトなら、途中で改行することができます。
; 配列(f.music_list)を準備
@iscript
f.music_list = [
'innocent.oog',
'AtoZ.ogg',
'ASAP.ogg'
];
@endscript

このように一曲ごとに改行して書くと見やすいかもしれません。まあ好きなようにしてください。
配列の[]が離れていてわかりづらいですが、最初と最後の[と]がそれです。
]の後にセミコロンを付けるのを忘れないでください。


次回はsf.music_listの中身をテキストファイルから読みだすようにしてみます。

続きを閉じる▲

タグ : 吉里吉里 KAG 講座

カテゴリ : KAG

[iscript] [endscript]タグを使う

TJSを何個も続けて使いたいときがあります。
[eval]タグを何回も書けばいいんですが、なかなか面倒です。
そういう時には[iscript]タグと[endscript]タグを使うことでタイプ量を減らすことができます。

KAGで配列を使う(4)の記事で以下のスクリプトを書きました。
@eval exp="f.hairetu = []"
@eval exp="f.hairetu[0] = 0"
@eval exp="f.hairetu[1] = 20"
@eval exp="f.hairetu[2] = 15"
@eval exp="f.hairetu[3] = 33"

[eval]タグが5つも並んでます。めんどくさいです。
同じページで書いた配列の初期化を使えばいいんですが、説明のために敢えて使いません。

[iscript]タグと[endscript]タグを使うと、[eval]タグを使わずに以下のように書けます。
@iscript
f.hairetu = [];
f.hairetu[0] = 0;
f.hairetu[1] = 20;
f.hairetu[2] = 15;
f.hairetu[3] = 33;
@endscript

[iscript]タグと[endscript]タグの間ではTJSを直接使うことができます。KAGを使うことはできません。
普段[eval]タグのexp属性に指定しているものなら何でも書けます。

それぞれの行の最後にセミコロン(;)がついているのに気を付けてください。
セミコロンは、普段[eval]タグで書いているものの最後につけます。
これは、[eval]タグのexp属性にはTJS式を指定するが、[iscript]~[endscript]間にはTJSスクリプトを書くからです。
そんな理屈はどうでもいいですが、セミコロンを付けるのは忘れないようにしてください。
忘れるとエラーがでます。慣れないと何故エラーが出ているのか見つけるのが大変かもしれません。
気を付けてください。


ついでに言うと、マクロの中では[iscript]タグと[endscript]タグを使うことはできません。
@macro name="テスト用マクロ"
@iscript
@endscript
@endmacro

このスクリプトではエラーがでます。

[iscript][endscript]使用例
pbgmマクロ(3) - 配列の利用

続きを閉じる▲

タグ : 吉里吉里 KAG 講座

カテゴリ : KAG

KAGで配列を使う(4) - 配列の初期化

前回 KAGで配列を使う(3) - テキストファイルの書き込み
配列には値を代入することができます。
その配列を最初に使うときには、一気に値を代入することができます。(初期化)

@eval exp="f.hairetu = [0, 20, 15, 33]"

このスクリプトは以下のものと同じ意味です。
@eval exp="f.hairetu = []"
@eval exp="f.hairetu[0] = 0"
@eval exp="f.hairetu[1] = 20"
@eval exp="f.hairetu[2] = 15"
@eval exp="f.hairetu[3] = 33"

配列の準備をするときに、コンマ(,)で区切ることでf.hairetu[0],f.hairetu[1],...にあらかじめ値を代入することができます。


初期化子([]の中に書いてるやつ。ここでは0 20 15 33)には変数を使うこともできます。
@eval exp="f.a = 0"
@eval exp="f.b = 20"
@eval exp="f.hairetu = [f.a, f,b]"

初期化子にf.aとf.bを使っています。
このスクリプトは以下のものと同じ意味です。
@eval exp="f.a = 0"
@eval exp="f.b = 20"
@eval exp="f.hairetu = []"
@eval exp="f.hairetu[0] = f.a"
@eval exp="f.hairetu[1] = f.b"

簡単でしたが今回はここまで。
配列の初期化使用例
pbgmマクロ(3) - 配列の利用

続きを閉じる▲

タグ : 吉里吉里 KAG TJS 講座

カテゴリ : KAG

pbgmマクロ(2) - ファイル名を変えてしまう

前回:pbgmマクロ(1) - BGM管理マクロ

前回は[pbgm]の機能を紹介して、とりあえず簡単なものを作りました。
今回も実に単純です。ファイル名自体を変えてしまいます。

前回のファイル名をそれぞれ
 "innocent.ogg" ⇒ "bgm_0.ogg"
 "AtoZ.ogg ⇒ "bgm_1.ogg"
 "ASAP.ogg" ⇒ "bgm_2.ogg"
に変えます。

マクロは以下のようになります。
@macro name="pbgm"
@playbgm storage="& 'bgm_' + mp.no + '.ogg' "
@endmacro

[playbgm]タグのstorage属性でエンティティ(&)を使って「'bgm_' + mp.no + '.ogg'」を再生しています。
エンティティを使うと属性にTJSで指定できます。ここでは文字の連結を行うTJSを指定しています。
例えば[pbgm no="0"]と使うと、mp.noには"0"が代入され
'bgm_' + "0" + '.ogg'
という演算が行われます。結果として"bgm_0.ogg"が再生されることになります。
これは前回の"innocent.ogg"を改名したもので、機能的には前回の[pbgm]マクロと同じです。

BGMのファイル名を変える手間はありますが、番号と曲の対応をメモっておけば十分実用性はあります。
曲数が増えてもマクロは全く変わりません。ファイルを「bgm_番号.ogg」にしてbgmフォルダに入れるだけです。
これで終わってもいいんですが、折角なのでファイル名を変えずに済む別の実装方法も次回以降紹介します。

続きを閉じる▲

タグ : 吉里吉里 KAG TJS 講座

カテゴリ : KAG

pbgmマクロ(1) - BGM管理マクロ

■吉里吉里/KAG/TJS雑談質問スレ■その20
>>307より

ジュークボックスみたいな感じで音楽を管理

[pbgm no="1"]

マクロ側で、Noに応じて曲を割り振ってる
一覧にしとくとすごい楽
後で変えようと思ったときもマクロ側の対応ナンバーを違う曲に変えればいいだけだし


このマクロを数回にわたって作っていきたいと思います。

とりあえず超単純なスクリプト。
; マクロ定義
@macro name="pbgm"
@if exp="mp.no == 0"
@playbgm storage="innocent.ogg"
@endif
@if exp="mp.no == 1"
@playbgm storage="AtoZ.ogg"
@endif
@if exp="mp.no == 2"
@playbgm storage="ASAP.ogg"
@endif
@endmacro

; innocent.oggを再生
@pbgm no="0"

; AtoZ.oggを再生
@pbgm no="1"

; ASAP.oggを再生
@pbgm no="2"

マクロの中で[if]タグで再生する曲を分けています。
(mpについては→マクロでmpを使う)
no属性に0を指定すると"innocent.ogg"、1を指定すると"AtoZ.ogg"、2を指定すると"ASAP.ogg"を再生します。

このマクロだと、曲が一曲増えるたびに[if][playbgm][endif]の組を増やさなければなりません。
かなり不便です。次回以降改良していきます。

続きを閉じる▲

タグ : 吉里吉里 KAG TJS 講座

カテゴリ : KAG

TJSの演算子について

演算子についてちょっと詳しめに説明しておきます。

とりあえず説明というか定義。
具体例は後で出すので分からんかったら分かったふりしながら読み進めてください。

演算子って何?
演算子(えんざんし、英: operator symbol, operator name)は、各種の演算をあらわす記号・符牒のことである。
コンピュータプログラミングにおいては、主に記号を用いて演算を指示するものが演算子と呼ばれる。(wikipediaより)

要は、「各種の演算をあらわす記号」です。
+ - * / = などなど吉里吉里でも色々つかえます。

演算って何?
計算です。足し算,引き算,掛け算,割り算色々あります。
吉里吉里でいう代入も演算の一種です。

単項演算子?
オペランドが一つだけの演算を表す演算子を、単項演算子という。(同wikipediaより)
例として√(根号)があげられています。吉里吉里では根号を示す演算子はありません。
吉里吉里で使える演算子の例としては単項+演算子があります。

オペランド(被演算子)って何?
演算が作用する対象のことをオペランド(operand; 被演算子、被演算数、引数)という。たとえば、n と 3 との和を表す式 "n + 3" において、"+" は演算子であり、そのオペランドは "n" と "3" である。(同wikipediaより)

二項演算子?
二つのオペランドから一つの結果を得る演算を表す演算子を二項演算子という。(同wikipediaより)
足し算、引き算、掛け算、割り算、代入全部二項演算子です。
「f.a = f.b」ではf.a、f.bと2つのオペランドがあります。
多くの演算子が二項演算子です。

優先順位
演算子には優先順位というものがあります。
優先順位が高い順に演算されていきます。
優先順位の表は載せておきますがどうでもいいです。
・掛け算、割り算は足し算、引き算より優先順位が高い
・代入は優先順位低い
このくらい知っとけばいいんです。
どこから計算されるのか分からん程ごちゃごちゃした式は書かないでください。
分からないならカッコでかこんでおけばそこから計算されます。


実際の式で見てみる
↓の式でどんな演算がされるのか追っていきます。
 f.a = 2 * 3 + 4
一番優先順位が高いのは*です。そのオペランドは2と3なので結果は6。
  ↓
 f.a = 6 + 4
なのでこうなる。
次に優先順位が高いのは+。そのオペランドは6と4なので結果は10。
  ↓
 f.a = 10
次に優先順位が高いのは=。単純代入演算子(=)は、右側のものを左側のものに代入し、結果としては右側のものになります。
  ↓
 10
演算子がないので終わりです。f.aには10が代入されています。


終わり
だからどうした、という話でした。
ですが説明で便利なので、最後の実際の式を見たような書き方で説明することもあります。
そのためだけに書いたといっても過言ではない。

続きを閉じる▲

タグ : 吉里吉里 KAG TJS 講座

カテゴリ : KAG

文字列を数値に変換する - 単項+演算子

参照:TJSの演算子について
吉里吉里では文字列と数値は区別されます。

@eval exp="f.a = 5"
@eval exp="f.b = '10'"
@emb exp="f.a + f.b"

このスクリプトを実行すると「510」と表示されます。
これはf.bに'10'が代入されているからです。
(' '(シングルクォート)で囲まれていることに注意。数値の「10」ではなく文字列の「'10'」)
加算+演算子では、どちらか一方でも文字列だった場合、文字列同士をつなぎ合わせます。(参照)
このスクリプトの[emb]タグでは、「5」が「'5'」に変換されて'5' + '10'で結果は'15'となります。


数値として足し算させるために、計算する前にf.bを数値に変換する必要があります。
@eval exp="f.a = 5"
@eval exp="f.b = '10'"
; ↓ f.bを数値に変換する
@eval exp="f.b = +f.b"
@emb exp="f.a + f.b"

これを実行すると10 + 5 の結果である「15」と表示されます。
変数の前に+を付けると変数の中身を数値に変換してくれます。
その変換されたものを、元の変数(ここではf.b)に入れてやればf.bの中身を文字列から数値に換えることができます。
※f.b = +f.bを詳しくみてみる
この式で一番優先順位が高いのは+です。この+は単項+演算子です。足し算の+とは異なります。
(※足し算の+は二項演算子ですがこの+は単項演算子です)
単項+演算子は右側にあるものを評価(実行)し、それを数値に変換します。
(※変数を"評価"すると、その中身になります)
 f.b = +f.b
  ↓ (f.bを評価)
 f.b = +'10'
  ↓ ('10'を数値に変換)
 f.b = 10
次に単純代入演算子(=)が実行され、f.bに数値である10が代入されます。
  ↓
 10

ただし、数値に変換できない文字列だった場合0になるので注意してください。
@eval exp="f.b = 'あいうえお'"
@eval exp="f.b = +f.b"
@emb exp="f.b"

これを実行すると「0」と表示されます。
'あいうえお'を数値に変換することができないからです。
※ついでにこのf.b = +f.bも詳しくみてみる。
 f.b = +f.b
  ↓(f.bを評価)
 f.b = +'こんにちは'
  ↓('こんにちは'を数値に変換しようとする、が変換できない)
 f.b = 0
  ↓(f.bに0が代入される)
 0



単項+演算子使用例
pbgmマクロ(3) - 配列の利用

続きを閉じる▲

タグ : 吉里吉里 KAG TJS 講座

カテゴリ : KAG

マクロでmpを使う

KAGでは変数が3種類用意されています。
ゲーム変数(f)、システム変数(sf)、一時変数(tf)の3つです。
ここではそこまで遡って説明はしません。

マクロの中では、その他にmpという変数が使えます。


実際に使ってみます。
@macro name="テスト用マクロ"
@emb exp="mp.text"
@endmacro

@テスト用マクロ text="あいうえお"

[テスト用マクロ]の働きは、text属性に渡された文字を表示するだけです。
このスクリプトを実行すると、「あいうえお」と表示されます。
マクロの中身は一行だけで、[emb]タグで変数mp.textを表示させているだけです。
要するに変数mpの中には、マクロの属性に与えられた値が代入されています。
今回はtext="あいうえお"としているのでmp.textの中身が"あいうえお"となります。


mpは%とは異なります。以下のスクリプトはエラーとなります。
@macro name="テスト用マクロ"
@emb exp="%test"
@endmacro

@テスト用マクロ text="あいうえお"

mpは、属性に与えられた値が入った"変数"として使えます。
それに対して、%は属性に与えられた値に置き換えられるだけです。
[emb]タグは変数をシナリオ中に表示させたい場合に使います。
上のスクリプトがエラーになるのは[emb exp="あいうえお"]がエラーになるのと同じです。


%を使って文字を表示するには以下のようにしなければなりません。
@macro name="テスト用マクロ"
@ch text="%text"
@endmacro

@テスト用マクロ text="あいうえお"

chタグではtext属性に変数ではなく文字列を指定するので、%を使うことができます。


chタグでmpを使う事も出来ます。
@macro name="テスト用マクロ"
@ch text="&mp.text"
@endmacro

@テスト用マクロ text="あいうえお"

TJS式を指定する属性(expなど)以外の属性でtjs式(大抵fやsfなどの変数)を使うときには&(エンティティ)をつかうのでした。
mpでもそれが使えます。


長々と書きましたが知っといたほうがいい事としては、
・マクロの中ではmpという変数が使える。
・mpにはマクロに与えられた属性の値が代入されている。
・mpはfやsfなどと同じように使える。
ついでに言うとmpは栞には保存されません。
マクロの中ではセーブ可能なラベルを書けないので、マクロの中でしか使えないmpが保存されないのは当然です。


mpの使用例
pbgmマクロ(2) - ファイル名を変えてしまう
pbgmマクロ(3) - 配列の利用

続きを閉じる▲

タグ : 吉里吉里 KAG TJS 講座

カテゴリ : KAG

KAGで配列を使う(3) - テキストファイルの書き込み

前回 KAGで配列を使う(2) - テキストファイルの読み込み

前回はテキストファイルの読み込みをやったので、ついでにテキストファイルの書き込みについてやります。

テキストファイルに書き込む
読み込みと同様に配列を使います。
とりあえずスクリプト。
; ①配列(f.file)を作る
@eval exp="f.file = []"
; ②ファイル(test.txt)に書き込む内容を代入
@eval exp="f.file[0] = '今回はテキストファイルに書き込みます。'"
@eval exp="f.file[1] = 'ゲーム変数fとシステム変数sfは自動で保存してくれます。'"
@eval exp="f.file[2] = 'ゲームを作る上ではあまり使う機会はないかもしれません。'"
; ③ファイル(test.txt)に書き込む
@eval exp="f.file.save('test.txt')"

このスクリプトをfirst.ksに書いて実行すると、プロジェクトフォルダの中にtest.txtが作られます。
test.txtの内容は以下のようになっています。
  今回はテキストファイルに書き込みます。
  ゲーム変数fとシステム変数sfは自動で保存してくれます。
  ゲームを作る上ではあまり使う機会はないかもしれません。
では①、②、③に分けて解説していきます。

①配列を作るのは前回と同様です。

②ファイルに書き込む内容を配列f.fileの変数に代入します。
 f.file[0]の中身がテキストファイルの1行目、f.file[1]の中身が2行目、……となります。

③配列f.fileの変数の中身をテキストファイルに書き込みます。
 読み込むのには「.load」を使いましたが、書き込むのには「.save」を使います。
 .loadと同様に.saveでもどのファイルに書き込むのか()をつけて指定します。
 今回はtest.txtです。
 test.txtがプロジェクトフォルダの中にすでに存在した場合、もとの中身はすべて消えてしまうので注意してください。

続きを閉じる▲

タグ : 吉里吉里 KAG TJS 講座

カテゴリ : KAG

最新記事
カテゴリ

openclose

記事一覧
Twitter
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。