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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.12.2014, 20:06   #1
Owletass
Новичок
Джуниор
 
Регистрация: 11.12.2014
Сообщений: 8
По умолчанию Столкновение с объектом и его остановка

В технаре начали изучать паскаль и недавно остановились на анимации графики, и мне захотелось создать простую игру. Пока всё идет нормально, но появился вопрос с взаимодействием объектов (твердость объектов). Я написал простую программу, в которой игрок упирается, если подходит к прямоугольнику вплотную, но она не совершенна. Как её стабилизировать я знаю, но хочу спросить: можно ли как-то сделать проще?

Код:
uses
  ABCObjects, GraphABC;

var
  speed: integer;
  vkleft, vkright, vkup, vkdown: boolean;
  players, player, block: ObjectABC;
// Клавиша нажата
procedure KeyDown(Key: integer);
begin
  case Key of
    VK_Left:  vkleft := true;
    VK_right: vkright := true; 
    VK_up:  vkup := true;
    VK_down: vkdown := true;
  end;
  
end;
// Клавиша ОТжата
procedure KeyUp(Key: integer);
begin
  case Key of
    VK_Left:  vkleft := false; 
    VK_right: vkright := false; 
    VK_up:  vkup := false;
    VK_down: vkdown := false;
  end;
end;
// таймер
procedure TimerProc;
begin
  if vkleft = true then
  begin
    player.MoveOn(-speed, 0); end;
  
  if vkright = true then 
  begin
    player.MoveOn(speed, 0); end;
  
  if vkup = true then
  begin
    player.MoveOn(0, -speed); end;
  
  if vkdown = true then
  begin
    player.MoveOn(0, speed); end;
end;

procedure usewith;
begin
  if ((player.Intersect(block)) and (players <> block)) and vkleft = true then 
// Если соприкосновение с блоком и нажата клавиша ВЛЕВО, тогда его откидывает на его же скорость ВПРАВО
  begin
    player.MoveOn(speed, 0);
  end else
  if ((player.Intersect(block)) and (players <> block)) and vkright = true then 
// Если соприкосновение с блоком и нажата клавиша ВПРАВО, тогда его откидывает на его же скорость ВЛЕВО
  begin
    player.MoveOn(-speed, 0);
  end else
  if ((player.Intersect(block)) and (players <> block)) and vkup = true then 
// Если соприкосновение с блоком и нажата клавиша ВВЕРХ, тогда его откидывает на его же скорость ВНИЗ
  begin
    player.MoveOn(0, speed);
  end else
  if ((player.Intersect(block)) and (players <> block)) and vkdown = true then 
// Если соприкосновение с блоком и нажата клавиша ВНИЗ, тогда его откидывает на его же скорость ВВЕРХ
  begin
    player.MoveOn(0, -speed);
  end;
  
  if ((player.Intersect(block)) and (players <> block)) and (vkleft = true and vkup = true)  then 
// Если соприкосновение с блоком и нажата клавиша ВЛЕВО и ВВЕРХ, тогда его откидывает на его же скорость ВПРАВО и ВНИЗ
  begin
    player.MoveOn(-speed, speed);
  end;
  if ((player.Intersect(block)) and (players <> block)) and (vkright = true and vkup = true)  then
 // Если соприкосновение с блоком и нажата клавиша ВПРАВО и ВВЕРХ, тогда его откидывает на его же скорость ВЛЕВО и ВНИЗ
  begin
    player.MoveOn(speed, speed);
  end;
  if ((player.Intersect(block)) and (players <> block)) and (vkright = true and vkdown = true)  then
 // Если соприкосновение с блоком и нажата клавиша ВПРАВО и ВНИЗ, тогда его откидывает на его же скорость ВЛЕВО и ВВЕРХ
  begin
    player.MoveOn(speed * 2, -speed * 2);
  end;
  if ((player.Intersect(block)) and (players <> block)) and (vkleft = true and vkdown = true)  then 
 // Если соприкосновение с блоком и нажата клавиша ВЛЕВО и ВНИЗ, тогда его откидывает на его же скорость ВПРАВО и ВВЕРХ
  begin
    player.MoveOn(-speed * 2, -speed * 2);
  end;
end;

// Основа
begin
  player := new PictureABC(Random(Window.Width - 100), Random(Window.Height - 100), 'player.bmp');
  block := new RectangleABC(1, 350, 100, 30);
  speed := 1;
  Window.Title := 'Передвигайте мышью объекты';
  while true do
  begin
    TimerProc;
    usewith;
    OnKeyDown := KeyDown;
    OnKeyUp := KeyUp;  
    sleep(5);
  end;
end.

Последний раз редактировалось Stilet; 12.12.2014 в 08:08.
Owletass вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с COM объектом. Son Общие вопросы Delphi 0 10.01.2013 23:01
слежение за объектом Giku Свободное общение 12 18.04.2012 15:20
Столкновение GaLiof Помощь студентам 5 25.11.2009 09:42
Как сделать грамотно проверку на столкновение с объектом Ckomoroh Общие вопросы Delphi 3 26.10.2009 02:38
Проблема с COM объектом resu654 Общие вопросы Delphi 2 25.05.2009 23:00