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

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

11
ฉันควรใช้ขั้นตอนเวลาแบบคงที่หรือแบบแปรผันเมื่อใด
ลูปเกมควรเป็นไปตามขั้นตอนเวลาคงที่หรือแปรผันหรือไม่? เป็นหนึ่งที่เหนือกว่าเสมอหรือตัวเลือกที่เหมาะสมแตกต่างกันไปตามเกม? ขั้นตอนเวลาผันแปร การอัปเดตทางฟิสิกส์จะถูกส่งผ่านอาร์กิวเมนต์ "เวลาที่ผ่านไปนับตั้งแต่การอัปเดตครั้งล่าสุด" และขึ้นอยู่กับอัตราเฟรม position += distancePerSecond * timeElapsedซึ่งอาจหมายถึงทำคำนวณเป็น จุดเด่น : ราบรื่นและง่ายต่อการเขียนโค้ดจุด ด้อย : ไม่สามารถกำหนดค่าได้คาดเดาไม่ได้ในขั้นตอนเล็กหรือใหญ่ ตัวอย่างdeWiTTERS : while( game_is_running ) { prev_frame_tick = curr_frame_tick; curr_frame_tick = GetTickCount(); update( curr_frame_tick - prev_frame_tick ); render(); } ขั้นตอนเวลาคงที่ การอัปเดตอาจไม่ยอมรับ "เวลาที่ผ่านไป" เนื่องจากจะถือว่าการอัปเดตแต่ละรายการเป็นช่วงเวลาที่แน่นอน การคำนวณอาจทำได้position += distancePerUpdateดังนี้ ตัวอย่างมีการแก้ไขระหว่างการเรนเดอร์ จุดเด่น : สามารถคาดการณ์ได้กำหนดขึ้น (ซิงค์เครือข่ายง่ายกว่า) รหัสการคำนวณที่ชัดเจนจุด ด้อย …

3
ฉันจะเขียนลูปของเกมหลักได้อย่างไร [ปิด]
ฉันจะเขียนลูปของเกมหลักได้อย่างไร คุณควรทำอะไรในเกมลูปและบางสิ่งที่คุณไม่ควรทำในเกมลูป ฉันเขียนมันมากมาย แต่ฉันไม่เคยอ่านบนลูปของเกมเลย ฉันแน่ใจว่าฉันสามารถปรับปรุงได้อย่างมาก แต่ฉันไม่แน่ใจว่าจะทำอย่างไร

5
การอัพเดทเรนเดอร์อิสระในเกมลูปคืออะไร?
มีบทความหนังสือและการอภิปรายมากมายในลูปเกม อย่างไรก็ตามฉันมักเจอสิ่งนี้: while(running) { processInput(); while(isTimeForUpdate) { update(); } render(); } สิ่งที่ทำให้ฉันรำคาญใจเกี่ยวกับวิธีการนี้คือการแสดงผลแบบ "ปรับปรุงอิสระ" เช่นสร้างเฟรมเมื่อไม่มีการเปลี่ยนแปลงเลย ดังนั้นคำถามของฉันคือทำไมวิธีการนี้มักถูกสอน

5
นักแสดงในเกมควรมีความรับผิดชอบในการวาดภาพตนเองหรือไม่?
ฉันยังใหม่ต่อการพัฒนาเกม แต่ไม่ได้เขียนโปรแกรม ฉัน (อีกครั้ง) เล่นกับเกมประเภท Pong โดยใช้canvasองค์ประกอบของ JavaScript ฉันสร้างPaddleวัตถุที่มีคุณสมบัติดังต่อไปนี้ ... width height x y colour ฉันยังมีPongวัตถุที่มีคุณสมบัติเช่น ... width height backgroundColour draw(). draw()วิธีการในปัจจุบันคือการรีเซ็ตcanvasและที่เป็นที่คำถามขึ้นมา ควรPaddleวัตถุมีdraw()วิธีการรับผิดชอบสำหรับการวาดภาพหรือควรdraw()ของPongวัตถุต้องรับผิดชอบสำหรับการวาดภาพของนักแสดง (ฉันคิดว่าเป็นคำที่ถูกต้องโปรดแก้ไขฉันหากฉันไม่ถูกต้อง) ฉันคิดว่ามันจะเป็น advantagous สำหรับPaddleการวาดตัวเองที่ผมยกตัวอย่างวัตถุสองและPlayer Enemyถ้ามันไม่ได้อยู่ในPongของdraw()ฉันจะต้องเขียนรหัสที่คล้ายกันสองครั้ง การปฏิบัติที่ดีที่สุดที่นี่คืออะไร? ขอบคุณ

3
เมื่อหลาย ๆ คลาสจำเป็นต้องเข้าถึงข้อมูลเดียวกันข้อมูลจะถูกประกาศที่ไหน?
ฉันมีเกมป้องกันหอคอยพื้นฐาน 2 มิติใน C ++ แต่ละแผนที่เป็นคลาสที่แยกต่างหากซึ่งสืบทอดมาจาก GameState แผนที่จะมอบหมายตรรกะและรหัสการวาดภาพให้กับแต่ละวัตถุในเกมและตั้งค่าข้อมูลเช่นเส้นทางแผนที่ ในโค้ดหลอกส่วนลอจิกอาจมีลักษณะดังนี้: update(): for each creep in creeps: creep.update() for each tower in towers: tower.update() for each missile in missiles: missile.update() วัตถุ (ครีพหอคอยและขีปนาวุธ) ถูกเก็บไว้ในพอยน์เตอร์พอยน์เตอร์ หอคอยต้องมีการเข้าถึง vector-of-creeps และ vector-of-missiles เพื่อสร้างขีปนาวุธใหม่และระบุเป้าหมาย คำถามคือ: ฉันจะประกาศเวกเตอร์ได้ที่ไหน พวกเขาควรเป็นสมาชิกของคลาส Map หรือไม่และส่งผ่านเป็นอาร์กิวเมนต์ไปยังฟังก์ชัน tower.update ()? หรือประกาศทั่วโลก? หรือมีวิธีแก้ไขปัญหาอื่น ๆ ที่ฉันขาดไปทั้งหมดหรือไม่ เมื่อหลาย ๆ คลาสจำเป็นต้องเข้าถึงข้อมูลเดียวกันข้อมูลจะถูกประกาศที่ไหน?

3
เกมวน C # / Windows Forms มาตรฐานคืออะไร?
เมื่อเขียนเกมใน C # ที่ใช้ Windows Forms แบบเก่าและกราฟิก API wrapper บางอย่างเช่นSlimDXหรือOpenTKเกมหลักจะต้องมีโครงสร้างอย่างไร แอปพลิเคชันแบบฟอร์มมาตรฐานของ Windows มีจุดเข้าใช้ที่มีลักษณะดังนี้ public static void Main () { Application.Run(new MainForm()); } และในขณะที่บางคนสามารถบรรลุสิ่งที่จำเป็นโดยการเชื่อมโยงเหตุการณ์ต่าง ๆ ของFormชั้นเรียนเหตุการณ์เหล่านั้นไม่ได้ให้สถานที่ที่ชัดเจนในการวางบิตของรหัสเพื่อดำเนินการปรับปรุงเป็นระยะเพื่อวัตถุตรรกะของเกมหรือเริ่มและสิ้นสุดการเรนเดอร์ กรอบ เทคนิคใดที่เกมดังกล่าวควรใช้เพื่อให้ได้สิ่งที่คล้ายกับบัญญัติ while(!done) { update(); render(); } ลูปเกมและจะทำอย่างไรกับประสิทธิภาพที่น้อยที่สุดและผลกระทบ GC?

2
วิธีที่ดีในการสร้างลูปเกมใน OpenGL
ขณะนี้ฉันเริ่มเรียน OpenGL ที่โรงเรียนและฉันเริ่มทำเกมง่ายๆเมื่อวันก่อน (ด้วยตัวเองไม่ใช่เพื่อโรงเรียน) ฉันใช้ freeglut และสร้างมันใน C ดังนั้นสำหรับวงเกมของฉันฉันเพิ่งใช้ฟังก์ชั่นที่ฉันส่งผ่านglutIdleFuncเพื่ออัปเดตรูปวาดและฟิสิกส์ทั้งหมดในรอบเดียว นี่เป็นสิ่งที่ดีสำหรับแอนิเมชั่นธรรมดา ๆ ที่ฉันไม่ได้สนใจมากเกินไปเกี่ยวกับอัตราเฟรม แต่เนื่องจากเกมส่วนใหญ่เป็นพื้นฐานของฟิสิกส์ฉันต้องการ (ต้อง) ผูกมัดว่ามันอัพเดตเร็วแค่ไหน ดังนั้นความพยายามครั้งแรกของฉันคือการให้ฟังก์ชั่นของฉันฉันส่งไปที่glutIdleFunc( myIdle()) เพื่อติดตามเวลาที่ผ่านไปนับตั้งแต่การโทรครั้งก่อนและอัปเดตฟิสิกส์ (และกราฟิกปัจจุบัน) ทุกมิลลิวินาที ฉันเคยtimeGetTime()ทำสิ่งนี้ (โดยใช้<windows.h>) และนี่ทำให้ฉันคิดว่าการใช้ฟังก์ชั่นว่างเป็นวิธีที่ดีในการวนรอบเกมหรือไม่? คำถามของฉันคือวิธีที่ดีกว่าในการใช้ลูปเกมใน OpenGL คืออะไร ฉันควรหลีกเลี่ยงการใช้ฟังก์ชันว่างหรือไม่
31 opengl  c  game-loop 


4
อะไรคือ“ เดลต้า” ในรหัสนี้? มันสะท้อนถึงสิ่งมาตรฐานในเกม dev หรือไม่?
ฉันรู้น้อยมากเกี่ยวกับการเขียนโปรแกรมเกม แต่ต้องการเรียนรู้เพิ่มเติม ฉันกำลังพยายามที่จะเข้าใจรหัสสำหรับนี้เกม ฉันพยายามที่จะเข้าใจว่าทำไมรหัสถึงผ่าน "delta" ไปยัง Shipcontrols.js ซึ่งเปลี่ยนทิศทางของเรือตามการป้อนข้อมูลของผู้ใช้ โดยทั่วไปเกมจะคำนวณ "เดลต้า" ทุกวง ... นี่คือเวอร์ชั่นย่อของสแต็กที่ใช้ delta ถึงหนึ่งลูป ... var delta = now - this.time; this.time = now; this.current.render.call(this.current, delta, this.renderer); ก้าวเข้าสู่ที่นี่ ... ctx.manager.add("game", scene, camera, function(delta, renderer) { if(delta > 25 && this.objects.lowFPS < 1000) this.objects.lowFPS++; var dt = delta/16.6; this.objects.components.shipControls.update(dt); ก้าวเข้าสู่ที่นี่ …

5
การกระทำของเกมที่ใช้เวลาหลายเฟรมให้เสร็จสมบูรณ์
ฉันไม่เคยเขียนโปรแกรมเกมมาก่อนจริงๆคำถามตรงไปตรงมา ลองนึกภาพฉันกำลังสร้างเกม Tetris ด้วยลูปหลักกำลังมองหาสิ่งนี้ for every frame handle input if it's time to make the current block move down a row if we can move the block move the block else remove all complete rows move rows down so there are no gaps if we can spawn a new block …

4
มีอันตรายในการมีการวนลูปเกมหลักที่ควบคุมไม่ได้?
ฉันสงสัยว่ามีอันตรายใด ๆ ที่เป็นไปได้หรือไม่เมื่อลูปเกมของฉันทำงานเร็วเท่าที่ระบบอนุญาต ขณะนี้ฉันมีลูปซึ่งโดยการวัดเวลาที่ผ่านไปในหน่วยนาโนวินาทีเรียกใช้ตรรกะของเกมและตรรกะการเรนเดอร์ด้วยความเร็วที่กำหนดไว้ล่วงหน้าโดยไม่มีปัญหา ในความเป็นจริงตรรกะใด ๆ ที่ฉันทำในการวนซ้ำนั้นถูกโอเวอร์คล็อกไปที่การโทรในแต่ละวินาที การวนซ้ำตัวเองนั้นวิ่งได้เร็วเท่าที่มันชอบซึ่งมีประมาณ 11.7 ล้านลูปต่อวินาทีในเครื่องของฉัน วน (pseudocode ง่าย): while(!isGameOver){ if(canPollInputs){ pollInputs() } while(canStepLogic){ stepLogic() } if(canRender){ render() } } คำถามของฉันนั้นก็คือถ้าลูปแบบง่ายนั้นถ้ามันไม่ทำงานด้วยความเร็วที่ควบคุมสามารถทำอันตรายต่อระบบได้หรือไม่? แก้ไข: นั่นหมายความว่าตรรกะของฉันทำงาน 30 ครั้งต่อวินาที (30 tps), เครื่องมือแสดงภาพของฉันทำงานที่ 60 fps, ฉันสำรวจสัญญาณอินพุต 100 ครั้งต่อวินาทีและยังมีตรรกะบางอย่างที่จะรับมือกับตรรกะหรือการแสดงผลนานกว่าที่คาดไว้ . แต่ห่วงไม่ได้ควบคุมปริมาณ แก้ไข: การใช้Thread.sleep()เช่น Throttle การวนลูปหลักลงไปที่ 250 ลูปต่อวินาทีนำไปสู่การลดลง แต่ลูปทำงานที่ประมาณ 570 ลูปต่อวินาทีแทนที่จะเป็น 250 ที่ต้องการ …

1
ต้นไม้พฤติกรรม :: การกระทำที่ใช้เวลานานกว่าหนึ่งขีด
จากสิ่งที่ฉันเข้าใจในต้นไม้พฤติกรรมพฤติกรรมแต่ละอย่างควรเป็นเป้าหมายสั้น ๆ ที่สามารถทำได้ในการทำซ้ำสองสามครั้ง ตัวอย่างเช่นด้านล่างเป็นรูปภาพของแผนผังพฤติกรรม: ตอนนี้ให้เราสมมติว่าพฤติกรรมDrive To Enemyใช้เวลามากกว่าสองสามซ้ำในต้นไม้ ดังนั้นในการขับผ่านไปยังศัตรูแต่ละครั้งจะถูกเรียกเพราะตอนนี้อยู่ในสถานะ ใช้งาน ปัญหาคือฉันต้องการเรียกEvade Enemyหาก Enemy อยู่ใกล้ ๆ และการพิจารณาว่าDrive To Enemyมักถูกเรียกว่าฉันไม่เคยได้รับโอกาสที่จะเรียกEvade Enemy ( ควรเรียกว่าหลีกเลี่ยงศัตรู ) ฉันควรสำรวจ Tree EACHผ่านไม่ว่า Action จะทำงานอะไร ฉันจะทำในสิ่งที่ถูกต้องหรือไม่ วิธีที่เหมาะสมในการจัดการพฤติกรรมดังกล่าวคืออะไร? ตอนแรกถูกถามใน Stackoverflow ความคิดที่นี่น่าจะเหมาะกว่าที่จะถามคำถามนี้
19 ai  game-loop  behavior 

3
การออกแบบเกมเทิร์นเบสที่การกระทำมีผลข้างเคียง
ผมเขียนรุ่นคอมพิวเตอร์ของเกมการปกครอง มันเป็นเกมไพ่เทิร์นเบสที่การ์ดแอคชั่นการ์ดขุมทรัพย์และการ์ดแต้มชัยชนะจะถูกสะสมไว้ในเด็คส่วนบุคคลของผู้เล่น ฉันมีโครงสร้างของชั้นเรียนที่พัฒนาค่อนข้างดีและฉันเริ่มออกแบบตรรกะของเกม ฉันใช้หลามและฉันอาจเพิ่ม GUI อย่างง่ายด้วย pygame ในภายหลัง ลำดับการหมุนของผู้เล่นนั้นควบคุมโดยกลไกของรัฐที่ง่ายมาก หมุนตามเข็มนาฬิกาและผู้เล่นไม่สามารถออกจากเกมก่อนที่จะจบ การเล่นของเทิร์นเดี่ยวยังเป็นกลไกของรัฐ โดยทั่วไปผู้เล่นจะผ่าน "ขั้นตอนการกระทำ", "ขั้นตอนการซื้อ" และ "ขั้นตอนการทำความสะอาด" (ตามลำดับ) ตามคำตอบของคำถามวิธีการใช้เอ็นจิ้นเกมเทิร์นเบส เครื่องสถานะเป็นเทคนิคมาตรฐานสำหรับสถานการณ์นี้ ปัญหาของฉันคือในระหว่างขั้นตอนการกระทำของผู้เล่นเธอสามารถใช้การ์ดแอคชั่นที่มีผลข้างเคียงไม่ว่าจะด้วยตัวเองหรือกับผู้เล่นคนอื่นอย่างน้อยหนึ่งคน ตัวอย่างเช่นการ์ดแอคชั่นหนึ่งใบอนุญาตให้ผู้เล่นทำการเลี้ยวที่สองทันทีตามข้อสรุปของเทิร์นปัจจุบัน การ์ดการกระทำอีกใบหนึ่งทำให้ผู้เล่นคนอื่น ๆ ทิ้งการ์ดสองใบจากมือของพวกเขา อีกหนึ่งการ์ดแอคชั่นไม่ทำอะไรเลยสำหรับเทิร์นปัจจุบัน แต่อนุญาตให้ผู้เล่นวาดการ์ดพิเศษในเทิร์นถัดไปของเธอ เพื่อให้สิ่งต่าง ๆ มีความซับซ้อนยิ่งขึ้นมีการขยายเกมใหม่ ๆ เพิ่มการ์ดใหม่บ่อยครั้ง สำหรับฉันแล้วดูเหมือนว่าการเขียนโค้ดผลลัพธ์ของแอ็คชั่นการ์ดทุกใบลงในเครื่องสถานะของเกมจะน่าเกลียดและไม่สามารถปรับเปลี่ยนได้ คำตอบของTurn-based Strategy Loop ไม่เข้าสู่ระดับรายละเอียดที่เน้นการออกแบบเพื่อแก้ไขปัญหานี้ ฉันควรใช้รูปแบบการเขียนโปรแกรมประเภทใดเพื่อครอบคลุมข้อเท็จจริงที่ว่ารูปแบบทั่วไปสำหรับการเลี้ยวสามารถแก้ไขได้ด้วยการกระทำที่เกิดขึ้นภายในเทิร์น? วัตถุของเกมควรติดตามผลของการ์ดทุกใบหรือไม่ หรือหากการ์ดควรใช้เอฟเฟ็กต์ของตนเอง (เช่นโดยใช้อินเทอร์เฟซ) จำเป็นต้องมีการตั้งค่าใดเพื่อให้มีพลังงานเพียงพอ ฉันคิดวิธีแก้ปัญหานี้เล็กน้อย แต่ฉันสงสัยว่ามีวิธีมาตรฐานในการแก้ปัญหาหรือไม่ โดยเฉพาะฉันต้องการทราบว่าวัตถุ / คลาส / อะไรก็ตามที่รับผิดชอบในการติดตามการกระทำที่ผู้เล่นทุกคนจะต้องทำตามผลของการ์ดแอ็คชั่นที่กำลังเล่นและวิธีการที่เกี่ยวข้องกับการเปลี่ยนแปลงชั่วคราวในลำดับปกติของ เครื่องเปลี่ยนสถานะ

2
ควรวางตรรกะการตรวจจับการชนกันที่ไหน
ฉันกำลังพัฒนาเอ็นจิ้นเกม 2D ขนาดเล็ก ตัวละครมีวิธีทาสีซึ่งปัจจุบันทำดังต่อไปนี้: คำนวณตำแหน่งใหม่ของตัวละครตามความเร็ว ฯลฯ อัปเดตเซลล์กริดการชน ** วาดตัวละครที่ตำแหน่งใหม่ ** ฉันได้สร้างตารางการชนกันเพื่อลดจำนวนการตรวจสอบทางแยก ตอนนี้อัลกอริทึมพื้นฐานที่ฉันคิดว่าตรวจจับการชนกันคือ: For Each Character Check intersection with characters in surrounding 8 cells ฉันสามารถวางรหัสนี้ในวิธีการทาสี แต่นี่คือปัญหาที่ฉันคาดหวัง สมมติว่าอักขระสองตัว A และ B อยู่ในเซลล์ที่อยู่ติดกันในตารางการชนกัน ตอนนี้ตามอัลกอริทึมข้างต้นในการวนซ้ำของอักขระ A มันจะตรวจพบว่ามันชนกับ B ในการวนซ้ำสำหรับอักขระ B มันจะตรวจจับว่ามันชนกับ A แต่ฉันมีความคิดว่าเมื่อ A ตรวจพบว่ามันชนกับ B มันควรแจ้ง B ว่ามันชนกับ A นี่จะช่วยประหยัดการเปรียบเทียบได้มากเมื่อมีนักแสดงมากกว่า 2 คนชนกัน แต่ฉันไม่แน่ใจว่าจะจัดการเรื่องนี้อย่างไร …

2
ทำไมผู้เล่นสไปรต์ของฉันถึงเคลื่อนที่เร็วขึ้นเมื่อฉันเลื่อนเมาส์
ฉันพยายามพัฒนาเกมง่ายๆที่สร้างด้วย Pygame (Python library) ฉันมีspriteวัตถุที่เป็นplayerและฉันย้ายมันโดยใช้ปุ่มลูกศร ถ้าฉันไม่เลื่อนเม้าส์สไปรต์ก็จะเคลื่อนที่ตามปกติ แต่เมื่อฉันเลื่อนเมาส์สไปรต์จะเคลื่อนที่เร็วขึ้น (เช่น x2 หรือ x3) playerวัตถุอยู่ภายในcharsGroupvar ฉันใช้งานเกมใน W7 และใน Ubuntu สิ่งเดียวกันเกิดขึ้นในทั้งสองระบบปฏิบัติการ ฉันมีเอนทิตีมากกว่าที่เคลื่อนไหวเหมือน NPC และกระสุน แต่พวกมันไม่ได้รับผลกระทบเพียงแค่ผู้เล่น ด้วยสิ่งนี้ฉันคิดว่าปัญหาอาจมีการเชื่อมต่อโดยตรงกับระบบการเคลื่อนที่ของผู้เล่น (ปุ่มลูกศร) นี่คือupdate()วิธีการของplayerวัตถุ: def update(self): for event in pygame.event.get(): key = pygame.key.get_pressed() mouseX, mouseY = pygame.mouse.get_pos() if event.type == pygame.MOUSEBUTTONDOWN: self.bulletsGroup.add(Bullet(pygame.image.load("bullet.png"), self.rect.x + (self.image.get_width()/2), self.rect.y + (self.image.get_height()/2), mouseX, mouseY, …

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