Làm thế nào để tôi giải quyết phong trào RPG từ trên xuống?


13

Tôi có một trò chơi mà tôi đang viết bằng Java. Nó là một game nhập vai từ trên xuống và tôi đang cố gắng xử lý chuyển động trên thế giới. Thế giới chủ yếu mang tính thủ tục và tôi đang gặp khó khăn trong việc giải quyết cách xử lý chuyển động của nhân vật trên khắp thế giới và đưa ra những thay đổi cho màn hình. Tôi có cả thế giới được tải trong các khối chứa tất cả các ô.

Làm thế nào để tôi giải quyết các chuyển động nhân vật?

Tôi đã bối rối và không thể tìm ra nơi tôi nên đi với nó.

EDIT : Vâng, tôi đã trừu tượng với vấn đề trong tay.

Ngay bây giờ tôi chỉ có thể nghĩ đến việc cứng nhắc dán mọi thứ vào một mảng 2D và lưu ID khối và phần bù của người chơi trong Khối hoặc tôi chỉ có thể "thả nổi" mọi thứ và di chuyển giữa các ô để nói.

Câu trả lời:


11

Sử dụng tọa độ thế giới

(Hoặc như bạn nói, thả nổi mọi thứ.)

Tọa độ thế giới là những gì bạn thường làm việc với, và có rất nhiều lý do cho điều đó. Chúng là cách đơn giản và trực quan nhất để thể hiện vị trí của bạn trên thế giới và là cách duy nhất để thực sự so sánh vị trí của bất kỳ hai thực thể nào trong cùng một thế giới.

Bạn không đạt được gì ngoài công việc bằng cách để anh ta được theo dõi trong các khối riêng lẻ. Chà, một lợi thế là bạn có thể xác định được anh ta đang ở trong khối nào, nhưng bạn đã có thể tính toán điều đó với tọa độ thế giới.


Phần còn lại của câu trả lời này sẽ là một lời giải thích về cách tính khối thế giới mà người chơi dựa vào tọa độ thế giới của anh ta.

Tôi sẽ viết đoạn mã như thể bạn có một lớp vectơ 2D có tên Vector2- loại vectơ bạn tìm thấy trong hình học, không phải Vectorloại danh sách được cung cấp bởi java.util. Nếu bạn không có bất kỳ lớp Vector hình học nào, bạn nên tìm một số trực tuyến hoặc tự viết một số (có ai biết thư viện hình học chất lượng nào cho Java không?)

Lớp Vector2 sẽ có một Xtrường và một Ytrường, là các số công khai (không quan trọng là loại số nào ở đây).

// Current player X,Y position in the world
Player.Position.X, Player.Position.Y

// An array of map blocks with consistent width and height
Block[x][y] blocks = World.GetBlocks();

// We'll wing it with an example global width/height for all blocks
Block.GetWidth() == 100;
Block.GetHeight() == 100;

// To ensure we're on the same page:
// blocks[0][0] should be at position (0,0) in the world.
// blocks[2][5] should be at position (200,500) due to the width/height of a block.

// Also:
// Assuming (0,0) is in the top-left of the game world, the origin of a block
// is its top-left point. That means the point (200,500) is at the top-left of
// blocks[2][5] (as oppose to, say, its center).

public Vector2 GetPlayersBlockPosition() {
    Vector2 blockPosition = new Vector2();
    blockPosition.X = (int)(Player.Position.X / Block.GetWidth());
    blockPosition.Y = (int)(Player.Position.Y / Block.GetHeight());

    return blockPosition;
}

public Block GetPlayersBlock() {
    Vector2 bp = GetPlayersBlockPosition();
    return blocks[bp.X, bp.Y];
}

Block block = GetPlayersBlock();

2 chức năng> tất cả sự lộn xộn của theo dõi trong khối và chuyển giữa các khối


1
Câu trả lời tốt hơn tôi đang tìm kiếm
WarmWaffles

0

Câu hỏi của bạn hơi trừu tượng nhưng có lẽ bạn đang tìm kiếm một thuật toán tìm đường, tôi đề nghị A * (http://en.wikipedia.org/wiki/A*_search_alacticm). Điều này sẽ giúp bạn di chuyển ô nhân vật của mình sang ô xếp nếu ô không bị chặn địa hình.


1
Đó là nhiều hơn về cách tôi giải quyết kết xuất. Tôi có lưu ID khối và bù người chơi trong mỗi khối không?
Ấm bánh quế
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.