Bagaimana cara mengatasi gerakan RPG top-down?

13

Saya memiliki permainan yang saya tulis di Jawa. Ini adalah RPG top-down dan saya mencoba menangani gerakan di dunia. Dunia sebagian besar bersifat prosedural dan saya mengalami kesulitan menangani bagaimana menangani pergerakan karakter di seluruh dunia dan membuat perubahan pada layar. Saya memiliki dunia dimuat dalam blok yang berisi semua ubin.

Bagaimana cara mengatasi gerakan karakter?

Saya bingung dan tidak tahu ke mana saya harus pergi dengannya.

EDIT : Yah saya abstrak dengan masalah yang dihadapi.

Saat ini saya hanya bisa memikirkan kaku memasukkan semuanya ke dalam array 2D dan menyimpan ID blok dan pemain mengimbangi di Blok atau saya hanya bisa "melayang" semuanya dan bergerak di antara ubin sehingga untuk berbicara.

WarmWaffles
sumber

Jawaban:

11

Gunakan Koordinat Dunia

(Atau seperti yang Anda katakan, apungkan semuanya.)

Koordinat dunia adalah tempat Anda bekerja secara umum, dan ada banyak alasan untuk itu. Mereka adalah cara paling sederhana dan intuitif untuk mewakili posisi Anda di dunia, dan satu-satunya cara untuk benar-benar membandingkan posisi dari dua entitas di dunia yang sama.

Anda mendapatkan apa-apa selain bekerja dengan membuatnya dilacak dalam blok individu. Nah, satu keuntungan adalah Anda bisa menentukan di blok mana dia berada, tetapi Anda sudah bisa menghitungnya dengan koordinat dunia.


Sisa dari jawaban ini akan menjadi penjelasan tentang bagaimana cara menghitung blok dunia yang digunakan pemain berdasarkan koordinat dunianya.

Saya akan menulis cuplikan kode seolah-olah Anda memiliki kelas vektor 2D bernama Vector2- jenis vektor yang Anda temukan dalam geometri, bukan Vectortipe daftar yang ditawarkan oleh java.util. Jika Anda tidak memiliki kelas vektor geometris, Anda harus menemukan beberapa online atau menulis sendiri (ada yang tahu perpustakaan geometri berkualitas untuk Java?)

Kelas Vector2 akan memiliki Xbidang dan Ybidang, yang merupakan angka publik (tidak masalah tipe numerik mana di sini).

// 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 fungsi> semua kekacauan pelacakan dalam-blok dan transfer antar-blok

doppelgreener
sumber
1
Jawaban yang lebih baik daripada yang saya cari
WarmWaffles
0

Pertanyaan Anda agak abstrak tapi mungkin Anda mencari algoritma pencarian jalur, saya sarankan A * (http://en.wikipedia.org/wiki/A*_search_algorithm). Ini akan membantu Anda memindahkan ubin karakter Anda ke ubin jika ubin tersebut tidak diblokir.


sumber
1
Ini lebih dari bagaimana saya menangani rendering. Apakah saya menyimpan ID blok dan offset pemain di setiap blok?
WarmWaffles