สถานะภาพเคลื่อนไหวที่ขับเคลื่อนด้วยข้อมูล


14

แก้ไข: เพื่อให้ชัดเจนว่าคำถามของฉันคืออะไร: นี่เป็นวิธีที่ดีในการจัดการภาพเคลื่อนไหว / สถานะภาพเคลื่อนไหวในเอ็นจิ้นเกมด้วยตาการสร้าง / การจัดการเนื้อหาหรือไม่ อะไรคือข้อบกพร่องในการทำเช่นนี้และสิ่งที่จะเป็นทางเลือกในการทำเช่นนั้น? - แม้ว่าคำตอบของฉันจะได้รับคำตอบบางส่วนในความคิดเห็นเพราะมันเป็นหนทางไป

ฉันพยายามจัดการกับอนิเมชั่นในโปรเจ็กต์เกมเอนจิ้น 2Dโดยไม่ต้องเข้ารหัสให้ยุ่งยาก สถานะภาพเคลื่อนไหวที่เข้ารหัสยากดูเหมือนว่าจะเป็นปรากฏการณ์ธรรมดา แต่แปลกมากสำหรับฉัน

พื้นหลังเล็กน้อย: ฉันกำลังทำงานกับระบบเอนทิตีที่ส่วนประกอบคือถุงของข้อมูลและระบบย่อยทำหน้าที่แทนพวกเขา ฉันเลือกที่จะใช้ระบบการลงคะแนนเพื่ออัพเดทสถานะภาพเคลื่อนไหว

ด้วยสถานะภาพเคลื่อนไหวฉันหมายถึง: "walking_left", "running_left", "walking_right", "shooting", ...

ความคิดของฉันเพื่อภาพเคลื่อนไหวที่จับคือการออกแบบเป็นรูปแบบข้อมูลที่ขับเคลื่อนด้วย ข้อมูลสามารถเก็บไว้ในไฟล์ xml, rdbms, ... และสามารถโหลดได้ตั้งแต่เริ่มเกม / ระดับ / ... วิธีนี้คุณสามารถแก้ไขภาพเคลื่อนไหวและช่วงการเปลี่ยนภาพได้อย่างง่ายดายโดยไม่ต้องเปลี่ยนรหัสทุกที่ในตัวคุณ เกม.

ตัวอย่างเช่นฉันสร้างร่าง xml ของคำจำกัดความข้อมูลที่ฉันมีอยู่ในใจ

ชิ้นหนึ่งที่สำคัญมากของข้อมูลก็จะเป็นรายละเอียดของภาพเคลื่อนไหว ภาพเคลื่อนไหวจะมีรหัสเฉพาะ (ชื่อที่สื่อความหมาย) มันจะถือ id อ้างอิงไปยังภาพ (แผ่นงานสไปรท์ที่ใช้เพราะภาพเคลื่อนไหวที่แตกต่างกันอาจใช้แผ่นงานสไปรต์ที่แตกต่างกัน) เฟรมต่อวินาทีเพื่อเปิดภาพเคลื่อนไหว "เล่นซ้ำ" ที่นี่กำหนดว่าควรจะเรียกใช้ภาพเคลื่อนไหวหนึ่งครั้งหรือไม่สิ้นสุด จากนั้นฉันกำหนดรายการสี่เหลี่ยมเป็นเฟรม

<animation id='WIZARD_WALK_LEFT'>
    <image id='WIZARD_WALKING' />
    <fps>50</fps>
    <replay>true</replay>
    <frames>
        <rectangle>
            <x>0</x>
            <y>0</y>
            <width>45</width>
            <height>45</height>
        </rectangle>
        <rectangle>
            <x>45</x>
            <y>0</y>
            <width>45</width>
            <height>45</height>
        </rectangle>
    </frames>
</animation>

ข้อมูลภาพเคลื่อนไหวจะถูกโหลดและเก็บไว้ในกลุ่มทรัพยากรภาพเคลื่อนไหวและอ้างอิงโดยเอนทิตีเกมที่ใช้งาน มันจะถือว่าเป็นทรัพยากรเช่นรูปภาพเสียงพื้นผิว ...

ข้อมูลชิ้นที่สองที่จะกำหนดจะเป็นเครื่องรัฐในการจัดการสถานะภาพเคลื่อนไหวและช่วงการเปลี่ยนภาพ สิ่งนี้กำหนดแต่ละสถานะที่เอนทิตีของเกมสามารถอยู่ได้ซึ่งระบุว่าสามารถเปลี่ยนเป็นและสิ่งใดเป็นตัวกระตุ้นให้เกิดการเปลี่ยนแปลงสถานะ

เครื่องสถานะนี้จะแตกต่างจากเอนทิตีไปยังเอนทิตี เพราะนกอาจมีสถานะ "เดิน" และ "บิน" ในขณะที่มนุษย์จะมีเพียง "เดิน" เท่านั้น อย่างไรก็ตามมันสามารถใช้ร่วมกันโดยเอนทิตี้ที่แตกต่างกันเพราะมนุษย์หลายคนอาจจะมีสถานะเดียวกัน (โดยเฉพาะเมื่อคุณกำหนด NPC ทั่วไปบางอย่างเช่นมอนสเตอร์ ฯลฯ ) นอกจากนี้ orc อาจมีสถานะเช่นเดียวกับมนุษย์ เพียงเพื่อแสดงให้เห็นว่าคำนิยามของรัฐอาจจะมีการใช้ร่วมกัน แต่โดยเฉพาะกลุ่มที่เลือกของหน่วยงานเกม

<state id='IDLE'>
  <event trigger='LEFT_DOWN' goto='MOVING_LEFT' />
  <event trigger='RIGHT_DOWN' goto='MOVING_RIGHT' />
</state>
<state id='MOVING_LEFT'>
  <event trigger='LEFT_UP' goto='IDLE' />
  <event trigger='RIGHT_DOWN' goto='MOVING_RIGHT' />
</state>
<state id='MOVING_RIGHT'>
  <event trigger='RIGHT_UP' goto='IDLE' />
  <event trigger='LEFT_DOWN' goto='MOVING_LEFT' />
</state>

รัฐเหล่านี้สามารถจัดการได้ด้วยระบบการลงคะแนนเลือกตั้ง แต่ละเกมทำเครื่องหมายว่ามันคว้าสถานะปัจจุบันของเอนทิตีเกมและตรวจสอบทริกเกอร์ทั้งหมด หากตรงตามเงื่อนไขจะเปลี่ยนสถานะของนิติบุคคลเป็นสถานะ "goto"

ส่วนสุดท้ายที่ผมกำลังต่อสู้กับเป็นวิธีการผูกข้อมูลภาพเคลื่อนไหวและภาพเคลื่อนไหวรัฐเพื่อกิจการ ฉันใช้วิธีตรรกะมากที่สุดในการเพิ่มตัวชี้ไปยังข้อมูลสถานะเครื่องจักรที่เอนทิตีใช้และกำหนดสำหรับแต่ละสถานะในเครื่องนั้นว่าภาพเคลื่อนไหวที่ใช้

นี่คือตัวอย่าง xml ที่ฉันจะกำหนดพฤติกรรมการเคลื่อนไหวและการแสดงกราฟิกของเอนทิตีทั่วไปบางอย่างในเกมโดยระบุสถานะภาพเคลื่อนไหวและรหัสข้อมูลภาพเคลื่อนไหว โปรดทราบว่าทั้ง "ตัวช่วยสร้าง" และ "orc" มีสถานะภาพเคลื่อนไหวเดียวกัน แต่มีภาพเคลื่อนไหวที่แตกต่างกัน นอกจากนี้แอนิเมชั่นที่แตกต่างกันอาจหมายถึงสไปรต์ชีตที่ต่างกันหรือแม้กระทั่งแอนิเมชั่นตามลำดับที่แตกต่างกัน

<entity name="wizard">
    <state id="IDLE" animation="WIZARD_IDLE" />
    <state id="MOVING_LEFT" animation="WIZARD_WALK_LEFT" />
</entity>

<entity name="orc">
    <state id="IDLE" animation="ORC_IDLE" />
    <state id="MOVING_LEFT" animation="ORC_WALK_LEFT" />
</entity>

เมื่อมีการสร้างเอนทิตีมันจะเพิ่มรายการของสถานะด้วยข้อมูลสถานะเครื่องจักรและการอ้างอิงข้อมูลภาพเคลื่อนไหว

ในอนาคตฉันจะใช้ระบบเอนทิตีเพื่อสร้างเอนทิตีทั้งหมดโดยการกำหนดส่วนประกอบในรูปแบบ xml ที่คล้ายกัน

-

นี่คือสิ่งที่ฉันได้มาหลังจากการวิจัย อย่างไรก็ตามฉันมีปัญหาในการรับหัวของฉันดังนั้นฉันจึงหวังว่าจะได้รับคำติชม มีบางอย่างที่นี่ไม่มีความหมายหรือมีวิธีที่ดีกว่าในการจัดการกับสิ่งเหล่านี้หรือไม่? ฉันเข้าใจแนวคิดของการวนซ้ำผ่านเฟรม แต่ฉันมีปัญหาในการก้าวไปอีกขั้นหนึ่งและนี่คือความพยายามของฉันที่จะทำเช่นนั้น


1
ฉันมีแนวคิดคล้ายกันสำหรับการจัดเก็บข้อมูลภาพเคลื่อนไหวถึงแม้ว่าฉันไม่ได้พิจารณาทริกเกอร์ นี่เป็นบทความสั้น ๆ ที่ฉันเขียนเกี่ยวกับมันและลิงก์ไปยังโปรเจ็กต์ XNA ที่ฉันเขียนซึ่งกิน XML และจัดการด้านแอนิเมชั่นของสิ่งต่าง ๆ ฉันมีบางสิ่งที่แตกต่างเช่นแนวคิดของชุดและลำดับ แต่นอกเหนือจากนั้นฉันคิดว่าคุณกำลังติดตาม
John McDonald

2
ไม่ใช่ว่าการออกแบบของคุณไม่ดี (ไม่ใช่มันเป็นไปตามแนวทางของระบบที่คล้ายกันที่ฉันสร้างขึ้นในอดีต) แต่คำถามของคุณตรงนี้คืออะไร? ฉันคิดว่ามันชัดเจนจริงๆ
MrCranky

@ John - ขอบคุณเพื่อนฉันจะดูในภายหลังเย็นนี้ @ MrCranky - ส่วนใหญ่เป็นเพียงแค่สิ่งที่คุณพูด หากเป็นคำแนะนำ / ลิงก์ที่ดีและเป็นไปได้ ฉันอยู่ในความมืดที่นี่จริงๆประสบการณ์ที่ชาญฉลาด
user8363

1
ฉันต้องการยกระดับความลึกของข้อมูลที่ให้ แต่เพื่อสะท้อน MrCranky ฉันไม่ได้ติดตามสิ่งที่คำถามนี้ สำหรับคำแนะนำส่วนตัวของฉัน (ซึ่งวางไข่จากการสร้างระบบประเภทนี้เมื่อสองสามสัปดาห์ก่อน) ฉันจะบอกว่าคุณเห็น
Mike Cluck

@ MikeC นั่นเป็นเพียงคำตอบที่ฉันต้องการ ฉันขอโทษสำหรับความจริงที่ว่าฉันไม่สามารถเข้าใจคำถามของฉันได้ชัดเจนขึ้น บางทีถ้าฉันไม่ได้เห็นมันจะดูเหมือนคำถาม :) ความจริงก็คือฉันไม่สามารถหาแหล่งข้อมูลมากมายที่เกี่ยวข้องกับสถานะภาพเคลื่อนไหวและแหล่งข้อมูลที่ไม่ได้เข้ารหัสไว้ดังนั้นการสร้าง / เปลี่ยนแปลงเนื้อหาจะเป็นฝันร้าย ดังนั้นคำถามของฉันคือ: วิธีนี้ถูกต้องหรือไม่? และถ้าคุณบอกว่ามันเป็นอย่างนั้นก็ดี :)
user8363

คำตอบ:


4

คลิปภาพเคลื่อนไหวนั้นอธิบายได้ดีที่สุดในข้อมูลเก่า ๆ อย่างที่คุณทำในตัวอย่าง XML แรกของคุณ คุณสามารถทำได้ด้วยมือหรือส่งออกจากแพ็คเกจศิลปะ ไม่ว่าจะด้วยวิธีใดคุณอาจต้องการสร้างไปป์ไลน์ที่นำมาจากรูปแบบสื่อกลางที่มนุษย์สามารถอ่านได้เช่น XML และทำให้มันเป็นสิ่งที่ดีและรวดเร็วในการโหลด

ขั้นตอนต่อไปคือการแสดงสิ่งนั้น หากคุณใช้กราฟฉากบางอย่างนั่นอาจหมายถึงการสร้าง Anim Node ให้กับมัน คุณควรบอกโหนดแอนิเมชั่นว่ากำลังเล่นอนิเมชั่นอยู่ที่ไหนและในไทม์ไลน์นั้นอยู่ที่ใด ตรวจสอบให้แน่ใจว่าคุณสามารถเข้าถึงข้อมูลในกล่องขอบเขตได้ในระดับนี้เพื่อให้คุณสามารถป้อนเข้าสู่ระบบการเลือกสรรของคุณได้อย่างง่ายดาย

ตอนนี้คุณจะต้องการเชื่อมโยงภาพเคลื่อนไหวกับเอนทิตีเกม ฉันมักจะใช้แบบจำลองส่วนประกอบดังนั้นสำหรับฉันหมายความว่านี้และส่วนประกอบ AnimState นี่คือเลเยอร์กลางของคุณระหว่างการเล่นเกมและการเรนเดอร์ มันจะติดตามว่าแอนิเมชั่นกำลังเล่นอยู่ playmodes (วนครั้งเดียว ping-pong ฯลฯ ) เวลา ฯลฯ สามารถส่งเหตุการณ์เช่น "animover" กลับไปที่เอนทิตีและอัพเดตสถานะของ animnode เมื่อเหมาะสม . AnimStates สำหรับเอนทิตีที่ใช้งานจะได้รับการอัพเดตหนึ่งครั้งต่อหนึ่งซิมเลือกว่าพวกเขากำลังเล่นภาพเคลื่อนไหว

ส่วนประกอบของแอนิเมชั่นอาจจะเพียงพอสำหรับไอเท็มเกมง่าย ๆ (อุปกรณ์ประกอบฉากพื้นหลังพื้นฐานและสิ่งที่คล้ายกัน) แต่สำหรับเอนทิตีที่ซับซ้อนกว่านี้คุณจะต้องการใช้เครื่องสถานะเพื่อจัดการมัน สิ่งนี้แสดงได้ดีที่สุดในภาษาสคริปต์เช่น Lua หรือ Python สถานะสามารถมีหลายบล็อกการทำงาน (onEnter, onExit, onUpdate, onEvent) เช่นเดียวกับไทม์ไลน์ที่ระบุการกระทำและทริกเกอร์ที่ควรเกิดขึ้นในบางช่วงเวลา คุณอาจจะมีคลาสผู้จัดการบางประเภทที่รับผิดชอบในการอัพเดตเครื่องสถานะเหล่านี้ตามความเหมาะสมรวมถึงการทริกเกอร์การโทรกลับลำดับเวลาเมื่อเกิดขึ้น คุณควรพยายามทำให้สิ่งเหล่านี้เป็นไปตามเหตุการณ์ที่เป็นไปได้เนื่องจาก OnUpdate ทุกอันที่คุณเขียนจะมีต้นทุนเชิงเส้นพร้อมจำนวนเอนทิตี คุณจะต้องสามารถระบุแท็ก ('โจมตี', 'ไม่ได้ใช้งาน', 'igninput' ฯลฯ ) ที่เกี่ยวข้องกับทั้งรัฐและภูมิภาคเวลาที่แน่นอน คุณอาจต้องการตัวจัดการเหตุการณ์ระดับสูงบางตัวที่ใช้กับกราฟสถานะทั้งหมดไม่ใช่เฉพาะบางสถานะ

ตัวละคร 'Sentient' อาจจะมี AI บางอย่างเช่นกัน ฉันมักจะสร้างส่วนประกอบ 'locomotor' ที่จัดการเดินไปรอบ ๆ มันเชื่อมต่อกับ stategraph โดยใช้ระบบสัญญาณและเหตุการณ์และสอบถามสถานะแท็กและสามารถบอกให้ "เดินไปที่จุด" หรือ "วิ่งไปในทิศทางที่แน่นอนด้วยความเร็วที่แน่นอน" ส่วนประกอบ AI ระดับสูงกว่า (เช่นแผนผังพฤติกรรมหรืออะไรก็ตาม) สามารถใช้ส่วนต่อประสานนี้ได้โดยไม่ต้องกังวลกับรายละเอียด


1

ระบบภาพเคลื่อนไหวที่ขับเคลื่อนด้วยข้อมูลที่ดีที่สุดที่ฉันเคยเห็นคือ ต้นไม้ผสม จริงๆแล้วมันเป็นเรื่องที่ดีและสามารถทำทุกอย่างที่คุณขอได้ที่นี่ จากข้อมูลของ AIGameDev.com ตอนนี้เป็นมาตรฐานจริงในอุตสาหกรรมและฉันเชื่อว่ามันถูกต้อง

แต่น่าเสียดายที่ผมพบว่าไม่มีทรัพยากรที่ดีกับ Googling อย่างรวดเร็ว แต่คุณสามารถลองนี้หรือที่จะได้รับภาพรวม นอกจากนี้ยังมีบทความการจ่ายเงินใน AIGameDev.com ไม่ทราบว่ามันคุ้มค่าที่จะได้รับบัญชีพรีเมี่ยม


นี่เป็นแหล่งข้อมูลที่ดีมากขอบคุณ ฉันกำลังมองหาข้อมูลเช่นนี้
user8363

1
เป็นไปไม่ได้ที่ภาพเคลื่อนไหวผสมด้วยสไปรต์แผ่นแยกเฉพาะกับแอนิเมชั่นโครงกระดูกต่อเนื่อง
AlexFoxGill
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.