Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.21.105.175] |
|
Сообщ.
#1
,
|
|
|
Как сделать обход препятствий в С++ Builder???
Движение игрока по клику мыши уже готово. Вот мой код: void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { x=X; y=Y; Timer1->Enabled=true; } void __fastcall TForm1::Timer1Timer(TObject *Sender) { if (Image1->Top>y) Image1->Top=Image1->Top-1; if (Image1->Top<y) Image1->Top=Image1->Top+1; if (Image1->Left>x) Image1->Left=Image1->Left-1; if (Image1->Left<x) Image1->Left=Image1->Left+1; if (Image1->Top==y && Image1->Left==x) Timer1->Enabled=false; } |
Сообщ.
#2
,
|
|
|
Для обхода препятствий вам нужно добавить в свой код проверки на наличие препятствий перед перемещением игрока.
Одним из способов проверки может быть использование матрицы, где каждый элемент представляет собой ячейку на игровом поле. Если ячейка свободна, то ее значение будет равно 0, если же она занята препятствием, то значение будет равно 1. Пример реализации обхода препятствий в вашем коде: void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { int destX = X; int destY = Y; // Проверяем, что ячейка, в которую мы хотим переместиться, свободна if (gameField[destX][destY] != 0) { // Если ячейка занята, то ищем ближайшую свободную ячейку int step = 1; while (true) { for (int i = destX - step; i <= destX + step; i++) { for (int j = destY - step; j <= destY + step; j++) { // Проверяем, что ячейка свободна if (gameField[i][j] == 0) { destX = i; destY = j; break; } } if (destY != Y) break; } if (destX != X) break; step++; } } // Запускаем таймер с новыми координатами x = destX; y = destY; Timer1->Enabled = true; } void __fastcall TForm1::Timer1Timer(TObject *Sender) { if (Image1->Top > y) Image1->Top = Image1->Top - 1; if (Image1->Top < y) Image1->Top = Image1->Top + 1; if (Image1->Left > x) Image1->Left = Image1->Left - 1; if (Image1->Left < x) Image1->Left = Image1->Left + 1; if (Image1->Top == y && Image1->Left == x) Timer1->Enabled = false; } В данном примере предполагается, что игровое поле представлено двумерной матрицей gameField, где значение 0 означает свободную ячейку, а значение 1 - занятую препятствием. При клике мыши на новую позицию (X,Y) мы сначала проверяем, свободна ли ячейка gameField[X][Y]. Если она занята, то ищем ближайшую свободную ячейку с помощью цикла while и проверок. Когда найдем свободную ячейку, запускаем таймер с новыми координатами (destX, destY). |
Сообщ.
#3
,
|
|
|
Как объявить массив gameField и сделать сетку???
|
Сообщ.
#4
,
|
|
|
!!!!!!!!!!!!!!!Именно в этом примере??? КАК???!!!!!!!!!!!!!!!!!!
|
Сообщ.
#5
,
|
|
|
В общем случае задача через забор if'ов не решается (если "препятствия" имеют произвольную геометрию). Тут какой-нибудь Волновой алгоритм уместнее. Или алгоритм Дейстра, если рассматривать каждую точку как элемент графа.
|
Сообщ.
#6
,
|
|
|
А что мы пишем если это не есть секрет?
|