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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.04.2011, 23:17   #1
Alexa555
Пользователь
 
Регистрация: 03.04.2011
Сообщений: 16
По умолчанию Графика в Delphi - чтобы самолет делал мертвую петлю

Как сделать, чтобы самолет делал мертвую петлю, что надо изменить в коде??? или добавить??
Код:
unit aplane_;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, StdCtrls, Buttons;


type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Image1: TImage;
    procedure FormActivate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;



implementation

{$R *.DFM}
var
  Back, bitmap, Buf : TBitMap;  // фон, картинка, буфер
  BackRct : TRect; // область фона, которая должна быть
                   // восстановлена из буфера
  BufRct: Trect;   // область буфера, которая используется для
                   // восстановления фона

  x,y:integer;  // текущее положение картинки
  W,H: integer; // размеры картинки

procedure TForm1.FormActivate(Sender: TObject);
begin
  // создать три объекта - битовых образа
  Back := TBitmap.Create;    // фон
  bitmap := TBitmap.Create;  // картинка
  Buf := TBitmap.Create;     // буфер

  // загрузить и вывести фон
  Back.LoadFromFile('factory.bmp');
  Form1.Image1.canvas.Draw(0,0,Back);

  // загрузить картинку, которая будет двигаться
  bitmap.LoadFromFile('aplane.bmp');
  // определим "прозрачный" цвет
  bitmap.Transparent := True;
  bitmap.TransParentColor := bitmap.canvas.pixels[1,1];

  // создать буфер для сохранения копии области фона,
  // на которую накладывается картинка
  W:= bitmap.Width;
  H:= bitmap.Height;
  Buf.Width:= W;
  Buf.Height:=H;
  Buf.Palette:=Back.Palette; // Чтобы обеспечить соответствие палитр !!
  Buf.Canvas.CopyMode:=cmSrcCopy;
  // определим область буфера, которая будет использоваться
  // для восстановления фона
  BufRct:=Bounds(0,0,W,H);

  // начальное положение картинки
  x := -W;
  y := 20;

  // определим сохраняемую область фона
  BackRct:=Bounds(x,y,W,H);
  // и сохраним ее
  Buf.Canvas.CopyRect(BufRct,Back.Canvas,BackRct);
end;

// обработка сигнала таймера
procedure TForm1.Timer1Timer(Sender: TObject);
begin
     // восстановлением фона (из буфера) удалим рисунок
     Form1.image1.canvas.Draw(x,y,Buf);

     x:=x+2;
     if x>form1.Image1.Width then x:=-W;

     // определим сохраняемую область фона
     BackRct:=Bounds(x,y,W,H);
     // сохраним ее копию
     Buf.Canvas.CopyRect(BufRct,Back.Canvas,BackRct);

     // выведем рисунок
    Form1.image1.canvas.Draw(x,y,bitmap);
end;

// завершение работы программы
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 // освободим память, выделенную
 // для хранения битовых образов
 Back.Free;
 bitmap.Free;
 Buf.Free;
end;

end.


___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 08.04.2011 в 08:15.
Alexa555 вне форума Ответить с цитированием
Старый 08.04.2011, 07:34   #2
JonMagon
Форумчанин
 
Регистрация: 07.04.2011
Сообщений: 152
По умолчанию

мммм... где-то я подобное видел, вроде стандартными средствами никак, там нет функций переворачивания изображения.
JonMagon вне форума Ответить с цитированием
Старый 08.04.2011, 08:07   #3
Alexa555
Пользователь
 
Регистрация: 03.04.2011
Сообщений: 16
По умолчанию

а по другому никак нельзя, хоть на подобие???
Alexa555 вне форума Ответить с цитированием
Старый 08.04.2011, 08:26   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

можно "по-всякому".
но задачка не примитивная...

1) изображение в Image можно поворачивать на любой угол...
(долго и муторно. и, при некоторых углах изображение будет выглядеть просто жутко (будут изломы)
как поворачивать - смотри, например, тут
(там, правда углы 90, 180, 270 градусов. Но если уловить идею и написать свою функцию преобразования массива точек - то можно переделать на любой угол.

2) можно нарисовать МНОГО-МНОГО картинок (чем больше - тем плавнее будет движение) (поворачивая в графическом редакторе изображение) - потом выводить их в зависимости от координаты (угла). Получится анимация.

3) самолётик можно рисовать графическими примитивами прямо на Canvas - тогда при рисовании можно пересчитывать координаты через sin(угол), cos(угол)...

какой способ выбрать - решать Вам...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 08.04.2011, 08:41   #5
Alexa555
Пользователь
 
Регистрация: 03.04.2011
Сообщений: 16
По умолчанию

а можно что-нибудь сделать с самолетиком?чтобы он сначала нормально летел, а назад в перевернутом виде?

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


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Графика в Delphi - чтобы кораблик доходил до определенного места и начинал двигаться обратно Alexa555 Помощь студентам 3 14.10.2012 03:21
Как построить петлю магнитного гистерезиса в Delphi 1408sunwell23 Общие вопросы Delphi 2 17.12.2010 22:14
Кто-нибудь делал сайт в Ukoz? lilu1559 Помощь студентам 11 15.02.2010 20:49
Самолет,описывающий "Петлю Нестерова" Promagnum Помощь студентам 0 13.12.2009 14:47