พื้นหลัง
ฉันพัฒนาเกมเป็นงานอดิเรกและกำลังมองหาวิธีที่ดีกว่าในการออกแบบพวกเขา ปัจจุบันฉันใช้วิธีมาตรฐาน OOP (ฉันได้ทำการพัฒนาองค์กรเป็นเวลา 8 ปีแล้ว ยกตัวอย่างเช่น "baddie"
public class Baddie:AnimatedSprite //(or StaticSprite if needed, which inherit Sprite)
{
//sprite base will have things like what texture to use,
//what the current position is, the base Update/Draw/GetInput methods, etc..
//an AnimatedSprite contains helpers to animated the player while
//a StaticSprite is just one that will draw whatever texture is there
}
ปัญหา
ให้บอกว่าฉันทำ platformer 2d และต้องการ baddie เพื่อให้สามารถกระโดดได้ โดยปกติสิ่งที่ฉันทำคือการเพิ่มรหัสที่เหมาะสมในวิธีการอัพเดต / GetInput ถ้าฉันต้องการให้ผู้เล่นคลาน, เป็ด, ไต่และอื่น ๆ ... รหัสจะไปที่นั่น
ถ้าฉันไม่ระวังวิธีการเหล่านั้นก็จะยุ่งเหยิงดังนั้นฉันจึงสร้างวิธีการจับคู่แบบนี้
CheckForJumpAction(Input input)
และ DoJump()
CheckforDuckAction(Input input)
และ DoDuck()
ดังนั้น GetInput จึงดูเหมือนว่า
public void DoInput(Input input)
{
CheckForJumpAction(input);
CheckForDuckAction(input);
}
และอัปเดตดูเหมือนว่า
public void Update()
{
DoJump();
DoDuck();
}
ถ้าฉันไปและสร้างเกมอื่นที่ผู้เล่นต้องกระโดดและเป็ดฉันมักจะเข้าสู่เกมที่มีฟังก์ชั่นและคัดลอกมัน ยุ่งฉันรู้ ฉันว่าทำไมฉันถึงมองหาสิ่งที่ดีกว่า
วิธีการแก้?
ฉันชอบที่ Blend มีพฤติกรรมที่ฉันสามารถแนบกับองค์ประกอบได้อย่างไร ฉันคิดถึงการใช้แนวคิดเดียวกันนี้ในเกมของฉัน ลองดูตัวอย่างเดียวกัน
ฉันจะสร้างวัตถุฐานพฤติกรรม
public class Behavior
{
public void Update()
Public void GetInput()
}
และฉันสามารถสร้างพฤติกรรมโดยใช้สิ่งนั้น JumpBehavior:Behavior
และDuckBehavior:Behavior
ฉันสามารถเพิ่มคอลเลกชันของพฤติกรรมลงใน Sprite base และเพิ่มสิ่งที่ฉันต้องการในแต่ละเอนทิตี
public class Baddie:AnimatedSprite
{
public Baddie()
{
this.behaviors = new Behavior[2];
this.behaviors[0] = new JumpBehavior();
//etc...
}
public void Update()
{
//behaviors.update
}
public GetInput()
{
//behaviors.getinput
}
}
ดังนั้นตอนนี้ถ้าฉันต้องการใช้ Jump and Duck ในหลาย ๆ เกมฉันสามารถนำเอาพฤติกรรมไปใช้ ฉันสามารถสร้างห้องสมุดสำหรับคนทั่วไปได้
มันใช้งานได้หรือไม่
สิ่งที่ฉันไม่สามารถหาได้คือวิธีการแบ่งปันสถานะระหว่างพวกเขา การดูที่ Jump and Duck ทั้งคู่ไม่เพียงส่งผลกระทบต่อส่วนปัจจุบันของพื้นผิวที่ถูกวาดเท่านั้น แต่ยังรวมถึงสถานะของผู้เล่นด้วย (การกระโดดจะใช้แรงลดลงตามช่วงเวลาในขณะที่เป็ดกำลังจะหยุดการเคลื่อนไหวเปลี่ยนพื้นผิวและขนาดการชนของ baddie
ฉันจะผูกมันเข้าด้วยกันเพื่อให้มันทำงานได้อย่างไร ฉันควรสร้างคุณสมบัติการพึ่งพาระหว่างพฤติกรรมหรือไม่ ฉันควรให้แต่ละพฤติกรรมทราบเกี่ยวกับพ่อแม่และแก้ไขโดยตรงหรือไม่ สิ่งหนึ่งที่ฉันคิดว่าสามารถส่งผู้แทนไปยังแต่ละพฤติกรรมเพื่อรับการดำเนินการเมื่อมีการเรียกใช้
ฉันแน่ใจว่ามีปัญหาเพิ่มเติมที่ฉันกำลังมองหาอยู่ แต่จุดประสงค์ทั้งหมดคือเพื่อให้ฉันสามารถนำพฤติกรรมเหล่านี้กลับมาใช้ใหม่ระหว่างเกมและเอนทิตีในเกมเดียวกันได้อย่างง่ายดาย
ดังนั้นฉันหันไปหาคุณ สนใจที่จะอธิบายว่าสามารถทำได้หรือไม่? คุณมีความคิดที่ดีกว่านี้ไหม? ฉันหูของทุกคน