Tôi nên làm gì để ngăn quái vật của mình rời khỏi các nền tảng?


8

Tôi có một câu hỏi khiến tôi phát điên vì tôi nghĩ nó khá dễ để tìm một hướng dẫn về nó. Tôi hiện đang sử dụng XNA và Farseer để tạo một trò chơi platformer đơn giản. Tôi sắp hoàn thành nó nhưng tôi muốn quái vật của mình thông minh hơn. Trong trường hợp này, điều đó có nghĩa là tôi không muốn quái vật của mình rơi xuống vách đá.

Nói một cách đơn giản, tôi muốn thứ gì đó kiểm tra khu vực phía trước "quái vật" của tôi để xác định khi nào quái vật sẽ đổi hướng. Các bạn có thể chỉ cho tôi đi đúng hướng?

Tôi nên sử dụng cái gì, nên tồn tại một giải pháp đơn giản hoặc thuật toán đơn giản để kiểm tra điều này, phải không?

Câu trả lời:


17

Tôi chưa bao giờ làm việc với XNA trước đây và tôi nghĩ nó sẽ xuất hiện các giải pháp tốt hơn sau đó là của tôi. Nhưng một cách giải quyết khác có thể hoạt động là bạn có thể đặt một vật thể vô hình lên các cực của vách đá và quái vật có thể kiểm tra va chạm với các vật thể đó. Nếu nó va chạm, sau đó thay đổi hướng.


2
Đơn giản và thanh lịch, +1
Valmond

Đó là một giải pháp tốt. Farseer hỗ trợ " cảm biến ", vì vậy hãy sử dụng chúng tại các vách đá.
bummzack

Tôi thực sự thích câu trả lời của bạn vì vậy tôi không muốn tranh luận. Anh ta cũng có thể sử dụng ô dưới cùng bên trái / bên phải (tùy theo hướng di chuyển) - đó là một giải pháp 'rõ ràng' hơn.
Jonathan Dickinson

1
Vấn đề chính với một giải pháp như thế này là bạn phải đặt một chướng ngại vật cho mọi vách đá. Nếu có một vài trong trò chơi, thì nó có thể ổn, nhưng nếu không, nó có thể mất nhiều thời gian, và bạn có thể bỏ lỡ một số vách đá.
AlbeyAmakiir

4
@AlbeyAmakiir Chà, bạn cũng có thể trao đổi cái này xung quanh và đặt một cảm biến ở phía dưới trước người chơi (di chuyển với người chơi). Ngay khi cảm biến này dừng đăng ký va chạm, bạn đang ở trong một vách đá.
bummzack

7

Một cách ngây thơ để thực hiện nó là bằng cách sử dụng raycasting.

Tính toán nơi con quái vật của bạn sẽ ở trong một khoảng thời gian nhỏ (có thể là một khung). Từ vị trí đó (hoặc nếu bạn muốn mạnh hơn, vị trí đó +/- vùng giới hạn của kẻ thù của bạn) thực hiện một tia xuống. Nếu nó không đạt được thứ gì đó trong một phạm vi thích hợp (tùy thuộc vào nơi bạn bắt đầu phát sóng theo chiều dọc, chiều cao của nhân vật, "kích thước bước" mong muốn của bạn, v.v.), bạn có thể hình dung rằng có một vách đá nơi nhân vật muốn ở, và quyết định thay đổi hướng thích hợp.


1

Với AI của tôi, tôi chỉ cần kiểm tra xem có nền tảng nào bên dưới không và hướng di chuyển của nó (không sử dụng hệ thống gạch, chỉ là hệ thống va chạm thô bạo). Nếu không có - hoặc nếu nó chạm vào một khối rắn, nó sẽ có một cái nhìn bối rối và quay lại.

Bằng cách này, bạn có thể có bản đồ động và vẫn có AI hoạt động (thuật ngữ được sử dụng một cách lỏng lẻo).


0

Tôi nghi ngờ bạn đang sử dụng bản đồ ô vuông, trong trường hợp đó, giải pháp sẽ được thực hiện dựa trên các chỉ số ô. Bạn cần tìm xem gạch quái vật của bạn hiện đang ở trên, với các công thức sau:

int tileX = (int)(monster.Position.X / TILE_WIDTH);
int tileY = (int(monster.Position.Y / TILE_HEIGHT);

Khi bạn biết những điều này, bạn phải tìm hướng X mà bạn đang đi (để kiểm tra các khối phía trước):

int direction = 0;
if (monster.Velocity > 0f)
    direction = 1;
if (monster.Velocity < 0f)
    direction = -1;

Bây giờ bạn có một hướng X được chuẩn hóa để làm việc.

Tiếp theo, bạn sẽ muốn kiểm tra các khối xung quanh để xem bạn có nên đổi hướng hay không:

if (GetTileCollision(tileX + direction, tileY) == TileCollision.Impassable || // going into a wall
    GetTileCollision(tileX + direction, tileY) == TIleCollision.Passable &&
    GetTileCollision(tileX + direction, tileY + 1) == TileCollision.Passable)) // we're going to fall down a block
    ChangeDirection(); // we change direction

Bạn nhận được các ý tưởng chung. Đảm bảo rằng bạn quay lại TileCollision.Impassable(hoặc bất cứ điều gì) nếu các chỉ số ô nằm ngoài bản đồ, để ngăn chương trình của bạn gặp sự cố với chỉ mục không hợp lệ và điều đó cũng ngăn quái vật ra khỏi bản đồ.

Tôi đoán nó thực sự phụ thuộc vào cách bạn xử lý gạch nhưng đây là giải pháp hiệu quả với tôi.

Dựa trên các hướng dẫn tắt http://www.sgtconker.com/ (mặc dù trang web không hoạt động khi tôi viết bài này)


0

Đặt một hộp ở bên ngoài nền tảng nằm trên một lớp riêng biệt và để quái vật kiểm tra xem, vì vậy chúng sẽ không rơi ra nhưng người chơi vẫn có thể.


Tôi nghĩ rằng đây là cùng một câu trả lời mà Gilson đã đưa ra.
Richard Marskell - Drackir

ya nhìn đúng đó là
Darren
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.