Yukarıdan aşağıya RPG hareketi ile nasıl başa çıkarım?


13

Java ile yazdığım bir oyunum var. Bu yukarıdan aşağıya bir RPG ve dünyadaki hareketi ele almaya çalışıyorum. Dünya büyük ölçüde prosedürel ve dünyadaki karakter hareketinin nasıl ele alınacağını ve ekranda değişikliklerin nasıl yapılacağını ele almakta zorlanıyorum. Dünyadaki tüm karoları içeren bloklar yüklü.

Karakter hareketiyle nasıl başa çıkabilirim?

Yorgunum ve onunla nereye gitmem gerektiğini anlayamıyorum.

EDIT : Ben eldeki konu ile soyut oldu.

Şu anda sadece her şeyi bir 2D diziye sıkıca yapıştırmayı ve blok kimliğini ve oyuncu blokunu Blokta kaydetmeyi düşünebilirim ya da sadece her şeyi "yüzer" ve fayanslar arasında hareket edebilirim.

Yanıtlar:


11

Dünya Koordinatlarını Kullan

(Ya da koyduğunuzda, her şeyi yüzer.)

Dünya koordinatları genellikle birlikte çalıştığınız şeylerdir ve bunun birçok nedeni vardır. Bunlar, dünyadaki konumunuzu temsil etmenin en basit ve sezgisel yoludur ve aynı dünyadaki herhangi iki varlığın pozisyonlarını gerçekten karşılaştırmanın tek yoludur.

Bireysel bloklarda izlenmesini sağlayarak işten başka bir şey kazanamazsınız. Bir avantajı, hangi blokta olduğunu belirleyebilmenizdir, ancak bunu dünya koordinatlarıyla zaten hesaplayabilirsiniz.


Bu cevabın geri kalanı, bir oyuncunun içinde bulunduğu dünya bloğunu dünya koordinatlarına göre nasıl hesaplayacağının bir açıklaması olacaktır.

Kod parçacığını, 2B vektör sınıfınız varmış gibi yazacağım Vector2- geometride bulduğunuz vektör Vectortürü, sunduğu liste türü değil java.util. Herhangi bir geometrik Vector sınıfınız yoksa, bazılarını çevrimiçi bulmalı veya kendiniz yazmalısınız (Java için herhangi bir kaliteli geometri kitaplığı bilen var mı?)

Vector2 sınıfında , genel sayı olan bir Xalan ve Yalan bulunur (burada hangi sayısal türün önemi yoktur).

// 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 fonksiyon> tüm blok içi izleme ve bloklar arası aktarım karmaşası


1
Aradığımdan daha iyi cevap
WarmWaffles

0

Sorunuz biraz soyut ama belki de bir yol bulma algoritması arıyorsunuz, A * (http://en.wikipedia.org/wiki/A*_search_algorithm) öneririm. Bu, döşeme arazisi engellenmezse karakter döşemenizi döşemeye taşımanıza yardımcı olur.


1
Daha çok render ile nasıl başa çıkacağım. Her blokta blok kimliğini ve oynatıcı ofsetini kaydedebilir miyim?
WarmWaffles
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.