แอนิเมชันยังสามารถแยกระหว่างตรรกะและการเรนเดอร์ สถานะข้อมูลนามธรรมของการเคลื่อนไหวจะเป็นข้อมูลที่จำเป็นสำหรับ API กราฟิกของคุณในการแสดงภาพเคลื่อนไหว
ในเกม 2 มิติที่อาจเป็นพื้นที่สี่เหลี่ยมผืนผ้าซึ่งทำเครื่องหมายพื้นที่ที่แสดงส่วนปัจจุบันของแผ่นงานสไปรต์ที่ต้องวาด (เมื่อคุณมีแผ่นงานประกอบด้วยสมมติว่าภาพวาด 80 80x80 ประกอบด้วยขั้นตอนต่าง ๆ ของตัวละครของคุณ กระโดดนั่งลงขยับ ฯลฯ ) นอกจากนี้ยังอาจเป็นข้อมูลประเภทใดก็ได้ที่คุณไม่จำเป็นต้องใช้ในการเรนเดอร์ แต่อาจเป็นเพราะการจัดการอนิเมชั่นเองเช่นเวลาที่เหลือจนกว่าขั้นตอนของอนิเมชั่นปัจจุบันจะหมดอายุหรือชื่อของอนิเมชั่น ฯลฯ ) สิ่งเหล่านี้สามารถเป็นตัวแทนในแบบที่คุณต้องการ นั่นคือส่วนของ logics
ในส่วนของการเรนเดอร์คุณเพียงทำตามปกติรับสี่เหลี่ยมผืนผ้านั้นจากโมเดลของคุณและใช้ renderer เพื่อทำการเรียกไปยังกราฟิค API
ในรหัส (ใช้ไวยากรณ์ C ++ ที่นี่):
class Sprite //Model
{
private:
Rectangle subrect;
Vector2f position;
//etc.
public:
Rectangle GetSubrect()
{
return subrect;
}
//etc.
};
class AnimatedSprite : public Sprite, public Updatable //arbitrary interface for classes that need to change their state on a regular basis
{
AnimationController animation_controller;
//etc.
public:
void Update()
{
animation_controller.Update(); //Good OOP design ;) It will take control of changing animations in time etc. for you
this.SetSubrect(animation_controller.GetCurrentAnimation().GetRect());
}
//etc.
};
นั่นคือข้อมูล โหมดแสดงภาพของคุณจะใช้ข้อมูลนั้นและวาด เนื่องจากทั้ง Sprite ธรรมดาและการ์ตูนเคลื่อนไหวถูกวาดในลักษณะเดียวกันคุณสามารถใช้ polymorphy ได้ที่นี่!
class Renderer
{
//etc.
public:
void Draw(const Sprite &spr)
{
graphics_api_pointer->Draw(spr.GetAllTheDataThatINeed());
}
};
TMV:
ฉันมาด้วยตัวอย่างอื่น สมมติว่าคุณมีเกม RPG ตัวอย่างเช่นโมเดลของคุณที่แสดงถึงแผนที่โลกอาจจะต้องเก็บตำแหน่งของตัวละครในโลกเป็นพิกัดแผนที่ย่อยบนแผนที่ อย่างไรก็ตามเมื่อคุณย้ายตัวละครพวกเขาเดินพิกเซลสองสามครั้งในตารางถัดไป คุณเก็บตำแหน่ง "ระหว่างไทล์" นี้ในวัตถุอนิเมชั่นหรือไม่? คุณจะอัปเดตโมเดลได้อย่างไรเมื่อตัวละคร "มาถึง" ในพิกัดไทล์ถัดไปบนแผนที่?
แผนที่โลกไม่รู้เกี่ยวกับตำแหน่งของผู้เล่นโดยตรง (มันไม่มี Vector2f หรืออะไรทำนองนั้นที่เก็บตำแหน่งผู้เล่นโดยตรง = แต่มันมีการอ้างอิงโดยตรงไปยังวัตถุของผู้เล่นเองซึ่งในทางกลับกันมาจาก AnimatedSprite เพื่อให้คุณสามารถส่งผ่านไปยังโหมดแสดงภาพได้อย่างง่ายดายและรับข้อมูลที่จำเป็นทั้งหมดจากมัน
โดยทั่วไปแล้ว tilemap ของคุณไม่ควรทำทุกอย่างได้ฉันมีคลาส "TileMap" ซึ่งดูแลการจัดการไทล์ทั้งหมดและบางทีมันอาจทำการตรวจจับการชนกันระหว่างวัตถุที่ฉันส่งมอบให้และ กระเบื้องบนแผนที่ จากนั้นฉันจะมีคลาส "RPGMap" อีกชั้นหนึ่งหรืออย่างไรก็ตามคุณต้องการโทรหาซึ่งมีทั้งการอ้างอิงถึง tilemap ของคุณและการอ้างอิงถึงผู้เล่นและทำการอัปเดตจริง () ไปยังเครื่องเล่นของคุณและของคุณ tilemap
วิธีที่คุณต้องการอัปเดตโมเดลเมื่อผู้เล่นย้ายขึ้นอยู่กับสิ่งที่คุณต้องการจะทำ
ผู้เล่นของคุณได้รับอนุญาตให้ย้ายระหว่างไทล์ (อิสระสไตล์ Zelda) หรือไม่? เพียงจัดการอินพุตและย้ายเครื่องเล่นตามทุกเฟรม หรือคุณต้องการให้ผู้เล่นกด "ขวา" และตัวละครของคุณจะย้ายไทล์หนึ่งไปทางขวาโดยอัตโนมัติหรือไม่? ปล่อยให้คลาส RPGMap ของคุณสอดแทรกตำแหน่งผู้เล่นจนกว่าเขาจะมาถึงปลายทางของเขาและในขณะเดียวกันก็ล็อคการจัดการอินพุตคีย์การเคลื่อนไหวทั้งหมด
ทั้งสองวิธีถ้าคุณต้องการทำให้มันง่ายขึ้นในตัวคุณเองทุกรุ่นของคุณจะมีวิธีการ Update () หากพวกเขาต้องการตรรกะบางอย่างเพื่อปรับปรุงตัวเอง (แทนที่จะเป็นแค่การเปลี่ยนค่าของตัวแปร) - คุณไม่ได้มอบตัวควบคุม ในรูปแบบ MVC ด้วยวิธีนี้คุณเพียงแค่ย้ายรหัสจาก "หนึ่งขั้นตอนข้างบน" (ตัวควบคุม) ลงไปที่รูปแบบและตัวควบคุมทั้งหมดจะเรียกวิธีการอัพเดตนี้ () ของรูปแบบ (ตัวควบคุมในกรณีของเราจะเป็น RPGMap) คุณยังสามารถสลับรหัส logics ได้อย่างง่ายดาย - คุณสามารถเปลี่ยนรหัสของคลาสได้โดยตรงหรือหากคุณต้องการพฤติกรรมที่แตกต่างไปจากเดิมอย่างสิ้นเชิงคุณสามารถได้มาจากคลาสรุ่นของคุณและแทนที่เมธอด Update () เท่านั้น
วิธีการนั้นช่วยลดการเรียกใช้เมธอดและสิ่งต่างๆมากมายซึ่งเคยเป็นหนึ่งในข้อเสียเปรียบหลักของรูปแบบ MVC บริสุทธิ์ (คุณเรียกใช้ GetThis () GetThat () บ่อยมาก) - ทำให้โค้ดทั้งยาวขึ้นและ อ่านน้อยลงและช้าลงนิดหน่อย - แม้ว่านั่นอาจจะได้รับการดูแลโดยคอมไพเลอร์ของคุณที่ปรับสิ่งต่าง ๆ ให้เหมาะสมเช่นนั้น