Форум: "Игры";
Текущий архив: 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.033 c