コアスクリプト解読で分からない部分を話し合いましょう

しぐれん

ユーザー
即時関数使う派です。
それと、即時関数を使っても別のファイルから参照することは可能です。

JavaScript・名前空間で調べると出てきます。
名前空間というのは関数やクラスの苗字みたいなものです。
Yep系プラグインがImported = Imported || {};と書いている部分がありますが、これが名前空間の定義です。
名前空間で分けることによって、重複を回避できます。
 

ツミオ

ユーザー
即時関数使う派です。
それと、即時関数を使っても別のファイルから参照することは可能です。

JavaScript・名前空間で調べると出てきます。
名前空間というのは関数やクラスの苗字みたいなものです。
Yep系プラグインがImported = Imported || {};と書いている部分がありますが、これが名前空間の定義です。
名前空間で分けることによって、重複を回避できます。
しぐれんさん。

そんな機能があるのですね。
また知識が一つ増えました。
ただすぐに使いこなすのはちょっと難しそうな機能なので、先に名前空間についてよく調べてみます。

ありがとうございました!
 

ツミオ

ユーザー
いつもお世話になっております。
またもやゲームの制作に詰まってしまったので質問いたします。

【質問の簡単なまとめ】
マウスが移動したとき、マウスの現在の座標を取得したい

【試したこと】
TouchInput.isMoved()→クリックしているときしか反応しない
TouchInput.x(y)→クリックしたときの座標を保存しているだけ

【知りたいこと】
マウスの位置によって何かしらのイベントを起こしたいと思っています。
公式のヘルプなどを読んで、マウスをクリックしたときの座標は取得できたのですが、マウスをクリックしていないとき(マウスが移動したとき)の座標の取得方法がわかりません。
コアスクリプトを読んだ感じ、「Graphics.pageToCanvasY(touch.pageY)」などと書かれている辺りで座標を取得しているのかなあと思っていますが……どこをどうすればクリックしていないときも座標を取得できるのかがわかりません。


以上短いですが、現在のマウスの位置を取得する方法をもしご存知の方がいましたら、教えていただけませんでしょうか。
よろしくお願いいたします。
 
ツミオさん:
実はまさにそれにドンピシャのプラグインを作ったことがあります。
(コアスクリプトだけでは取得できないから)

http://www.moonwhistle.org/tkoolMV/TouchInputDispatcher.zip

このプラグインは、マウスやタッチ入力と連動して座標取得をしたり、コモンイベントを起動したりできます。
詳しくはヘルプをご覧になればわかりますが、トリガ(起動条件)になるのは、
クリック時、長押し時(インターバル設定可)、離されたとき、カーソル移動中ずっと(インターバル設定可)
画面内にある間ずっと(インターバル設定可)のいずれかが可能です。

これがツミオさんのお望みのものであることを願います。
 
最後に編集:

ツミオ

ユーザー
ツミオさん:
実はまさにそれにドンピシャのプラグインを作ったことがあります。
(コアスクリプトだけでは取得できないから)

http://www.moonwhistle.org/tkoolMV/TouchInputDispatcher.zip

このプラグインは、マウスやタッチ入力と連動して座標取得をしたり、コモンイベントを起動したりできます。
詳しくはヘルプをご覧になればわかりますが、トリガ(起動条件)になるのは、
クリック時、長押し時(インターバル設定可)、離されたとき、カーソル移動中ずっと(インターバル設定可)
画面内にある間ずっと(インターバル設定可)のいずれかが可能です。

これがツミオさんのお望みのものであることを願います。
神無月サスケさん。
お返事ありがとうございます。

さっそくダウンロードして使ってみました……が、説明文にもある通り「マップ専用」なのですね。
マップ画面以外でもマウスの座標を取得し続けたいので、ちょっと目的から外れてしまいます。

せっかくプラグインまで紹介していただいたのに、すみません。
回答ありがとうございました!
 
どうも、ツミオさん。
そうでしたか、それはお気の毒でした。
もう少し時間に余裕があれば、マップ以外でも取得可能に
プラグインを改造することはできそうですが
申し訳ないことに、今はそこまで手が回りません。

ツミオさんのスキルがあるなら、プラグインを解析して、マップ以外でも
適用可能にするのは可能かもしれませんので、頑張っていただけたらと思います。
 
たびたびすみません。思ったより簡単に解決できたので、
急ごしらえですが、以下のコードをプラグインにして取り込んでください。

PHP:
  var _TouchInput_onMouseMove = TouchInput._onMouseMove;
  TouchInput._onMouseMove = function(event) {
    _TouchInput_onMouseMove.call(this, event);
    if (!this._mousePressed) {
      var x = Graphics.pageToCanvasX(event.pageX);
      var y = Graphics.pageToCanvasY(event.pageY);
      this._onMove(x, y);
    }
  };
これだと、マウス移動時にどのシーンでも TouchInput.x, TouchInput.y が変更されますし、
マウスが移動やクリックされていなくても、座標は保存されます。

※余談:メッセージにコードを埋め込むやり方、しぐれんさんから教えていただき感謝。
 
最後に編集:

ツミオ

ユーザー
たびたびすみません。思ったより簡単に解決できたので、
急ごしらえですが、以下のコードをプラグインにして取り込んでください。

PHP:
  var _TouchInput_onMouseMove = TouchInput._onMouseMove;
  TouchInput._onMouseMove = function(event) {
    _TouchInput_onMouseMove.call(this, event);
    if (!this._mousePressed) {
      var x = Graphics.pageToCanvasX(event.pageX);
      var y = Graphics.pageToCanvasY(event.pageY);
      this._onMove(x, y);
    }
  };
これだと、マウス移動時にどのシーンでも TouchInput.x, TouchInput.y が変更されますし、
マウスが移動やクリックされていなくても、座標は保存されます。

※余談:メッセージにコードを埋め込むやり方、しぐれんさんから教えていただき感謝。

神無月サスケさん。
コードを書いてくださってありがとうございます。
今晩にでもさっそく導入してみます。

ありがとうございました!
 

ツミオ

ユーザー
いつもお世話になっております。
プラグインの制作で詰まってしまいました。
お力添えいただければなと思います。

質問は2つありますので、別々に説明いたします(コアスクリプトスレで質問するか、別に新規にスレッドを立てるか悩みましたが、コアスクリプトに対する疑問に近いかなと思ったのでこちらにしました)。

【質問1:画像の幅を取得したい】

例えば以下のようなコードを書いたとします(簡略化しているので実際に僕が使っているコードとは違います)。

PHP:
        //base
        var width              = 300;
        var height             = 300;
        this._base_sprite      = new Sprite(new Bitmap(width,height));
        this._base_sprite.bitmap.fillAll('#FFF');
        SceneManager._scene.addChild(this._base_sprite);
        //window
        var bitmap             = ImageManager.loadPicture('hoge');
        this._window_sprite    = new Sprite(bitmap);
        this._base_sprite.addChild(this._window_sprite);
        console.dir(bitmap);
        this._window_sprite.anchor.x   = 0.5;
        this._window_sprite.x          = bitmap.width / 2;
        this._window_sprite.y          = 100;
このコードでは、ウィンドウ用のスプライトに対して、anchorプロパティを使ってX座標の原点を中心に変更しています。
その後、ベース用のスプライトに合わせて位置を変更したいと思ったので(つまりanchor.x = 1のときの位置)、ウィンドウの座標を「bitmap.width / 2;」に変更しました。
ですが、実際にゲームを起動して位置を確認してみると何も変わっていません。
そこでコンソール出力で色々と見てみると、どうも「bitmap.width」が0なのが原因なようでした。
今度はconsole.dir(bitmap);としてコンソール画面を確認すると、以下の画像のような出力になりました。
WS000010.JPG
僕が欲しい情報は赤線で引いたwidthなのですが、この情報がうまく取得できていないようです。
他のプロパティと違って、表示されている色が薄くなっているのに何かカラクリがありそうだなとは思ったのですが、薄いものが何を意味するのかすらよくわかりませんでした。

以上長くなりましたが、質問をまとめます。
・ImageManagerでロードしたBitmapの幅の取得方法が知りたい
・コンソール画面の、色が薄くなっている文字が何を意味するのか知りたい


追記:いじっていて気がついたのですが、どうも幅を取得できていないのは「シーンを最初に開いた時」のみで、「二回目にシーンを開いたとき」は正常に取得できているようです。

【質問2:特定の領域内のみに描画させたい】

先ほどのコードをもう一度貼ります。

PHP:
        //base
        var width              = 300;
        var height             = 300;
        this._base_sprite      = new Sprite(new Bitmap(width,height));
        this._base_sprite.bitmap.fillAll('#FFF');
        SceneManager._scene.addChild(this._base_sprite);
        //window
        var bitmap             = ImageManager.loadPicture('hoge');
        this._window_sprite    = new Sprite(bitmap);
        this._base_sprite.addChild(this._window_sprite);
        console.dir(bitmap);
        this._window_sprite.anchor.x   = 0.5;
        this._window_sprite.x          = bitmap.width / 2;
        this._window_sprite.y          = 100;

このコードでは、this._base_spriteにthis._window_spriteをaddChildしています。
this._base_spriteに設定した領域内(new Bitmap(width,height))にのみアレヤコレヤを描画して、その範囲外のものは描画してほしくないなという意図からこうしました。
ですが実際にゲームを実行してみると、以下の画像(白色の部分がthis._base_sprite設定した領域に相当して、青いウィンドウのようなものがthis._window_spriteに相当します)のように、設定した領域外のものも描画されてしまいます。
image_20170729_110427.jpg
これを、設定した領域外のものについては描画しないようにするにはどうしたらよいでしょうか?

質問をまとめます
・描画領域を決め、その領域からはみ出たものは描画しないようにしたい

以上、質問が2つになりましたが、ご存知の方がいらっしゃいましたら教えていただけませんでしょうか。
よろしくお願いいたします。
 

しぐれん

ユーザー
1:画像の幅の取得
ツクールMVは画像や音声を非同期読み込みしていると聞いたことがあります。
シーン開始時に画像を先読みすると改善すると思います。
LoadImage()を先行して呼び出し、シーンが実際に動き始めるstartのタイミングで改めてwidthの値を利用してみましょう。

2.描画領域を決め、その領域からはみ出たものは描画しないようにしたい
window系クラスがこの枠外にはみ出るの防ぐ機能を持っています。
おそらくスキルを選択する画面だと思いますので、Window_Selectableを参考に改造すれば行けると思います。
スキル名の表示に独自の枠を付けているようですので、drawItemだったかの項目1つを描画する関数を改造してください。
で、Windowクラスの最下層にあるthis.contents.blt()を使います。
サンプルとしてdrawFace()を見てください。
 
最後に編集:

ツミオ

ユーザー
1:画像の幅の取得
ツクールMVは画像や音声を非同期読み込みしていると聞いたことがあります。
シーン開始時に画像を先読みすると改善すると思います。
LoadImage()を先行して呼び出し、シーンが実際に動き始めるstartのタイミングで改めてwidthの値を利用してみましょう。

2.描画領域を決め、その領域からはみ出たものは描画しないようにしたい
window系クラスがこの枠外にはみ出るの防ぐ機能を持っています。
おそらくスキルを選択する画面だと思いますので、Window_Selectableを参考に改造すれば行けると思います。
スキル名の表示に独自の枠を付けているようですので、drawItemだったかの項目1つを描画する関数を改造してください。
で、Windowクラスの最下層にあるthis.contents.blt()を使います。
サンプルとしてdrawFace()を見てください。
しぐれんさん、回答ありがとうございます。

1.
こちらは追記に記した「1回目は表示されないけど2回目は表示される」という点の似た症状に思い当たるものがあったので、addLoadListenerを挟ませることで解決しました。
また、startのタイミングでwidthの値を再利用しても正常に動作することを確認しました。
1については解決としたいと思います。
ありがとうございます。

2.
WindowのcontensはBitmapらしいので、今回僕の考えているものとは少し違ったようです(画像のウィンドウっぽいものは、いわゆるWindowクラスは利用しておらず、全てただのSpriteです)。
また、仮に似たようなものだとしても、僕の技術ではコードを読んで真似するというのは難しいと判断しました。

そこで更にいろいろ調べたところ、マスク機能なるものがあると知りました。
http://kido0617.github.io/rpgmaker/2017-07-09-gauge/
こちらを利用することでうまく実現できたので、2についても解決にしたいと思います。
ありがとうございます。
image_20170729_121912.png

残りの質問の
・コンソール画面の、色が薄くなっている文字が何を意味するのか知りたい
については引き続き回答していただける方を探しています。
よろしくお願いいたします。
 

kien

ユーザー
*コンソール画面の、色が薄くなっている文字が何を意味するのか知りたい
プロパティがObject.defineProperty、またはObject.definePropertiesを利用して、getに関数を設定された時にそうなるようです。
プロパティの値が表示されるべき部分に(...)があり、それをクリックすることでデバッグツールがそのプロパティのゲッター関数を呼び出して値を決定させて表示しているようです
 

ツミオ

ユーザー
*コンソール画面の、色が薄くなっている文字が何を意味するのか知りたい
プロパティがObject.defineProperty、またはObject.definePropertiesを利用して、getに関数を設定された時にそうなるようです。
プロパティの値が表示されるべき部分に(...)があり、それをクリックすることでデバッグツールがそのプロパティのゲッター関数を呼び出して値を決定させて表示しているようです
とてもわかりやすい説明、ありがとうございます。
色分けにはそんな意味があったのですね。
今度から参考にしてみます。

全て解決しました。
皆さんありがとうございました。
 
トップ