forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Основной форум (http://forum.boolean.name/forumdisplay.php?f=49)
-   -   Анимация "салют" (http://forum.boolean.name/showthread.php?t=16944)

Yadro 21.06.2012 23:02

Анимация "салют"
 
Помогите запрограммировать салют, вот как на картинке:
:rolleyes:

Yadro 21.06.2012 23:05

Ответ: Анимация "салют"
 
Попробывал переписать готовый код с байсика, но устественно ничего не из этого не вышло:

PHP код:

Program cube;
var 
i,dir1,ix,iy,vel,rnd:integer;
x: array[0..50of integer
y: array[0..50of integer
xv: array[0..50of integer
yv: array[0..50of integer
ox: array[0..50of integer
oy: array[0..50of integer


procedure main;

Begin
  
For i:= 0 to 50 do
  
begin
   x
[i]:= 0;
   
y[i]:= 0
   
dir1:=trunc(Rnd 6.28);
        
vel:=trunc(Rnd 1);
   
xv[i]:= trunc(Sin(dir1) * vel);
   
yv[i]:= trunc(Cos(dir1) * vel);
  
end;

  
ix:=Rnd 320;
  
iy:=Rnd 200;

  For 
i:= 0 to 50 do
  
begin
    drawLine
(ox[i] + ixoy[i] + iy,x[i] + ixy[i] + iy);
    
ox[i]:= x[i];
    
oy[i]:= y[i];

    
x[i]:= x[i] + xv[i];
    
y[i]:= y[i] + yv[i];

    
drawLine(x[i] + ixy[i] + iy,x[i] + ixy[i] + iy);
    
repaint;
        
delay(100);
    
end;
end;

begin
repeat
SetColor
(000);
FillRect(00GetWidthGetHeight);
setcolor(255,255,255);
main;
repaint;
delay(100);
until keyToAction(getKeyClicked) <> GA_NONE;
End


PassCall 25.06.2012 01:02

Ответ: Анимация "салют"
 
Ну а что тут создавать?

Делаешь массив точек, у каждой из которых есть параметры x, y и угол поворота.

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

Затем вспоминаешь алгебру, и двигаешь циклически точки.

???

PROFIT!!!

Igor 25.06.2012 20:25

Ответ: Анимация "салют"
 
да это же... вектора!

Mr_F_ 26.06.2012 00:53

Ответ: Анимация "салют"
 
Цитата:

потом разрезаем нашую прямую на кусочки по 10 и решаем систему уравнений, где первое - уравнение нашей прямой, а второе
sqr(x)+sqr(y)=sqr(m)
wtffff
достаточно сделать массив "частиц", где у каждой имеем позицию/скорость, позицию задаём в одной точке, скорость рандомную (в адекватных пределах), дальше обрабатываем массив - меняем позицию по имеющейся скорости+гравитации, затухаем скорость.
это подходит для точек, чтобы сделать салют из линий, можно хранить предыдущую позицию каждой частицы и тупо рисовать линию из предыдущей в новую.
если необходима одинаковая длина линий, то имея эти же две позиции, можно найти нормализованный вектор от одной к другой, через atan2 вычислить угол, повернуть точки линии через sin/cos им.

AntiRock 26.06.2012 01:44

Ответ: Анимация "салют"
 
Эмм все так описывают как будто это дважды два... ну так что код-то не покажете как составить?

PassCall 27.06.2012 00:56

Ответ: Анимация "салют"
 
А для чего голова нужна? Чтобы думать!

Голова+MidletPascalHelp+разжеванный алгоритм+руки=счастие.

Если Вас будут вести за ручку, Вы ничему не научитесь. Знать<>уметь.

AntiRock 27.06.2012 09:23

Ответ: Анимация "салют"
 
Цитата:

Сообщение от Yadro (Сообщение 230975)
Попробывал переписать готовый код с байсика, но устественно ничего не из этого не вышло

Кинь сюда исходник этого "фейерверка", попробую передедать под MP.
Я с basic`ом более менее лучше дружу, чем с тем же MP...

AntiRock 27.06.2012 10:19

Ответ: Анимация "салют"
 
Кстати нашел код под FreeBasic
Код:

Dim As Short x(50), y(50), xv(50), yv(50), ox(50), oy(50)
Dim As Short dir1,vel,tx,ty,c,done


  For t As Integer = 0 To 50
  x(t) = 0
  y(t) = 0
  dir1 = Rnd * 6.28: vel = Int(Rnd * 5) + 1
  xv(t) = Sin(dir1) * vel
  yv(t) = Cos(dir1) * vel
  Next
  '
  tx = Int(Rnd * 320)
  ty = Int(Rnd * 200)
  c = 31: done = 0

  Locate 1, 6: Print "Explosions by Andrew L. Ayers"
  Locate 23, 8: Print "Press any key to exit demo"

  Do
  For t As Integer = 0 To 50
    Line (ox(t) + tx, oy(t) + ty)-(x(t) + tx, y(t) + ty), 0
    ox(t) = x(t): oy(t) = y(t)

    x(t) = x(t) + xv(t)
    y(t) = y(t) + yv(t)

    Line -(x(t) + tx, y(t) + ty), Int(Rnd*15)
  Next
  c = c - 1: If c < 16 Then done = 1
  If Inkey <> "" Then done = 2
  Sleep 25
  Loop Until done
Loop Until done = 2

Начал переделывать под MP, дописал до середины и решил проверить - вышла фигня. Цикл for что ли не заканчивается? VB полегче этого mobilepascalя будет по мне...:)
Код:

Program explosions;
var vel,tx,ty,c,done,i,dir1:integer;
var x:array[0..49] of integer;
var y:array[0..49] of integer;
var xv:array[0..49] of integer;
var yv:array[0..49] of integer;
var ox:array[0..49] of integer;
var oy:array[0..49] of integer;
begin
  for i:= 1 to 50 do
    begin
    x[i]:=0;
    y[i]:=0;
    dir1:=trunc(random(1)*628);
    vel:=trunc(random(1)*5)+1;
    xv[i]:=trunc(sin(trunc(dir1))*vel);
    yv[i]:=trunc(cos(trunc(dir1))*vel);
    end;
tx:=trunc(random(1)*320);
ty:=trunc(random(1)*200);
c:=31;
done:=0;
drawtext('Explosions by Andrew L. Ayers',5,5);
drawtext('Press any key to exit demo',5,25);
repaint;
delay(5000);
end.

Цикл почему то не заканчивается, добавляю в него тогда такую строку "if i:=50 then break;" мпаскаль ругается и пишет, что это нелогично. Подскажите куда копать-то.

Yadro 27.06.2012 10:49

Ответ: Анимация "салют"
 
Antirock, Да я этот код и переделывал, а ошибка в том, что цикл должен начинаться с 0 до 49, как и массив.

AntiRock 27.06.2012 11:31

Ответ: Анимация "салют"
 
Надо бы сам оригинальный код затестить, может он нерабочий :-D
Опять не пашет, полностью переписал под MP.
Код:

Program explosions;
var vel,tx,ty,c,done,i,dir1:integer;
var x:array[0..50] of integer;
var y:array[0..50] of integer;
var x2:array[0..50] of integer;
var y2:array[0..50] of integer;
var xv:array[0..50] of integer;
var yv:array[0..50] of integer;
var ox:array[0..50] of integer;
var oy:array[0..50] of integer;

begin
  for i:= 0 to 50 do
    begin
    x[i]:=0;
    y[i]:=0;
    dir1:=trunc(random(1)*628);
    vel:=trunc(random(1)*5)+1;
    xv[i]:=trunc(sin(trunc(dir1))*vel);
    yv[i]:=trunc(cos(trunc(dir1))*vel);
    end;

tx:=trunc(random(1)*160);
ty:=trunc(random(1)*180);
c:=31;
done:=0;
drawtext('Explosions by Andrew L. Ayers',5,5);
drawtext('Press any key to exit demo',5,25);

  for i:= 0 to 50 do
    begin
    drawline(ox[i]+tx,oy[i]+ty,x[i]+tx,y[i]+ty);
    repaint;
    x[i]:=x[i]+xv[i];
    y[i]:=y[i]+yv[i];
    x2[i]:=x[i]+tx;
    y2[i]:=y[i]+ty;
    drawline(x2[i],y2[i],x[i]+tx,y[i]+ty);
    repaint;
    c:=c-1;
    end;

  repeat
  delay(100)
  until (c<16);
end.


Ввел новые переменные-массивы x2 и y2 для хранения координат точек, так как в оригинальном коде идет такая схема
Код:

line -(x,y), цвет
где "-" означает, что первая точка имеет координаты(x,y), а вторая точка будет последняя отрисованая, в нашем случае это x[i]+tx и y[i]+ty. Ну так где господа PassCall и Mr_F_, долго будете "включать умняка"? Может подскажете?

Yadro 27.06.2012 11:45

Ответ: Анимация "салют"
 
Надо бы ещё randomize перед каждым random.
Как доберусь до компа попробую запилить этот код.

"Ввел новые переменные-массивы x2 и y2 " получается, что рисуется точка:
drawline(x2[i],y2[i],x[i]+tx,y[i]+ty);

AntiRock 27.06.2012 13:12

Ответ: Анимация "салют"
 
Держи =) Дальше сам, а то мозги поплыли уже. Вроде легкий код, но эти массивы... Написал с нуля, сам.
Код:

Program explosions;
Var
  xc,yc,ugol,dlina,i:integer;
  x2:array[0..50] of integer;
  y2:array[0..50] of integer;
begin
dlina:=30;  ///устанавлием длину отрезков, которые будут отрисовываться и составлять наш вейерверк
xc:=getwidth/2;  ///устанавливаем "фейерверк" в центр экрана
yc:=getheight/2;    ///предыдущий комментарий

  for i:= 0 to 50 do
    begin
    x2[i]:=xc+trunc(sin(random(360))*dlina);  \\\придумываем угол, находим син\кос и находим координаты точек
    y2[i]:=yc+trunc(cos(random(360))*dlina);  \\\придумываем угол, находим син\кос и находим координаты точек
    drawline(xc,yc,x2[i],y2[i]);  \\\выводим в буфер
  end;

repaint;  \\\выводим на экран
delay(5000);  \\\ждем
end.


AntiRock 27.06.2012 14:38

Ответ: Анимация "салют"
 
Собрался с мозгами доделал код:
Код:

Program explosions;
Var
  dlina,i,skorost:integer;
  x2:array[0..50] of integer;
  y2:array[0..50] of integer;
  x:array[0..50] of integer;
  y:array[0..50] of integer;
begin

dlina:=10;
skorost:=5;
  for i:= 0 to 50 do
    begin
    x[i]:=getwidth/2;
    y[i]:=getheight/2;
    end;
  for i:= 0 to 50 do
    begin
    x2[i]:=x[1]+trunc(sin(random(360))*dlina);
    y2[i]:=y[1]+trunc(cos(random(360))*dlina);
    drawline(x[i],y[i],x2[i],y2[i]);
  end;
repeat
repaint;
delay(skorost);
  for i:= 0 to 50 do
    begin
    setcolor(255,255,255);
    drawline(x[i],y[i],x2[i],y2[i]);
    setcolor(0,0,0);
    x[i]:=2*x2[i]-x[i];
    y[i]:=2*y2[i]-y[i];
    drawline(x[i],y[i],x2[i],y2[i]);
    end;
repaint;
delay(skorost);
  for i:= 0 to 50 do
    begin
    setcolor(255,255,255);
    drawline(x[i],y[i],x2[i],y2[i]);
    setcolor(0,0,0);
    x2[i]:=2*x[i]-x2[i];
    y2[i]:=2*y[i]-y2[i];
    drawline(x[i],y[i],x2[i],y2[i]);
    end;
repaint;
until (false);

end.


Немного подправить код, как нужно и все.

Yadro 27.06.2012 14:40

Ответ: Анимация "салют"
 
:4to: ОГРОМНОЕ СПАСИБО!!!

AntiRock 27.06.2012 14:46

Ответ: Анимация "салют"
 
Тебе спасибо, мне хоть нашлось чем заняться :-D
Заодно навыки свои повысил в MP, только начал его изучать.
Правда тебе еще надо сделать фейерверк разноцветным и т.д., а в моем коде черт ногу сломит...Не завидую)
Завтра может продолжу работу над этим кодом, сделаю чтобы фейерверк был разноцветным, сделаю чтобы он гасил скорость со временем и разберусь почему он квадратный(не сильно заметно но все же, видать из-за округления...)

Yadro 27.06.2012 15:11

Ответ: Анимация "салют"
 
Код подогнал под себя:
PHP код:

Program explosions;
Var
  
dlina,i,skorost:integer;
  
x2:array[0..50of integer;
  
y2:array[0..50of integer;
  
x1:array[0..50of integer;
  
y1:array[0..50of integer;
 

procedure main;

begin

repeat
  
for i:= 0 to 50 do
    
begin
    setcolor
(255,255,255);
    
drawline(x1[i],y1[i],x2[i],y2[i]);
    
setcolor(0,0,0);
    
x1[i]:=2*x2[i]-x1[i];
    
y1[i]:=2*y2[i]-y1[i];
    
x2[i]:=2*x1[i]-x2[i];
    
y2[i]:=2*y1[i]-y2[i];
    
drawline(x1[i],y1[i],x2[i],y2[i]);
    
end;
repaint;
delay(skorost);
until (false);

end;

begin
dlina
:=20;
skorost:=50;
for 
i:= 0 to 50 do
  
begin
  x1
[i]:=getwidth/2;
  
y1[i]:=getheight/2;
  
x2[i]:=x1[i]+trunc(sin(random(360))*dlina);
  
y2[i]:=y1[i]+trunc(cos(random(360))*dlina);
  
drawline(x1[i],y1[i],x2[i],y2[i]);
  
end;

main;
end


или вот:
PHP код:

Program explosions;
Var
  
dlina,i,skorost:integer;
  
x2:array[0..50of integer;
  
y2:array[0..50of integer;
  
x1:array[0..50of integer;
  
y1:array[0..50of integer;

begin
dlina
:=20;
skorost:=50;
for 
i:= 0 to 50 do
  
begin
  x1
[i]:=getwidth/2;
  
y1[i]:=getheight/2;
  
x2[i]:=x1[i]+trunc(sin(random(360))*dlina);
  
y2[i]:=y1[i]+trunc(cos(random(360))*dlina);
  
drawline(x1[i],y1[i],x2[i],y2[i]);
  
end;

//***********************************
repeat
  
for i:= 0 to 50 do
    
begin
    setcolor
(255,255,255);
    
drawline(x1[i],y1[i],x2[i],y2[i]);
    
setcolor(0,0,0);
    
x1[i]:=2*x2[i]-x1[i];
    
y1[i]:=2*y2[i]-y1[i];
    
x2[i]:=2*x1[i]-x2[i];
    
y2[i]:=2*y1[i]-y2[i];
    
drawline(x1[i],y1[i],x2[i],y2[i]);
    
end;
repaint;
delay(skorost);
until (false);
//***********************************
end


AntiRock, у тебя получается много ненужных repaint, циклов и тп. Рисуются белые линии, их надо бы убрать. И ещё раз большое спасибо.:)

AntiRock 27.06.2012 15:18

Ответ: Анимация "салют"
 
Спасибо за замечания. Как раз занимаюсь кодом, добавил параметр "кол-во" и сделал чтобы скорость регулировалась не "чем меньше, тем быстрее" да и за цветом уже занялся. Сейчас сделаю чтобы можно было выбрать цвет фона. =)

Yadro 27.06.2012 15:46

Ответ: Анимация "салют"
 
Вот так-то лучше)
PHP код:

Program explosions;
Var
  
dlina,i,skorost:integer;
  
si:array[0..50of integer;
  
co:array[0..50of integer;
  
x2:array[0..50of integer;
  
y2:array[0..50of integer;
  
x1:array[0..50of integer;
  
y1:array[0..50of integer;
 


begin
dlina
:=20;
skorost:=10;
for 
i:= 0 to 50 do
  
begin
  x1
[i]:=getwidth/2;
  
y1[i]:=getheight/2;
  
si[i]:=random(360);
  
co[i]:=random(360);
  
x2[i]:=x1[i]+trunc(sin(si[i])*dlina);
  
y2[i]:=y1[i]+trunc(cos(co[i])*dlina);
  
drawline(x1[i],y1[i],x2[i],y2[i]);
  
end;
repaint;
delay(skorost);

//***********************************
repeat
SetColor
(255255255);
FillRect(00GetWidthGetHeight);
  for 
i:= 0 to 50 do
    
begin
    x1
[i]:=x2[i];
    
y1[i]:=y2[i];
    
x2[i]:=x1[i]+trunc(sin(si[i])*dlina);
    
y2[i]:=y1[i]+trunc(cos(co[i])*dlina);
    
setcolor(0,0,0);
    
drawline(x1[i],y1[i],x2[i],y2[i]);
    
end;
    
repaint;
delay(skorost);
until (false);
//***********************************
end


AntiRock 27.06.2012 15:51

Ответ: Анимация "салют"
 
Ну да, лучше, намного) Сейчас тогда цветной фейерверк буду по твоему коду делать :super:

Yadro 27.06.2012 16:00

Ответ: Анимация "салют"
 
Надобы ещё, чтобы скорость зависила не от delay.

AntiRock 27.06.2012 16:04

Ответ: Анимация "салют"
 
Вот он, вот он фейерверк моей мечты!!!
Код:

Program explosions;
Var
  dlina,i,skorost,koli4estvo:integer;
  si:array[1..50] of integer;
  co:array[1..50] of integer;
  x2:array[1..50] of integer;
  y2:array[1..50] of integer;
  x1:array[1..50] of integer;
  y1:array[1..50] of integer;
  r:array[1..50] of integer;
  g:array[1..50] of integer;
  b:array[1..50] of integer;
begin

dlina:=10;  ///от 3 до 20
skorost:=150;  /// от 1 до 150
koli4estvo:=20; /// от 1 до 50
//įIJнимание все параметры должны быть записаны целыми числами!

for i:= 1 to koli4estvo do
  begin
  x1[i]:=getwidth/2;
  y1[i]:=getheight/2;
  si[i]:=random(360);
  co[i]:=random(360);
  x2[i]:=x1[i]+trunc(sin(si[i])*dlina);
  y2[i]:=y1[i]+trunc(cos(co[i])*dlina);
  drawline(x1[i],y1[i],x2[i],y2[i]);
  end;

repaint;
delay(150/skorost);

repeat
SetColor(255, 255, 255);
FillRect(0, 0, GetWidth, GetHeight);
  for i:= 1 to koli4estvo do
    begin
    r[i]:=random(255);
    g[i]:=random(255);
    b[i]:=random(255);
    setcolor(r[i],g[i],b[i]);
    x1[i]:=x2[i];
    y1[i]:=y2[i];
    x2[i]:=x1[i]+trunc(sin(si[i])*dlina);
    y2[i]:=y1[i]+trunc(cos(co[i])*dlina);
    drawline(x1[i],y1[i],x2[i],y2[i]);
    end;

repaint;
delay(100/skorost);
until (false);
end.


Вот только лучше будет вынести рэндом цвета из repeat, так как много времени уходит только на то, чтобы дать каждой переменной каждой линии цвет...считай 3*50 и rnd

PassCall 27.06.2012 16:18

Ответ: Анимация "салют"
 
Вложений: 2
Вот еще вариант.

С эффектом "Блюр" сильно тормозно, можно и без него :В

Вложение 17098
Вложение 17099

AntiRock 27.06.2012 16:22

Ответ: Анимация "салют"
 
Сейчас займусь тем чтобы начальная скорость распространения была большая и постепенно гасла, что он не был бесконечным и не улетал за края, а так же что бы он под "силой притяжения" смещался вниз по оси y.
По идее должно получится реалистичнее чем в исходном коде, от которого мы отталкивались.

PassCall, красиво реализовано)

Yadro 27.06.2012 16:31

Ответ: Анимация "салют"
 
Вообще мне нужен был взрыв... :-D А "под "силой притяжения" смещался вниз по оси y" уж очень геморойно.

Кстати проблема осталась в том, что скорость зависит от длины линии. А ещё как сделать чтоб цвет линий менял прозрачность, те со временем линии исчезали?

AntiRock 27.06.2012 16:39

Ответ: Анимация "салют"
 
Ты игру что ли делаешь? Если, то этот код не годится, надо чтобы взрыв составляли спрайты, и тем более нужно будет учитывать физику, учитывать столкновения и т.д.)) Ну а если тебе просто украсить текст тогда этого достаточно ;) В MP если мне не изменяет память нет инструментов для работы с прозрачностью, нужно раскуривать библиотеки.

AVL 27.06.2012 16:39

Ответ: Анимация "салют"
 
Год назад PassCall предлагал устроить конкурс по мидлет паскалю - http://forum.boolean.name/showthread.php?t=14612 . Тогда, правда, ничего не получилось. А тут сейчас, я вижу, уже 3 участника точно есть (я четвертым буду). Мб оформим это все-таки именно как конкурс?

Yadro 27.06.2012 16:40

Ответ: Анимация "салют"
 
Мне нужно для игры. Да всё нормально, у меня кубик, когда врезается должен взрываться)

AntiRock 27.06.2012 16:45

Ответ: Анимация "салют"
 
Цитата:

Сообщение от AVL (Сообщение 231637)
Год назад PassCall предлагал устроить конкурс по мидлет паскалю - http://forum.boolean.name/showthread.php?t=14612 . Тогда, правда, ничего не получилось. А тут сейчас, я вижу, уже 3 участника точно есть (я четвертым буду). Мб оформим это все-таки именно как конкурс?

Какой из меня конкурент? =D Я только начал изучать MP, даже толком не знаю, что такое двумерный массивы и зачем они, а тут конкурс...Ну попробовать можно, у меня с математикой отлично все, да и делать нечего днем(перешел в 11-ый, каникулы). Игру для себя делаешь что ли от скуки? :-D Кубик, да еще и таким образом взрываться будет.

Yadro 27.06.2012 16:45

Ответ: Анимация "салют"
 
Цитата:

Сообщение от Yadro (Сообщение 231635)
А ещё как сделать чтоб цвет линий менял прозрачность, те со временем линии исчезали?

А может использовать спрайты ввиде пиксельных квадратиков и уже потом менять прозрачность.

Yadro 27.06.2012 16:47

Ответ: Анимация "салют"
 
Цитата:

Сообщение от AntiRock (Сообщение 231639)
Игру для себя делаешь что ли от скуки? :-D Кубик, да еще и таким образом взрываться будет.

Клон вот этой игры The Impossible Game

AntiRock 27.06.2012 17:00

Ответ: Анимация "салют"
 
Так как для прозрачности нужно курить либы сделал так
PHP код:

Program explosions;
Var
  
dlina,i,skorost,koli4estvo,trololo:integer;
  
si:array[1..50of integer;
  
co:array[1..50of integer;
  
x2:array[1..50of integer;
  
y2:array[1..50of integer;
  
x1:array[1..50of integer;
  
y1:array[1..50of integer;
  
r:array[1..50of integer;
  
g:array[1..50of integer;
  
b:array[1..50of integer;
begin

dlina
:=10;  ///от 3 до 20.
skorost:=150;   /// от 1 до 150.
koli4estvo:=35/// от 1 до 50.
trololo:=300;   ///ограничитель фейерверка. Хоть он и квадратный, но не столь заметно.
//внимание все параметры должны быть записаны целыми числами!

for i:= 1 to koli4estvo do
  
begin
  x1
[i]:=getwidth/2;
  
y1[i]:=getheight/2;
  
si[i]:=random(360);
  
co[i]:=random(360);
  
x2[i]:=x1[i]+trunc(sin(si[i])*dlina);
  
y2[i]:=y1[i]+trunc(cos(co[i])*dlina);
  
drawline(x1[i],y1[i],x2[i],y2[i]);
  
end;

repaint;
delay(150/skorost);
setClip(x1[1]-trololo/2,y1[1]-trololo/2,trololotrololo);


repeat
SetColor
(255255255);
FillRect(00GetWidthGetHeight);
  for 
i:= 1 to koli4estvo do
    
begin
    r
[i]:=random(255);
    
g[i]:=random(255);
    
b[i]:=random(255);
    
setcolor(r[i],g[i],b[i]);
    
x1[i]:=x2[i];
    
y1[i]:=y2[i];
    
x2[i]:=x1[i]+trunc(sin(si[i])*dlina);
    
y2[i]:=y1[i]+trunc(cos(co[i])*dlina);
    
drawline(x1[i],y1[i],x2[i],y2[i]);
    
drawline(x1[i]-1,y1[i]-1,x2[i]-1,y2[i]-1);
    
end;

repaint;
delay(100/skorost);
until (false);
end


жаль что setclip есть только квадратный:mad:

PassCall 27.06.2012 17:04

Ответ: Анимация "салют"
 
не совсем понял, зачем там клиппинг. Ну а если горишь желанием получить "неквадратный" клиппинг - юзай маску прозрачности. Это, конечно, не совсем клиппинг, но, потанцевав с бубном, с помощью маски можно делать удивительные вещи.

AntiRock 27.06.2012 17:11

Ответ: Анимация "салют"
 
Чтобы фейерверк этот самый не был бесконечным. Сейчас покопаюсь в либах, может что придумаю.

Yadro 27.06.2012 17:14

Ответ: Анимация "салют"
 
Цитата:

Сообщение от AntiRock (Сообщение 231644)
Чтобы фейерверк этот самый не был бесконечным. Сейчас покопаюсь в либах, может что придумаю.

Нужно просто ограничить x, y: если x больше n или меньше n2 то x=n или x=n2 соответственно.

PassCall 27.06.2012 19:24

Ответ: Анимация "салют"
 
Ято бы не был бесконечным? Как это? То есть, что бы не улетал за пределы экрана? Или чтобы "угасал"?

AntiRock 27.06.2012 19:45

Ответ: Анимация "салют"
 
Вообще хотелось бы чтобы когда один из отрезков долетит до краев окружности(центр которой - "начало" фейерверка) он бы начал резко набирать прозрачность, таким образом поидее был бы эффект исчезновения, но к сожаления такого стандартного инструментария с прозрачностью нету.

Igor 27.06.2012 19:47

Ответ: Анимация "салют"
 
Господа, используйте массив записей, а не кучу разных.

PassCall 27.06.2012 20:19

Ответ: Анимация "салют"
 
Разве что налаживать поферх экрана картинку, у которой в центре дырка, и края сглаженные. Опять же - маска прозрачности :В Можно соорудить программным путем

AntiRock 27.06.2012 21:27

Ответ: Анимация "салют"
 
Мне кто-нибудь поможет вот с этим Это =)

AntiRock 28.06.2012 18:12

Ответ: Анимация "салют"
 
От нечего делать решил поработать над этим кодом. Оптимизировал, убрал циклический rnd цвета, так как жрет много процессорного времени и нам этого не нужно, все массивы собрал в один ,благодаря чему, дальнейшая работа с кодом просто невозможна, добавил таймер.
=)
PHP код:

Program explosions;
Var
  
dlina,i,m,t,skorost,koli4estvo,rndx,rndy:integer;
  
p:array[1..9,1..50of integer;
begin
dlina
:=30;  ///от 3 до 20.
skorost:=100;   /// от 1 до 100.
koli4estvo:=50/// от 1 до 50.
t:=2;   ///время(в секундах), через которое наш фейерверк умирает.
//внимание все параметры должны быть записаны целыми числами!

rndx:=random(getwidth);
rndy:=random(getheight);
for 
i:= 1 to koli4estvo do
begin
p
[1,i]:=random(360);
p[2,i]:=random(360);
p[3,i]:=random(255);
p[4,i]:=random(255);
p[5,i]:=random(255);
p[6,i]:=rndx;
p[7,i]:=rndy;
end;
repeat
SetColor
(000);
FillRect(00GetWidthGetHeight);
for 
i:= 1 to koli4estvo do
begin
setcolor
(p[3,i],p[4,i],p[5,i]);
p[6,i]:=(p[8,i]+p[6,i])/2;
p[7,i]:=(p[9,i]+p[7,i])/2;
p[8,i]:=p[6,i]+trunc(sin(p[1,i])*dlina);
p[9,i]:=p[7,i]+trunc(cos(p[2,i])*dlina);
drawline(p[6,i],p[7,i],p[8,i],p[9,i]);
drawline(p[6,i]-1,p[7,i]-1,p[8,i]-1,p[9,i]-1);
end;
repaint;
m:=m+100/skorost;
delay(100/skorost);
until (m>t*50);
end


Yadro 28.06.2012 19:15

Ответ: Анимация "салют"
 
PHP код:

Program explosions
Var 
  
dlina,i,t,skorost,koli4estvo,rndx,rndy:integer
  
p:array[1..9,1..50of integer;
  
begin 
dlina
:=30;  ///от 3 до 20. 
skorost:=1;   /// от 1 до 150. 
koli4estvo:=50/// от 1 до 50. 
t:=3;   ///время(в секундах), через которое наш фейерверк умирает. 
//внимание все параметры должны быть записаны целыми числами! 

rndx:=20+random(getwidth-40); 
rndy:=20+random(getheight-40); 
for 
i:= 1 to koli4estvo do 
begin 
p
[1,i]:=random(360); //угол
p[2,i]:=random(360); //угол
p[3,i]:=random(255); //цвет
p[4,i]:=random(255); //цвет
p[5,i]:=random(255); //цвет
p[6,i]:=rndx//1я точка x
p[7,i]:=rndy//1я точка y
p[8,i]:=p[6,i]+trunc(sin(p[1,i])*dlina); //2я точка x
p[9,i]:=p[7,i]+trunc(cos(p[2,i])*dlina); //2я точка y
end

repeat 
SetColor
(000); 
FillRect(00GetWidthGetHeight); 
for 
i:= 1 to koli4estvo do 
begin 
setcolor
(p[3,i],p[4,i],p[5,i]); 
drawline(p[6,i],p[7,i],p[8,i],p[9,i]); 
drawline(p[6,i]-1,p[7,i]-1,p[8,i]-1,p[9,i]-1); 
p[6,i]:=(p[8,i]+p[6,i])/2
p[7,i]:=(p[9,i]+p[7,i])/2
p[8,i]:=p[6,i]+trunc(sin(p[1,i])*dlina); 
p[9,i]:=p[7,i]+trunc(cos(p[2,i])*dlina); 
end;

if 
keyToAction(getKeyClicked) = GA_FIRE then //если нажать 5 перерисовка
begin
rndx
:=random(getwidth);
rndy:=random(getheight); 
for 
i:= 1 to koli4estvo do
 
begin
    p
[1,i]:=random(360); 
    
p[2,i]:=random(360); 
    
p[3,i]:=random(255); 
    
p[4,i]:=random(255); 
    
p[5,i]:=random(255); 
    
p[6,i]:=rndx
    
p[7,i]:=rndy
    
p[8,i]:=p[6,i]+trunc(sin(p[1,i])*dlina); 
    
p[9,i]:=p[7,i]+trunc(cos(p[2,i])*dlina); 
 
end;
end;

repaint
delay(100/skorost); 
until false

end


AntiRock 29.06.2012 07:11

Ответ: Анимация "салют"
 
Украсить текст сойдет)
PHP код:

Program explosions;
Var
  
dlina,i,m,t,skorost,koli4estvo,rndx,rndy,Rf,Gf,Bf:integer;
  
p:array[1..9,1..300of integer;
begin
Rf
:=0;   ///цвет фона R(0-255)
Gf:=38;   ///цвет фона G(0-255)
Bf:=100  ///цвет фона B(0-255)
dlina:=30;  ///от 3 до 50.
skorost:=100;   /// от 1 до 100(по сути мы не ускоряем, а уменьшаем задержку).
koli4estvo:=300/// от 1 до 300(чем больше число, тем больше времени уходит на обработку массивов!!).
t:=3;   ///время через которое наш фейерверк умирает и появляется новый(работает коряво, не могу сообразить как сделать=)).
//внимание все параметры должны быть записаны целыми числами!

repeat
rndx
:=random(getwidth);   ///рэндомно выбираем на экране координату X для эпицентра фейерверка.
rndy:=random(getheight);   ///рэндомно выбираем на экране координату Y для эпицентра фейерверка.
for i:= 1 to koli4estvo do
begin
p
[1,i]:=random(360);   ///задаем рэндомно угол.
p[2,i]:=random(360);   ///задаем рэндомно угол.
p[3,i]:=random(255);   ///задаем цвет R.
p[4,i]:=random(255);   ///задаем цвет G.
p[5,i]:=random(255);   ///задаем цвет B.
p[6,i]:=rndx;   ///перемещаем координаты X.
p[7,i]:=rndy;   ///перемещаем координаты Y.
p[8,i]:=0;   ///присваеваем координате X, второй точки значение 0.
p[9,i]:=0;   ///присваеваем координате Y, второй точки значение 0.
end;
repeat
SetColor
(RfGfBf);   ///цвет фона
FillRect(00GetWidthGetHeight);   ///очищаем экран для генерации новых линий.
for i:= 1 to koli4estvo do
begin
setcolor
(p[3,i],p[4,i],p[5,i]);   ///присваеваем цвет.
p[6,i]:=(p[8,i]+p[6,i])/2;   ///расчитываем координату X.
p[7,i]:=(p[9,i]+p[7,i])/2;   ///расчитываем координату Y.
p[8,i]:=p[6,i]+trunc(sin(p[1,i])*dlina);   ///расчитываем координату X2.
p[9,i]:=p[7,i]+trunc(cos(p[2,i])*dlina);   ///расчитываем координату Y2.
drawline(p[6,i],p[7,i],p[8,i],p[9,i]);   ///чертим линию по заданным координатам.
drawline(p[6,i]-1,p[7,i]-1,p[8,i]-1,p[9,i]-1);   ///чертим линию по (заданным координатам-1), таким образом они становятся толще, визуально.
end;
repaint;   ///выводим на экран наше художество.
m:=m+100/skorost;   ///считаем время.
delay(100/skorost);   ///пауза.
until (m>t*50);   ///прерываем цикл.
m:=0;   ///сбрасываем время.
until (false);
end


Думаю с этого кода хватит, столько времени ему уделили...

Yadro 29.06.2012 10:50

Ответ: Анимация "салют"
 
Цитата:

Сообщение от AntiRock (Сообщение 231819)
Думаю с этого кода хватит, столько времени ему уделили...

Да уж с него точно хватит. А draw line надо чтобы был первым в цикле, чтоб салют летел из одной точки)


Часовой пояс GMT +4, время: 02:11.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot