โดยพื้นฐานแล้วคุณอยู่ในเส้นทางที่ถูกต้อง - คุณต้องรู้ว่าภาพเคลื่อนไหวใช้เวลานานแค่ไหนในการทำสิ่งนี้ แอนิเมชั่นเป็นมากกว่าการรวบรวมเฟรมมีข้อมูลอื่น ๆ รอบตัวที่คุณต้องการ เช่นมีจำนวนเฟรมภาพเคลื่อนไหววนซ้ำเร็วแค่ไหนเล่น (เช่น 10 เฟรมภาพเคลื่อนไหวต่อวินาทีหรือ 25 หรือ 60 หรือไม่) ภาพเคลื่อนไหวทุกภาพสามารถกำหนดได้ในรูปของข้อมูลสองสามชิ้นซึ่งบางรหัสภาพเคลื่อนไหวทั่วไปสามารถดูและเล่นได้ คุณควรห่อหุ้มส่วนภาพเคลื่อนไหวในรหัสบิตของตัวเองซึ่งไม่ได้ตระหนักถึงสิ่งใดนอกจากคำจำกัดความภาพเคลื่อนไหวเหล่านี้และวิธีการแสดงเฟรมภาพแต่ละภาพ นั่นคือมีวัตถุแอนิเมชั่นที่คุณสามารถโหลดเริ่มเล่นหยุดเล่นและบอกให้แสดงที่ตำแหน่งเฉพาะบนหน้าจอ
แนวทางที่ยืดหยุ่นคือการใช้คำจำกัดความของภาพเคลื่อนไหวเพื่อสรุปข้อมูลประเภทนี้ ดังนั้นแทนที่จะเพียงแค่พูดว่า "ภาพเคลื่อนไหว X เป็นเฟรมเหล่านี้ทั้งหมดเพียงแค่เล่นผ่านมัน" คุณจะได้รับบางสิ่งที่ซับซ้อนกว่านี้
เช่นกับรูปแบบข้อมูลที่เยาะเย้ย
แอนิเมชั่น =
{
{name = "walk", files = "walk * .png", frameCount = "12", loop = "true"},
{name = "fire" ไฟล์ = "fire * .png" frameCount = "6",
เหตุการณ์ = {
{name = "bulletLeavesGun", frame = "4", param1 = "43", param2 = "30"}
}
}
}
ดังนั้นรหัสของคุณพูดว่า:
currentAnimation = animations.Get("fire");
currentAnimation.Play();
วิธีที่คุณตรวจพบเหตุการณ์สามารถอยู่กับรหัสภาพเคลื่อนไหวที่โทรกลับคุณได้ (เช่นเมื่อตรวจพบเหตุการณ์ใหม่เพราะภาพเคลื่อนไหวเล่นในบางเฟรมมันจะเรียกรหัสเกมของคุณเพื่อบอกเกี่ยวกับเหตุการณ์ใหม่) หรือโดยการสำรวจ แอนิเมชันเช่นนั้น:
List<Event> events = currentAnimation.EventsSinceLastCheck();
foreach (AnimationEvent event in events)
{
if (event.name == "bulletLeavesGun")
{
Vector2 bulletPosition = new Vector2(event.param1, event.param2);
Vector2 actualBulletPosition = new Vector2(
character.x + bulletPosition.x,
character.y + bulletPosition.y);
CreateBulletAt(actualBulletPosition);
}
}
จุดที่ควรทราบ:
- รหัสภาพเคลื่อนไหวควรมีอยู่แยกต่างหากจากรหัสเกม คุณไม่ต้องการให้รหัสการเล่นของคุณผูกติดแน่นเกินไปกับการเล่นภาพเคลื่อนไหว
- รหัสภาพเคลื่อนไหวรู้ว่าจะวนซ้ำตามนิยามของภาพเคลื่อนไหวหรือไม่
- รหัสภาพเคลื่อนไหวรู้ว่าเมื่อทำภาพเคลื่อนไหวแล้วและสามารถโทรกลับไปที่รหัสอื่นเพื่อบอกว่า 'เดี๋ยวก่อนภาพเคลื่อนไหวที่เรียกว่า "ไฟ" เพิ่งเสร็จสิ้นคุณต้องการทำอะไรในตอนนี้
- รหัสภาพเคลื่อนไหวไม่ทราบอะไรเกี่ยวกับเหตุการณ์อื่นนอกจากว่าพวกเขามีชื่อและข้อมูลบางอย่างที่เกี่ยวข้องกับพวกเขา (param1 และ param2)
- รหัสภาพเคลื่อนไหวรู้ว่าตอนนี้เฟรมเปิดอยู่และเมื่อเปลี่ยนเป็นเฟรมใหม่มันสามารถตรวจสอบและพูดว่า 'โอ้ตอนนี้ฉันอยู่ที่เฟรม 4 แล้วนั่นหมายความว่าเหตุการณ์นี้เรียกว่า "ไฟ" เพิ่งเกิดขึ้นเพิ่มไปที่ รายการเหตุการณ์ล่าสุดของฉันดังนั้นฉันสามารถบอกใครก็ได้ที่ถามเกี่ยวกับมัน '
หากคุณไม่ต้องการกระสุนยิงที่จะเกิดขึ้นภายในอนิเมชั่น แต่เมื่อเสร็จแล้วคุณสามารถหนีไปได้ด้วยระบบที่ซับซ้อนน้อยกว่าโดยไม่ต้องคิดเหตุการณ์ แต่คุณยังคงต้องการระบบที่ภาพเคลื่อนไหวเล่นด้วยตัวเองรู้ว่ามันเป็นเวลานานเท่าใดและสามารถโทรกลับไปที่รหัสเกมเมื่อภาพเคลื่อนไหวเสร็จสมบูรณ์