แรงกระตุ้นการกระโดด


12

มีสิ่งหนึ่งที่ทำให้ฉันงงงวยและนั่นก็คือวิธีการใช้การกระโดดแบบ 'faux-impulsed' ใน platformer หากคุณไม่รู้ว่าฉันกำลังพูดถึงอะไรให้นึกถึงการกระโดดของมาริโอเคอร์บี้และอ้างจาก Cave Story พวกเขามีอะไรที่เหมือนกัน? ความสูงของการกระโดดนั้นพิจารณาจากระยะเวลาที่คุณกดปุ่มกระโดดค้างไว้

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

การใช้งานปัจจุบันของฉันทำงานดังต่อไปนี้:

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

ในขณะที่กดปุ่มกระโดดแรงโน้มถ่วงจะถูกปิดและ Y coordenate ของอวตารจะลดลงตามค่าคงที่ของแรงโน้มถ่วง ตัวอย่างเช่นหากสิ่งต่างๆตกอยู่ที่หน่วย Z ต่อหนึ่งขีดมันจะเพิ่มขึ้นหน่วย Z ต่อหนึ่งขีด

เมื่อปล่อยปุ่มหรือถึงขีด จำกัด แล้ว Avatar จะคำนวณจำนวนที่จะทำให้มันครอบคลุมหน่วย X จนกว่าความเร็วจะถึง 0; เมื่อมันเร่งความเร็วขึ้นจนถึงความเร็วที่ตรงกับแรงโน้มถ่วง - ติดกับตัวอย่างฉันบอกได้ว่ามันเร่งจาก 0 ถึง Z หน่วย / ติ๊กในขณะที่ยังครอบคลุม X

อย่างไรก็ตามการใช้งานนี้ทำให้กระโดดในแนวทแยงเกินไปและถ้าความเร็วของอวาตาร์นั้นเร็วกว่าแรงโน้มถ่วงซึ่งจะทำให้มันเร็วเกินไปในโครงการปัจจุบันของฉัน (มันเคลื่อนที่ที่ประมาณ 4 พิกเซลต่อเห็บและแรงโน้มถ่วงคือ 10 พิกเซลต่อเห็บที่ อัตราเฟรม 40FPS) ทำให้แนวตั้งมากกว่าแนวนอน ผู้ที่คุ้นเคยกับ platformers จะสังเกตเห็นว่าตัวละครของ arc'd กระโดดเกือบตลอดเวลาช่วยให้พวกเขากระโดดต่อไปแม้ว่าพวกเขาจะไม่เร็วเท่าแรงโน้มถ่วงของเกมและเมื่อมันไม่ถ้าเล่นไม่ถูกก็จะพิสูจน์ตัวเองว่าเป็น ตอบโต้ได้ง่ายมาก ฉันรู้สิ่งนี้เพราะฉันสามารถยืนยันได้ว่าการใช้งานของฉันน่ารำคาญมาก

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

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

นอกจากนี้ฉันต้องการนำเสนอเพื่อหลีกเลี่ยงการเข้ารหัสเฉพาะภาษา เช่นการแบ่งปันเราเป็นตัวอย่าง C ++ หรือ Delphi ... เท่าที่ฉันใช้กรอบ XNA สำหรับโครงการของฉันและไม่สนใจสิ่ง C # ฉันไม่มีความอดทนในการอ่านรหัสของผู้อื่นและฉัน นักพัฒนาเกมบางคนของภาษาอื่น ๆ จะสนใจในสิ่งที่เราประสบความสำเร็จที่นี่ดังนั้นอย่ามัว แต่สนใจที่จะใช้โค้ดหลอก

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


3
คุณได้ดูคำถามต่อไปนี้และคำตอบแล้วหรือยัง gamedev.stackexchange.com/questions/29617/…
bummzack

@bummzack นี่เป็นการล้างอย่างมากเช่นกัน
Mutoh

1
ความเป็นไปได้ที่ซ้ำกันของJump handling and gravityในขณะที่มันไม่มีภาพสวยมันเป็นคำถามเดียวกัน
MichaelHouse

คำตอบ:


8

ฉันคิดว่าปัญหาหลักของคุณอยู่ที่นี่:

ในขณะที่กดปุ่มกระโดดแรงโน้มถ่วงจะถูกปิดและ Y coordenate ของอวตารจะลดลงตามค่าคงที่ของแรงโน้มถ่วง ตัวอย่างเช่นหากสิ่งต่างๆตกอยู่ที่หน่วย Z ต่อหนึ่งขีดมันจะเพิ่มขึ้นหน่วย Z ต่อหนึ่งขีด

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

กล่าวโดยง่าย ๆ ในขณะที่ความเร็วคืออัตราคงที่ของการเปลี่ยนแปลงตำแหน่งตลอดเวลาการเร่งความเร็วคืออัตราคงที่ของการเปลี่ยนแปลงความเร็วตลอดเวลา

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

pos_y = pos_y + (velocity_y * time_difference)

คุณต้องทำอะไรซักอย่าง

pos_y = pos_y + (velocity_y * time_difference) + (gravity_y * (time_difference ^ 2) / 2)
velocity_y = velocity_y + (acceleration_y * time_difference)

วิธีนั้นทุกอย่างจะตกลงไปในพาราโบลาซึ่งเป็นท่าทางที่ถูกต้องทางร่างกาย

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

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

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

pos_y = pos_y + (velocity_y * time_difference) + (force_y * (time_difference ^ 2) / 2)
velocity_y = velocity_y + (force_y * time_difference)

4

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

แรงโน้มถ่วงไม่ใช่ความเร็ว แต่เป็นความเร่ง ดังนั้นหากผู้เล่นมีความเร็วสูงกว่า 20 หน่วยและแรงโน้มถ่วงคือ -10 หน่วยในขีดถัดไปความเร็วที่เพิ่มขึ้นจะเป็น 10 หน่วยถัดไป 0 หน่วยเป็นต้น

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

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

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


2

เรื่องสั้นคือคุณจะมีส่วนที่ไม่ใช่พาราโบลาในส่วนโค้งกระโดดของคุณ

ฉันพยายามสองสามวิธีเมื่อใช้การกระโดด:

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

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

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

ลองสิ่งเหล่านี้และดูว่ารู้สึกดีที่สุด

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