2013-11-09 3 views
0

У меня проблема с моей первой изометрической игрой. Я не знаю, как сделать, чтобы мой игрок мог приблизиться к краю стены. В этот момент игрок может двигаться в зеленой зоне.Первая изометрическая игра

Моя карта:

int[,] map = new int[,] 
     { 

      {1, 1, 1, 1, 1, 1, 1, 1}, 
      {1, 0, 0, 0, 0, 0, 0, 1}, 
      {1, 0, 0, 0, 0, 0, 0, 1}, 
      {1, 0, 0, 0, 0, 0, 0, 1}, 
      {1, 0, 0, 0, 0, 0, 0, 1}, 
      {1, 0, 0, 0, 0, 0, 0, 1}, 
      {1, 0, 0, 0, 0, 0, 0, 1}, 
      {1, 1, 1, 1, 1, 1, 1, 1} 

     }; 

Переменные:

int TileWidth = 50; 
int TileHeight = 50; 
int posX = 2; // map X position 
int posY = 2; // map Y position 
float playerX = 2 * 50; // player X position 
float playerY = 2 * 50; // player Y position 

Detect стены:

public bool detectSolidTile(int x, int y) 
    { 

     if (map[y, x] == 1) return true; else return false; 

    } 

Movemet:

posX = (int)(Math.Floor((playerX)/50)); 
posY = (int)(Math.Floor(playerY/50)); 

(...) 

     if (slide == 1 && !detectSolidTile(posX + 1, posY)) 
     { 
      playerX++; 
     } 
     if (slide == 2 && !detectSolidTile(posX - 1, posY)) 
     { 
      playerX--; 
     } 

Изображение ->http://s16.postimg.org/cxkfomemd/tiles.jpg

Что мне нужно улучшить, чтобы иметь возможность передвигаться от стены до стены?

наилучшими пожеланиями, Krzysiek

ответ

0

Попробуйте сделать все карты, где вы можете перемещаться по 0, а затем карту, где вы не можете 1. При попытке сделать новый контрольный ход, если будущее положение будет либо 1 или 0. Если это 0, вы позволяете ему двигаться, иначе вы его остановите.

if (slide == 1 && !detectSolidTile(posX + 1, posY)) 
    { 
     playerX++; 
    } 

Это определит карту с 1 как за пределами подвижной области, таким образом, останавливая его от туда, куда вы хотите.

Вы понимаете, где проблема?

Другим решением является понимание размера матрицы, и как только x или y достигнут максимального значения, вы перестанете увеличивать их. Но если вы хотите добавить препятствия позже, продолжайте то, что вы делаете сейчас, но убедитесь, что 0 для карты, 1 для внешней карты.

Итак, вот редактирование для BartoszKP: Возможно, вы правы, что это "!" не исправляет его код, я просто объяснял, как он должен это делать.

Код, который я использовал бы для его проблем, несколько отличается.

Прежде всего, снимите плеер X и playerY, так как это то же самое, что и posX и posY, вы просто делаете дополнительные вычисления. теперь это время сказал, что вы алгоритм движения будет выглядеть примерно так:

Переменные:

int TileWidth = 50; 
int TileHeight = 50; 
int posX = 2; // map X position - same thing as playerX 
int posY = 2; // map Y position - same thing as playerY 
//posX and posY will now hold the position of your player on the map since your conversion from playerX to playerY will only work if you increment a value by 50 or more. 

Detect стену: // если плитка в точке с координатами х и у стены я вернуть истинный // еще вернуть ложную общественных Его detectSolidTile (INT х, Int у) {

if (map[y, x] == 1) return true; 
    else return false; 
} 

Движение:

posX = (int)(Math.Floor((playerX)/50)); //drop this you don't need it 
posY = (int)(Math.Floor(playerY/50)); //drop this too, you are using posX and posY to store locations 

(...) 

     if (slide == 1 && !detectSolidTile(posX + 1, posY)) 
     { 
      posX++; 
     } 
     if (slide == 2 && !detectSolidTile(posX - 1, posY)) 
     { 
      posX--; 
     } 

     if (slide == 3 && !detectSolidTile(posX, posY+1)) 
     { 
      posY++; 
     } 
     if (slide == 4 && !detectSolidTile(posX, posY-1)) 
     { 
      posY--; 
     } 

Это должно работать очень хорошо, если вы используете posX и posY в качестве положения игрока на карте. Создание 1 типа координаты для игрока и одного типа для карты просто делает ее более запутанной в этой точке. Но если вы действительно должны использовать разные координаты для них, вы всегда должны относиться к PlayerX и playerY при попытке вычислить движение, как это:

if (slide == 1 && !detectSolidTile((int)(Math.Floor((playerX+1)/50)) + 1, posY)) 
{ 
    playerX++; 
} 

И это потому, что вы меняете значение PlayerX на 1 не значение posX, и это ограничит ваше движение. Если это смущает, дайте мне знать, и я попытаюсь объяснить это лучше.

+0

Изменение 1 до 0 помогло, но только правая стена. Игрок двигаться только по зеленой зоне :( IMG http://i.stack.imgur.com/k6xG8.jpg редактировать: я сделал: DI изменить если (слайд == 2 && detectSolidTile (PosX - 1, posY)) if (slide == 2 && detectSolidTile (posX, posY)) – Krzysiek

+0

Используя тот же процесс для y, вы можете перемещать его вверх и вниз. –

Смежные вопросы