Xác định player.isFalling () thông qua thay đổi của y?


8

Tôi hiện đang sử dụng Box2D và nhân vật của tôi là một loạt các đồ đạc trong Box2D. Tôi đã tự hỏi nếu, để xác định xem một người chơi đang rơi, phát hiện thay đổi vị trí Y có phù hợp không?

Có thể có những cách khác mà tôi không nghĩ đến? Làm thế nào là loại điều này thường được phát hiện?


2
Không phải người chơi sẽ có một vận tốc đi xuống để chỉ ra ngã?
Vịt Cộng sản

1
Những gì "rơi" trong trường hợp của bạn anyway? Đây có phải là một vận tốc đi xuống đơn giản? Có phải là sự không có mặt của một bề mặt rắn ngay bên dưới? Bạn có đang "té ngã" khi nhân vật của bạn nhảy ra khỏi một tòa nhà và vẫn đang đi lên, nhưng rõ ràng là sẽ chạm vào bê tông vài giây kể từ bây giờ?
Anko

@Aku ấp úng là bất cứ lúc nào nó sẽ không có ý nghĩa đối với anh ta để nhảy (vì không có bề mặt để nhảy ra)
jmasterx

3
Thông thường một động cơ vật lý sẽ cung cấp cho bạn các cách để kiểm tra bình thường của một vụ va chạm. Nếu đó là 'lên', điều này có nghĩa là người chơi của bạn đang đứng trên một cái gì đó, và sẽ có thể nhảy. Ngược lại nếu anh ta không va chạm, hoặc nếu không có bất kỳ quy tắc va chạm nào đang chỉ 'lên' thì anh ta sẽ ngã.
Jonathan Connell

@Duck và @ 3nixios nghe có vẻ là câu trả lời hay, tại sao không làm cho nó .. ehm câu trả lời;) Tôi, vì một người sẽ nâng cao
Maik Semder

Câu trả lời:


9

(Từ nhận xét của tôi.) Tôi không quen thuộc với Box2D, nhưng thông thường, một công cụ vật lý sẽ cung cấp cho bạn các cách để kiểm tra mức độ bình thường của một vụ va chạm.

Nếu đó là 'lên', điều này có nghĩa là người chơi của bạn đang đứng trên một cái gì đó, và sẽ có thể nhảy.

Ngược lại nếu anh ta không va chạm, hoặc nếu không có bất kỳ quy tắc va chạm nào đang chỉ 'lên' thì anh ta sẽ ngã.


3

Bạn cần hai booleans, isColidingWithGroundisJumping

Khi người dùng nhấn nút nhảy, nếu isColidingWithGroundtrueisJumpingsai, hãy gọi jump()bộ nào isJumpingthànhtrue

Nếu yvận tốc của người chơi là dương thì isJumpingbằngfalse

Nếu người chơi đang ở trên mặt đất, thì isColidingWithGround bằng true, khác isColidingWithGroundbằng false.

Đôi khi người chơi vẫn tiếp xúc với mặt đất sau xung lực nhảy ban đầu và tôi thấy rằng với việc sử dụng hai lá cờ này, nó sẽ ngăn không cho nhảy () được gọi nhiều lần khi nhảy.


Sử dụng phương pháp này, sẽ rất thú vị để kiểm tra xem phím nhảy có được nhấn khi người chơi ngã không và nếu nó được nhấn như 200ms trước khi chạm đất, hãy gọi jump()lại.
JCM

2

Cách tôi xử lý điều này là mỗi người chơi có một isJumpingboolean, khi họ nhảy, được đặt thành true. Khi chúng va chạm với một bề mặt, tôi kiểm tra xem đó có phải là thứ gì đó mà chúng có thể nhảy ra và các quy định khác như chúng có đứng thẳng không, v.v. và đặt nó thành false.

Sau đó, khi họ cố gắng nhảy, nếu bề mặt họ đang hoạt động tốt và isJumping == falsetôi cho phép họ nhảy, nếu không họ không thể nhảy. Tôi nghĩ rằng điều này tốt hơn so với tính toán va chạm mỗi khi bạn muốn xem liệu họ có nhảy không.

Chỉnh sửa
Như @BlueRaja chỉ ra bên dưới, nếu người dùng rời khỏi rìa, isJumpingvẫn sẽ như vậy false. Bạn có thể khắc phục điều này bằng EndContactphương pháp của Trình lắng nghe Liên hệ (xem tài liệu môn phái Box2D 9.4 . Bạn chỉ cần đặt thuộc isJumpingtính truekhi hết va chạm với thế giới.


2
Điều gì nếu họ đi ra khỏi mép mà không nhảy? isJumpingsẽ được false, nhưng họ vẫn không được phép nhảy
BlueRaja - Danny Pflughoeft

@BlueRaja - Điểm tốt. Tôi quên mất điều đó, tôi cũng có một kiểm tra về việc phá vỡ va chạm. Xem EndContacttrong 9.4 từ Tài liệu Box2d . Chỉnh sửa câu trả lời cập nhật.
Richard Marskell - Drackir

0

Di chuyển tất cả các thành phần có liên quan trong "bó đồ đạc" của bạn (cùng làm cho người chơi) xuống một lượng nhỏ và kiểm tra va chạm với bất cứ thứ gì bạn cho là có thể nhảy ra. Nếu không có va chạm, người chơi bị ngã. Nếu không, anh ta không. Đừng quên di chuyển các thành phần sao lưu với cùng số tiền đó.

Nếu nhân vật của bạn là người hình người, có lẽ bạn nên di chuyển và chỉ kiểm tra chân của nhân vật, vì nếu không nhân vật của bạn cuối cùng có thể nhảy ngay cả khi đứng trên đầu anh ta!


0

Điều này có thể hoặc không thể áp dụng, nhưng chúng tôi sẽ phát hiện ra sự khác biệt giữa nhảy / hạ cánh và ngã để chúng tôi biết khi nào cần đổi sang hoạt hình rơi, gây sát thương khi rơi quá lâu (không quá xa;)) và tương tự.

Nó đã được thực hiện khá nhiều bằng cách theo dõi thời gian một đối tượng không có điểm tham chiếu. Bất cứ điều gì trên mặt đất, hoặc bất kỳ đối tượng nào khác, có liên quan đến những gì nó đang đứng .. Không đứng trên bất cứ điều gì? Sau đó, bạn đã ở trên không, và sau 1-2 giây, bạn đã 'rơi' thay vì hạ cánh duyên dáng :)


0

Rất ngây thơ và đơn giản, bạn có thể kiểm tra xem người chơi có vận tốc y (vận tốc chứ không phải tốc độ)> 0, giả sử bạn đang sử dụng (0,0) ở trên cùng bên trái.

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.