Biến chiều cao nhảy trong cuộn bên


10

Làm cách nào để người chơi nhảy cao hơn nếu phím nhảy được giữ lâu hơn? Tôi hiện chỉ đang giảm trọng lực miễn là phím được giữ và người chơi đang nhảy, nhưng điều này có vẻ kỳ lạ.


có thể chỉ bằng một số sửa đổi trong việc bạn giảm trọng lực đến mức nào, bạn sẽ có được một hành động nhảy tốt hơn.
Ali1S232

@Gajet Điều đó khá là rắc rối và có vẻ là một cách kỳ lạ để làm điều đó.
Vịt Cộng sản

Hmm, bạn nói giảm trọng lực không có nghĩa là bạn đang sử dụng một động cơ vật lý. Đây có phải là trường hợp? Bạn đang sử dụng Impulses để nhảy?
Jonathan Connell

Không có động cơ vật lý và tôi không sử dụng Impulses
John Stimac

Trong trường hợp nào, làm thế nào để người chơi rơi? Bạn chỉ dịch vị trí của mình theo một chuyển động * nhảy * vectơ trọng lực?
Jonathan Connell

Câu trả lời:


9

Trước tiên, bạn cần phải quyết định những gì bạn muốn nhảy như thế nào.

Trong cuộc sống thực, chiều cao nhảy được quyết định tại thời điểm bạn rời khỏi mặt đất. Bạn không thể tiếp tục nhảy cao hơn trong khi bạn đang ở giữa không trung.

Vì vậy, nếu bạn có thể kiểm soát chiều cao nhảy của mình trong khi bạn đang ở trên không, bạn sẽ nhận được một loại hiệu ứng giống như "máy bay phản lực".

Tôi dường như nhớ một sidcroller có hai độ cao nhảy khác nhau, tôi nghĩ đó là một trong những trò chơi siêu mario. Bước nhảy cao hơn xảy ra khi bạn giữ nút nhảy, và bước nhảy sau đó thực sự là một bước nhảy hai phần, bắt đầu với bước nhảy thông thường ban đầu, tiếp theo là một xung thứ hai đưa bạn lên cao hơn.

Vì vậy, những gì bạn muốn nhảy của bạn trông như thế nào? Loại điều khiển nào bạn muốn người chơi có thể vượt qua?

Những gì tôi sẽ bắt đầu với là:

Để trọng lực một mình (tức là không bao giờ thay đổi nó). Khi người chơi nhấn nút nhảy, hãy áp dụng lực nhảy miễn là người chơi nhấn nút nhảy (tối đa một số giới hạn thời gian). Sau đó, khi người chơi nhả nút nhảy, anh ta không thể áp dụng bất kỳ lực nhảy nào nữa (tức là anh ta không thể bắt đầu lại cú nhảy) cho đến khi chạm đất lần đầu tiên, tại đó điểm nhảy được bật lại.


Tôi đã thử điều đó, và tôi nhận được hiệu ứng jetpack. Tôi đã tự hỏi nếu có cách nào để tránh điều đó.
John Promotionac

1
Có thể không phải là trò chơi mà bạn có trong đầu, nhưng trong Super Mario 2, bạn đã nhảy cao hơn bằng cách cúi xuống một chút trước khi nhảy. (Điều này có ý nghĩa trực quan nhất định, vì bạn không nhảy xa nếu bạn cố gắng thực hiện trực tiếp từ vị trí đứng.)
Darien

3
Jcubed: Thay vì thêm lực vào vận tốc, hãy thử thêm lực trực tiếp vào vị trí. Sau đó, người chơi sẽ di chuyển tuyến tính lên, thay vì tung lên.
Olhovsky

@Jcubed: khi chơi một số trò chơi như super meat boytôi nghĩ có hiệu ứng nhảy giống như bạn muốn, có vẻ như khi bạn giữ nút nhảy, một lực được tác dụng lên nhân vật, nó ngược với trọng lực và nhỏ hơn nó, và phần còn lại giống như những gì alhovsky nói. nếu tôi thực hiện một cái gì đó như thế thì tôi sẽ bắt đầu với thứ gì đó như 60% -80% trọng lực là lực nhảy.
Ali1S 232

1
Tôi làm điều này mọi lúc, chỉ cần giữ thời gian trong đó bạn thiết lập tốc độ nhảy lên bằng cách giữ nút đủ ngắn để nó không phải là hiệu ứng gói phản lực đáng chú ý - sau đó sẽ giống như Super Mario khá dễ dàng, với một vài phép thuật chỉnh số. Đừng làm cho "lực" nhỏ hơn, chỉ cần đặt lại vận tốc để nhảy tối đa cho đến khi jumpHigherTime hết hạn hoặc người chơi nhả nút ... đồng thời, tôi cảm thấy các cậu bé siêu thịt nhảy lên không chính xác và khó chịu, như bất kỳ nền tảng nào chỉ dựa vào một động cơ vật lý; p
Oskar Duveborn

7

Tôi đã thấy một số người làm điều này:

  1. Tạo một biến (tôi sẽ gọi nó jumpTime) (số / double / float). Khi nhấn phím nhảy, đặt jumpTimethành một số (nghĩa là 0.5đây sẽ là số giây giữ phím nhảy sẽ ảnh hưởng).

  2. Sau đó, với mỗi bước, đặt vận tốc thành jumpTimenhân với một số số khác và giảm jumpTimetheo delta(chênh lệch thời gian giữa mỗi bước).

  3. Lặp lại điều đó cho đến khi jumpTimeđạt đến 0 hoặc thấp hơn hoặc khi người chơi nhả phím nhảy. Sau đó, sử dụng vật lý bình thường (áp dụng gia tốc âm liên tục cho đến khi người chơi chạm đất).

Bạn có thể cần phải sử dụng thử và lỗi (hoặc "đoán logic") để tìm các giá trị phù hợp cho các "số đó", trừ khi bạn biết cách thực hiện.


CẬP NHẬT: Tôi đã tìm thấy thủ thuật làm cho bước nhảy thực tế hơn một chút (vì ban đầu nó đi chậm nhưng sau đó sẽ đi xuống nhanh chóng). Infinite Mario cũng sử dụng dòng sau (293 phiên bản JavaScript của phiên bản JavaScript) ... this.Ya *= 0.85;Điều này đơn giản giống như "kéo không khí" và giới hạn / làm chậm tốc độ của nhân vật khi ở giữa không trung. Vì vậy, mỗi khung hình, nhân tốc độ y (tốc độ dọc) với một số nhỏ hơn một để nó chậm lại khi rơi xuống (và do đó cả hai đi lênđi xuống trong khi nhảy sẽ tương tự và thực tế hơn). Tôi biết, tôi rất tệ trong việc giải thích ...

Khi nhân vật nhảy bằng cách sử dụng phương pháp mà tôi đã mô tả ban đầu ở trên, nó "tăng lên" nhanh hơn sau đó "rơi xuống dưới". Việc kéo, tuy nhiên, làm chậm tốc độ dọc. Vì chúng tôi đặt tốc độ dọc tỷ lệ thuận với jumpTimemọi khung hình, lực cản này không ảnh hưởng nhiều đến nửa đầu của bước nhảy. Tuy nhiên, trong nửa tiếp theo (giảm dần xuống dưới), tốc độ dọc không được đặt ở mọi khung hình, mà chỉ được thêm bởi một số khác (trong trường hợp này là hằng số hấp dẫn). Do đó, lực cản có hiệu lực khi rơi, và vì nó làm giảm tốc độ (theo bất kỳ hướng nào), nó làm chậm sự rơi, làm cho nó tương tự như nửa đầu.

Có nhiều cách khác để giải quyết vấn đề này, như giảm ảnh hưởng của trọng lực lên nhân vật khi nó rơi xuống. Tuy nhiên, chúng ta cần tìm xem chúng ta nên giảm trọng lực đến mức nào.


Nghiên cứu điển hình: Infinite Mario

Đây là những gì tôi tìm thấy (từ dòng 206 của Mario.java của 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;
    }

Phiên bản javascript về cơ bản là giống nhau https://github.com/robertkleffner/mariohtml5/blob/master/code/character.js

Điều này tương tự như gợi ý từ Olhovsky, nhưng trong trường hợp này, lực sẽ tỷ lệ thuận với lượng thời gian trôi qua sau khi người chơi nhấn phím nhảy.

Phiên bản javascript của tôi:

    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;

Tuy nhiên, một số giá trị cho các hằng số (ví dụ: "vityConstant" và "jumpConstant") sẽ tạo ra một bước nhảy không thực tế. Nhưng đôi khi các trò chơi không cần phải thực tế! ( cập nhật xem phần cập nhật ở trên)

Câu hỏi này đã được hơn một năm tuổi, nhưng tôi hy vọng điều này sẽ giúp!


2

Như Olhovsky đã nói, chiều cao nhảy được quyết định ngay khi bạn rời khỏi mặt đất, không phải sau đó.

Nếu bạn thực sự muốn tránh hiệu ứng jetpack, tôi chỉ thấy hai cách: tổ hợp phím để nhảy cao hơn hoặc thay đổi cơ bản cách thức hoạt động của phím nhảy:

Thay vì làm cho người chơi nhảy ngay khi nhấn phím, hãy trì hoãn bước nhảy cho đến khi phím được giải phóng . Vì vậy, về cơ bản thời lượng của phím bấm điều khiển mức độ căng của lò xo trong chân người chơi được tạo ra và sau đó được giải phóng.

Tất nhiên, điều này về cơ bản làm thay đổi cơ chế trò chơi và có thể xa lạ với người chơi. Nhưng hiệu ứng có thể khá thú vị và cũng có thể đáng để không quen.


2
Tôi nghĩ rằng tôi nhớ chơi một số platformer với chính xác người thợ đó - đừng rời khỏi mặt đất cho đến khi bạn "tính phí" bước nhảy. Với một số hình ảnh động đẹp mắt (như đám mây bụi phát triển dưới chân nhân vật), điều này có thể được thực hiện để cảm thấy trực quan.
Jari Komppa

2

Tôi đã tìm thấy một giải pháp khác trong câu trả lời của David Gouveia cho câu hỏi " Làm thế nào để khiến nhân vật nhảy lên? "

Tóm lược:

Ý tưởng của anh là thiết lập vận tốc khi người chơi nhấn nút nhảy xuống. Trong mỗi khung hình, nó chỉ tính trọng lực. Tuy nhiên, khi người chơi nhả nút, nó sẽ đặt vận tốc thành giá trị nhỏ hơn nếu vận tốc lớn hơn nó. Vận tốc chỉ giảm mỗi khung bởi trọng lực.

Tôi không nên đánh cắp câu trả lời của anh ấy, vì vậy hãy tiếp tục và đọc bài viết của anh ấy. Giải pháp của anh nằm trong phần " Biến đổi chiều cao nhảy ".

Vì vậy, thực sự mọi người đã nghĩ ra nhiều cách khác nhau để giải quyết vấn đề này ...

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.