Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 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.037 c
8-1101371582
П7
2004-11-25 11:33
2005.03.13
Перегрузка Flash


3-1108469267
first_may
2005-02-15 15:07
2005.03.13
Тип данных BLOB


9-1103291787
elf_123
2004-12-17 16:56
2005.03.13
GLUTь


1-1109548060
Flash_chnu
2005-02-28 02:47
2005.03.13
Динамическая компонента TImage


14-1108810765
Сергей Г
2005-02-19 13:59
2005.03.13
Компонент TF1Book





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский