เขียนยังมั่วๆอยู่นะครับ แต่ก็ยังพอแก้ได้
1.ท่านสร้างฟังก์ชันซ้อนกัน 2 ฟังก์ชัน โดยมี 1 ฟังก์ชันที่ไม่ทำงาน
ฟังก์ชันที่ซ้อนกันคือ createCommandWindow กับ createMotherlandWindow ของคลาส Scene_pxeChooseHomeland
- ซึ่งไอ้ฟังก์ชัน createMotherlandWindow เนี่ย!! มันไม่มีการ setHandler เพราะงั้นกดให้ตายก็ไม่ขึ้น
- ส่วนฟังก์ชัน createCommandWindow นั้นมัน setHandler ไว้แล้ว แต่ไม่ได้กำหนดคำแหน่งหน้าต่าง X Y (เอาจริงๆตรงคำสั่ง new Window_MotherlandList(0, 0) นั้น 0,0 คือพารามิเตอร์สำหรับกำหนดตำแหน่ง X,Y แต่อาจจะใช้ไม่ได้ ในกรณีของท่านที่ต้องรอให้มีการสร้าง Window ก่อน )
ท่านก็เพิ่ม this._motherlandListWindow.y = Graphics.boxHeight - this._motherlandListWindow.height;
ไว้ใต้บรรทัด this._motherlandListWindow = new Window_MotherlandList(0, 0); ก็พอ จะได้ประมาณนี้
Code:
Scene_pxeChooseHomeland.prototype.createCommandWindow = function() {
this._motherlandListWindow = new Window_MotherlandList(0, 0);
this._motherlandListWindow.y = Graphics.boxHeight - this._motherlandListWindow.height;
this._motherlandListWindow.setHandler('syrin', this.commandSyrin.bind(this));
this._motherlandListWindow.setHandler('dinyard', this.commandDinyard.bind(this));
this._motherlandListWindow.setHandler('cancel', this.popScene.bind(this));
this.addWindow(this._motherlandListWindow);
};
แล้วก็ลบฟังก์ชัน createMotherlandWindow ทิ้งไปได้เลยครับ ไม่ได้ใช้แล้ว
2.ให้มาดูฟังก์ชัน create ของ Scene_pxeChooseHomeland
ตรงนี้เนื่องจากเราลบ ฟังก์ชัน createMotherlandWindow ไปแล้ว
ให้ท่านลบ
this.createMotherlandWindow(); ตามไปด้วยเลยครับ แล้วเพิ่ม
this.createCommandWindow(); เข้าไปแทน จะได้ประมาณนี้
Code:
Scene_pxeChooseHomeland.prototype.create = function() {
Scene_MenuBase.prototype.create.call(this);
this.createHeadWindow();
this.createCommandWindow();
};
3. ทีนี้จะเกิด Error ไม่รู้ close อัลไล เพราะมี window ที่ไม่มีตัวตน (undefined) ปรากฏขึ้น
ในฟังก์ชัน commandSyrin นั่นคือ this._commandWindow.close();
ต้องถามคนเขียนโค้ด ว่าตัวแปร _commandWindow มันมาตอนไหน
แก้เป็น this._motherlandListWindow.close(); ครับ จะได้ประมาณนี้
Code:
Scene_pxeChooseHomeland.prototype.commandSyrin = function() {
DataManager.setupNewGame();
this._motherlandListWindow.close();
this.fadeOutAll();
SceneManager.goto(Scene_Map);
};
คำแนะนำ
1.ควรศึกษาการเขียนโปรแกรมเชิงวัตถุ OOP (Object-oriented programming) เพื่อความเข้าใจภาษา JavaScript มากขึ้น (ถ้าเรียนมาแล้วขออภัยดว้ยครับ
)
2.ควรศึกษาภาษา JavaScript ครับ
3.ควรศึกษาโครงสร้างเอนจิ้นของ RPG Maker MV นี้ก่อนครับ (ข้อนี้ประกอบกับข้อ 1 สำคัญมาก
) เพราะว่าบางฟังก์ชันมันมีในคลาสแม่ สืบทอดมาคลาสลูก แต่บางฟังก์ชันก็ไม่มี ต้องดูให้ดีๆ เพราะ
พวก OOP มันจะมีตัวแปร instance ที่ใช้งานได้เฉพาะในคลาส (นอกคลาสเรียกใช้ไม่ได้) คือพวกที่เป็นตัวแปร _ ทั้งหลาย เช่น _motherlandListWindow เป็นต้น (JavaScript อาจจะเรียกใช้ได้ ผมไม่แน่ใจว่ามันมี scope หรือเปล่า เพราะ JavaScript มันชอบทำอะไรแปลกๆ เช่น ออกแบบมาเขียนโปรแกรมที่ทำงานแบบ Async) และเรื่องอื่นๆ
ก็ฝากไว้เพียงเท่านี้ละกันครับ