Войти
Исаев ВикторСтатьи

Генерация симметричной карты относительно центра для любого количества игроков

Автор:

Всем привет.
Сегодня я расскажу о том, как я делал алгоритм для генерации карты с симметричным расположением ресурсов. Порой это очень важно, чем внешний вид.
Например для киберспортивных игр. Но сейчас не об этом.



Писалось все на Xors3D для души. Но я думаю адаптировать для своих целей не составит труда.
Итак. Начнем.
R1 = 100
R2 = 150
R3 = 50
R4 = 150

NumOfPlayers = 5
NumOfPoints = 200
AngleStep# = 360*1./NumOfPlayers 
R1 - радиус на котором располагаются игроки.
R2 - сторона (половина стороны) квадрата/куба (2д/3д) в котором случайно располагаются наши ресурсы.
R3 - расстояние от центра координат, на котором отсекаются ресурсы.
R4 - расстояние от центра координат, после которого отсекаются ресурсы.
Смысл в том, чтобы оставить для одного игрока сектор ресурсов, снять с него матрицу и продублировать ее на остальных.

NumOfPoints  - кол-во игроков.
AngleStep - угол (ширина) нашего сектора.

0 | Генерация симметричной карты относительно центра для любого количества игроков

Создаем наши ресурсы в квадрате около первого центра.

;Generate other object
n = 0
For i = 0 To NumOfPoints 
  Obj.Obj = New Obj
  Obj\X = R1*Sin(AngleStep*n)+Rnd(-R2 ,R2 )
  Obj\Y = R1*Cos(AngleStep*n)+Rnd(-R2 ,R2 )
Next

1 | Генерация симметричной карты относительно центра для любого количества игроков

Удаляем лишние точки по радиусам.

;Delete misspoints
For Obj.Obj = Each Obj
  If Distance (0,0,Obj\X, Obj\Y) < R3 Or Distance (0,0,Obj\X, Obj\Y) > R4 Then
    Delete Obj
  End If
Next

2 | Генерация симметричной карты относительно центра для любого количества игроков

Удаляем лишние точки по углам.

;Revers transformation and delete
For Obj.Obj = Each Obj
  Yes = 0
  R5 = Distance(0,0,Obj\X,Obj\Y)
  If ASin((Obj\X)*1./R5) >= AngleStep*n - AngleStep/2 And ASin((Obj\X)*1./R5) <= AngleStep*n + AngleStep/2 And ACos((Obj\Y)*1./R5) >= AngleStep*n - AngleStep/2 And ACos((Obj\Y)*1./R5) <= AngleStep*n + AngleStep/2 Then
    Yes  = 1
  End If
  If Yes = 0 Then Delete Obj
Next

3 | Генерация симметричной карты относительно центра для любого количества игроков

Делаем матрицу с имеющихся точек.

;Create Matrix
For Obj.Obj = Each Obj
  Mat.Mat = New Mat
  Mat\X = Obj\X
  Mat\Y = Obj\Y
Next

Делаем копии. Для вычисления угла рекомендую использовать арктангенс - мне больше понравилось, хотя дело вкуса.

;Make Copies
For i = 1 To NumOfPlayers-1 
  For Mat.Mat = Each Mat
    R5 = Distance(0,0,Mat\X,Mat\Y)
    Obj.Obj = New Obj
    Sub_angle# = ATan(Mat\X*1./Mat\Y)
    Obj\X =  R5*Sin(AngleStep*i + Sub_angle)
    Obj\Y =  R5*Cos(AngleStep*i  + Sub_angle)
  Next
Next

4 | Генерация симметричной карты относительно центра для любого количества игроков

Остальной код - это отрисовка этих квадратиков и линий, а также сохранение скриншота в файл. Ничего интересного:)
Линии представлены лишь для наглядности.



Еще одна серия картинок (8 игроков).
0 | Генерация симметричной карты относительно центра для любого количества игроков
1 | Генерация симметричной карты относительно центра для любого количества игроков
2 | Генерация симметричной карты относительно центра для любого количества игроков
3 | Генерация симметричной карты относительно центра для любого количества игроков
4 | Генерация симметричной карты относительно центра для любого количества игроков

Надеюсь данная статья поможет всем кто занимается играми, а также мне в поиске работы (каким-либо образом) :).
Спасибо за внимание!

#генерация, #карта, #симметричные карты

19 июля 2014

Комментарии [4]