Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.05.2011, 00:45
Аватар для Antidelphik
Antidelphik Antidelphik вне форума
Новичок
 
Регистрация: 28.04.2011
Сообщения: 67
Репутация: 10
Вопрос флаг движущийся по периметру экрана

Доброй ночи или кто когда читает гостям темы =) нароооод, помогите пожалуйста, я вот не знаю, как нарисовать следующую штуку:
надо нарисовать российский флаг и чтобы он двигался по периметру экрана,нарисовать флаг я могу,НО, я его рисую полосками, но так, чтобы они выкладывались в российский флаг, следовательно если чё-то двигать, то там двигаться будет только одна полоска, остальные ж на месте стоять будут, вот я не знаю что делать, помогите а?
Ответить с цитированием
  #2  
Старый 02.05.2011, 00:50
Аватар для Antidelphik
Antidelphik Antidelphik вне форума
Новичок
 
Регистрация: 28.04.2011
Сообщения: 67
Репутация: 10
По умолчанию

и вообще я знаю только один метод как можно заставить анимашку двигаться,но он какой-то корявый(я его знаю в теории, на практике у меня плохо пока что реализуется) подскажите пожалуйста если кто что получше знает...и попроще =)
Ответить с цитированием
  #3  
Старый 02.05.2011, 00:56
SawA SawA вне форума
Новичок
 
Регистрация: 09.03.2011
Сообщения: 57
Репутация: 10
По умолчанию

Цитата:
Сообщение от Antidelphik
я его рисую полосками,
так нарисуй одну полоску но шоб там 3 цвета сразу были вчем проблема?
Ответить с цитированием
  #4  
Старый 02.05.2011, 01:05
Аватар для Antidelphik
Antidelphik Antidelphik вне форума
Новичок
 
Регистрация: 28.04.2011
Сообщения: 67
Репутация: 10
По умолчанию

так,а как так нарисовать? смотри, тут одна тонкость
Код:
 with Image1.Canvas do
  begin
   brush.Color:=clWhite;
   rectangle(0,Image1.Height div 2,Image1.Width div 2,0);
   brush.Color:=clBlue;
   rectangle(0,Image1.Height div 3,Image1.Width div 2,Height div 6);
   brush.Color:=clRed;
   rectangle(0,Image1.Height div 2,Image1.Width div 2,Height div 3);
  end;

видишь? я сначала задаю большой прямоугольник, потом на нем как бы рисую ещё 2 прямоугольничка, так если двигать, то двигаться то всё равно будет только 1 из них
Ответить с цитированием
  #5  
Старый 02.05.2011, 01:07
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Анимация всегда делается одинаково:
1) стираем все
2) рисуем в новом месте

Соответственно тут то же самое:
1) рисуем серый прямоугольник на форме чтоб все стереть
2) рисуем флаг в новых координатах.

и не пойму, что мешает рисовать по координатам X и Y и по таймеру их менять.

Не проще так?
Код:
   brush.Color:=clWhite;
   rectangle(X,Y,X+100,Y+200);
   brush.Color:=clBlue;
   rectangle(X+100,Y,X+200,Y+200);
   brush.Color:=clRed;
   rectangle(X+200,Y,X+300,Y+200);
или что-нибудь в этом духе?
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 02.05.2011 в 01:10.
Ответить с цитированием
  #6  
Старый 02.05.2011, 01:11
SawA SawA вне форума
Новичок
 
Регистрация: 09.03.2011
Сообщения: 57
Репутация: 10
По умолчанию

Кстати если тебе просто нужно создать эфект перемещения к примеру по форме то перемещай объект image можно через тотже таймер или к примеру по кнопкам
Ответить с цитированием
  #7  
Старый 02.05.2011, 01:13
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Если рисовать на компоненте TImage то можно вообще просто его двигать:
Код:
image1.left:=x;
image1.top:=y;

А если надо именно на экране, то можно двигать саму форму. Только надо её границы убрать чтоб не мешались.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 02.05.2011 в 01:16.
Ответить с цитированием
  #8  
Старый 02.05.2011, 01:16
Аватар для Antidelphik
Antidelphik Antidelphik вне форума
Новичок
 
Регистрация: 28.04.2011
Сообщения: 67
Репутация: 10
По умолчанию

ааааа, афигеть, я ничего этого не знаю =( в делфи чайник, но пытаюсь что-то сделать, а как через таймер кстати делать я не знаю =(((
Ответить с цитированием
  #9  
Старый 02.05.2011, 01:20
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

надо по экрану? тогда кидаешь на форму таймер, ставишь нужный интервал в миллисекундах, дважды тыкаешь и пишешь там код перемещения формы
Код:
Top:=Top+2;
Left:=Left+2;
это заставит двигаться по диагонали.
Чтобы по периметру надо продумать например флаги, чтобы ехал горизонтально, потом доехал до края - вертикально и т.д.
на заметку, пригодится: ширина экрана - Screen.Width. высота - Screen.Height.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #10  
Старый 02.05.2011, 01:27
Аватар для Antidelphik
Antidelphik Antidelphik вне форума
Новичок
 
Регистрация: 28.04.2011
Сообщения: 67
Репутация: 10
По умолчанию

эммм...я ещё в процессе варения, вот взгляните, я всё почистила, сделала заготовку на флаг, но его ещё не красила
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
 with Image1.Canvas do
  begin
   brush.Color:=clGray;
   pen.color:=clBlack;
   fillrect(Image1.ClientRect);
   rectangle(0,Image1.Height div 2,Image1.Width div 2,0);
   moveto(0,Image1.Height div 6);
   lineto(Image1.Width div 2,Image1.Height div 6);
   moveto(0,Image1.Height div 3);
   lineto(Image1.Width div 2,Image1.Height div 3);
  end;

end;
вот, дальше, чтобы его накрасить, вы говорите через таймер, а это как??
Ответить с цитированием
  #11  
Старый 02.05.2011, 01:33
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Так. Расставим все по местам.
Если нужно, чтобы флаг ездил по форме - то надо чистить и рисовать флаг.
Если это делать через TImage - то нужно один раз (например при старте формы) нарисовать на TImage картинку и двигать TImage. Чистить ничего не надо.
Если нужно, чтобы флаг ездил по экрану - то нужно один раз (например при старте формы) нарисовать на TImage картинку, и потом двигать форму. Чистить ничего не надо.

Это три разных случая. Если второй или третий, то надо взять код, приведенный мной выше, и везде X и Y заменить на 0. Это будет отрисовка флага на TImage.

Если третий случай, то по событию таймера (которое создается двойным кликом на компоненте TTimer) написать код для перемещения формы.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #12  
Старый 02.05.2011, 01:35
Аватар для Antidelphik
Antidelphik Antidelphik вне форума
Новичок
 
Регистрация: 28.04.2011
Сообщения: 67
Репутация: 10
По умолчанию

я на самом деле думала так: взяла просто растянула форму до размеров экрана, на неё во весь её размер поместила Image1 и планировала нарисовать на кусочке от Image1 флаг, а потом каким-то образом, который я ещё не до конца осмыслила, с помощью application.processmessages заставить этот кусочек двигаться по Image, как раз выглядело бы как-будто он по периметру экрана
Ответить с цитированием
  #13  
Старый 02.05.2011, 01:44
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

То есть флаг должен двигаться по форме. То, что вы описываете - первый случай.
На самом деле второй на мой взгляд проще в данном случае. Image и так является "кусочком" изображения на форме. Его не зачем растягивать на всё, лучше сделать по размерам флага.

Тогда надо двигать TImage.
Код:
image1.left:=image1.left+2;
image1.top:=image1.top+2;

Это по диагонали. По периметру наверно как-то так (за работоспособность не ручаюсь, пол второго ночи на дворе)
Код:
var vectX:integer=1;
     vectY:integer=0;
...
procedure TForm1.Timer1OnTimer(Sender:TObject)
begin
image1.left:=image1.left+2*vectX;
image1.top:=image1.top+2*vectY;

if image1.left + image1.width > ClientWidth then
begin
  image1.left := ClientWidth - image1.width;
  vectX := 0;
  vectY := 1;
end;
if image1.top + image1.height > ClientHeight then
begin
  image1.top := Clientheight - image1.height;
  vectX := -1;
  vectY := 0;
end;
if image1.left < 0 then
begin
  image1.left := 0;
  vectX := 0;
  vectY := -1;
end;
if image1.top < 0 then
begin
  image1.top := 0;
  vectX := 1;
  vectY := 0;
end;
end;

2*vectX: тут 2 - это шаг в пикселях. если надо быстрее - можно его увеличить.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #14  
Старый 02.05.2011, 01:44
Аватар для Antidelphik
Antidelphik Antidelphik вне форума
Новичок
 
Регистрация: 28.04.2011
Сообщения: 67
Репутация: 10
По умолчанию

то есть получается, мой флаг это картинка на Image1 и надо эту картинку просто двигать по всей Image, вот
Ответить с цитированием
  #15  
Старый 02.05.2011, 01:48
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

нет. флаг - Image1. Его надо двигать по Form1. Image нету.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:22.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025