Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / к Game Developing'у / 7 сообщений из 7, страница 1 из 1
23.08.2006, 10:39
    #33936621
TopSpace
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
к Game Developing'у
Всем привет, у меня такой вопрос. Нарисована карта города(текстура), разбита на районы (НЕ ВЫПУКЛЫЕ полигоны). У каждого района должно быть 3 состояния: defaul, pressed, highlightning. Вопрос 1: как отследить факт щелчка мыши не в прямоугольной, а сложной области?
Вопрос 2: как соответствующий многоугольник перекрасить, изменить на текстуре цвет(хранить 30 разных текстур для 10 районов?!). Такое в играх часто попадается, может кто сталкивался?
P.S. на всякий случай, игра пишется на движке Nebula2.
...
Рейтинг: 0 / 0
23.08.2006, 15:34
    #33937954
Tracer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
к Game Developing'у
Код: 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
24.08.2006, 10:26
    #33939319
TopSpace
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
к Game Developing'у
Уважаемый Tracer, спасибо за код, это конечно вариант, но немного не тот. Полигон НЕ ВЫПУКЛЫЙ, значит при его интерполяции придется в массив POINT *pt занести просто чудовищное количество точек, и я не хотел бы быть тем, кто из будет считать:) а вопрос закраски - вообще труба...
...
Рейтинг: 0 / 0
24.08.2006, 13:15
    #33940012
alex_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
к Game Developing'у
но ведь полигоны уже заданы? и описаны точками?
тогда создай отдельный битмап, заполненный этими полигонами. и каждый своим цветом.
и когда ведешь мышу - бери цвет пиксела из второго битмапа(полигольного) и по соответствию цвета можешь определить что да как.

насчет отрисовки подсвеченного.
бери прямоугольник в который вписывается подсвечиваемый прямоугольник и сканируй по полигольному битмапу. если цвет пиксела соответствует выбранному полигону - то на видимом битмапе изменяй цвет пиксела.
...
Рейтинг: 0 / 0
24.08.2006, 19:12
    #33941314
Tracer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
к Game Developing'у
TopSpace
Алгоритм работает и на не выпуклых полигонах.
...
Рейтинг: 0 / 0
25.08.2006, 10:18
    #33942154
TopSpace
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
к Game Developing'у
Точками полигоны не заданы, все одной текстурой. Насчет определения по цвету - идея супер:) вот закрашивать по пикселям нехото... много вычислений, но видимо таки и придется. спасибо!
...
Рейтинг: 0 / 0
29.08.2006, 08:37
    #33948437
TopSpace
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
к Game Developing'у
Тогда не создавая отдельного топика спрошу: есть кто-нибудь шарящий в эффеках для 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
Форумы / C++ [игнор отключен] [закрыт для гостей] / к Game Developing'у / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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