คำถามติดแท็ก game-loop

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

3
เครื่องสถานะ จำกัด ใน C ++
ดังนั้นฉันได้อ่านมากเกี่ยวกับการใช้ FSM เพื่อจัดการสถานะเกมสิ่งต่าง ๆ เช่น FSM คืออะไรและใช้สแต็กหรือชุดของรัฐเพื่อสร้างสิ่งหนึ่ง ฉันผ่านทุกสิ่งไปแล้ว แต่ฉันติดอยู่กับการเขียนการใช้งาน FSM ตามความเป็นจริงที่ออกแบบมาอย่างดีเพื่อจุดประสงค์นั้น โดยเฉพาะอย่างยิ่งหนึ่งจะแก้ไขปัญหาของการเปลี่ยนระหว่างรัฐได้อย่างหมดจด (อย่างไร) รัฐควรจะสามารถใช้ข้อมูลจากรัฐอื่น ๆ และอื่น ๆ ได้อย่างไร ใครบ้างมีเคล็ดลับในการออกแบบและเขียนการใช้งานใน C ++ หรือดีกว่าตัวอย่างรหัส?

9
ฉันจะลบเอนทิตีออกจากลูปเกมของฉันได้อย่างไรเมื่อมันตาย
ตกลงดังนั้นฉันมีรายการใหญ่ของเอนทิตีทั้งหมดของฉันซึ่งฉันวนซ้ำและอัปเดต ใน AS3 ฉันสามารถเก็บสิ่งนี้เป็นแบบ Array (ความยาวแบบไดนามิกไม่พิมพ์) เวกเตอร์ (พิมพ์) หรือรายการที่เชื่อมโยง (ไม่ใช่แบบดั้งเดิม) ตอนนี้ฉันกำลังใช้ Array แต่ฉันวางแผนที่จะเปลี่ยนเป็น Vector หรือรายการที่เชื่อมโยงถ้ามันเร็วขึ้น อย่างไรก็ตามคำถามของฉันเมื่อกิจการถูกทำลายฉันจะลบออกจากรายการได้อย่างไร ฉันสามารถลบตำแหน่งของมันออกมาประกบกันหรือตั้งธงไว้เพื่อพูดว่า "ข้ามฉันไปฉันตายแล้ว" ฉันรวมกำไรหน่วยงานของฉันดังนั้นนิติบุคคลที่ตายไปแล้วมีแนวโน้มที่จะมีชีวิตอีกครั้งในบางจุด สำหรับคอลเลกชันแต่ละประเภทกลยุทธ์ที่ดีที่สุดของฉันคืออะไรและการรวมกันของประเภทคอลเลกชันและวิธีลบออกจะทำงานได้ดีที่สุด
16 game-loop 

2
การกำหนดเวลาแบบกึ่งถาวรหรือแบบคงที่ครบหรือไม่
ฉันกำลังทำ iphone shmup และพยายามตัดสินใจว่าจะใช้ loop ของเกมประเภทใด ฉันต้องการใช้การประทับเวลาแบบกึ่งถาวรหรือการประทับเวลาแบบคงที่ทั้งหมด ด้วยการประทับเวลากึ่งถาวรฉันจะทำการโทรเป็นศูนย์หรือมากกว่า (FIXED_INTERVAL) การโทรตามด้วยการอัพเดทหนึ่งครั้ง (dt) การโทรโดยที่ dt <= FIXED_INTERVAL ต่อการวนรอบเกม ตามที่ฉันเข้าใจข้อเสียของวิธีนี้ก็คือตรรกะการอัปเดตทางฟิสิกส์ของฉัน (dt) จะเป็นเรื่องยากมากขึ้นในการเขียนโปรแกรมเพราะโดยทั่วไปฉันต้องสมมติตัวแปร dt สำหรับการอัพเดททุกครั้ง และจากนั้นฉันก็ได้ยินว่าการวิ่งในเกมของฉันแต่ละครั้งจะแตกต่างกันเล็กน้อยเนื่องจากค่าจุดลอยตัวไม่เหมือนกันทุกครั้ง จากนั้นด้วยการประทับเวลาที่แก้ไขอย่างสมบูรณ์ฉันกำลังโทรหาการปรับปรุงอย่างน้อยหนึ่งครั้ง (FIXED_INTERVAL) ตามด้วยการแก้ไขหนึ่งครั้ง (dt / FIXED_INTERVAL) โดยที่ dt <FIXED_INTERVAL ต่อการวนรอบเกม ดังนั้นดูเหมือนว่าการตัดสินใจครั้งใหญ่ที่ฉันต้องทำคือ: ฉันต้องการจัดการกับความท้าทายในการใช้การอัปเดต (dt) กับตัวแปร dt หรือฉันต้องการจัดการกับความท้าทายในการนำการแก้ไขมาใช้หรือไม่ ตอนนี้จากสิ่งที่ฉันได้อ่านผู้คนส่วนใหญ่บอกว่าใช้การแก้ไขอย่างเต็มที่และทำการแก้ไข แต่เมื่อฉันคิดเกี่ยวกับการใช้การแก้ไขดูเหมือนว่าฉันจะซับซ้อนกว่าการอัพเดต (dt) ด้วยตัวแปร dt นี่เป็นเพราะถ้าฉันใช้การแก้ไขฉันต้องจำทั้งสถานะก่อนหน้าและสถานะปัจจุบัน ดังนั้นถ้าฉันต้องการใช้การแก้ไขฉันต้องหาเลเยอร์ทางอ้อมเพิ่มเติมที่เป็นนามธรรมออกมาจากแต่ละเกม ในขณะที่มีการประทับเวลากึ่งถาวรที่ฉันไม่ต้องใช้การแก้ไขฉันไม่จำเป็นต้องมีสถานะเกมที่เป็นนามธรรมเพราะมีเพียงหนึ่งสถานะเกมเสมอและเป็นเพียง "อาร์เรย์ทั่วโลก" ที่เป็นตัวแทนศัตรูของฉันและศัตรู กระสุน ฯลฯ …
15 game-loop 

2
วนรอบเกม“ ดีที่สุด” สำหรับ 2D-scroller
เป็นไปได้หรือไม่ที่จะอธิบายโครงร่าง "ดีที่สุด" (ในแง่ของประสิทธิภาพ) สำหรับลูปเกมของผู้เลื่อนด้าน 2D ในบริบทนี้ "game loop" ใช้การป้อนข้อมูลของผู้ใช้อัปเดตสถานะของวัตถุเกมและดึงวัตถุเกม ตัวอย่างเช่นการมีคลาสฐาน GameObject ที่มีลำดับชั้นการสืบทอดลึกอาจดีสำหรับการบำรุงรักษา ... คุณสามารถทำสิ่งต่อไปนี้: foreach(GameObject g in gameObjects) g.update(); อย่างไรก็ตามฉันคิดว่าวิธีนี้สามารถสร้างปัญหาด้านประสิทธิภาพได้ ในทางกลับกันข้อมูลและฟังก์ชันของวัตถุในเกมทั้งหมดอาจเป็นข้อมูลทั่วโลก ซึ่งจะเป็นการบำรุงรักษาอาการปวดหัว แต่อาจเข้าใกล้กับลูปเกมที่มีประสิทธิภาพสูงสุด ความคิดใด ๆ ฉันสนใจในการใช้งานจริงของโครงสร้างลูปเกมที่ดีที่สุด ... แม้ว่าฉันจะปวดหัวในการบำรุงรักษาเพื่อแลกกับประสิทธิภาพที่ยอดเยี่ยม

3
วนรอบเกม, วิธีตรวจสอบเงื่อนไขหนึ่งครั้ง, ทำอะไรแล้วไม่ทำอีกครั้ง
ตัวอย่างเช่นฉันมีคลาสเกมและมันจะคอยintติดตามชีวิตของผู้เล่น ฉันมีเงื่อนไข if ( mLives < 1 ) { // Do some work. } อย่างไรก็ตามเงื่อนไขนี้ยังคงมีการยิงต่อเนื่อง ตัวอย่างเช่นฉันต้องการตั้งเวลาเพื่อออกจากเกมใน 5 วินาที ปัจจุบันมันจะตั้งค่าเป็น 5 วินาทีทุกเฟรมและเกมจะไม่มีวันสิ้นสุด นี่เป็นเพียงตัวอย่างเดียวและฉันมีปัญหาเดียวกันในหลาย ๆ ด้านของเกม ฉันต้องการตรวจสอบเงื่อนไขบางอย่างแล้วทำบางครั้งเพียงครั้งเดียวแล้วไม่ตรวจสอบหรือทำรหัสในคำสั่ง if อีกครั้ง วิธีแก้ปัญหาที่เป็นไปได้บางอย่างที่อยู่ในใจกำลังมีอยู่boolสำหรับแต่ละเงื่อนไขและตั้งค่าboolเมื่อเงื่อนไขเริ่มทำงาน อย่างไรก็ตามในทางปฏิบัติสิ่งนี้ได้รับการจัดการที่ยุ่งมากboolsเนื่องจากพวกมันจะต้องถูกเก็บไว้เป็นฟิลด์คลาสหรือคงที่ภายในวิธีการเอง การแก้ปัญหาที่เหมาะสมสำหรับสิ่งนี้คืออะไร (ไม่ใช่สำหรับตัวอย่างของฉัน แต่สำหรับโดเมนปัญหา) คุณจะทำสิ่งนี้ในเกมได้อย่างไร?
13 c++  game-loop 

4
การเขียนโปรแกรมลำดับการต่อสู้ในเกมสวมบทบาท
ฉันพยายามเขียน "เกม" สั้น ๆ ที่ผู้เล่นไปรอบ ๆ และต่อสู้กับสัตว์ประหลาด แต่ฉันไม่รู้ว่าจะจัดการกับการต่อสู้ได้อย่างไร ตัวอย่างเช่นสมมติว่าฉันมี "นักรบ" และ "หมุนรอบ" ทั้งสองต่อสู้กันอย่างไร ฉันรู้ว่าฉันสามารถทำอะไรบางอย่างเช่น Conan = Warrior.new(); CaveTroll = Troll.new(); Conan.attack(CaveTroll); CaveTroll.attack(Conan); แต่ส่วนใดของเกมที่ควบคุมสัตว์ประหลาด? ฉันเพียงแค่ติดลำดับข้างต้นในลูปจนกว่าหนึ่งในนั้นจะตาย? หรือ "เครื่องมือ" เกมจำเป็นต้องมีส่วนที่เกี่ยวข้องกับการต่อสู้โดยเฉพาะหรือไม่? หรือนี่คือแง่มุมของปัญญาประดิษฐ์ของ Troll ที่ต้องดูแลการกระทำของมัน? ใครเป็นผู้ตัดสินการกระทำของสัตว์ประหลาด? บางทีโทรลล์อาจทุบตีเตะกัดเสกคาถาดื่มยาใช้สิ่งของวิเศษ เอ็นจิ้นของเกมเป็นตัวกำหนดสิ่งที่ Troll ใช้หรือเป็นสิ่งที่คลาส Troll จัดการหรือไม่ ขออภัยฉันไม่สามารถระบุได้มากขึ้น แต่ฉันต้องการคำแนะนำเกี่ยวกับทิศทางที่จะไปกับสิ่งนี้

2
หยุดเกมชั่วคราวภายในลูปเกม
ภายในลูปเกมเกมหยุดชั่วคราวโดยการกด P ซึ่งหมายความว่าลูปเกมจะไม่ทำงานอีกต่อไป ปัญหาคือหลังจากหยุดลูปนี้แล้วไม่สามารถกด P อีกครั้งเพื่อกลับมาเล่นลูปต่อได้เนื่องจากอยู่ในลูปเอง จะทำอย่างไรเพื่อให้เมื่อกด P อีกครั้งจะทำให้ลูปทำงานอีกครั้ง
12 game-loop 

3
EXTREMELY สับสนมากกับ "เกมความเร็วคงที่สูงสุด FPS" ลูปเกม
ฉันเพิ่งอ่านบทความนี้เกี่ยวกับ Game Loops: http://www.koonsolo.com/news/dewitters-gameloop/ และการนำไปใช้ครั้งสุดท้ายที่แนะนำทำให้ฉันสับสนอย่างยิ่ง ฉันไม่เข้าใจวิธีการทำงานและดูเหมือนเป็นระเบียบสมบูรณ์ ฉันเข้าใจหลักการ: อัปเดตเกมด้วยความเร็วคงที่ไม่ว่าอะไรก็ตามที่เหลือจะทำให้เกมเป็นไปได้หลายครั้ง ฉันคิดว่าคุณไม่สามารถใช้: รับอินพุต 25 ขีด เกมแสดงผลสำหรับ 975 เห็บ วิธีการตั้งแต่คุณจะได้รับการป้อนข้อมูลสำหรับส่วนแรกของสองและสิ่งนี้จะรู้สึกแปลก? หรือเป็นสิ่งที่เกิดขึ้นในบทความ? เป็นหลัก: while( GetTickCount() > next_game_tick && loops < MAX_FRAMESKIP) มันจะใช้ได้ยังไง? สมมติว่าคุณค่าของเขา MAX_FRAMESKIP = 5 สมมุติว่า next_game_tick ซึ่งกำหนดช่วงเวลาหลังจากเริ่มต้นก่อนที่ลูปเกมหลักจะพูดว่า ... 500 ในที่สุดเมื่อฉันใช้ SDL และ OpenGL สำหรับเกมของฉันด้วย OpenGL ที่ใช้สำหรับการเรนเดอร์เท่านั้นสมมติว่าGetTickCount()คืนค่าเวลาตั้งแต่ SDL_Init ถูกเรียกซึ่งมันทำ SDL_GetTicks -- Get the number …

2
รหัสใดในสองรหัสนี้ที่ 'ดีกว่า' ทำให้ตัวแปรท้องถิ่นหรือตัวแปรคลาส?
ฉันสร้างเกมมากขึ้นและถามคำถามที่โง่กว่านี้ หวังว่าอันนี้จะสั้นมาก ฉันกำลังสร้างคลาสพื้นฐานที่เพิ่งย้ายวัตถุ Player โดยใช้กำลังกับคนที่แข็งทื่อ แต่มันทำให้ฉันสงสัยว่าฉันควรจะอ้างอิงคลาสกับ rb หรือเพียงแค่ตัวแปรท้องถิ่นในอัปเดตทุกเฟรมหรือไม่ (จำไว้ว่ามันมีอยู่แล้วใน Monobehaviour.GameObject ระดับผู้ปกครองสามัคคี) ฉันสงสัยว่าถ้าทำหลายตัวแปรในท้องถิ่นจะทำให้วงทั้งหมดช้าลง (โดยเฉพาะที่ฉันหมายถึงในฟังก์ชั่นของตัวเองไม่ใช่ในชั้นเรียน - หวังว่าฉันจะใช้คำศัพท์ที่ถูกต้อง) นี่คือสิ่งที่ฉันหมายถึงสองวิธีที่ฉันคิดทำ: public class Player : MonoBehaviour { private void FixedUpdate() { Rigidbody rb = GetComponent<Rigidbody>(); float v = Input.GetAxis("Vertical"); rb.AddForce(v * rb.transform.forward * Const.walkForce); } } หรือ... public class Player : MonoBehaviour { Rigidbody rb; …
11 unity  c#  game-loop 

3
UPS และ FPS - ฉันควร จำกัด อะไรและทำไม
ขณะนี้ฉันกำลังเขียนเกมโดยใช้ C ++ และ SDL2 และมีสิ่งหนึ่งที่ฉันสงสัย - มีเหตุผลไหมที่จะ จำกัด จำนวนเฟรมต่อวินาที (FPS) และ / หรืออัปเดตต่อวินาที (UPS) ฉันเข้าใจว่าถ้าคุณ จำกัด ยูพีเอสคุณจะต้องควบคุมความเร็วของเกมเป็นหลัก - หากผู้เล่นเคลื่อนที่ 1px ต่อการอัปเดตและคุณอัพเดท 30 ครั้งต่อวินาทีเขาจะเคลื่อนที่ด้วยความเร็ว 30px / s และคุณ อาจช่วยลด CPU ได้เนื่องจากจำนวนการคำนวณต่อวินาทีจะลดลง หากคุณ จำกัด FPS จำนวนการเรียกเลขหมายต่อวินาทีจะลดลงดังนั้นคุณจึงลดการใช้ GPU ของคุณ ฉันหวังว่าฉันจะเข้าใจทุกอย่างถูกต้องถ้าไม่รู้สึกอิสระที่จะแก้ไขให้ถูกต้อง คำถามของฉันคือ - ฉันควร จำกัด อะไรในเกมของฉัน FPS? ยูพีเอส? ทั้งสอง? ทั้ง? มีอีกวิธีที่ดีกว่านี้? เกมนี้ส่วนใหญ่ทำได้อย่างไรและทำไม? คำตอบนั้นได้รับการชื่นชมอย่างมาก!
11 game-loop  logic  sdl2 

2
ความแตกต่างระหว่าง Update และ FixedUpdate ใน Unity คืออะไรและฉันควรจะสนใจอะไร?
ฉันบอกว่าจะใช้Update()สำหรับกราฟิกและFixedUpdate()ฟิสิกส์ FixedUpdate()แต่บางครั้งปัจจัยการผลิตของฉันจะไม่ลงทะเบียนเมื่อฉันใช้ มันใช้งานได้ดีถ้าฉันใช้Update()กับทุกสิ่ง ฉันควรจะรำคาญFixedUpdate()หรือฉันกำลังทำอะไรผิดหรือเปล่า?
10 unity  c#  game-loop 

4
เป็นเธรดแยกต่างหากสำหรับการบังคับเกมลูปสำหรับเกมแบบง่ายหรือไม่?
ฉันยังใหม่ต่อการพัฒนาเกม เพื่อเรียนรู้ฉันกำลังสร้างเกมนี้บนแพลตฟอร์ม Android คุณสามารถดูวิดีโอการเล่นเกมได้ที่ลิงค์ด้านบน มันเป็นเกมที่ง่าย ฉันได้อ่านบทความจำนวนมากเกี่ยวกับการเริ่มต้นกับการพัฒนาเกมเกือบทุกเรื่องที่แนะนำให้ใช้ลูปเกมในเธรดแยกต่างหากซึ่งเหมาะสมสำหรับเกมอื่น ๆ อย่างไรก็ตามสำหรับเกมนี้ฉันต้องเริ่มแยกเธรดหรือไม่

2
การเขียนโปรแกรมเกม Java 2D: แนวทางที่แตกต่างกันในการสร้างเกมลูป
ฉันยังใหม่กับการเขียนโปรแกรมเกม Java แต่ยิ่งฉันอ่านมากขึ้นฉันก็สับสนเพราะฉันได้เห็นวิธีการที่แตกต่างกันในการทำลูปเกม: 1. วิธีการมาตรฐานที่ใช้คลาส Timer (ดูเหมือนจะน้อยกว่า) แม่นยำ) 2. วิธีที่แม่นยำยิ่งขึ้นที่ใช้ System.nanoTime 3. วิธีการง่ายๆที่ใช้ schedAtFixedRate โดยทั่วไปควรเลือกข้อใดข้อหนึ่งและข้อดี / ข้อเสียของแต่ละวิธีอยู่ที่ใด ขอบคุณล่วงหน้าสำหรับข้อมูลใด ๆ

5
ทำไมฉันไม่สามารถใช้โอเปอเรเตอร์ '> =' กับ Vector3s ได้
ฉันพยายามที่จะได้รับรูปสี่เหลี่ยมผืนผ้าย้ายไปมาระหว่างสองตำแหน่งที่ผมพูดถึงและ_positionA ทั้งสองประเภท_positionB Vector3สี่เหลี่ยมผืนผ้าเคลื่อนไหวได้ดี อย่างไรก็ตามเมื่อมันมาถึง_positionBมันจะไม่เคลื่อนที่ในทิศทางตรงกันข้ามเหมือนอย่างที่ควร ฉันกลับไปที่โค้ดเพื่อดู ฉันมาถึงข้อสรุปว่าเป็นวัตถุย้ายที่ifงบในรหัสพลาดเฟรมซึ่งในตำแหน่ง rects _positionBเท่ากับ ฉันตัดสินใจที่จะปรับเปลี่ยนรหัสไปในทิศทางที่ตรงกันข้ามถ้าตำแหน่ง rects คือมากกว่าหรือเท่ากับ _positionBรหัสของฉันไม่ยาวเกินไปดังนั้นฉันจะแสดงด้านล่าง: using UnityEngine; using System.Collections; public class Rectangle : MonoBehaviour { private Vector3 _positionA = new Vector3(-0.97f, -4.28f); //Start position private Vector3 _positionB = new Vector3(11.87f, -4.28f); //End position private Transform _rect_tfm; private bool _atPosA = false, _atPosB = …
9 unity  c#  vector  mathematics  vector  matrix  unity  c#  transformation  java  3d  terrain-rendering  shading  ios  opengl-es  opengl  rendering  optimization  python  scripting  minecraft-modding  modding  pc  3d-meshes  mesh  culling  point-cloud  networking  interpolation  mathematics  game-design  ai  game-mechanics  animation  unreal-4  skeletal-animation  3dsmax  unity  c#  3d  opengl  c++  textures  unity  ide  cocos2d  cocos2d-x-js  unity  c#  mono  il2cpp  c++  game-loop  timer  linux  flash  actionscript-3  java  glsl  c++  vector  entity-component  c++  directx11  windows  visual-studio  libgdx  mouse  unity  c#  architecture  storage  unity  c#  rotation  coordinates  quaternion  vrpn  movement  vector  unreal-4  unity  shaders  unity  gui  text  bug  shooter  3d  animation  rendering  voxels  c++  mmo  multithreading  linux  textures  procedural-generation  terrain-rendering  multiplayer  mmo  game-state  java  android  libgdx  opengl  procedural-generation  unity  gui  3d  animation  tools  geometry-shader  mobile  advertisements  unity  c#  animation  scripting  unity  animation  unityscript  coroutines  unity  shaders  lighting  camera 

2
ระบบเล่นซ้ำ: บันทึกอินพุตหรือเหตุการณ์?
ฉันอ่านสิ่งนี้: วิธีการออกแบบระบบเล่นซ้ำแต่มันไม่ได้ตอบคำถามของฉัน เกมของฉันสร้างขึ้นด้วยไคลเอนต์ "ดู" ของเกมเป็นโปรแกรมแยกจากเซิร์ฟเวอร์ "รุ่น" และ "ตัวควบคุม" (บิตเช่น mmo หรือเกมที่มีผู้เล่นหลายคนสร้างขึ้นด้วยวิธีนี้) ฝั่งเซิร์ฟเวอร์เป็น "ความจริง" ของเกมเสมอยอมรับเฉพาะคำขอการกระทำเป็นข้อมูลจากลูกค้าและเหตุการณ์เอาท์พุทและข้อความ "สถานะปัจจุบัน" รูปแบบและกฎของเกมได้รับการกำหนดอย่างสมบูรณ์ด้วยวัฏจักรการอัพเดท "ติ๊ก" ที่แน่นอนดังนั้นในฝั่งเซิร์ฟเวอร์ฉันสามารถบันทึกเหตุการณ์ที่ส่งไปยังมุมมองไคลเอนต์และคำขอการดำเนินการ ทั้งสองเกี่ยวข้องกับหมายเลขรอบเฉพาะ คำถามคือ: ในกรณีนี้เพื่อติดตั้งระบบเล่นซ้ำฉันควรใช้อินพุตหรือคำขอการกระทำของผู้ใช้ (ตามที่แนะนำในที่นั่น) หรือเหตุการณ์? ฉันคิดว่าทั้งคู่จะให้ผลลัพธ์ที่เหมือนกันทั้งหมด ความแตกต่างเดียวที่ฉันเห็นคือ: เหตุการณ์ให้ผลผลิตจริงในขณะที่คำขอการดำเนินการจะต้องดำเนินการเพื่อให้เหตุการณ์ คำขอการดำเนินการอาจมีข้อมูลน้อยกว่าที่จะบันทึก มีสิ่งอื่นที่ต้องพิจารณาอีกไหม?

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