Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

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

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

Код:

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 в 09:08.
Owletass вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


10:30.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru