ทำให้สิ่งที่ดูรวดเร็วช้า (Box2D)


9

ฉันกำลังทำงานกับเกมที่คุณควบคุม Trebuchet เพื่อขว้างลูกบอลให้ฝ่ายตรงข้าม

มันเหมือนเกมที่เรียกว่า 'Medieval Siege' เมื่อ Trebuchet กำลังแกว่งแขนผู้เล่นต้องยึดช่วงเวลาที่ดีที่สุดเพื่อกดปุ่มและปล่อยลูกบอล จากนั้นลูกบอลจะลอยไปที่มุมสัมผัส ป้อนคำอธิบายรูปภาพที่นี่ ปัญหาของฉันในตอนนี้คือแขน trebuchet แกว่งเร็วเกินไปสำหรับผู้เล่นที่จะคว้าช่วงเวลาที่เหมาะสม ในขณะเดียวกันก็ต้องมีความเร็วอย่างนี้ไม่อย่างนั้นมันก็ไม่สามารถโยนได้ไกลพอ และมีสายเล็ก ๆ ที่เชื่อมต่อลูกบอลและแขน trebuchet ถ้าแขนแกว่งช้าเกินไปลูกบอลก็จะลอยอยู่บนเชือกเมื่อแขนขยับ

ฉันแก้ปัญหาด้วยการสลับขนาดก้าวเมื่อใดก็ตามที่แขนแกว่งไปมาฉันเปลี่ยนขนาดก้าวจาก 1/60 เป็น 1/200 และเมื่อผู้เล่นปล่อยลูกบอลมันกลับไปที่ 1/60

วิธีนี้ใช้งานได้ดียกเว้นเกมของฉันมีไว้สำหรับผู้เล่นหลายคนที่มีเครือข่าย ดังนั้นขั้นตอนการเปลี่ยนอาจทำให้เกิดปัญหา

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

กรุณาส่องไฟนี้ออกมาขอบคุณ!


แก้ไข

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

คำตอบของ @MrCranky มีรายละเอียดและดูเป็นไปได้ดังนั้นฉันจึงยอมรับ :)


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

2
การทำให้ฟิสิกส์ของคอมพิวเตอร์ทำงานเหมือน "ของจริง" นั้นยากมาก เครื่องยนต์ฟิสิกส์เกือบทั้งหมดจำลองร่างกายที่แข็งตัวความหมายของเอฟเฟกต์เช่นการงอแขนของ trebouchet นั้นไม่ได้มีสาเหตุมาจากทั้งฟิสิกส์เชือกและพฤติกรรมวัตถุในทางที่ถูกต้องดังนั้นการจำลองที่แน่นอนโดยไม่ต้อง กระบวนการที่จะเข้าใกล้สิ่งที่ดูจริงไปนิดหน่อยเช่นนี้: tweak, tweak, tweak, cheat, tweak, tweak, tweak, tweak, tweak, tweak, cheat, tweak , โกง, ปรับแต่ง
LearnCocos2D

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

คำตอบ:


3

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

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

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

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

สำหรับครั้งที่สองลองนึกภาพสอง Trebuchets ยิงกัน Trebuchet ใช้เวลา 10 วินาทีในการโยนและหน้าต่างการยิงเริ่มต้นที่ T + 5s P1 เริ่มรอบการยิงที่ T + 0s และที่ T + 5s ทำให้การจำลองทางฟิสิกส์ในพื้นที่ของพวกเขาช้าลง 50% มันจะใช้เวลา 15 วินาทีในการเล่นตลอดทั้งวง ดังนั้นที่ T + 5s, P1 บอก P2 ให้เริ่มเล่นรอบการเปิดตัว 10s ด้วยความเร็วเต็ม. ดังนั้น P1 จึงเห็นวงจร Trebuchet ใช้เวลา 15 วินาที P2 เห็นว่าใช้เวลา 10 วินาที แต่ผู้เล่นทั้งคู่เห็นรอบการเสร็จสิ้นที่ T + 15s เมื่อ P1 เผยแพร่จริงพวกเขาจะบอก P2 เมื่ออยู่ในวงรอบการคิดที่ปล่อยออกมา ดังนั้นถ้า P1 เผยแพร่ที่ T + 10s จริง ๆ แล้วจะอยู่ที่ 7.5 วินาทีตลอดวัฏจักรการเปิดตัว 10 วินาที P2 สามารถแสดงการเปิดตัวที่ T + 12.5s (7.5s ลงในการเล่นรอบของวง) และผู้เล่นทั้งสองแบบจำลองควรเปิดตัวกระสุนที่จุดทางกายภาพเดียวกันในรอบ

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


0

ทำไมไม่เพียงแค่คัดลอก / ปรับใช้สิ่งที่มีอยู่แล้วและใช้งานได้ในกรณีที่คล้ายกัน

ป้อนคำอธิบายรูปภาพที่นี่


0

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

ที่จริงแล้วมีวิธีอื่นที่คุณสามารถใช้เอฟเฟ็กต์เดียวกันได้: แทนที่จะปรับสเกลเพียงแค่ขยายขนาดค่าคงที่ฟิสิกส์ทั้งหมดของคุณที่อยู่ในหน่วยรวมถึงเวลา ตัวอย่างเช่นการเร่งความเร็วด้วยแรงโน้มถ่วงมีหน่วยของความเร็ว / เวลา = ระยะทาง / เวลา²ดังนั้นหากแรงโน้มถ่วงเป็นค่าคงที่เพียงอย่างเดียวในเกมของคุณให้ลดขนาดลงด้วยปัจจัย 100 = 10²ทำให้ได้ผลเช่นเดียวกับการชะลอเวลาลงด้วยปัจจัย 10 .

แน่นอนถ้าโมเดลฟิสิกส์ของคุณมีค่าคงที่อื่น ๆ ที่มีหน่วยของเวลา (หรือความเร็ว = ระยะทาง / เวลาหรือความเร่ง = ระยะทาง / เวลา² ฯลฯ ) คุณจะต้องปรับขนาดเหล่านั้นด้วยหากคุณต้องการให้วิถีเหมือนเดิม .

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


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