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