Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Ну вот, сочинил я для Вас некую вспомогательную игру. Вначале Ваш инопланетянин располагается в центре экрана (640х480). Нажатие клавиши "R" (в любом регистре, но с латинской раскладкой ("En")) заставляет его вертеться, клавиши "M" - двигаться туда, куда смотрит "голова". Нажатие любой другой символьной клавиши прерывает программу. Клавиши "M" и "R" можно удерживать. Одновременное их нажатие НЕ ПРЕДУСМОТРЕНО.
Кроме того, мне кажется, у меня массив точек и построение фигуры сделаны более компактно и рационально.
А уж всякие там траектории, стрелки и пр. - это Вы, пожалуйста, самостоятельно.
И еще одно - ВАЖНО! У меня DOS-экран, на котором рисование идет белым по черному. Если у Вас экран белый, а линии черные, то цвета в командах SetColor в процедуре нужно поменять местами.
Код:
Uses
CRT, Graph;
TYPE
PCoord=Array[1..19,1..2] of Integer;
CONST
a0:PCoord=((-25,20),(-25,-20),(25,-20),(25,0),(25,-10),
(28,-10),(28,-20),(30,-20),(30,-10),(35,-5),
(35,5),(30,10),(30,20),(28,20),(28,10),
(25,10),(25,0),(25,20),(-25,20));
VAR
a1,a2:PCoord;
X1,Y1,X2,Y2,Angle:WORD;
Ch:Char;
Shft:Byte;
grDriver:integer;
grMode:integer;
ErrCode: integer;
Procedure Draw_Fig(X_bef,Y_bef,Fi:Word; a_bef:PCoord; Sh:Byte;
var X_aft:WORD; var Y_aft:WORD; var a_aft:PCoord);
var
i:Byte;
Fi_rad:Real;
begin
Fi_rad:=Pi*Fi/180;
SetColor(Black);
for i:=1 to 18 do
Line(X_bef+a_bef[i,1],Y_bef+a_bef[i,2],
X_bef+a_bef[i+1,1],Y_bef+a_bef[i+1,2]);
If Sh<>0 then
begin
X_aft:=ROUND(X_bef+Sh*Cos(Fi_Rad));
Y_aft:=ROUND(Y_bef-Sh*Sin(Fi_Rad));
end
else
begin
X_aft:=X_bef;
Y_aft:=Y_bef;
end;
for i:=1 to 19 do
begin
a_aft[i,1]:=ROUND(a0[i,1]*Cos(Fi_Rad)+a0[i,2]*Sin(Fi_Rad));
a_aft[i,2]:=ROUND(-a0[i,1]*Sin(Fi_Rad)+a0[i,2]*Cos(Fi_Rad));
end;
SetColor(White);
for i:=1 to 18 do
Line(X_aft+a_aft[i,1],Y_aft+a_aft[i,2],
X_aft+a_aft[i+1,1],Y_aft+a_aft[i+1,2]);
end;
BEGIN
grDriver:=Detect;
InitGraph(grDriver, grMode, 'd:\bp\bgi' );
ErrCode:=Graphresult;
a1:=a0;
X1:=320;
Y1:=240;
Angle:=0;
Draw_Fig(X1,Y1,0,a1,0,X2,Y2,a2);
X1:=X2;
Y1:=Y2;
a1:=a2;
Repeat
Ch:=ReadKey;
If (Ch='m') or (Ch='M') then
Draw_Fig(X1,Y1,Angle,a1,4,X2,Y2,a2);
If (Ch='r') or (Ch='R') then
begin
Angle:=Angle+9;
Draw_Fig(X1,Y1,Angle,a1,0,X2,Y2,a2)
end;
X1:=X2;
Y1:=Y2;
a1:=a2;
Until (Ch<>'m') and (Ch<>'M') and (Ch<>'r') and (Ch<>'R');
CloseGraph;
END.
Обработку Graphresult я обычно не использую. Хотите - добавьте, тут нет проблем.
|