Форум: "Игры";
Текущий архив: 2005.03.13;
Скачать: [xml.tar.bz2];
ВнизГенерация 2d карт Найти похожие ветки
← →
D-Man (2004-12-15 17:42) [0]Подскажите кто знает, как случайно разделить имеющийся кусок квадратного 2д пространства на несколько кривых территорий заданного размера. Чтобы в результате получилось нечто вроде географической карты. Такое есть например в игре Генерал (http://newgame.agava.ru). И вообще подскажите где можно найти материалы по поводу генераторов карт для игр.
← →
D-Man (2004-12-15 20:32) [1]Чуваки, подскажите хотябы как нарисовать один остров случайной формы, но заданного размера!
← →
A22 (2004-12-15 20:57) [2]построй вписанный в квадрат N-угольник правильный и добавь некоторый рандом в позицию каждой вершины. Ну, может, алгоритм не остановится на простом рандоме, но попробуй оттталкиваться от этого
← →
D-Man (2004-12-15 21:39) [3]Хорошо бы сделать чтобы его площадь была точно рассчитанной, а так она может получиться с некоторым разбросом
← →
тт (2004-12-16 16:12) [4]Есть ли на эту тему статьи?
← →
Mihey_temporary © (2004-12-16 17:23) [5]
> Хорошо бы сделать чтобы его площадь была точно рассчитанной,
> а так она может получиться с некоторым разбросом
Построй правильный (или не правильный) N-угольник нужной тебе площади. Подойдёт и квадрат. Затем выбирай случайно какую-нибудь секущую прямую, для простоты параллельную одной из осей, и сдвигай вдоль неё половинки. И так много раз.
← →
TButton © (2004-12-16 18:32) [6]берешь байтовую матрицу NxN
заполняешь нулями
чтобы получить случайную фигуру площади M (M<N*N)
в случайной точке ставишь единицу
далее
for i:=1 to m-1 do
составляешь список ячеек граничащих с теми в которых единица
содержащих ноль
выбираешь из списка случайную и присваиваешь ей единицу
а могу и исходник подкинуть
прога генерировала архипелаг
счас найду
← →
TButton © (2004-12-16 18:39) [7]ага нашел
procedure TForm1.SpeedButton1Click(Sender: TObject);
// собсно выбор случайной точки
function RandomPoint:TPoint;
var
pl, rl: array of TPoint;
i, j, k: integer;
s: boolean;
begin
// preparing list of all water sectors
SetLength(pl, 0);
for i:=0 to 24 do
for j:=0 to 24 do
begin
if map[i, j]=0 then
begin
SetLength(pl, high(pl)+2);
pl[high(pl)].x:=i;
pl[high(pl)].y:=j;
end;
end;
// nothing - leaving
if high(pl)=-1 then exit;
// skaning list
SetLength(rl, 0);
for k:=0 to high(pl) do
begin
s:=false;
for i:=pl[k].x-1 to pl[k].x+1 do
for j:=pl[k].y-1 to pl[k].y+1 do
if (not(((i<0)or(i>24))or((j<0)or(j>24))))and((i=pl[k].x)or(j=pl[k].y))and(map[i, j]=1)
then s:=true;
if s then
begin
SetLength(rl, high(rl)+2);
rl[high(rl)]:=pl[k];
end;
end;
k:=round(random*high(rl));
result:=rl[k];
end;
// функция определяет суммарное количество "водных" клеток
// на карте
function WaterCount: integer;
var
i, j: integer;
begin
result:=0;
for i:=0 to 24 do
for j:=0 to 24 do
if map[i, j]=0 then
result:=result+1;
result:=round(result/625*100);
end;
var
wc, i, j, n: integer;
p: TPoint;
begin
// очистка
for i:=0 to 24 do
for j:=0 to 24 do
map[i, j]:=0;
// случайное количество исходных точек
n:=5+random(5);
for i:=0 to n do
map[random(25), random(25)]:=1;
// количество воды 0-100
wc:=TrackBar1.Position;
while WaterCount>wc do
begin
p:=RandomPoint;
map[p.x, p.y]:=1;
end;
table.Repaint;
end;
← →
D-Man (2004-12-16 19:24) [8]
> Построй правильный (или не правильный) N-угольник нужной
> тебе площади. Подойдёт и квадрат. Затем выбирай случайно
> какую-нибудь секущую прямую, для простоты параллельную одной
> из осей, и сдвигай вдоль неё половинки. И так много раз.
Спасибо, вроде уловил.
TButton © (16.12.04 18:39) [7]
офигенно! щас проверю!
Я вообще вот к чему спрашивал. Не так давно, вдохновившись безумной идеей начал делать 2d игрушку. Жанр Action с элементами RPG. Геймплей мне видится очень похожим на Дьябло. Основная мысль в том, чтобы сделать ее по настоящему случайной, случайный мир, случайные квесты и события, а не иллюзия случайности, как во многих играх. Так вот я застрял на случайном разбиении тайловой карты на зоны (трава, грязь, вода, ...), чтобы в итоге получилась более или менее натуральная местность, наверняка кто-то видел или знает подходящий алгоритм на эту тему.
Кстати специально для этой игрухи я разобрался в том каким образом во 2м War Craft"е рисуется карта, т.е. сочетания травы с землей, деревьев с травой итд и реализовал это в коде. Кому
интересно могу просветить только не побрезгайте сабжем пожалуйста.
← →
D-Man (2004-12-16 20:43) [9]TButton © (16.12.04 18:39) [7]
Блин никак не скомпилирую, можешь мне эту прогу целиком на мыло кинуть?
← →
rts111 © (2004-12-16 20:52) [10]Вот нашел.
Копирую модуль целиком.
Если немного переделать получится генератор.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
pic1:tbitmap;
a:array of pwordarray;
s:integer=400;
p1:integer=300000;
p2:integer=27;
st:integer=1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var n,i,j,x,y:integer;
begin
for n:=1 to p2 do
a[st+random(s-2*st),st+random(s-2*st)]:=random($ffffff);
for n:=1 to p1 do
begin
x:=st+random(s-2*st);
y:=st+random(s-2*st);
if a[y,x]>83
then begin
for j:=y-st to y+st do
for i:=x-st to x+st do
if a[j,i]=0 then a[j,i]:=a[y,x]+1;
end;
end;
canvas.Draw(0,0,pic1);
end;
procedure TForm1.FormCreate(Sender: TObject);
var j,i:integer;
begin
pic1:=tbitmap.Create;
pic1.Width:=s;
pic1.Height:=s;
pic1.PixelFormat:=pf15bit;
setlength(a,s);
for j:=0 to s-1 do a[j]:=pic1.ScanLine[j];
for j:=0 to s-1 do
for i:=0 to s-1 do
a[j,i]:=0;
pic1.Canvas.Brush.Color:=$300000;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
pic1.Free;
end;
end.
← →
D-Man (2004-12-16 21:31) [11]TButton
Разобрался с принципом. Вроде похоже. А еще если размер общей территории сделать побольше, а генерируемую землю ~10%, то получается похоже на реку, только с очень большими территориями (где-то 400х400) уже не очень хорошо.
rts111 © (16.12.04 20:52) [10]
аксес виолейшн на строке
a[st+random(s-2*st),st+random(s-2*st)]:=random($ffffff);
расскажи саму идею
← →
rts111 © (2004-12-16 22:10) [12]В инспекторе может быть забыл
form1 oncreate назначить процедуру procedure FormCreate(Sender: TObject);
← →
D-Man (2004-12-16 22:25) [13]
> В инспекторе может быть забыл
> form1 oncreate назначить процедуру procedure FormCreate(Sender:
> TObject);
Точно! Спасибо, интересная штука...
← →
wiz © (2004-12-16 22:40) [14]не совсем то, что ты просил, но...
Однажды развлекался идеей построения случайной географической карты местности (леса/поля/степи итп...)
в результате одной из проб получился следующий алгоритм:
http://gnar.fatal.ru/land_create.zip
в .pas даны краткие комментарии что происходит
в самой программе выставляем чекбоксы и давим поочерёдно на кнопки (Place, Progress, Smooth...)
штука далека от идеала, но может быть натолкнёт тебя на какие-нибудь интересные мысли?
← →
wiz © (2004-12-16 22:42) [15]PS: (совсем забыл) размер zip"а - 8 Kb
← →
D-Man (2004-12-17 00:22) [16]2 wiz
Я как раз состряпал почти тоже самое, но все равно спасибо
← →
wiz © (2004-12-17 11:07) [17]2 D-Man: не за что :)
Страницы: 1 вся ветка
Форум: "Игры";
Текущий архив: 2005.03.13;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.042 c