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

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

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

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

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

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

как сделать так, чтобы кораблик доходил до определенного места и начинал двигаться обратно.
Вот код, когда он двигается нормально:
Код:
unit ship_;

interface

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

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

var
  Form1: TForm1;
  x,y: integer; // координаты корабля (базовой точки)

implementation

{$R *.DFM}

procedure Titanik(x,y: integer;   // координаты базовой точки
                  color: TColor); // цвет корабля
const
  dx = 5;
  dy = 5;
var
  buf: TColor;
begin
  with form1.canvas do
  begin
    buf:=pen.Color;   // сохраним текущий цвет
    pen.Color:=color; // установим нужный цвет
    // рисуем ...
    //  корпус
    MoveTo(x,y);
    LineTo(x,y-2*dy);
    LineTo(x+10*dx,y-2*dy);
    LineTo(x+11*dx,y-3*dy);
    LineTo(x+17*dx,y-3*dy);
    LineTo(x+14*dx,y);
    LineTo(x,y);
    // надстройка
    MoveTo(x+3*dx,y-2*dy);
    LineTo(x+4*dx,y-3*dy);
    LineTo(x+4*dx,y-4*dy);
    LineTo(x+13*dx,y-4*dy);
    LineTo(x+13*dx,y-3*dy);
    MoveTo(x+5*dx,y-3*dy);
    LineTo(x+9*dx,y-3*dy);
    // капитанский мостик
    Rectangle(x+8*dx,y-4*dy,x+11*dx,y-5*dy);
    // труба
    Rectangle(x+7*dx,y-4*dy,x+8*dx,y-7*dy);
    // иллюминаторы
    Ellipse(x+11*dx,y-2*dy,x+12*dx,y-1*dy);
    Ellipse(x+13*dx,y-2*dy,x+14*dx,y-1*dy);
    // мачта
    MoveTo(x+10*dx,y-5*dy);
    LineTo(x+10*dx,y-10*dy);
    // оснастка
    MoveTo(x+17*dx,y-3*dy);
    LineTo(x+10*dx,y-10*dy);
    LineTo(x,y-2*dy);
    pen.Color:=buf; // восстановим старый цвет карандаша
  end;
end;

// обработка сигнала таймера
procedure TForm1.Timer1Timer(Sender: TObject);
begin
   Titanik(x,y,form1.color); // стереть рисунок
   if x < Form1.ClientWidth
      then x := x+5
      else begin // новый рейс
        x := 0;
        y := Random(50) + 100;
      end;
   Titanik(x,y,clWhite);     // нарисовать в новой точке
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
     x:=0;
     y:=100;
     Form1.Color:=clNavy;
     Timer1.Interval := 50; // сигнал таймера каждые 50 мСек
end;

end.


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

______________
Название темы по правилам форума должно адекватно отражать суть решаемой задачи/проблемы.
В последующем, темы с названием наподобие "Задача на Делфи", "Помогите решить" и т.п. будут закрываться или удаляться,
а автор такой темы будет получать штрафные баллы.
Учтите это на будущее.

Модератор.

Последний раз редактировалось Serge_Bliznykov; 07.04.2011 в 22:22.
Alexa555 вне форума Ответить с цитированием
Старый 07.04.2011, 22:05   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
Tform1 =class(Tform)
private
  d: integer;

public
  procedure Afterconstruction; override;
end;

procedure Tform1.AfterConstruction;
begin
  d:=5;
end;
Код:
......
if x < Form1.ClientWidth
then x := x+d
else begin 
  d:=-d; //меняем направление движения
  x:=x+d;
end;
.............
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 07.04.2011, 23:14   #3
Alexa555
Пользователь
 
Регистрация: 03.04.2011
Сообщений: 16
По умолчанию

спасиб))))))
Alexa555 вне форума Ответить с цитированием
Старый 14.10.2012, 03:21   #4
koshkarjov
Пользователь
 
Аватар для koshkarjov
 
Регистрация: 31.01.2009
Сообщений: 26
По умолчанию

Здравствуйте! Извиняюсь за подъем старой темы

Тоже попалась такая задача, нашел эту тему.
Добавил в рабочий проект данный код и в итоге получилось вот что:

Что я сделал не так?

Код:
unit ship;
 
interface
 
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls;
 
type
  TForm1 = class(TForm)
    Timer: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure TimerTimer(Sender: TObject);
 
    private
      d: integer;
    public
      procedure Afterconstruction; override;
end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.DFM}
 
var
  x,y:integer; //координаты корабля (базовой точки)
 
procedure Tform1.AfterConstruction;
begin
  d:=5;
end;
 
//вычерчивает на поверхности формы кораблик или стирает его
procedure titanic(x,y: integer; mode: boolean); //x,y - координаты базовой точки кораблика. mode: True - нарисовать, False - стереть
const
  //Базовые точки кораблика находятся в узлах сетки, шаг которой определяет размер кораблика
  dx=5; //шаг сетки по X
  dy=5; //шаг сетки по Y
var
  //корпус и надстройку будем рисовать при помощи метода Polygon (описание метода тут: studarhiv.ru/dir/cat32/subj30/file2075/view2075/page2.html)
  p1:array[1..7]of TPoint; //координаты точек корпуса
  p2:array[1..8]of TPoint; //координаты точек надстройки
  pc,bc: TColor; //текущий цвет карандаша и кисти
begin
  if not mode then
  begin
    //стереть
    Form1.Canvas.Brush.Color:=clNavy;
    Form1.Canvas.Pen.Color:=clNavy;
    Form1.Canvas.Rectangle(x,y+1,x+17*dx,y-10*dy);
    Form1.Canvas.Brush.Color:=clNavy;
    //небо
    if y-10*dy < 80 then
      begin
        //конец мачты на фоне неба
        Form1.Canvas.Pen.Color:=clSkyBlue;
        Form1.Canvas.Brush.Color:=clSkyBlue;
        Form1.Canvas.Rectangle(x,y-10*dy,x+17*dx,80);
      end;
    exit;
  end;
  //рисуем сам кораблик
  with Form1.Canvas do
    begin
      pc:=Pen.Color; //сохраним текущий цвет карандаша
      bc:=Brush.Color; //и кисти
      Pen.Color:=clBlack; //установим нужный цвет
      Brush.Color:=clWhite;
      //рисуем корпус кораблика
      p1[1].X:=x;        p1[1].y:=y;
      p1[2].X:=x;        p1[2].Y:=y-2*dy;
      p1[3].X:=x+10*dx;  p1[3].Y:=y-2*dy;
      p1[4].X:=x+11*dx;  p1[4].Y:=y-3*dy;
      p1[5].X:=x+17*dx;  p1[5].Y:=y-3*dy;
      p1[6].X:=x+14*dx;  p1[6].Y:=y;
      p1[7].X:=x;        p1[7].Y:=y;
      Polygon(p1);
      //рисуем надстройку
      p2[1].X:=x+3*dx;   p2[1].Y:=y-2*dy;
      p2[2].X:=x+4*dx;   p2[2].Y:=y-3*dy;
      p2[3].X:=x+4*dx;   p2[3].Y:=y-4*dy;
      p2[4].X:=x+13*dx;  p2[4].Y:=y-4*dy;
      p2[5].X:=x+13*dx;  p2[5].Y:=y-3*dy;
      p2[6].X:=x+11*dx;  p2[6].Y:=y-3*dy;
      p2[7].X:=x+10*dx;  p2[7].Y:=y-2*dy;
      p2[8].X:=x+3*dx;   p2[8].Y:=y-2*dy;
      Polygon(p2);
      MoveTo(x+5*dx,y-3*dy);
      LineTo(x+9*dx,y-3*dy);
      //рисуем капитанский мостик
      Rectangle(x+8*dx,y-4*dy,x+11*dx,y-5*dy);
      //рисуем трубу
      Rectangle(x+7*dx,y-4*dy,x+8*dx,y-7*dy);
      //рисуем иллюминаторы
      Ellipse(x+11*dx,y-2*dy,x+12*dx,y-1*dy);
      Ellipse(x+13*dx,y-2*dy,x+14*dx,y-1*dy);
      //рисуем мачту
      MoveTo(x+10*dx,y-5*dy);
      LineTo(x+10*dx,y-10*dy);
      //рисуем оснастку
      Pen.Color:=clWhite;
      MoveTo(x+17*dx,y-3*dy);
      LineTo(x+10*dx,y-10*dy);
      LineTo(x,y-2*dy);
      Pen.Color:=pc; // восстановим старый цвет карандаша
    end;
end;
 
//обработка сигнала таймера
procedure TForm1.TimerTimer(Sender: TObject);
begin
  titanic(x,y,False); // стереть рисунок
  //if x < Form1.ClientWidth then x:=x+2 else begin x:=0; y:=Random(50)+100; end; //новый рейс
  if x < Form1.ClientWidth then x := x+d else begin d:=-d; x:=x+d; end;   //меняем направление движения
  titanic(x,y,True); //нарисовать в новой точке
end;
 
procedure TForm1.FormPaint(Sender: TObject);
begin
  //небо
  Canvas.Brush.Color:=clSkyBlue;
  Canvas.Pen.Color:=clSkyBlue;
  Canvas.Rectangle(0,0,ClientWidth,80);
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  Form1.DoubleBuffered:=true;
  x:=0; y:=80; //исходное положение парохода
  Form1.Color:=clNavy; //цвет моря
  Timer.Interval:=50; //сигнал таймера каждые 50 мСек
end;
 
end.
koshkarjov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кто с чего начинал justso Свободное общение 54 25.06.2010 12:09
нарисовать в паскале кораблик Lozergod Помощь студентам 28 13.11.2009 19:53
Как сделать чтобы файлы определенного типа открывались программой? Вадим Буренков Общие вопросы Delphi 3 07.07.2009 13:47
Нарисовать кораблик (Turbo Pascal) Сэм Помощь студентам 9 15.04.2009 19:46
преобразование десятичной дроби в обыкновенную и обратно, Delphi ИгорьОК Помощь студентам 4 04.04.2007 21:12