ความสูงที่เปลี่ยนแปลงได้ในตัวเลื่อนด้านข้าง


10

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


อาจเป็นเพราะการดัดแปลงบางอย่างในระดับที่คุณลดแรงโน้มถ่วงที่คุณได้รับจากการกระโดดที่ดีขึ้น
Ali1S232

@Gajet นั่นค่อนข้างจะเป็น clunky และดูเหมือนจะเป็นวิธีที่แปลกในการทำ
The Duck คอมมิวนิสต์

อืมคุณบอกว่าการลดแรงโน้มถ่วงไม่ได้หมายความว่าคุณกำลังใช้เครื่องมือฟิสิกส์ เป็นกรณีนี้หรือไม่? คุณกำลังใช้แรงกระตุ้นเพื่อกระโดด
Jonathan Connell

ไม่มีเครื่องมือฟิสิกส์และฉันไม่ได้ใช้ Impulses
John Stimac

ในกรณีนี้คุณเล่นได้อย่างไร? คุณเพียงแค่แปลตำแหน่งของเขาตามเวกเตอร์การเคลื่อนไหว * กระโดด * แรงโน้มถ่วง?
Jonathan Connell

คำตอบ:


9

ก่อนอื่นคุณต้องตัดสินใจว่าคุณต้องการให้กระโดดเป็นอย่างไร

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

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

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

คุณต้องการให้กระโดดของคุณเป็นอย่างไร คุณต้องการให้ผู้เล่นมีการควบคุมแบบใด

สิ่งที่ฉันจะเริ่มต้นด้วยคือ:

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


ฉันลองมันแล้วฉันจะได้เอฟเฟกต์ Jetpack ฉันสงสัยว่ามีวิธีใดที่จะหลีกเลี่ยงปัญหานั้นได้หรือไม่
John Stimac

1
อาจไม่ใช่เกมที่คุณมีอยู่ในใจ แต่ในSuper Mario 2คุณสามารถกระโดดได้สูงขึ้นโดยการจุมพิตเล็กน้อยก่อนกระโดด (ซึ่งจะทำให้จำนวนหนึ่งของความรู้สึกที่ใช้งานง่ายเนื่องจากคุณไม่กระโดดไกลมากถ้าคุณพยายามที่จะทำมันได้โดยตรงจากท่ายืน.)
ปานามา

3
Jcubed: แทนที่จะเพิ่มแรงกับความเร็วลองเพิ่มแรงเข้ากับตำแหน่งโดยตรง จากนั้นผู้เล่นจะเลื่อนขึ้นเป็นเส้นตรงแทนที่จะเป็นเส้นขึ้น
Olhovsky

@Jcubed: เมื่อเล่นเกมบางอย่างเช่นsuper meat boyซึ่งฉันคิดว่ามีลักษณะพิเศษแบบกระโดดที่คุณต้องการดูเหมือนว่าตราบใดที่คุณกดปุ่มกระโดดแรงจะถูกนำไปใช้กับตัวละครมันตรงกันข้ามกับแรงโน้มถ่วงและเล็กกว่าและ ส่วนที่เหลือเป็นเหมือนสิ่งที่ alhovsky พูด ถ้าฉันจะใช้บางอย่างเช่นนั้นฉันจะเริ่มด้วยแรงโน้มถ่วง 60% -80% เป็นแรงกระโดด
Ali1S232

1
ฉันทำสิ่งนี้ตลอดเวลาเพียงแค่ให้เวลาในระหว่างที่คุณตั้งความเร็วกระโดดขึ้นโดยการกดปุ่มสั้นพอดังนั้นมันจึงไม่ใช่เอฟเฟกต์เจ็ทแพ็คที่เห็นได้ชัดเจน - จากนั้นมันจะเป็นเหมือนซูเปอร์มาริโอ ปรับแต่งจำนวน อย่าทำให้ "แรง" เล็กลงเพียงตั้งค่าความเร็วสูงสุดเป็น jumpspeed ต่อไปจนกว่า jumpHigherTime จะหมดอายุหรือผู้เล่นปล่อยปุ่ม ... นอกจากนี้ฉันยังรู้สึกว่าเด็กผู้ชายเนื้อสุดกำลังกระโดดไม่แน่ชัดและน่ารำคาญเหมือนแพลตฟอร์มใด ๆ ที่กระโดด ที่ต้องอาศัยเครื่องมือฟิสิกส์เท่านั้น p
Oskar Duveborn

7

ฉันเคยเห็นบางคนทำสิ่งนี้:

  1. สร้างตัวแปร (ฉันจะเรียกมันว่าjumpTime) (หมายเลข / สองครั้ง / ลอย) เมื่อกดปุ่มข้ามให้ตั้งค่าjumpTimeเป็นจำนวน (เช่น0.5นี่คือจำนวนวินาทีที่กดปุ่มกระโดดจะมีผล)

  2. จากนั้นสำหรับทุกขั้นตอนให้ตั้งค่าความเร็วให้jumpTimeคูณด้วยจำนวนอื่นและลดลงjumpTimeด้วยdelta(ความแตกต่างของเวลาระหว่างแต่ละขั้นตอน)

  3. ทำซ้ำจนกระทั่งjumpTimeถึงศูนย์หรือต่ำกว่าหรือเมื่อผู้เล่นปล่อยปุ่มกระโดด หลังจากนั้นให้ใช้ฟิสิกส์ปกติ (ใช้การเร่งความเร็วเชิงลบอย่างต่อเนื่องจนกว่าผู้เล่นจะถึงพื้น)

คุณอาจต้องใช้การทดลองและข้อผิดพลาด (หรือ "การคาดเดาเชิงตรรกะ") เพื่อค้นหาค่าที่เหมาะสมสำหรับ "ตัวเลขบางตัว" ยกเว้นว่าคุณรู้วิธีการทำ


UPDATE:ฉันพบกลอุบายที่ทำให้การกระโดดมีความสมจริงมากขึ้น (เนื่องจากเดิมทีการเดินขึ้นช้าลง แต่ก็ลงอย่างรวดเร็ว) Infinite Mario ใช้บรรทัดต่อไปนี้ (293 ของ Character.js ของเวอร์ชัน JavaScript) ...this.Ya *= 0.85;มันก็เหมือนกับ "air drag" และ จำกัด / ชะลอความเร็วของตัวละครเมื่ออยู่ในกลางอากาศ ดังนั้นทุกเฟรมให้คูณความเร็ว y (ความเร็วแนวตั้ง) ด้วยจำนวนที่น้อยกว่าหนึ่งเพื่อให้ช้าลงเมื่อตกลงไป (ดังนั้นทั้งคู่จึงขึ้นและลงในระหว่างการกระโดดจะคล้ายกันและสมจริงมากขึ้น) ฉันรู้ว่าฉันไม่ดีที่อธิบาย ...

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

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


กรณีศึกษา: Infinite Mario

นี่คือสิ่งที่ฉันพบ (จากบรรทัด 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") จะให้การกระโดดที่ไม่สมจริง แต่บางครั้งเกมก็ไม่จำเป็นต้องเป็นจริง! (อัปเดตดูในส่วนการอัปเดตด้านบน)

คำถามนี้มีอายุมากกว่าหนึ่งปีแล้ว แต่ฉันหวังว่านี่จะช่วยได้!


2

อย่างที่ Olhovsky ได้กล่าวไว้ความสูงของการกระโดดนั้นจะตัดสินทันทีที่คุณออกจากพื้นไม่ใช่หลังจากนั้น

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

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

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


2
ฉันคิดว่าฉันจำได้ว่าเล่น platformer กับช่างนั่น - อย่าออกจากพื้นจนกว่าคุณจะ "พุ่ง" กระโดด ด้วยอนิเมชั่นที่สวยงาม (เช่นเมฆฝุ่นที่กำลังเติบโตที่เท้าของตัวละคร) สิ่งนี้สามารถทำให้รู้สึกถึงสัญชาตญาณ
Jari Komppa

2

ฉันพบวิธีแก้ไขปัญหาอื่นในคำตอบของ David Gouveia สำหรับคำถาม " จะทำให้ตัวละครกระโดดได้อย่างไร? "

สรุป:

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

ฉันไม่ควรขโมยคำตอบของเขาดังนั้นไปข้างหน้าและอ่านโพสต์ของเขา วิธีแก้ปัญหาของเขาอยู่ในส่วน " กระโดดตัวแปรสูง "

ดังนั้นผู้คนจึงคิดวิธีแก้ปัญหานี้ขึ้นมามากมาย ...

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