จะเขียนโค้ด Time Stop หรือ Bullet Time ในเกมได้อย่างไร?


11

ฉันกำลังพัฒนา platformer RPG ผู้เล่นเดี่ยวใน XNA 4.0 ฉันต้องการเพิ่มความสามารถที่จะทำให้เวลา "หยุด" หรือช้าลงและมีเพียงตัวละครของผู้เล่นที่เคลื่อนที่ด้วยความเร็วดั้งเดิม (คล้ายกับคาถา Time Stop จากซีรี่ส์ประตู Baldur) ฉันไม่ได้มองหาการใช้งานที่แน่นอน แต่เป็นแนวคิดและรูปแบบการออกแบบทั่วไป

แก้ไข: ขอบคุณทุกท่านสำหรับการป้อนข้อมูลที่ยอดเยี่ยม ฉันคิดวิธีแก้ปัญหาต่อไปนี้ขึ้นมา

    public void Update(GameTime gameTime)
        {

            GameTime newGameTime = new GameTime(gameTime.TotalGameTime,
 new TimeSpan(gameTime.ElapsedGameTime.Ticks / DESIRED_TIME_MODIFIER));
            gameTime = newGameTime;

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

คำตอบ:


8

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

ตัวอย่างเช่น:

player.update(dt)
dt = dt * .5 --half speed
enemy.update(dt)

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

x = x + xspeed * dt * speed

ส่วนแรกทำให้รู้สึกสมบูรณ์แบบส่วนที่สองไม่ชัดเจน
AturSams

2
เพียงแค่ให้แต่ละวัตถุที่ย้ายตัวแปรความเร็วที่คุณสามารถเปลี่ยนและเมื่อคุณมีการแปลง (เช่น x) ให้คูณขนาดด้วยตัวแปรความเร็ว
tesselode

ทำให้รู้สึกตอนนี้ :)
AturSams

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

คุณหมายถึงอะไร AI จะสามารถตอบสนองด้วยความเร็วปกติ AI ใดที่มีรหัสที่ไม่สามารถใช้ตัวแปรความเร็วได้
tesselode

3

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

หากคุณต้องการชะลอองค์ประกอบเกมกลุ่มใหญ่ในเกมผู้เล่นเดี่ยวคุณสามารถสร้างนาฬิกาภายในที่สองสำหรับสิ่งมีชีวิตแต่ละตัวนาฬิกาจะเริ่มในเวลาปัจจุบันเมื่อสิ่งมีชีวิตปรากฏขึ้น เมื่อร่ายช้า ๆ ร่ายแต่ละเฟรมนาฬิกาจะเพิ่มขึ้น x% ของเวลาที่ผ่านไปจริง ๆ พฤติกรรมของสัตว์ประหลาดทั้งหมดจะถูกกำหนดโดยนาฬิกาภายใน หากสัตว์ประหลาดต่าง ๆ มีความต้านทานต่อการชะลอพวกเขาสามารถใช้นาฬิกาของตัวเองมันเป็นจำนวนเต็มที่ไม่ต้องใช้พื้นที่มากหรือการคำนวณ

เมื่อหยุดเอฟเฟกต์ช้านาฬิกายังคงใช้งานอยู่และเพิ่มขึ้น 100% ของเวลาที่ผ่านไปจริง ๆ

สิ่งนี้สามารถใช้กับคาถาเร่งรีบได้

@ Sidar: ฉันเห็นสองทางเลือก

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

  2. การจับเวลาหนึ่งครั้งต่อการโจมตี: คุณรู้ว่าต้องใช้เวลานานเท่าใดในการโจมตีเพื่อชาร์จและคุณเพียงแค่ตั้งเวลาและลบเวลาที่ผ่านไป * (1-slowdown%) แต่ละรอบ

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

มันขึ้นอยู่กับความพึงพอใจของมัน


ไม่จำเป็นต้องใช้นาฬิกาภายใน มันลดลงมาเป็นทวีคูณที่คุณสามารถเชื่อมโยงไปยังวัตถุของคุณที่เพิ่มหรือลดผลิตภัณฑ์ dt (เวลาเดลต้า) ของคุณคุณสามารถจัดการวัตถุตามกลุ่มหรืออะไรก็ตาม ฉันคิดว่าวิธีการของคุณอาจจะมากไปหน่อย แต่เดี๋ยวก่อนถ้ามันใช้งานได้ ... แล้วมันก็ใช้งานได้
Sidar

@Sidar หากคุณหลีกเลี่ยงปัญหานี้คุณอาจต้องใช้นาฬิกาต่อการโจมตีหนึ่งครั้งเพื่อเติมพลังโจมตีระยะเวลาการสะกดและสิ่งต่าง ๆ อย่างน้อยที่สุดคุณต้องอัปเดตนาฬิกาหนึ่งครั้งและเพียงแค่ให้เวลา 'การเปิดใช้งานครั้งสุดท้าย' เพื่อรีเซ็ตคุณสมบัติ
AturSams

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

การชะลอตัวของสภาพแวดล้อมนั้นรวมถึงการลดอัตราการโจมตีรวมถึงความสามารถอื่น ๆ ของพวกเขา (เนื่องจากมันเป็นเกม RPG) อาจมีความสามารถของม็อบหลากหลายที่ขึ้นอยู่กับเวลาในการชาร์จ รักษาบัฟ, ดีบัฟ, คาถาและอื่น ๆ ไม่ต้องพูดถึงเวลาเปิดใช้งาน
AturSams

2

คุณสามารถเริ่มต้นด้วยวิธีแก้ปัญหาอย่างง่าย ๆ เช่นเดียวกับ tesselode หรือ Mr Beast แต่ถ้าคุณเริ่มผสมสิ่งที่ซับซ้อนเช่นเวลาแสดงหัวข้อย่อยในขณะที่ร่ายช้าลงคุณจะติดอยู่

ฉันขอแนะนำให้คุณใช้ลำดับชั้นของนาฬิกา :

.
├── Main clock
│   └── UI clock
│   └── 3D clock
│       ├── GFX clock
│       └── Gameplay clock
│           └── Slowdown spell clock 01
│           └── Slowdown spell clock 02

ทุกสิ่งในเกมของคุณควรใช้เดลตาเวลาจากหนึ่งในนาฬิกา: เอฟเฟกต์กราฟิกที่รันบนนาฬิกา GFX, AI และแอนิเมชั่นจะทำงานบนนาฬิกา Gameplay สัตว์ที่ได้รับผลกระทบจากการสะกดช้าลง ส่งผลกระทบต่อส่วนต่าง ๆ ของลำดับชั้นของคุณ: คาถาการชะลอตัวสร้างและส่งผลต่อนาฬิกาที่กำหนดเองในขณะที่เวลาแสดงหัวข้อย่อยจะส่งผลกระทบต่อลำดับชั้นของนาฬิกา 3 มิติทั้งหมด


ขอบคุณนี่เป็นข้อมูลเชิงลึกที่สำคัญ อย่างไรก็ตามฉันคิดว่าฉันจะรักษาความเรียบง่ายเอาไว้เพราะมันไม่สมเหตุสมผลในกรณีของฉันที่จะเกิดเอฟเฟกต์การชะลอตัวหลายอย่างในเวลาเดียวกัน
David Miler

1

คุณเพียงแค่ต้องการนาฬิกาสองแบบที่แตกต่างกันแทนที่จะเป็นหนึ่งอันสำหรับเวลาที่เกี่ยวข้องกับการเล่นเกมและเวลา "จริง" หนึ่งครั้ง

currentGameTime = 0;
gameSpeed = 1.0f;
[...]
currentApplicationTime = GetTime():
timeDelta = (currentApplicationTime - lastApplicationTime)*gameSpeed;
currentGameTime += timeDelta;
lastApplicationTime = currentApplicationTime;

จากนั้นคุณสามารถเปลี่ยน gameSpeed ​​เพื่อเร่งความเร็ว (> 1) หรือชะลอเวลา (<1) สำหรับผู้เล่นที่จะย้ายด้วยความเร็วที่แตกต่างกันเพียงตรวจสอบเวลาที่ช้าลงหรือไม่

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