Làm thế nào để làm cho một nhân vật nhảy?


44

Tôi hiện đang tạo một trò chơi trong C # bằng Direct X 9.0. Trò chơi được làm lại là Donkey Kong NES. Tôi đã hoàn thành gần như mọi thứ, nhưng tôi gặp vấn đề với vật lý nhảy của Mario. Tôi có các biến được khai báo cho các phối hợp Y và X.

Tôi đã tự hỏi nếu có một phương pháp đơn giản để làm điều này. Tôi đã tìm kiếm cao và thấp để tìm câu trả lời nhưng câu trả lời tôi tìm thấy là không liên quan / hoặc sử dụng ngôn ngữ lập trình khác như XNA.

Tôi hiện có một biến bool được đặt để kiểm tra xem W đã được nhấn chưa, điều đó sẽ kích hoạt bất kỳ mã nào để làm cho anh ta nhảy. Tôi đã được gửi xung quanh như.

  if (jump == true)
    {

        Playerypos -=  vel;
        Playerxpos +=  vel;
    }

Mà đã không làm việc đó tốt. Tôi đã tìm kiếm cao và thấp để tìm câu trả lời và bây giờ tôi đang tuyệt vọng, nếu ai đó có thể chỉ cho tôi đi đúng hướng đến một giải pháp đơn giản. Điều đó sẽ rất tuyệt. Rất nhiều đánh giá cao cho bất kỳ câu trả lời.


5
Câu trả lời sử dụng ngôn ngữ lập trình khác không nên đặt ra vấn đề. Thuật toán là những gì bạn quan tâm, không phải là triển khai cụ thể ... trừ khi bạn chỉ hy vọng sao chép và dán mà không hiểu bất cứ điều gì, điều mà tôi chắc chắn hy vọng bạn không làm! Có thể đọc và điều chỉnh các thuật toán từ các ngôn ngữ lập trình khác là một kỹ năng rất tốt cần có.
ccxvii

Câu trả lời:


84

Trước hết, XNA cũng sử dụng C # để nó cùng ngôn ngữ lập trình. Và mặc dù API cơ bản có thể có một số khác biệt so với DirectX, nhưng điều đó không liên quan gì đến việc nhảy, do đó, các hướng dẫn hoặc câu trả lời tương tự nên được áp dụng ở đây. Ngoài ra, có rất nhiều cách để thực hiện điều này, tùy thuộc vào rất nhiều yếu tố. Những gì tôi sẽ mô tả dưới đây chỉ là một trong những khả năng.

Yêu cầu vật lý cơ bản

Trước tiên, bạn cần một số biến và tính toán vật lý cơ bản trên vòng cập nhật của bạn. Cụ thể, bạn cần xác định vị trí, vận tốc và trọng lực và vòng cập nhật của bạn sẽ thực hiện một cái gì đó gần giống với điều này (phát hiện va chạm và phản ứng bị bỏ qua cho đơn giản):

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
}

Cố định chiều cao nhảy

Bây giờ cách dễ nhất để thực hiện một cú nhảy luôn có cùng chiều cao, cho dù bạn nhấn phím bao lâu, chỉ đơn giản là thay đổi vận tốc dọc một lần. Điều này sẽ làm cho nhân vật bắt đầu tăng lên, trong khi trọng lực sẽ tự động chăm sóc để đưa anh ta xuống:

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

Quan trọng Bạn không muốn có thể bắt đầu nhảy nếu nhân vật của bạn không ở trên mặt đất, vì vậy bạn sẽ cần thêm một kiểm tra cho điều đó.

Biến chiều cao nhảy

Nhưng các trò chơi như Mario và Sonic có bước nhảy thay đổi trong đó độ cao của bước nhảy phụ thuộc vào thời gian bạn nhấn nút xuống. Trong trường hợp này, bạn sẽ cần xử lý cả việc nhấn nhả phím nhảy. Bạn có thể thêm một cái gì đó như:

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

Tinh chỉnh tất cả các giá trị này (tức là các số như 0.5, -12.0fhoặc -6.0f) trong mã ở trên, bạn có thể thay đổi cảm giác về bước nhảy của mình, anh ấy nhảy cao như thế nào, anh ấy giữ được bao nhiêu ngay cả khi thả nút nhảy, anh ấy rơi nhanh như thế nào, v.v. .

Quan trọng Đừng gọi các chức năng này mỗi khung. Gọi cho họ chỉ một lần khi phím được nhấn hoặc phát hành. Nếu không thì nhân vật của bạn sẽ bay thay vì nhảy.

Ví dụ làm việc

Tôi vừa tạo một ví dụ nhanh về các kỹ thuật được mô tả ở trên, bạn có thể thử trên trình duyệt của mình ở đây (nhấn nút chuột để nhảy, thả nó giữa chừng để kiểm soát độ cao của bước nhảy). Đó là trong JS nhưng như tôi đã đề cập trước đó, ngôn ngữ này không liên quan trong trường hợp này.

http://jsfiddle.net/LyM87/


11
Cũng có thể tận dụng cơ hội để chia sẻ bài viết tuyệt vời này được viết cách đây vài ngày với thông tin liên quan đến chủ đề này: Hướng dẫn triển khai nền tảng 2D . Và cũng thế này: Nhảy Sonic .
David Gouveia

2
Bài viết mô tả một cách khác nhau để thực hiện bước nhảy thay đổi so với câu trả lời của bạn. Nó kêu gọi triệt tiêu trọng lực hoặc tiếp tục thêm xung khi nút được giữ. Tôi thường làm những gì David nói trong câu trả lời của mình, nhưng có suy nghĩ nào về phương pháp của bài viết không?
Jeff

@Jeff Điều đó cũng thu hút sự chú ý của tôi, và đó chính xác là lý do tại sao tôi đề cập rằng có nhiều cách để thực hiện nó. Bài viết đầu tiên mô tả hai cách xử lý bổ sung cho cùng một vấn đề, trong khi cách tôi mô tả dựa trên bài viết thứ hai. Tôi không biết làm thế nào họ so sánh với nhau, mặc dù bất kỳ trong số họ là khá dễ thực hiện. Cuối cùng, tôi đã chọn phương pháp này vì nó dễ giải thích hơn và không yêu cầu thêm bộ đếm thời gian hoặc xử lý nhiều xung lực có cường độ giảm dần.
David Gouveia

Câu trả lời có thể thay đổi dựa trên trò chơi cụ thể và số lượng hoạt hình bạn muốn làm. Metroid sử dụng bước nhảy tốc độ không đổi: / hạ xuống, nhưng che giấu nó bằng hoạt hình chất lượng cao hoạt động để làm cho nó trông mượt mà và "cong" ở đỉnh cao. Nhiều nền tảng khác sử dụng các bước nhảy tốc độ thay đổi, đòi hỏi nhiều công việc hơn để làm cho nó hoạt động tốt.
Sean Middleditch

1
điều này rất hữu ích, 5 năm sau :) và điều thú vị này là rất tuyệt - tôi nên học JS!
Chất lỏng

1

Giống như trong vật lý. Chỉ tại thời điểm Bạn nhấn jump keyvà nhân vật ở trên mặt đất thêm vận tốc lên (nó được gọi là xung lực), nhưng làm cho nhân vật rơi xuống bởi trọng lực mọi lúc.

Nếu bạn không muốn nhân vật nhảy lên mỗi khi nó chạm đất - bởi vì bạn đang giữ jump key- thêm jump key is being pressedbiến mà bạn xóa sau jump keyđược phát hành và đặt sau. Mã giả:

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 ...

Nếu tôi sử dụng theo cách của bạn:

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

Làm thế nào donkey.ysẽ thay đổi là tùy theo trí tưởng tượng của bạn. Vận tốc nên để con lừa cao hơn nhỏ hơn trong không khí để làm cho nó trông tốt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.