irpg Community
[RMMZ] เก็บตำแหน่งเมาส์ไว้ในตัวแปร - Printable Version

+- irpg Community (https://irpg.in.th)
+-- Forum: irpg Fabella RPG Maker Academia (https://irpg.in.th/forum-4.html)
+--- Forum: RGSS and JS Showcase (https://irpg.in.th/forum-26.html)
+--- Thread: [RMMZ] เก็บตำแหน่งเมาส์ไว้ในตัวแปร (/thread-3669.html)



[RMMZ] เก็บตำแหน่งเมาส์ไว้ในตัวแปร - XthemeCore - 12-26-2022

เราสามารถเก็บตำแหน่งเมาส์ไว้ในตัวแปร และ สามารถแปลงตำแหน่งดังกล่าวไปเป็นตำแหน่งในแผนที่ได้ด้วย
โดยใช้ Event ตามด้านล่างนี้ (ตั้ง Event เป็น Parallel เพื่อรับอัพเดทค่าทุกเฟรม)
[Image: DWMtKJX.png]
ระบบนี้สามารถนำไปประยุกต์ใช้ในการสร้างเกมได้หลายแนว เช่น เกมสร้างเมือง หรือเกม RTS ที่ต้องควบคุมยูนิตไปยังจุดต่างๆบนแผนที่

Code:
TouchInput.x
$gameMap.canvasToMapX($gameVariables.value(1))
$gameMap.canvasToMapX(TouchInput.x)
TouchInput.isPressed()


ตัวอย่างที่ 1: ใช้ในการทำให้ตัวละครเดินไปยังจุดที่คลิก (ขอบคุณเคล็ดลับจากท่าน Madon Nopora)



ร้าง Event ที่จะใช้เดินไปยังตำแแหน่งที่คลิก แล้วตั้งเป็น Parallel
[Image: F0OyF1E.png]

ใส่โค้ดในการสั่ง Move Route Event ดังนี้ (ตัวแปร 3 กับ 4 ใช้ต่อเนื่องมาจากด้านบน)

Code:
this.moveStraight(this.findDirectionTo($gameVariables.value(3), $gameVariables.value(4)));

เนื่องจาก Search Limit มีระยะจำกัด เราจึงจำเป็นต้องแก้ไขตัวเอนจิ้นเล็กน้อยเพื่อให้หาเส้นทางได้ดีขึ้น (ปรับตามความเหมาะสม)

Code:
Game_Character.prototype.searchLimit = function() {
   return 999;//12;
};



ตัวอย่างที่ 2: ใช้ในการ Spawn Event ในแผนที่ (เหมือนระบบสร้างสิ่งก่อสร้าง)



ร้าง Event ที่จะใช้เป็น Spawner แล้วตั้งเป็น Parallel (Event นี้ใช้ในการ Spawn Event ตัวอื่น)
[Image: MQuvhry.png]
ใส่โค้ดใน Event Script ดังนี้ (ตัวแปร 3 กับ 4 ใช้ต่อเนื่องมาจากด้านบน)
ตรง new Game_Event(ไอดีของแมพ, ไอดีของอีเว้นต้นแบบ)

Code:
var eid = $gameMap._events.length;
var sid = SceneManager._scene._spriteset._characterSprites.length;

var event = $gameMap._events[eid] = new Game_Event($gameMap._mapId, 15);
event.locate($gameVariables.value(3), $gameVariables.value(4));

var spriteset = SceneManager._scene._spriteset;
var sprite = spriteset._characterSprites[sid] = new Sprite_Character(event);
sprite.update();
spriteset._tilemap.addChild(sprite);