powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / к Game Developing'у
7 сообщений из 7, страница 1 из 1
к Game Developing'у
    #33936621
TopSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет, у меня такой вопрос. Нарисована карта города(текстура), разбита на районы (НЕ ВЫПУКЛЫЕ полигоны). У каждого района должно быть 3 состояния: defaul, pressed, highlightning. Вопрос 1: как отследить факт щелчка мыши не в прямоугольной, а сложной области?
Вопрос 2: как соответствующий многоугольник перекрасить, изменить на текстуре цвет(хранить 30 разных текстур для 10 районов?!). Такое в играх часто попадается, может кто сталкивался?
P.S. на всякий случай, игра пишется на движке Nebula2.
...
Рейтинг: 0 / 0
к Game Developing'у
    #33937954
Tracer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
BOOL IsInPolygonArea( POINT* pt, iCountPoint, int curX, int curY )
{
    int iCount =  0 ;

    for ( int i =  0 ; i < iCountPoint; i++ )
    {
	    int j = ( i+ 1  ) % iCountPoint;
	    int p1y = pt[i].y;
    	int p2y = pt[j].y;
	    int maxY,minY;

	    if ( p1y == p2y ) continue;

	    if ( p1y > p2y )
    	{
	    	maxY = p1y;
		    minY = p2y;
	    }
    	else
	    {
		     maxY = p2y;
		     minY = p1y;
	    }

	    if ( maxY == curY )
        {
            iCount++;
        }
	    else
        {
	        if ( minY == curY ) continue;
	        else
	        {
		        double t = (double)( curY - p1y ) / (double)( p2y - p1y );
		        
                if ( pt[i].x + t * ( pt[j].x - pt[i].x) >= curX )
                {
                    iCount++;
                }
	         }
        }
    }

    return ( iCount &  1  );
}
...
Рейтинг: 0 / 0
к Game Developing'у
    #33939319
TopSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемый Tracer, спасибо за код, это конечно вариант, но немного не тот. Полигон НЕ ВЫПУКЛЫЙ, значит при его интерполяции придется в массив POINT *pt занести просто чудовищное количество точек, и я не хотел бы быть тем, кто из будет считать:) а вопрос закраски - вообще труба...
...
Рейтинг: 0 / 0
к Game Developing'у
    #33940012
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
но ведь полигоны уже заданы? и описаны точками?
тогда создай отдельный битмап, заполненный этими полигонами. и каждый своим цветом.
и когда ведешь мышу - бери цвет пиксела из второго битмапа(полигольного) и по соответствию цвета можешь определить что да как.

насчет отрисовки подсвеченного.
бери прямоугольник в который вписывается подсвечиваемый прямоугольник и сканируй по полигольному битмапу. если цвет пиксела соответствует выбранному полигону - то на видимом битмапе изменяй цвет пиксела.
...
Рейтинг: 0 / 0
к Game Developing'у
    #33941314
Tracer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TopSpace
Алгоритм работает и на не выпуклых полигонах.
...
Рейтинг: 0 / 0
к Game Developing'у
    #33942154
TopSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Точками полигоны не заданы, все одной текстурой. Насчет определения по цвету - идея супер:) вот закрашивать по пикселям нехото... много вычислений, но видимо таки и придется. спасибо!
...
Рейтинг: 0 / 0
к Game Developing'у
    #33948437
TopSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тогда не создавая отдельного топика спрошу: есть кто-нибудь шарящий в эффеках для dx7 (файлы fx). Помогите найти ошибку в эффекте:

technique tEnvironment
{
pass p0
{
WorldTransform[0] = <Model>;
AlphaRef = <AlphaRef>;
CullMode = <CullMode>;
MaterialDiffuse = <MatDiffuse>;
MaterialEmissive = <MatEmissive>;
MaterialAmbient = {1.0, 1.0, 1.0, 1.0};

FVF = XYZ | NORMAL | TEX1;

TexCoordIndex[0] = 0;

TexCoordIndex[1] = CameraSpaceReflectionVector;

Sampler[0] = <DiffSampler>;
Sampler[1] = <EnvironmentSampler>;

// Base Texture
ColorArg1[0] = Texture;
AlphaOp[0] = SelectArg1;
AlphaArg1[0] = Texture;
ColorOp[0] = SelectArg1;

// Lighting
ColorOp[1] = Modulate;
ColorArg1[1] = Diffuse;
ColorArg2[1] = Current;
AlphaOp[1] = SelectArg1;

ColorOp[2] = Disable;
AlphaOp[2] = Disable;
}
}
Через MatDiffuse устанавливается цвет, но почему-то не работает!
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / к Game Developing'у
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]