Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.02.2009, 08:50   #1
Манжосов Денис :)
Участник клуба
 
Регистрация: 29.01.2008
Сообщений: 1,039
Сообщение Код проверки столкновений не работает.

Имеется код:
Код:
var
  GameForm: TGameForm; 
  Map: array [0..31, 0..23] of byte; // Массив объектов на карте
  GameMap: TBitmap; // Bitmap карты игры
  //
  Tree, Box, Road, Start, Finish: TBitmap; // Bitmapы объектов на форме
  //
  Car: TBitmap; // Bitmap машины
  XPos, YPos: integer;
// Координаты машины по X и по Y
Это глобальные переменные.
Код:
const
  CTREE = 1;
  CROAD = 2;
  CBOX = 3;
  CSTART = 4;
  CFINISH = 5;
Константы, которые обозначают на массиве Map объекты.
Загружаю карту:
Код:
procedure TGameForm.LoadMap;
var i,j: integer;
begin
  AssignFile(Input, 'GameEdit\DemoMap.txt');
  Reset(Input);
   for i:=0 to 31 do
    for j:=0 to 23 do
     Read(Map[i,j]);
   CloseFile(Input);
   for i:=0 to 31 do
    for j:=0 to 23 do
     case Map[i,j] of
      CTREE: GameMap.Canvas.Draw(i*25, j*25, Tree);
      CROAD: GameMap.Canvas.Draw(i*25, j*25, Road);
      CBOX:  GameMap.Canvas.Draw(i*25, j*25, Box);
      CSTART: begin
               GameMap.Canvas.Draw(i*25, j*25, Start);
               XPos := i*25;
               YPos := j*25;
              end;
      CFINISH: GameMap.Canvas.Draw(i*25, j*25, Finish);
     end;
end;
Думаю, что здесь всё понятно.
Отрисовка содержимого:
Код:
procedure TGameForm.FormPaint(Sender: TObject);
begin
  Canvas.Draw(0,0,GameMap);
  Canvas.Draw(XPos, YPos, Car);
end;
Далее идёт процедура таймера, который проевряет нажата ли клавиша, и, если нажата, надо двигать машину.
Код:
procedure TGameForm.TimerCarTimer(Sender: TObject);
begin
  if GetKeyState(VK_UP) shr 31  = 1 then MoveUp;
  if GetKeyState(VK_DOWN) shr 31  = 1 then MoveDown;
  if GetKeyState(VK_RIGHT) shr 31  = 1 then MoveRight;
  if GetKeyState(VK_LEFT) shr 31  = 1 then MoveLeft;
  ObjectsWithCar;
end;
MoveUp, MoveDown, MoveRight, MoveLeft - процедуры, которые отвечают за движения в разные стороны.
ObjectsWithCar - процедура, которая проверяет столкновения машины с объектами. Вот код:
Код:
procedure TGameForm.ObjectsWithCar;
var i,j: integer;
begin
  for i:=0 to 31 do
   for j:=0 to 23 do
    begin
      if Map[i,j] = CROAD then exit;
         if (XPos and YPos >= Map[i,j]) and (XPos and YPos <= Map[i,j])
          then
           begin
            ShowMessage('Столконовение');
            XPos := XPos - 2;
            YPos := YPos - 2;
            Repaint;
           end;
    end;
end;
Цитата:
if Map[i,j] = CROAD then exit;
Здесь проверка: если объект равен CROAD(2), то выйти и процедура, так как машина не должна сталкиваться с дорогой. В - общем столкновения не работают совершенно. Помогите, пожалуйста. Никак не пойму в чём проблема.
Манжосов Денис :) вне форума Ответить с цитированием
Старый 02.02.2009, 09:02   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну ты даеш - налил воды а сомого главного не описал
Прикрепил бы сюда архив с прогой, ато непонятно что делает твой CROAD
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.02.2009, 09:09   #3
Манжосов Денис :)
Участник клуба
 
Регистрация: 29.01.2008
Сообщений: 1,039
По умолчанию Я всё описал вам.

Я вроде бы как всё описал, что можно. А CROAD - это константа.
Вот исходный код:
Вложения
Тип файла: txt Code.txt (4.8 Кб, 128 просмотров)
Манжосов Денис :) вне форума Ответить с цитированием
Старый 02.02.2009, 09:20   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Я вроде бы как всё описал
Упс, неувидел.

Ты бы проверил чему равны значения в Map, в отладчике

НАсчет прикрепления - весь проект а не только код, ибо его запустить без твоих файлов никто не смогет быстро
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.02.2009, 09:32   #5
Манжосов Денис :)
Участник клуба
 
Регистрация: 29.01.2008
Сообщений: 1,039
Сообщение Полный проект выложить не могу.

Полный проект выложить не могу. Создал отдельный проект. Код тот же самый.
В Архиве имеется:
Цитата:
1. Файлы проекта.
2. Изображенрия объектов в игре.
3. Одна демо-карта.
Вложения
Тип файла: rar TestGame.rar (2.6 Кб, 13 просмотров)
Манжосов Денис :) вне форума Ответить с цитированием
Старый 02.02.2009, 09:49   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ты знаеш я пока наверное еще не проснулся но у меня в коде:
Код:
 for i:=0 to 31 do
   for j:=0 to 23 do
    begin
      if Map[i,j] = 2 then exit;
Изначально i,J равны запредельным числам.

Мож тебе поменять стратегию?...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.02.2009, 09:55   #7
Манжосов Денис :)
Участник клуба
 
Регистрация: 29.01.2008
Сообщений: 1,039
По умолчанию

Цитата:
Мож тебе поменять стратегию?...
Если не сложно, объясните пожалуйста - как?
()()()()()()()()()()()()()()()()()( )()()()()()()()()()()()
Кстати говоря. Я изменил код проверки на такой:
Код:
  for i:=0 to 31 do
   for j:=0 to 23 do
    begin
      if (Map[i,j] = CROAD) or (Map[i,j] = CSTART) or (Map[i,j] = 0)  then exit;
         if ((XPos and YPos) >= Map[i*25,j*25]) and ((XPos and YPos) <= Map[i*25,j*25])
          then
           begin
            XPos := XPos - 2;
            YPos := YPos - 2;
            Repaint;
           end;
    end;
Теперь машина едет нормально, но всё равно, не хочет врезаться с ящиками и деревьями.

Последний раз редактировалось Манжосов Денис :); 02.02.2009 в 10:11.
Манжосов Денис :) вне форума Ответить с цитированием
Старый 02.02.2009, 10:00   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Во-первых: Избавимся от таймера:
Код:
procedure TMainForm.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
 case key of
  VK_up:MoveUp;
  VK_DOWN:MoveDown ;
  VK_LEFT:MoveLeft;
  VK_RIGHT:MoveRight;
 end;
 ObjectsWithCar;
end;
Во-вторых: Я правильно понял что эта Map у тебя содержит 0 там где нет дороги? Вот и проверяй сразу после нажатия клавиши но до пердвижения есть ли в новых координатах 0 и если нет то можно двигать

И еще: совет убери StayOnTop - это не самая хорошая идея в твоем случае - отлаживать неудобно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.02.2009, 10:31   #9
Манжосов Денис :)
Участник клуба
 
Регистрация: 29.01.2008
Сообщений: 1,039
По умолчанию

Ещё поменял код:
Код:
function TMainForm.ObjectsWithCar: boolean;
var i,j: byte;
begin
  for i:=0 to 31 do
   for j:=0 to 23 do
    begin
      if (Map[i,j] = CTREE) or (Map[i,j] = CBOX)
       then
          begin
             if
             ((XPos+25 and YPos+25) >= Map[i*25,j*25])
             and
             ((XPos and YPos) <= Map[i*25,j*25])
              then
               begin
                ObjectsWithCar := true; 
                XPos := XPos - 25;
                YPos := YPos - 25;
                Label1.Caption := 'Test complete!';
                Repaint;
                Exit;
               end
           end
    end;
   result := false;
end;
И здесь, в таймере:
Код:
if ObjectsWithCar = true then exit;
  if GetKeyState(VK_UP) shr 31  = 1 then MoveUp;
  if GetKeyState(VK_DOWN) shr 31  = 1 then MoveDown;
  if GetKeyState(VK_RIGHT) shr 31  = 1 then MoveRight;
  if GetKeyState(VK_LEFT) shr 31  = 1 then MoveLeft;
Теперь он непонятно как, но сталкивается. Опять не найду ошибку.
Манжосов Денис :) вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работает код... prizrak1390 Общие вопросы Delphi 3 22.10.2008 14:59
этот код первый раз то окно сначала сворачивается, а потом сразу восстанавливается, а когда вызываешь второй, окно сворачивается? Аlex Общие вопросы Delphi 4 16.08.2008 11:51
Код для выравнивания не работает Михаил Юрьевич Общие вопросы Delphi 3 24.02.2008 18:09
Почему не работает код? Kashp Общие вопросы Delphi 3 09.08.2007 17:33