Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2004.10.31;
Скачать: [xml.tar.bz2];

Вниз

Алгоритм молнии...   Найти похожие ветки 

 
[dRake]   (2003-11-18 17:39) [0]

Кто нибудь делал молнию в игрушках? Поделитесь plz алгоритмом, а то что-то ничего путного придумать не могу ;) Варианты типа "рандомные точки и линии между ними" и "сходи на DELPHIGFX" н предлагать т.к. в первом случае получается довольно тупо >:), а на GFX"e в примере используется куча треугольников, что слишком тормознуто...  З.Ы. Юзаю PowerDraw, так что с различными эффектами вывода no problem ;)


 
miek ©   (2003-11-18 19:01) [1]

В известном примере Яна Хорна (ссылку не помню, но на его сайте должно быть) молнии это просто размытые линии более-менее случайного синего цвета. Скорее всего, ничего заковыристого в молнии нет. Ну, если не считать вспышки на заднем плане сцены.


 
miek ©   (2003-11-18 19:05) [2]

Если в 2D, то алгоритм такой может быть:
взять отрезок, мысленно разбить на X равных (для простоты) частей, запомнить точки разбиения, затем к каждой из них добавить рандомное смещение по обеим координатам. Начертить полупрозрачную ломаную через них.
Потом добавить еще меньший рандом ко всем координатам и начертить еще одну ломаную (более прозрачную) поверх старой. И так далее.


 
Mihey ©   (2003-11-18 22:39) [3]

miek всё верно говорит. В Ulead PhotoImpact есть эффект молнии, который имеет такие параметры, как ветвистость, толщина, величина свечения, изломанность. Так что ты на верном пути.


 
NailMan ©   (2003-11-20 11:48) [4]

Это делается через фракталы, типа как в Максе(по крайней маре в 2.0) был такой эффект.


 
MeF88 ©   (2003-11-20 14:11) [5]


> Это делается через фракталы, типа как в Максе(по крайней
> маре в 2.0) был такой эффект.

У мя статья есть, правда написана она Juster~-ом и будет размещена на моём сайте. Рассматривается два метода - фрактальный и один Rect с alpha-blend текстурой молнии, как это делалось в Warcraft3. Второй метод проще и эффективнее.
> З.Ы. Юзаю PowerDraw, так что с различными эффектами вывода
> no problem ;)

На самом деле там столько проблем...


 
cyborg ©   (2003-11-20 17:01) [6]

Сомневаюсь я, что в варике молния есть прямоугольник с текстурой.


 
MeF88 ©   (2003-11-20 17:25) [7]


> Сомневаюсь я, что в варике молния есть прямоугольник с текстурой.

Есть даже скрин, доказывающий это - там четко видно перекрытие этого recta с поверхностью land-а.


 
cyborg ©   (2003-11-20 17:27) [8]

Не понял, какое перекрытие там видно? Есественно молния на треугольниках основана, поэтому может утопать в земле, но это не значит, что молния есть прамоугольник (два треугольника).


 
MeF88 ©   (2003-11-20 17:32) [9]


> Не понял, какое перекрытие там видно? Есественно молния
> на треугольниках основана, поэтому может утопать в земле,
> но это не значит, что молния есть прамоугольник (два треугольника).

Я бы скрин привел - тогда бы ты понял, но здесь фотки выкладывать нельзя. Давай на мыло скину?


 
cyborg ©   (2003-11-20 17:37) [10]

Кидай.


 
[dRake]   (2003-11-21 04:18) [11]

>размещена на моём сайте.

Кинь ссылочку plz


 
MeF88 ©   (2003-11-21 11:55) [12]


> Кинь ссылочку plz

> будет размещена
Он у меня на стадии заполнения щас. Вот заполню и выложу на хостинге...


 
OSokin   (2004-04-05 19:50) [13]

Люди, я делаю проще - по двум осям. Привожу для полноэкранной программы.

var
 x,y:integer;
begin
 x:=random(Screen.Width+1);
 for y:=0 to Screeen.Height do begin
   Form1.Canvas.Pixels[x,y]:=clWhite;
   x:=x+((random(15) div 5)-1);
 end;
end;


 
TButton ©   (2004-04-05 23:56) [14]

re 13
это что?

вообще, miek сразу правильный ответ дал. я в свое время такую беду делал. разбиваем отрезок на n равных частей, придумываем рэндомное смещение (+-20% общей длины) и перпедикулярно отрезку смещаем точку. и т.д. и т.п.


 
Кулясов ©   (2004-04-06 00:41) [15]

Вот на Паскале, суть ясна:

Uses graph,crt;
Var gd,gm,mx,my,s,ugol,ougol,i:integer;

procedure flash(num,siz,x,y,x1,y1:integer);
var
numsiz,px,py:integer;
mnk,xoffs,yoffs,nx,ny,ugol,ugolw,i,o:integer;
begin
px:=x;
py:=y;
mnk:=1;
numsiz:=round(sqrt(sqr(x1 - x) + (y1 - y)) / num);
xoffs:=round((x1-x)/num);
yoffs:=round((y1-y)/num);
for i:=1 to num - 1 do
begin
 nx:=px+xoffs+(random(siz)*mnk);
 ny:=py+yoffs+(random(siz)*mnk*-1);
 setcolor(white);
 line(px,py,nx,ny);
 setcolor(lightblue);
 line(px+1,py+1,nx+1,ny+1);
 line(px-1,py-1,nx-1,ny-1);
 px:=nx;py:=ny;
 if mnk=1 then mnk:=-1 else mnk:=1;
end;
end;

Begin
gd:=detect;
InitGraph(gd,gm,"");
setcolor(1);
ugol:=1;
randomize;
for i:=1 to 1100 do
begin
 for s:=1 to 9 do
 begin
  mx:=round(cos((s*40)*pi/180)*150)+300;
  my:=round(sin((s*40)*pi/180)*150)+200;
  flash(39,10,mx,my,300,200);
 end;
cleardevice;
if keypressed then break;
end;
CloseGraph;
readkey;
End.


 
Leon ©   (2004-04-06 15:39) [16]

Вот так криво я делал молнию на канвасе (правда это статическая молния)
 TMol = record
   Pokolenie: Word;
   x0, y0, x,y      : integer;
   child1,
   child2   : PMol;
 end;

 TMolnia = class (TObject)
   Source: pMol;
   limit, minl, maxl, phi1, phi2, PrOfDie: integer;
   function CreateSegment(Parent: pMol): pMol;
 public
   constructor Create(x0, y0: integer;  {начало молнии}
                      _limit: byte = 5; {max число поколений}
                      _minl: byte = 35; _maxl: byte = 35; {l=lenght}
                      _phi1: integer = 45; _phi2: integer = 135;  {phi=phi}
                      _PrOfDie: byte = 20); {живучесть ветвей}
   destructor Destroy; override;

   procedure Draw(C: TCanvas; color: TColor; speed: integer);
 end;

implementation

{ TMolnia }

constructor TMolnia.Create(x0, y0: integer; _limit, _minl, _maxl: byte; _phi1,
 _phi2: integer; _PrOfDie: byte);
begin
 limit   := _limit;
 minl    := _minl;
 maxl    := _maxl;    {l=длина}
 phi1    := _phi1;
 phi2    := _phi2;    {phi=угол}
 PrOfDie := _PrOfDie; {антиживучесть ветвей}

 new(Source);
 Source^.x0        := x0;
 Source^.y0        := y0;
 Source^.x         := x0;
 Source^.y         := y0;
 Source^.Pokolenie := 0;
 Source^.child2    := nil;
 new(Source^.child1);
 Source^.child1    := CreateSegment(Source);
 {усё!}
end;

function TMolnia.CreateSegment(Parent: pMol): pMol;
var phi, l: real;
begin
 new(Result);
 Result^.x0 := Parent^.x;
 Result^.y0 := Parent^.y;
 phi := phi1 + Random((phi2-phi1)+1);
 l := minl + Random((maxl-minl)+1);
 Result^.x := Parent^.x + Round(l*cos(phi*Pi/180));
 Result^.y := Parent^.y + Round(l*sin(phi*Pi/180));
 Result^.Pokolenie := Parent^.Pokolenie + 1;

 if (Result^).Pokolenie >= limit then
   begin
     Result^.Child1 := nil;
     Result^.Child2 := nil;
     Exit; {конец}
   end;

 if((Result^).Pokolenie>2)and(Random(100)<PrOfDie)then
   result^.Child1 := nil
 else
   begin
     new(result^.child1);
     Result^.Child1 := CreateSegment(Result);{рекурсия!!!!}
   end;

 if{((Result^).Pokolenie>1)and}(Random(100)<PrOfDie)then
   result^.Child2 := nil
 else begin
   new(Result^.Child2);
   Result^.Child2 := CreateSegment(Result);{рекурсия!!!!}
 end;
end;

destructor TMolnia.Destroy;
 procedure KillSegment(Mol: pMol);
 begin
   if Mol.child1 <> nil then
     KillSegment(Mol.child1);
   if Mol.child2 <> nil then
     KillSegment(Mol.child2);
   dispose(Mol);
 end;
begin
 KillSegment(Source);
end;

procedure TMolnia.Draw(C: TCanvas; color: TColor; speed: integer);
 procedure DrawMol(Mol: pMol);
 var x, y: integer;
 begin
   if Mol = nil then
     Exit;
//    Sleep(Speed);
   x := Mol^.x0;//Mol^.Parent^.x;
   y := Mol^.y0;//.Parent^.y;
   C.MoveTo(x, y);
   x := Mol^.x;
   y := Mol^.y;
   if Mol.Pokolenie = 1 then
     C.Pen.Width := 4
   else if Mol.Pokolenie = 2 then
     C.Pen.Width := 2
   else
     C.Pen.Width := 1;
   C.LineTo(x, y);
   if Mol.child1<>nil then
     DrawMol(Mol.child1);
   if Mol.child2<>nil then
     DrawMol(Mol.child2);
 end;
begin
 C.Pen.Color := color;
 DrawMol(Source.child1);
end;


 
MeF88 ©   (2004-04-27 16:27) [17]

http://www.mirgames.ru/ - Статья "Фрактальные молнии"...

P.S
Сайт заполняю, но жутко медленно...


 
OSokin ©   (2004-06-24 18:21) [18]

TButton, а что ты еще хочешь с ученика, перешедшего этим летом в 9 класс???


 
GrayFace ©   (2004-06-24 19:06) [19]

OSokin   (05.04.04 19:50) [13]
>random(15) div 5
А чем random(3) не устраивает?
>TButton, а что ты еще хочешь с ученика, перешедшего этим летом в 9 класс???
Молнию.


 
ПсихЪ_клон   (2004-06-25 00:27) [20]

OFFTOPIC:

> MeF88 ©   (27.04.04 16:27) [17]

Только вчера читал, хотел ссылкой поделиться, но ты меня опередил... (:


 
OSokin ©   (2004-06-25 20:52) [21]

Вот я и выложил такой пример, какой мог. Извини, GrayFace, но я не знаю никаких фрактало и тому подобного.


 
GrayFace ©   (2004-06-27 03:20) [22]

Извини, OSokin, я тоже. Зато я знаю, что Random(3)=random(15) div 5.


 
OSokin ©   (2004-07-02 17:18) [23]

Просто число получается более случайным.


 
TButton   (2004-07-02 17:30) [24]

re 18
я ничего не хочу, когда я чего-то хочу я обращаюсь с просьбой.

re 23
случайность приблизительно одинаковая, неча выпендериваться 8)


 
OSokin ©   (2004-07-02 18:46) [25]

Ну, по привычке, еще с тех пор, когда начал писать на паскале и бейсике...
А так - дал что мог. Смотри [21]



Страницы: 1 вся ветка

Форум: "Игры";
Текущий архив: 2004.10.31;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.039 c
14-1097077567
Leksiy
2004-10-06 19:46
2004.10.31
Глюк


3-1096992665
Виктор
2004-10-05 20:11
2004.10.31
Номер порта


14-1097251913
ОлегЪ
2004-10-08 20:11
2004.10.31
Проект!


3-1096613230
anat
2004-10-01 10:47
2004.10.31
ORACLE 10g


14-1097560485
Holy
2004-10-12 09:54
2004.10.31
NEC 2510a





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский