วิธีที่จะทำให้ตัวละครกระโดด?


44

ฉันกำลังสร้างเกมใน C # โดยใช้ Direct X 9.0 remake ของเกมคือ Donkey Kong NES ฉันเกือบจะทำทุกอย่างเสร็จ แต่ฉันมีปัญหากับฟิสิกส์ของการกระโดดของมาริโอ ฉันมีตัวแปรที่ประกาศสำหรับการประสานงาน Y และ X

ฉันสงสัยว่ามีวิธีง่ายๆในการทำเช่นนี้หรือไม่ ฉันค้นหาคำตอบสูงและต่ำ แต่คำตอบที่ฉันพบนั้นไม่เกี่ยวข้อง / หรือใช้ภาษาโปรแกรมอื่นเช่น XNA

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

  if (jump == true)
    {

        Playerypos -=  vel;
        Playerxpos +=  vel;
    }

ซึ่งใช้งานไม่ได้ดี ฉันค้นหาคำตอบสูงและต่ำและตอนนี้ฉันหมดหวังถ้ามีคนชี้ให้ฉันในทิศทางที่ถูกต้องไปยังทางออกที่ง่าย มันจะดีมาก. ชื่นชมมากสำหรับการตอบสนองใด ๆ


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

คำตอบ:


84

ก่อนอื่น XNA ยังใช้ C # ด้วยดังนั้นจึงเป็นภาษาโปรแกรมเดียวกัน และถึงแม้ว่า API พื้นฐานอาจมีความแตกต่างจาก DirectX แต่ก็ไม่มีอะไรเกี่ยวข้องกับการกระโดดดังนั้นบทเรียนหรือคำตอบเดียวกันนี้ควรใช้ที่นี่ นอกจากนี้ยังมีวิธีการใช้งานที่หลากหลายขึ้นอยู่กับปัจจัยหลายอย่าง สิ่งที่ฉันจะอธิบายด้านล่างเป็นเพียงหนึ่งในความเป็นไปได้

ข้อกำหนดฟิสิกส์พื้นฐาน

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

float positionX, positionY;     // Position of the character
float velocityX, velocityY;     // Velocity of the character
float gravity = 0.5f;           // How strong is gravity

void Update(float time)
{
    positionX += velocityX * time;      // Apply horizontal velocity to X position
    positionY += velocityY * time;      // Apply vertical velocity to X position
    velocityY += gravity * time;        // Apply gravity to vertical velocity
}

กระโดดสูงคงที่

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

void OnJumpKeyPressed()
{
    velocityY = -12.0f;   // Give a vertical boost to the players velocity to start jump
}

สิ่งสำคัญคุณไม่ต้องการที่จะเริ่มกระโดดถ้าตัวละครของคุณไม่ได้อยู่บนพื้นดังนั้นคุณจะต้องเพิ่มการตรวจสอบว่า

กระโดดสูงตัวแปร

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

void OnJumpKeyReleased()
{
    if(velocityY < -6.0f)       // If character is still ascending in the jump
        velocityY = -6.0f;      // Limit the speed of ascent
}

tweaking ทั้งหมดของค่าเหล่านี้ (เช่นตัวเลขเช่น0.5, -12.0fหรือ-6.0f) ในโค้ดข้างต้นคุณสามารถเปลี่ยนความรู้สึกของการกระโดดของคุณวิธีการที่สูงเขากระโดดวิธีโมเมนตัมมากเขาไม่ให้แม้หลังจากที่ปล่อยปุ่มกระโดดวิธีการที่รวดเร็วเขาตกอยู่ ฯลฯ .

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

ตัวอย่างการทำงาน

ฉันเพิ่งสร้างตัวอย่างเทคนิคย่อที่อธิบายไว้ข้างต้นซึ่งคุณสามารถลองใช้บนเบราว์เซอร์ของคุณได้ที่นี่ (กดปุ่มเมาส์เพื่อกระโดดปล่อยกลางคันเพื่อควบคุมความสูงของการกระโดด) มันอยู่ใน JS แต่อย่างที่ฉันพูดไปก่อนหน้านี้ภาษาไม่เกี่ยวข้องในกรณีนี้

http://jsfiddle.net/LyM87/


11
รวมทั้งอาจจะได้รับโอกาสที่จะแบ่งปันบทความที่น่าตื่นตาตื่นใจนี้เขียนไม่กี่วันที่ผ่านมากับข้อมูลที่เกี่ยวข้องกับหัวข้อนี้: คู่มือการดำเนิน 2D platformers และยังนี้: โซนิคกระโดด
David Gouveia

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

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

คำตอบอาจแตกต่างกันไปขึ้นอยู่กับเกมเฉพาะและจำนวนภาพเคลื่อนไหวที่คุณต้องการทำ Metroid ใช้การกระโดดด้วยความเร็วคงที่: / descent แต่ปิดบังไว้ด้วยภาพเคลื่อนไหวคุณภาพสูงเพื่อให้ดูราบรื่นและ "โค้ง" ที่จุดสุดยอด platformers อื่น ๆ หลายแห่งใช้การกระโดดด้วยความเร็วตัวแปรซึ่งจำเป็นต้องใช้งานมากกว่านี้เพื่อให้ทำงานได้ดี
Sean Middleditch

1
สิ่งนี้มีประโยชน์มาก 5 ปีต่อมา :) และสิ่งที่ซอนี้ช่างยอดเยี่ยมมาก - ฉันควรเรียน JS!
ไหล

1

เหมือนในฟิสิกส์ เฉพาะตอนนี้คุณกดjump keyและตัวละครที่อยู่บนพื้นดินเพิ่มความเร็วขึ้น (เรียกว่าแรงกระตุ้น) แต่ทำให้ตัวละครตกอยู่ตามแรงโน้มถ่วงตลอดเวลา

หากคุณไม่ต้องการให้ตัวละครกระโดดทุกครั้งที่กระทบพื้นเพราะคุณกำลังถือjump key- เพิ่มjump key is being pressedตัวแปรที่คุณล้างหลังจากjump keyปล่อยและตั้งค่าหลังจาก pseudocode:

if jump being key pressed == false && jump key just pressed
   add y velocity 
   jump being key pressed = true

if jump key released
   jump being key pressed = false

decrease velocity by gravity
check for collisions // to not penetrate ground ...

ถ้าฉันใช้วิธีของคุณ:

if jump key not pressed
     jump height = 0            // imaginary height donkey would travel without gravity

if jump key pressed
     // going up
     if jump height < maximal height donkey might jump
         jump height += 5
         donkey.y    += 5        // 
     // going down
     else if jump height < 2 * maximal height donkey might jump
         jump height += 5
         donkey.y    -= 5

การdonkey.yเปลี่ยนแปลงจะขึ้นอยู่กับจินตนาการของคุณ ความเร็วควรทำให้ลาที่เล็กกว่าอยู่ในอากาศเพื่อให้ดูดี

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