Mod Скрипт для визуализации примитивов

Автор темы #1
Дата рег
19 Фев 2011
Сообщения
197
Симпатии
72
Классы для визуализации квадратов, гексов, прямоугольников без лишней возни обработкой\обновлением и прочим.

интерфейс iVisual, говорит о том что класс является классом визуализации
void Render( Orientation:: Point point ) - отрисовывает объект
void Render( Orientation:: Point point, Visual::color c ) - отрисовывает объект с цветом c
void AddChildren( Visual::iVisual children ) - добавляет наследника в очередь отрисовки
VisualPriority get_Priority( ) - приоритет отрисовки ( пока бесполезен )

дефайн типа uint для цветов - color

дефайн типа double для пометки того что передавать градус нужно в радианах - radian
double Pi - число Pi
radian get_Radian( double angle ) - перевод градусов в радиан. Пример Orientation::Radian[90.0f]
double get_Deg( radian r ) - перевод радианов в градусы. Пример Orientation:: Deg[ 0.71f ];
Point get_Mouse( ) - возвращает позицию мышки точкой;

класс Point - точка
rotate( radian angle ) - поворот точки на угол
double mod - модуль
double innerproduct( Point other ) - возвращает скалярное произведение
radian angle( Point other ) - возвращает угол между точками

Point ToRadian( ) - переводит координаты точки в радианы ( для случаев когда точка отражает угол, а не позицию )
Point ToDeg( ) - переводит коордианты точки из радианов в градусы
Point clone( ) - возвращает копию точки

класс Instance наследует Visual::iVisual - экземпляр примитива

Visual::color Color - дефолтный цвет примитива
double Angle - угол примитива

int[] Rotate( Visual::color&in c ) - возвращает данные для отрисовки через DrawPrimitive с поворотом Angle и цветом c
int[] GetData( Orientation:: Point&in point, Visual::color&in c ) - возвращает данные для отрисовки с поворотом Angle, цветом c, и с начальной точкой point
void Refresh( ) - обновляет данные

класс Poligon наследует Instance - многоугольник
void Build( uint angleCount, Orientation:: Point size, Orientation:: Point angle = null, bool radian = false, bool center = true ) - собирает многоугольник с количеством углов angleCount, размером size, внутренними углами angle. radian - указывает передается ли угол в радианах. center - указывает строить ли вокруг центра, или начальная точка должна быть левым верхним углом.

void Quadre( int size, Orientation:: Point angle = null, bool center = true ) - собирает квадрат
void Rectangle( int x, int y, Orientation:: Point angle = null, bool center = true ) - собирает прямоугольник
void Rectangle( Orientation:: Point size, Orientation:: Point angle = null, bool center = true ) - собирает прямоугольник
void Hexagonal( int x, int y, double angle, bool center = true ) - собирает гексагон
void Hexagonal( int x, int y, Orientation:: Point angle = null, bool center = true ) - собирает гексагон
void Hexagonal( Orientation:: Point size, double angle, bool center = true ) - собирает гексагон
void Hexagonal( Orientation:: Point size, Orientation:: Point angle = null, bool center = true ) - собирает гексагон

bool Fill - заливать ли фигуру цветом.
 

Вложения

Последнее редактирование:
Автор темы #2
Дата рег
19 Фев 2011
Сообщения
197
Симпатии
72
Пример отрисовывающий гексагон под курсором зеленым цветом, и соседние гексагоны белым цветом.
Код:
Visual::iVisual Cell;
double ZoomTemp;
 
void ModuleInit( )
{
  __EventRenderIface.SubscribeToLayer( 2, RenderMouse );
}
 
void DrawGameHexBorder( uint16 hx, uint16 hy, Visual::color color )
{
  int x = -1, y = -1;
 
  if( GetHexPos( hx, hy, x, y ) && GetMonitorHex( x, y, hx, hy ) )
	Cell.Render( Orientation::Point( x, y ), color );
}
 
void DrawGameHexBorder( uint16 hx, uint16 hy )
{
  int x = -1, y = -1;
 
  if( GetHexPos( hx, hy, x, y ) )
	Cell.Render( Orientation::Point( x, y ) );
}
 
void Build( )
{
  Primitive::Poligon poli = @Primitive::Poligon( );
  poli.Hexagonal( Orientation::Point( __MapHexWidth * 0.55 / __SpritesZoom, __MapHexHeight * 0.55 / __SpritesZoom ), 90.0f );
  poli.Color = Visual::color( COLOR_DGREEN );
  @Cell = @poli;
  ZoomTemp = __SpritesZoom;
}
 
void RenderMouse( uint )
{
  if( @Cell is null || __SpritesZoom != ZoomTemp )
	Build( );
 
  uint16 hx = 0, hy = 0;
  if( GetMonitorHex( __MouseX, __MouseY, hx, hy )  )
  {
	for( uint i = 0; i < 6; i++ )
	{
	  uint16 newX = hx, newY = hy;
	  MoveHexByDir( newX, newY, i, 1 );
	  DrawGameHexBorder( newX, newY, Visual::color( COLOR_GRAY ) );
	}
	DrawGameHexBorder( hx, hy );
  }
}
 
Последнее редактирование:
Автор темы #3
Дата рег
19 Фев 2011
Сообщения
197
Симпатии
72
Обновил, объединил все квадраты, гексагоны и прямоугольники в один класс, он может отрисовывать любой многоугольник, и даже круг ( визуально ).
screen.png
 
Последнее редактирование: