Показать сообщение отдельно
Старый 26.02.2011, 13:13   #3 (permalink)
Vladimir_S
Специалист
 
Регистрация: 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 я обычно не использую. Хотите - добавьте, тут нет проблем.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070