Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.04.2024, 14:38   #21
ichi
Форумчанин
 
Регистрация: 14.03.2012
Сообщений: 146
По умолчанию

Цитата:
Сообщение от Timurkh77 Посмотреть сообщение
Не могу понять , в чем же дело?
Ты набирал код программы допустил неточность в функции init(). В частности, в строчках кода:
Код:
M.cos[x] = cos(x / 180 * M_PI);
M.sin[x] = sin(x / 180 * M_PI);
Число 180 должно быть вещественным.
ichi вне форума Ответить с цитированием
Старый 17.04.2024, 20:22   #22
Timurkh77
Форумчанин
 
Регистрация: 16.02.2013
Сообщений: 151
По умолчанию

Спасибо за помощь.
Timurkh77 вне форума Ответить с цитированием
Старый 26.04.2024, 20:07   #23
Timurkh77
Форумчанин
 
Регистрация: 16.02.2013
Сообщений: 151
По умолчанию

Изменил программу с поддержкой секторов.Выдается ошибка деление на ноль
S[s].d /= (S[s].we - S[s].ws);
Не пойму в чем дело.В программе вроде бы все так же.

Код:
#define _USE_MATH_DEFINES

#include<math.h>
#include<stdio.h>
#include<Windows.h>
#include<glut.h>

#define res 1
#define SW 160*res
#define SH 120*res
#define SW2 (SW/2)
#define SH2 (SH/2)
#define pixelScale 4/res
#define GLSW (SW*pixelScale)
#define GLSH (SH*pixelScale)
#define numSect 4
#define numWall 16

typedef struct
{
	int fr1, fr2;
}time; time T;

typedef struct
{
	float cos[360];
	float sin[360];
}math; math M;

typedef struct
{
	int w, s, a, d;
	int sl, sr;
	int m;
}keys; keys K;

typedef struct
{
	int x, y, z;
	int a;
	int l;
}player; player P;

typedef struct
{
	int x1, y1;
	int x2, y2;
	int c;
}walls; walls W[30];

typedef struct
{
	int ws, we;
	int z1, z2;
	int d;
}sectors; sectors S[30];

int loadSectors[] =
{
 0,4,0,40,
 4,8,0,40,
 8,32,0,40,
 12,16,0,40,
};

int loadWalls[] =
{
0,0,32,0,0,
32,0,32,32,1,
32,32,0,32,0,
0,32,0,0,1,

64,0,96,0,2,
96,0,96,32,3,
96,32,4,32,2,
64,92,64,0,3,

64,64,96,64,4,
96,64,96,96,5,
96,96,64,96,4,
64,96,64,64,5,

0,64,32,64,6,
32,64,32,96,7,
32,96,0,96,6,
0,96,0,64,7,
};

void pixel(int x, int y, int c)
{
	int rgb[3];
	if (c == 0) { rgb[0] = 255; rgb[1] = 255; rgb[2] = 0; }
	if (c == 1) { rgb[0] = 160; rgb[1] = 160; rgb[2] = 0; }
	if (c == 2) { rgb[0] = 0; rgb[1] = 255; rgb[2] = 0; }
	if (c == 3) { rgb[0] = 0; rgb[1] = 160; rgb[2] = 0; }
	if (c == 4) { rgb[0] = 0; rgb[1] = 255; rgb[2] = 255; }
	if (c == 5) { rgb[0] = 0; rgb[1] = 160; rgb[2] = 160; }
	if (c == 6) { rgb[0] = 160; rgb[1] = 100; rgb[2] = 0; }
	if (c == 7) { rgb[0] = 110; rgb[1] = 50; rgb[2] = 0; }
	if (c == 8) { rgb[0] = 0; rgb[1] = 60; rgb[2] = 130; }

	glColor3ub(rgb[0], rgb[1], rgb[2]);
	glBegin(GL_POINTS);
	glVertex2i(x * pixelScale + 2, y * pixelScale + 2);
	glEnd();
}

void movePlayer()
{
	if (K.a == 1 && K.m == 0) { P.a -= 4; if (P.a < 0) { P.a += 360; } }
	if (K.d == 1 && K.m == 0) { P.a += 4; if (P.a > 359) { P.a -= 360; } }

	int dx = M.sin[P.a] * 10;
	int dy = M.cos[P.a] * 10;

	if (K.w == 1 && K.m == 0) { P.x += dx; P.y += dy; }
	if (K.s == 1 && K.m == 0) { P.x -= dx; P.y -= dy; }

	if (K.sr == 1) { P.x += dy; P.y -= dx; }
	if (K.sl == 1) { P.x -= dy; P.y += dx; }

	if (K.a == 1 && K.m == 1) { P.l -= 1; }
	if (K.d == 1 && K.m == 1) { P.l += 1; }
	if (K.w == 1 && K.m == 1) { P.z -= 4; }
	if (K.s == 1 && K.m == 1) { P.z += 4; }
}


void clearBackground()
{
	int x, y;
	for (y = 0; y < SH; y++)
	{
		for (x = 0; x < SW; x++) { pixel(x, y, 8); }
	}

}

void clipBehindPlayer(int* x1, int* y1, int* z1, int x2, int y2, int z2)
{
	float da = *y1;
	float db = y2;
	float d = da - db; if (d == 0) { d = 1; }
	float s = da / (da - db);
	*x1 = *x1 + s * (x2 - (*x1));
	*y1 = *y1 + s * (y2 - (*y1)); if (*y1 == 0) { *y1 = 1; }
	*z1 = *z1 + s * (z2 - (*z1));
}


void drawWall(int x1, int x2, int b1, int b2, int t1, int t2,int c)
{
	int x, y;
	int dyb = b2 - b1;
	int dyt = t2 - t1;
	int dx = x2 - x1;

	if (dx == 0) dx = 1;

	int xs = x1;

	if (x1 < 1) { x1 = 1; }
	if (x2 < 1) { x2 = 1; }
	if (x1 > SW - 1) { x1 = SW - 1; }
	if (x2 > SW - 1) { x2 = SW - 1; }

	for (x = x1; x < x2; x++)
	{
		int y1 = dyb * (x - xs + 0.5) / dx + b1;
		int y2 = dyt * (x - xs + 0.5) / dx + t1;

		if (y1 < 1) { y1 = 1; }
		if (y2 < 1) { y2 = 1; }
		if (y1 > SH - 1) { y1 = SH - 1; }
		if (y2 > SH - 1) { y2 = SH - 1; }

		for (y = y1; y < y2; y++)
		{
			pixel(x, y, 0);
		}
	}
}

int dist(int x1, int y1, int x2, int y2)
{
	int distance = sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
	return distance;
}

void draw3D()
{
	int s,w,wx[4], wy[4], wz[4];
	float CS = M.cos[P.a], SN = M.sin[P.a];

	for (s = 0; s < numSect; s++)
	{
		S[s].d = 0;
		for (w = S[s].ws; w < S[s].we; w++)
		{
			int x1 = W[w].x1 - P.x;
			int x2 = W[w].x2 - P.x;
			int y1 = W[w].y1 - P.y;
			int y2 = W[w].y2 - P.y;

			wx[0] = x1 * CS - y1 * SN;
			wx[1] = x2 * CS - y2 * SN;;
			wx[2] = wx[0];
			wx[3] = wx[1];

			wy[0] = y1 * CS + x1 * SN;
			wy[1] = y2 * CS + x2 * SN;
			wy[2] = wy[0];
			wy[3] = wy[1];

			S[s].d += dist(0, 0, (wx[0] + wx[1]) / 2, (wy[0] + wy[1]) / 2);
			wz[0] = S[s].z1 - P.z + ((P.l * wy[0]) / 32.0);
			wz[1] = S[s].z1 - P.z + ((P.l * wy[1]) / 32.0);
			wz[2] = wz[0] + S[s].z2;
			wz[3] = wz[1] + S[s].z2;


			if (wy[0] < 1 && wy[1] < 1) { continue; }

			if (wy[0] < 1)
			{
				clipBehindPlayer(&wx[0], &wy[0], &wz[0], wx[1], wy[1], wz[1]);
				clipBehindPlayer(&wx[2], &wy[2], &wz[2], wx[3], wy[3], wz[3]);
			}

			if (wy[1] < 1)
			{
				clipBehindPlayer(&wx[1], &wy[1], &wz[1], wx[0], wy[0], wz[0]);
				clipBehindPlayer(&wx[3], &wy[3], &wz[3], wx[2], wy[2], wz[2]);
			}


			wx[0] = wx[0] * 200 / wy[0] + SW2;
			wx[1] = wx[1] * 200 / wy[1] + SW2;
			wx[2] = wx[2] * 200 / wy[2] + SW2;
			wx[3] = wx[3] * 200 / wy[3] + SW2;

			wy[0] = wz[0] * 200 / wy[0] + SH2;
			wy[1] = wz[1] * 200 / wy[1] + SH2;
			wy[2] = wz[2] * 200 / wy[2] + SH2;
			wy[3] = wz[3] * 200 / wy[3] + SH2;


			drawWall(wx[0], wx[1], wy[0], wy[1], wy[2], wy[3],W[w].c);
		}
		S[s].d /= (S[s].we - S[s].ws);
	}

}

void display()
{
	int x, y;
	if (T.fr1 - T.fr2 >= 50)
	{
		clearBackground();
		movePlayer();
		draw3D();
		T.fr2 = T.fr1;
		glutSwapBuffers();
		glutReshapeWindow(GLSW, GLSH);
	}

	T.fr1 = glutGet(GLUT_ELAPSED_TIME);
	printf(" %i\n", glutGet(GLUT_ELAPSED_TIME) / 1000);
	glutPostRedisplay();
}


void KeysDown(unsigned char key, int x, int y)
{
	if (key == 'w' == 1) { K.w = 1; }
	if (key == 's' == 1) { K.s = 1; }
	if (key == 'a' == 1) { K.a = 1; }
	if (key == 'd' == 1) { K.d = 1; }
	if (key == 'm' == 1) { K.m = 1; }
	if (key == ',' == 1) { K.sr = 1; }
	if (key == '.' == 1) { K.sl = 1; }

}

void KeysUp(unsigned char key, int x, int y)
{

	if (key == 'w' == 1) { K.w = 0; }
	if (key == 's' == 1) { K.s = 0; }
	if (key == 'a' == 1) { K.a = 0; }
	if (key == 'd' == 1) { K.d = 0; }
	if (key == 'm' == 1) { K.m = 0; }
	if (key == ',' == 1) { K.sr = 0; }
	if (key == '.' == 1) { K.sl = 0; }
}

void init()
{
	int x;
	for (x = 0; x < 360; x++)
	{
		M.cos[x] = cos (x / 180.0 * M_PI);
		M.sin[x] = sin (x / 180.0 * M_PI);
	}

	int s, w, v1 = 0, v2 = 0;

	for (s = 0; s < numSect; s++)
	{
		S[s].ws = loadSectors[v1 + 0];
		S[s].we = loadSectors[v1 + 1];
		S[s].z1 = loadSectors[v1 + 2];
		S[s].z2 = loadSectors[v1 + 3] - loadSectors[v1 + 2];
		v1 += 4;

		for (w = S[s].ws; w < S[s].we; w++)
		{
			W[w].x1 = loadWalls[v2 + 0];
			W[w].y1 = loadWalls[v2 + 1];
			W[w].x2 = loadWalls[v2 + 2];
			W[w].y2 = loadWalls[v2 + 3];
			W[w].c = loadWalls[v2 + 4];
			v2 += 5;
		}

	}
	P.x = 70;
	P.y = -110;
	P.z = 20;
	P.a = 0;
	P.l = 0;
}

int main(int argc, char* argv[])
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
	glutInitWindowPosition(GLSW / 2, GLSH / 2);
	glutInitWindowSize(GLSW, GLSH);
	glutCreateWindow(" ");
	glPointSize(pixelScale);
	gluOrtho2D(0, GLSW, 0, GLSH);
	init();
	glutDisplayFunc(display);
	glutKeyboardFunc(KeysDown);
	glutKeyboardUpFunc(KeysUp);
	glutMainLoop();

	return 0;
}

Последний раз редактировалось BDA; 26.04.2024 в 21:07. Причина: добавил теги
Timurkh77 вне форума Ответить с цитированием
Старый 27.04.2024, 16:31   #24
ichi
Форумчанин
 
Регистрация: 14.03.2012
Сообщений: 146
По умолчанию

Цитата:
Сообщение от Timurkh77 Посмотреть сообщение
В программе вроде бы все так же.
Как и в прошлый раз в коде есть две неточности. Первая в массиве loadSectors и вторая в функции movePlayer.
ichi вне форума Ответить с цитированием
Старый 27.04.2024, 20:27   #25
Timurkh77
Форумчанин
 
Регистрация: 16.02.2013
Сообщений: 151
По умолчанию

Исправил ошибку в loadSectors ,там должно было стоять 12 в 3 строке.Вроде бы заработало.Не могу понять какая ошибка в функции movePlayer.
Timurkh77 вне форума Ответить с цитированием
Старый 28.04.2024, 06:24   #26
ichi
Форумчанин
 
Регистрация: 14.03.2012
Сообщений: 146
По умолчанию

В функции movePlayer, в строчках кода:
Код:
int dx = M.sin[P.a] * 10;
int dy = M.cos[P.a] * 10;
Число 10 должно быть вещественным.
ichi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Графика в Delphi средствами OpenGL?? Нужна объяснить функции artiom4356 Общие вопросы Delphi 2 01.08.2014 10:23
Как и где узнать все функции и процедуры OpenGL(желательно на Delphi) artiom4356 Общие вопросы Delphi 4 01.08.2014 10:10
Qt+OpenGL. Qt "не видит" функции OpenGL EnterFix Qt и кроссплатформенное программирование С/С++ 4 29.01.2013 18:59
Использование функции чужого приложения/OpenGL coNsept Общие вопросы C/C++ 7 31.12.2010 16:15