จะใช้เวลาเดินทางเข้าเกมอย่างไร?


10

ฉันสงสัยว่าจะนำการเดินทางข้ามเวลาไปใช้ในเกมอย่างไร ไม่มีอะไรซับซ้อนเป็นพิเศษเพียงแค่ย้อนเวลากลับคืนเหมือนใน Braid ที่ผู้ใช้สามารถย้อนกลับ / ไปข้างหน้าอย่างรวดเร็ว 30 วินาทีหรืออะไรก็ตาม

ฉันค้นหาในเว็บเป็นจำนวนมาก แต่โดยทั่วไปแล้วผลลัพธ์ของฉันจะเรียกว่าใช้เวลาเหมือนกับ "มันคือ 3:00" หรือมีการจับเวลา

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

ขอบคุณล่วงหน้า!


11
คุณไม่อ่านข่าว ( ust.hk/eng/news/press_20110719-893.html ) ใช่ไหม พวกเขาเพิ่งแสดงให้เห็นว่าการเดินทางข้ามเวลาเป็นไปไม่ได้ ดังนั้นจึงเป็นไปไม่ได้ที่จะเขียนโค้ด

คุณต้องคิดว่าความหมายที่เป็นไปได้สำหรับการเดินทางข้ามเวลาหลังจากนั้นเท่านั้นที่คุณจะเริ่มคิดเกี่ยวกับการใช้งาน
Paŭlo Ebermann


2
เรียนรู้ตัวเองบางคณิตศาสตร์เวกเตอร์ หากคุณกำลังเสนอสองอาร์เรย์แยกต่างหากที่แนะนำว่าคุณไม่เคยทำงานกับพวกเขา ฉันคิดว่ามันสำคัญสำหรับโปรแกรมเมอร์เกมที่ต้องรู้เพราะพวกเขาสามารถทำให้สิ่งต่าง ๆ ง่ายขึ้น
doppelgreener

5
import universal.back2future.FluxCapacitor;
jhocking

คำตอบ:


6

แนวคิดของอาเรย์นั้นค่อนข้างจะนำไปใช้ใน Braid ได้อย่างไร เมื่อสิ่งเดียวที่ทำหน้าที่เกี่ยวกับตัวละครคือแรงดึงดูดอินพุตคีย์บอร์ด / จอยแพดและตัวละครอื่น ๆ คุณต้องเก็บตำแหน่งและความเร็วในแต่ละขั้นตอนเพื่อที่จะได้รู้ทุกสิ่งที่สำคัญเกี่ยวกับตัวละครนั้น หากคุณเก็บ 10 snapshots ต่อวินาทีต่อตัวอักษรก็ยังน้อยกว่า 50K สำหรับหนึ่งนาทีของตัวละครตัวหนึ่ง - จัดการได้ง่ายในระบบส่วนใหญ่และคุณสามารถหาวิธีที่มีประสิทธิภาพมากกว่านั้น


นี่คือเส้นทางที่ถูกต้อง ตัวอย่างเช่นการจัดเก็บคำสั่งที่ใช้งานอยู่: การกดปุ่มด้วยการประทับเวลา คุณสามารถคาดการณ์พฤติกรรมอื่น ๆ ส่วนใหญ่ได้หากระบบกำหนดขึ้นได้ ตัวติดตาม 10 fps นั้นใช้ได้สำหรับระบบการกรอกลับแม้จะน้อยกว่านั้นก็อาจจะยอมรับได้ตราบใดที่คำสั่งจริงยังคงอยู่ซึ่งจะส่งผลต่อสถานะหรือการเปลี่ยนสถานะของวัตถุ
karmington

4

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

แต่ฉันคิดว่าความคิดของคุณอาเรย์เป็นเสียงเช่นกัน


อาจไม่ใช่ความคิดที่ดี - นอกเหนือจากการเพิ่มหน่วยความจำให้มากขึ้น(ทุกครั้งที่คุณเพิ่มความเร็วของเอนทิตีไปยังตำแหน่งของมันคุณจะต้องเก็บมันไว้เป็น "การกระทำ")มันต้องใช้คณิตศาสตร์แบบคงที่ -point สำหรับตำแหน่งของคุณ / ความเร็วอาจจะไม่เท่ากับ(x+v)-v x
BlueRaja - Danny Pflughoeft

1
@BlueRaja - อย่าดูว่าวิธีการนั้นจะใช้หน่วยความจำมากแค่ไหน ที่ 100 FPS และเก็บ 10 วินาทีสุดท้ายคุณต้องเก็บคำสั่ง 1,000 n-tupels โดยที่ n อยู่ที่ 5 หรือมากที่สุด หรือยิ่งกว่านั้นคุณจะเก็บเฉพาะตำแหน่งที่แน่นอนในแต่ละเฟรมเหล่านั้นและสำหรับการกรอกลับคุณสามารถทำให้ตัวละครย้อนกลับไปตามเส้นทางนั้นได้ สิ่งนี้จะช่วยขจัดปัญหาจุดลอยตัวที่อาจเกิดขึ้นและนำคุณกลับไปสู่จุดเริ่มต้นที่แน่นอน
Hackworth

3

แทนที่จะมีสองอาร์เรย์แยกกันคุณน่าจะมีหนึ่งคลาสที่อธิบายตำแหน่งของผู้เล่น (อาจมีคลาสพอยต์ใน Java อยู่แล้ว ... ฉันเป็นผู้ชาย C # เมื่อเร็ว ๆ นี้) และใช้อาร์เรย์เดียวเพื่อดำรงตำแหน่งที่ผ่านมา

คุณต้องตั้งค่า "ring buffer" ซึ่งหมายความว่าเมื่อคุณไปยังจุดสิ้นสุดของอาร์เรย์คุณจะวนกลับไปที่จุดเริ่มต้นของอาร์เรย์เขียนทับรายการที่เก่าที่สุด หากคุณย้อนเวลากลับไปสิ่งตรงกันข้ามก็เป็นจริง (เมื่อคุณไปถึงจุดเริ่มต้น

หากคุณต้องการเก็บข้อมูลที่ผ่านมา 30 วินาทีคุณจำเป็นต้องรู้อัตราเฟรมของคุณหากคุณต้องการจัดสรรพื้นที่ล่วงหน้าและใช้อาร์เรย์ขนาดคงที่ หากคุณแสดงผลเกมที่ 10 เฟรม / วินาทีคูณ 30 วินาทีนั่นคือ 300 องค์ประกอบ


2

GDCVaultมีการบรรยายโดย Jon Blow (ผู้สร้างBraid ) บนไซต์ของพวกเขาที่ชื่อว่าThe Implementation of Rewind in Braid ในราคา $ 3.95 ฉันจะเดิมพันว่ามีข้อมูลที่คุณต้องการ;)

แก้ไข: อาจจะไม่ได้อยู่ใน Java แต่ความคิดควรถือ


คุณรู้หรือไม่ว่าพวกเขาขายบันทึกเสียงด้วยหรือเฉพาะเสียง?
o0 '

ฉันไม่พบสิ่งใดผ่านการค้นหาเว็บไซต์อย่างรวดเร็ว คุณอาจจะใช้ซอฟต์แวร์ถอดความ ?
NoobsArePeople2

1

เช่นเดียวกับErik J ที่กล่าวว่าการเก็บตำแหน่งที่ผ่านมาของผู้เล่นเป็นการรวบรวมวัตถุจุดในเสียงเรียกเข้าแบบบัฟเฟอร์

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

update():
   time_queue.push(player.positions)
   if current_time() - start_time > n:
       queue.pop()

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

update():
    time_queue.push({
        'pos': player.positions,
        'time': current_time()
    })
    first_entry = queue.peek()
    while current_time() - first_entry['time'] > n:
       queue.pop()
       first_entry = queue.peek()

หวังว่านี่จะช่วยได้!


1

มีรูปแบบการออกแบบที่เรียกว่าMementoฉันคิดว่ามันเป็นจุดเริ่มต้นสำหรับเกมอย่าง Braid

รูปแบบของที่ระลึกเป็นรูปแบบการออกแบบซอฟต์แวร์ที่ให้ความสามารถในการเรียกคืน> วัตถุไปสู่สถานะก่อนหน้า (ยกเลิกการย้อนกลับผ่าน)

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

http://en.wikipedia.org/wiki/Memento_pattern

ข้อมูล Adcional ที่นี่: http://dofactory.com/Patterns/PatternMemento.aspx


2
ฉันไม่เห็นว่าสิ่งนี้จะช่วยได้อย่างไร ดูเหมือนว่าจะเป็น "การย้อนกลับแบบทันที" ในขณะที่ OP ขอสิ่งที่ราบรื่นเหมือนของ Braid บางทีฉันอาจอ่านผิดบางอย่าง?
o0 '

นี่คือรูปแบบที่ไม่ได้หมายถึงการย้อนกลับครั้งเดียวคุณสามารถสร้าง "ไทม์ไลน์" ของการกระทำได้ นี่คือโพสต์บล็อกของ Brazillian เกี่ยวกับการใช้รูปแบบนี้: abrindoojogo.com.br/padroes-de-projeto-memento นี่คือตัวอย่างที่ทำใน Flash: abrindoojogo.com.br/files/fasteroids.swf Move: Arrows | ยิง: อวกาศ | การดำเนินการย้อนกลับ: Backspace
Marcelo Assis

1

มีเกมวางจำหน่ายสำหรับ XBox360 ที่เกี่ยวข้องกับการย่นเวลา มันธรรมดาดังนั้นฉันจำชื่อตอนนี้ไม่ได้ อย่างไรก็ตามในการสัมภาษณ์กับนักพัฒนาซอฟต์แวร์พวกเขาได้อธิบายวิธีจัดการเวลา:

เฟรม X ทุกตัว (ที่มีค่า X ต่ำกว่านำไปสู่การปรับแต่งที่ละเอียดยิ่งขึ้น) คุณจะได้ "snapshot" ของ gameworld ณ จุดนั้นและเชื่อมโยงกับเวลาในเกม

ในขณะที่เล่นเกมโดยปกติการส่งต่อเวลาปฏิกิริยาที่ป้อนเข้าทุกครั้งจะมีส่วนทำให้เกิดชุดภาพรวมในอนาคต

โลกของเกมจะวนซ้ำระหว่างสแน็ปช็อตในเวลาปัจจุบันและเฟรมสแนปช็อต X ในอนาคต

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


+1 สำหรับจุดเกี่ยวกับความละเอียดของภาพรวม
Omar Kooheji

0

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

สมมติว่ามีการโต้ตอบกับผู้ใช้และระบบฟิสิกส์บางอย่างที่กำหนดพฤติกรรมของจักรวาลของคุณเมื่อไม่มีการป้อนข้อมูลของผู้ใช้สิ่งที่คุณต้องบันทึกคือผลของการโต้ตอบของผู้ใช้ (ตัวอย่างเช่นการเปลี่ยนแปลงในเวกเตอร์ความเร็ว n + 1 มิติ / การเร่งความเร็ว) ฟิสิกส์ของคุณควรจะย้อนเวลากลับไปได้

วิธีนี้คุณจะต้องใช้หน่วยความจำน้อยกว่ามากในการคำนวณสถานะของจักรวาลเกมในเวลาที่กำหนด


ดังที่ฉันได้กล่าวถึงในความคิดเห็นอื่นฟิสิกส์ในวิดีโอเกมมักจะไม่สามารถย้อนกลับได้เพราะเมื่อใช้ตัวเลขทศนิยม(x+v)-vอาจไม่เท่ากับx
BlueRaja - Danny Pflughoeft

0

สมมุติว่าเอนทิตีมีตำแหน่งการหมุนความเร็ว x และ y สิ่งเหล่านี้คือการเร่งความเร็วสถานะการเคลื่อนไหวพื้นฐานค่าหรืออะไรก็ตามที่คุณเรียกว่า คุณสามารถบันทึกข้อมูลได้สองวิธี:
1. บันทึกการหมุน, ตำแหน่ง x และ y
2. บันทึกการหมุน, ความเร็ว x และความเร็ว y

หากคุณมีความเร็วคงที่คุณสามารถบันทึกการหมุนหรือบันทึกความเร็วเดียวสำหรับทั้งสองแกนเท่านั้น

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

ที่กล่าวว่าการใช้รายการวัตถุหลายค่าเป็นสิ่งที่จำเป็น หากคุณมีระบบจับเวลาที่ดีตัวอย่างเช่นเรียกวิธีการอัพเดต 20 ครั้งในหนึ่งวินาทีและดังนั้นจึงเป็นอิสระจาก fps คุณสามารถสร้างอาร์เรย์ของวัตถุ 20 * 30 เพื่อเก็บค่าการเคลื่อนไหวที่คุณต้องการในช่วง 30 วินาทีที่ผ่านมา . ไม่แนะนำให้ใช้อาร์เรย์อย่างง่ายเนื่องจากคุณจะต้องย้ายทุกองค์ประกอบหนึ่งดัชนีออกจากการเรียกใช้การปรับปรุงแต่ละครั้ง

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

หากคุณทำลายวัตถุอย่าลืมรวมพวกมันไว้ด้วยเพื่อให้แน่ใจว่าคุณจะไม่เครียดกับเพื่อนที่เรียบร้อยของคุณมิสเตอร์ขยะมูลฝอย;)

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