2017-12-19 41 views
-1

私の現在の方法は、私の配列をチェックして、私が得るさまざまな値ごとにケースを作ることです。 1つまたは2つの衝突可能なタイルを持つ小さなマップでも機能しますが、100を超える場合は100以上のケースを作成する必要があり、プレーヤーが別のマップに入ると非常に非効率なケースを増やす必要があります。私はプレーヤーとのタイルマップの衝突を行うことができるより良い方法はありますか?例えばSFMLのタイルマップとの衝突

int x = player.getPlayerPositionX()/map.getTileWidth(); 
int y = player.getPlayerPositionY()/map.getTileHeight(); 

switch (player.getDirection()) 
{ 
case 3: 
    if (map.data[x + y * map.getMapWidth()] == 1) 
    { 
     player.moveRect(1.0f, 0); 
    } 
    break; 
case 4: 
    x = (player.getPlayerPositionX() + 20)/map.getTileWidth(); 
    if (map.data[x + y * map.getMapWidth()] == 1) 
    { 
     player.moveRect(-1.0f, 0); 
    } 

    break; 
} 
+0

正確には "ケースを作る?現在のアプローチを示すためにいくつかのコードを提供してください。 – Omni

+0

タイルマップはどのように保存しますか?現在の実装を示すいくつかのコードを与えてください –

+0

@Omniは例を示すように編集しました。 私のタイルマップをベクトルに格納します – Tomm

答えて

1

通常ゲームにおけるタイルが通過可能または通行としてフラグ付けされるべきです。可能性のあるすべてのケースを確認する必要はありません。

struct Tile { 
    bool passable; 
}; 

bool collision(tileMap, playerCharacter) { 
    if(tileMap[playerCharacter.x][playerCharacter.y].Tile != passable) { 
     //some collision logic here 
    } 

} 
0

あなたの質問は約space partitionningだと思います。あなたの場合、既知のサイズを持ち、グリッド(2次元配列)に格納されているタイルを持っているとします。あなたの衝突をチェックするためにグリッド内のインデックスを決定するために(あなたのプレーヤー座標の座標をタイル幅で)整数分割を使用することができます。 「保守性」については、近隣の人もチェックするので、プレイヤーのサイズに合わせて、アクティブなタイルを確認してください。私は極端な大虐殺のそれの複数のバージョンを実装しています。あなたはジップのソースを参照することができますhttps://sourceforge.net/projects/extremecarnage/風景構築のためのバイナリツリーバージョンと敵ストレージパーティショニングのためのグリッド/タイルバージョン