drawIcon関数で描画したアイコンの座標について

タツノコ
記事: 11
登録日時: 2020年6月15日(月) 19:07
連絡を取る:

drawIcon関数で描画したアイコンの座標について

投稿記事by タツノコ » 2020年7月29日(水) 12:40

質問が多くなってしまい大変申し訳ございません。

今回はdrawIconメソッドで描画したアイコンの座標について質問させてください。

【聞きたいこと】
RPGツクールMVの標準ライブラリに存在する「drawIconメソッド」で描画したアイコンの座標は
通常の座標とは異なる考え方になるのでしょうか?
同じ座標に合わせるためのロジックをご教示をお願いしたい所存でございます。

【詳細】
drawIconを使ってアイコンを表示し、その同じ座標に、異なる画像を表示しようとした場合、
画像の表示位置がずれてしまいました。
(x,yの座標の数値は同じ数値を使ってます)
同じ場所に表示させたく思っており、悩んでおります。

【自分なりの考察】
fillRectメソッドで描画するものもdrawIconと同じ考え方なのかなと思っております。
HTML5のcanvas関連だと座標の細かい考え方があるのかなというところまで考えましたが
それ以降が現在理解できておらず悩んでいる状態です。

サンプルコードと、サンプルコードの結果を貼り付けます。

サンプルコード

コード: 全て選択

(function(){
    'use strict';
    var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
    Game_Interpreter.prototype.pluginCommand = function(command, args){
        _Game_Interpreter_pluginCommand.call(this, command, args);
        if(command === "testtest"){
            switch(args[0]){
                case 'show':
                    SceneManager.push(Scene_test_Scene);
                    this.wait(10);
                    break;
            }
        }
    };


    function Scene_test_Scene(){
        this.initialize.apply(this,arguments);
    };

    Scene_test_Scene.prototype = Object.create(Scene_Base.prototype);
    Scene_test_Scene.prototype.constructor = Scene_test_Scene;

    Scene_test_Scene.prototype.initialize = function(){
        Scene_Base.prototype.initialize.call(this);
    };

    Scene_test_Scene.prototype.create = function(){
        Scene_Base.prototype.create.call(this);
        Scene_Base.prototype.createWindowLayer.call(this);
        var testWindow = new Window_test_Window();
        this.addWindow(testWindow);
    };

    function Window_test_Window(){
        this.initialize.apply(this,arguments);
    };

    Window_test_Window.prototype = Object.create(Window_Base.prototype);
    Window_test_Window.prototype.constructor = Window_test_Window;

    Window_test_Window.prototype.initialize = function(){
        Window_Base.prototype.initialize.call(this,0,0,Graphics.width,Graphics.height);
        this.contents.fillRect(10, 10, 30+40, 30+40, this.normalColor());
        this.drawIcon(76,10,10);
        var test = new Sprite();
        test.bitmap = ImageManager.loadBitmap('img/',"test");
        test.x=10;
        test.y=10;
        this.addChild(test);
    };
})();


サンプルイメージ(水色の画像の位置をアイコンの位置に合わせたいです)
添付画像の通りです。

何卒、よろしくお願いいたします。
添付ファイル
スクリーンショット 2020-07-29 12.31.17.png

アバター
剣崎 宗二
記事: 437
登録日時: 2016年11月12日(土) 20:36
連絡を取る:

Re: drawIcon関数で描画したアイコンの座標について

投稿記事by 剣崎 宗二 » 2020年7月29日(水) 17:51

えーと、どの部分をコードのどの部分で描画したのか不明なので、以下
・test.pngは水色の四角である。
・normalColorは白である(=白い四角はfillRectにより描画されている)
と言う仮定の元進めます。

この場合、タツノコさんの質問は「何故addChildされた新しいSprite画像が、contentsに描画されている画像の座標系と一致しないのか」と言う事になりますが、その答えはrpg_core内Window.prototype._refreshContentsにあります。
これを見ると分かる通り、Windowの.contentsはthis.paddingの分だけ、Windowの基本座標からずらされているのです。(恐らくWindowの「枠」の部分と重ならないようにする為の施策)
で、更にWindow_Base.prototype.updatePaddingを見てみると、this.paddingの値はthis.standardPadding()になっている事が分かります。なので、

同じ座標に合わせるためのロジックをご教示をお願いしたい所存でございます。

→新しいSpriteの座標を同様にthis.standardPadding()分だけずらせばよろしいのではないかと考えます。
----
-出先に居る場合回答が未テスト状態である事が多い為、テストは重々にお願いいたします。
タツノコ
記事: 11
登録日時: 2020年6月15日(月) 19:07
連絡を取る:

Re: drawIcon関数で描画したアイコンの座標について

投稿記事by タツノコ » 2020年7月29日(水) 19:26

剣崎 宗二様

はじめましてタツノコです。

質問に対するご回答ありがとうございます。
そして、情報が足らず大変申し訳ございません。

・test.pngは水色の四角である。
・normalColorは白である(=白い四角はfillRectにより描画されている)


上記はご認識の通りでございます。


なるほど・・・被らないための施策として
内部でpaddingしていたんですね・・・
ありがとうございます!ご教示いただいた内容を元に一度
Window.prototype._refreshContentsからソースコードを追いかけていきたいと思います!
そして、ロジックのご教示もありがとうございました!


情報不足の中、ご丁寧にご回答いただき本当にありがとうございました!

“MV:質問” へ戻る