ฉันจะให้ผู้เล่นกระโดดสูงขึ้นได้อย่างไรถ้าปุ่มกระโดดค้างไว้นานขึ้น? ขณะนี้ฉันเพิ่งลดแรงโน้มถ่วงตราบใดที่ยังมีกุญแจอยู่และผู้เล่นกระโดด แต่สิ่งนี้ดูแปลก
ฉันจะให้ผู้เล่นกระโดดสูงขึ้นได้อย่างไรถ้าปุ่มกระโดดค้างไว้นานขึ้น? ขณะนี้ฉันเพิ่งลดแรงโน้มถ่วงตราบใดที่ยังมีกุญแจอยู่และผู้เล่นกระโดด แต่สิ่งนี้ดูแปลก
คำตอบ:
ก่อนอื่นคุณต้องตัดสินใจว่าคุณต้องการให้กระโดดเป็นอย่างไร
ในชีวิตจริงความสูงของการกระโดดนั้นจะถูกตัดสินทันทีที่คุณออกจากพื้นดิน คุณไม่สามารถกระโดดได้สูงขึ้นในขณะที่คุณอยู่กลางอากาศแล้ว
ดังนั้นหากคุณสามารถควบคุมความสูงของการกระโดดขณะที่อยู่ในอากาศได้แล้วคุณจะได้รับเอฟเฟกต์คล้ายเจ็ทแพ็ค
ดูเหมือนว่าฉันจะจำ sidecroller ที่มีความสูงกระโดดสองแบบที่แตกต่างกันฉันคิดว่ามันเป็นหนึ่งในเกมซูเปอร์มาริโอ การกระโดดสูงขึ้นเกิดขึ้นเมื่อคุณกดปุ่มกระโดดค้างไว้และการกระโดดนั้นเป็นการกระโดดแบบสองส่วนโดยเริ่มจากการกระโดดปกติครั้งแรกตามด้วยแรงกระตุ้นครั้งที่สองที่ทำให้คุณสูงขึ้น
คุณต้องการให้กระโดดของคุณเป็นอย่างไร คุณต้องการให้ผู้เล่นมีการควบคุมแบบใด
สิ่งที่ฉันจะเริ่มต้นด้วยคือ:
ออกจากแรงโน้มถ่วงเพียงอย่างเดียว (เช่นไม่เคยเปลี่ยน) เมื่อผู้เล่นกดปุ่มกระโดดให้ใช้แรงกระโดดตราบเท่าที่ผู้เล่นกดปุ่มกระโดด (ขึ้นอยู่กับเวลาที่ จำกัด ) จากนั้นเมื่อผู้เล่นปล่อยปุ่มกระโดดเขาจะไม่สามารถใช้แรงกระโดดได้อีก (เช่นเขาไม่สามารถเริ่มกระโดดได้อีก) จนกว่าเขาจะสัมผัสพื้นก่อน
super meat boy
ซึ่งฉันคิดว่ามีลักษณะพิเศษแบบกระโดดที่คุณต้องการดูเหมือนว่าตราบใดที่คุณกดปุ่มกระโดดแรงจะถูกนำไปใช้กับตัวละครมันตรงกันข้ามกับแรงโน้มถ่วงและเล็กกว่าและ ส่วนที่เหลือเป็นเหมือนสิ่งที่ alhovsky พูด ถ้าฉันจะใช้บางอย่างเช่นนั้นฉันจะเริ่มด้วยแรงโน้มถ่วง 60% -80% เป็นแรงกระโดด
ฉันเคยเห็นบางคนทำสิ่งนี้:
สร้างตัวแปร (ฉันจะเรียกมันว่าjumpTime
) (หมายเลข / สองครั้ง / ลอย) เมื่อกดปุ่มข้ามให้ตั้งค่าjumpTime
เป็นจำนวน (เช่น0.5
นี่คือจำนวนวินาทีที่กดปุ่มกระโดดจะมีผล)
จากนั้นสำหรับทุกขั้นตอนให้ตั้งค่าความเร็วให้jumpTime
คูณด้วยจำนวนอื่นและลดลงjumpTime
ด้วยdelta
(ความแตกต่างของเวลาระหว่างแต่ละขั้นตอน)
ทำซ้ำจนกระทั่งjumpTime
ถึงศูนย์หรือต่ำกว่าหรือเมื่อผู้เล่นปล่อยปุ่มกระโดด หลังจากนั้นให้ใช้ฟิสิกส์ปกติ (ใช้การเร่งความเร็วเชิงลบอย่างต่อเนื่องจนกว่าผู้เล่นจะถึงพื้น)
คุณอาจต้องใช้การทดลองและข้อผิดพลาด (หรือ "การคาดเดาเชิงตรรกะ") เพื่อค้นหาค่าที่เหมาะสมสำหรับ "ตัวเลขบางตัว" ยกเว้นว่าคุณรู้วิธีการทำ
UPDATE:ฉันพบกลอุบายที่ทำให้การกระโดดมีความสมจริงมากขึ้น (เนื่องจากเดิมทีการเดินขึ้นช้าลง แต่ก็ลงอย่างรวดเร็ว) Infinite Mario ใช้บรรทัดต่อไปนี้ (293 ของ Character.js ของเวอร์ชัน JavaScript) ...this.Ya *= 0.85;
มันก็เหมือนกับ "air drag" และ จำกัด / ชะลอความเร็วของตัวละครเมื่ออยู่ในกลางอากาศ ดังนั้นทุกเฟรมให้คูณความเร็ว y (ความเร็วแนวตั้ง) ด้วยจำนวนที่น้อยกว่าหนึ่งเพื่อให้ช้าลงเมื่อตกลงไป (ดังนั้นทั้งคู่จึงขึ้นและลงในระหว่างการกระโดดจะคล้ายกันและสมจริงมากขึ้น) ฉันรู้ว่าฉันไม่ดีที่อธิบาย ...
เมื่อตัวละครกระโดดโดยใช้วิธีที่ฉันอธิบายไว้ข้างต้นมัน "ลุกขึ้น" เร็วขึ้นแล้ว "ถอยกลับลงมา" อย่างไรก็ตามการลากจะลดความเร็วในแนวตั้งลง เนื่องจากเราตั้งค่าความเร็วแนวตั้งให้เป็นสัดส่วนกับjumpTime
ทุกเฟรมการลากนี้จึงไม่มีผลกับการกระโดดครึ่งแรกมากนัก อย่างไรก็ตามในครึ่งหลัง (ถอยกลับลงไป) ความเร็วแนวตั้งไม่ได้ถูกตั้งค่าทุกเฟรม แต่เพิ่มโดยตัวเลขอื่น (ในกรณีนี้คือค่าคงตัวโน้มถ่วง) ดังนั้นการลากจะมีผลในการล้มและเนื่องจากความเร็วลดลง (ในทิศทางใด ๆ ) มันจะช้าลงการตกทำให้คล้ายกับครึ่งแรก
มีวิธีอื่นในการแก้ปัญหานี้เช่นการลดผลกระทบของแรงโน้มถ่วงกับตัวละครเมื่อมันตกลงมา อย่างไรก็ตามเราจำเป็นต้องค้นหาว่าเราควรลดแรงโน้มถ่วงลงเท่าใด
นี่คือสิ่งที่ฉันพบ (จากบรรทัด 206 ของ Mario.java โดย Markus Persson (Notch)):
if (keys[KEY_JUMP] || (jumpTime < 0 && !onGround && !sliding))
{
if (jumpTime < 0)
{
xa = xJumpSpeed;
ya = -jumpTime * yJumpSpeed;
jumpTime++;
}
else if (onGround && mayJump)
{
world.sound.play(Art.samples[Art.SAMPLE_MARIO_JUMP], this, 1, 1, 1);
xJumpSpeed = 0;
yJumpSpeed = -1.9f;
jumpTime = 7;
ya = jumpTime * yJumpSpeed;
onGround = false;
sliding = false;
}
else if (sliding && mayJump)
{
world.sound.play(Art.samples[Art.SAMPLE_MARIO_JUMP], this, 1, 1, 1);
xJumpSpeed = -facing * 6.0f;
yJumpSpeed = -2.0f;
jumpTime = -6;
xa = xJumpSpeed;
ya = -jumpTime * yJumpSpeed;
onGround = false;
sliding = false;
facing = -facing;
}
else if (jumpTime > 0)
{
xa += xJumpSpeed;
ya = jumpTime * yJumpSpeed;
jumpTime--;
}
}
else
{
jumpTime = 0;
}
รุ่นจาวาสคริปต์นั้นเป็นhttps://github.com/robertkleffner/mariohtml5/blob/master/code/character.jsเดียวกัน
นี่คล้ายกับคำแนะนำจาก Olhovsky แต่ในกรณีนี้แรงจะเป็นสัดส่วนกับจำนวนเวลาที่ผ่านไปหลังจากผู้เล่นกดปุ่มกระโดด
if ( onGround && jump && !jumped ) {
jumpTime = maxJumpTime;
onGround = false;
jumped = true;
this.vel.y = jumpTime * jumpConstant;
A = true;
} else if ( !onGround && jump && jumpTime > 0 && !released ) {
jumpTime -= evt.delta;
this.vel.y = jumpTime * jumpConstant;
B = true;
} else if ( !onGround && ( !jump || jumpTime <= 0 ) ) {
this.vel.y -= gravityConstant * evt.delta;
jumpTime = 0
released = true;
} if ( this.pos.y < 0 && !A && !B ) {
onGround = true;
released = false;
this.pos.y = 0;
this.vel.y = 0;
}
if ( !jump && onGround ) jumped = false;
อย่างไรก็ตามค่าบางค่าสำหรับค่าคงที่ (เช่น "gravityConstant" และ "jumpConstant") จะให้การกระโดดที่ไม่สมจริง แต่บางครั้งเกมก็ไม่จำเป็นต้องเป็นจริง! (อัปเดตดูในส่วนการอัปเดตด้านบน)
คำถามนี้มีอายุมากกว่าหนึ่งปีแล้ว แต่ฉันหวังว่านี่จะช่วยได้!
อย่างที่ Olhovsky ได้กล่าวไว้ความสูงของการกระโดดนั้นจะตัดสินทันทีที่คุณออกจากพื้นไม่ใช่หลังจากนั้น
หากคุณต้องการหลีกเลี่ยงผลกระทบ jetpack ฉันเห็นสองวิธีเท่านั้น: กุญแจ ผสมเพื่อกระโดดสูงขึ้นหรือเปลี่ยนวิธีการทำงานของคีย์การกระโดด:
แทนที่จะทำให้ผู้เล่นกระโดดทันทีที่กดปุ่มให้ชะลอการกระโดดจนกว่าจะปล่อยกุญแจได้รับการปล่อยตัวดังนั้นโดยทั่วไประยะเวลาของการกดปุ่มจะควบคุมความตึงของสปริงในขาของผู้เล่นและจากนั้นปล่อยออกมา
แน่นอนว่าสิ่งนี้เปลี่ยนโครงสร้างของเกมและอาจไม่คุ้นเคยสำหรับผู้เล่น แต่เอฟเฟกต์น่าสนใจทีเดียวและอาจจะคุ้มค่ากับความไม่คุ้นเคย
ฉันพบวิธีแก้ไขปัญหาอื่นในคำตอบของ David Gouveia สำหรับคำถาม " จะทำให้ตัวละครกระโดดได้อย่างไร? "
ความคิดของเขาคือการตั้งค่าความเร็วเมื่อผู้เล่นกดปุ่มกระโดดลง ในทุกเฟรมมันคำนวณแรงโน้มถ่วงเท่านั้น อย่างไรก็ตามเมื่อผู้เล่นปล่อยปุ่มมันจะตั้งค่าความเร็วเป็นค่าที่น้อยลงหากความเร็วนั้นสูงกว่า ความเร็วลดลงเพียงแต่ละเฟรมโดยแรงโน้มถ่วง
ฉันไม่ควรขโมยคำตอบของเขาดังนั้นไปข้างหน้าและอ่านโพสต์ของเขา วิธีแก้ปัญหาของเขาอยู่ในส่วน " กระโดดตัวแปรสูง "
ดังนั้นผู้คนจึงคิดวิธีแก้ปัญหานี้ขึ้นมามากมาย ...
http://excitemike.com/JumpingControlTester (แสดงกลไกการกระโดดที่แตกต่างกันในเกมต่าง ๆ )
http://meyermike.com/wp/?p=175 (อธิบายเส้นทางกระโดดของมาริโอด้วย)
http://www.flatredball.com/frb/docs/index.php?title=Tutorials:Platforer:Variable-Height_Jumps (อธิบาย 3 วิธีที่แตกต่างกัน)
อาจเป็นไปได้มากกว่า (ยังไม่ผ่านผลการค้นหามากเกินไป แต่ช่วย "ความสูงของตัวแปรกระโดดสูง" ได้ด้วย googling)