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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.07.2011, 00:18   #11
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

вместо
Код:
if(a == 1)
else if(a == 2)
else if(a == 3)
...
лучше использовать switch
Код:
switch(a){
   case 1:
   ...
   break;
   case 2:
   ...
   break;
...
}
переменным надо давать осмысленные имена, например texture3 можно было бы назвать ship_tex - текстура корабля

координаты как уже было сказано выше лучше загнать в структуру Coord (или лучше Point). А так же сделать такие структуры как плод, корабль итд у которых будет поле типа Point:
Код:
typedef struct {
    Point pos;
}Ship;
в идеале надо разделить графическую часть игры(инициализация окна, итд) от её механики и запускающую часть

Например я бы сделал такую структуру:
Код:
incude
   game.h // создание структур и прототипов функций
src
   game.c // реализация всех функций
   display.c // графическая часть (загрузка текстур итд)
main.c // главная часть (запускает игру)

Последний раз редактировалось NiCola999; 21.07.2011 в 00:24.
NiCola999 вне форума Ответить с цитированием
Старый 21.07.2011, 00:41   #12
pufystyj
Форумчанин
 
Аватар для pufystyj
 
Регистрация: 10.11.2010
Сообщений: 569
По умолчанию

Цитата:
Сообщение от NiCola999 Посмотреть сообщение
вместо
Код:
if(a == 1)
else if(a == 2)
else if(a == 3)
...
лучше использовать switch
Код:
switch(a){
   case 1:
   ...
   break;
   case 2:
   ...
   break;
...
}
переменным надо давать осмысленные имена, например texture3 можно было бы назвать ship_tex - текстура корабля

координаты как уже было сказано выше лучше загнать в структуру Coord (или лучше Point). А так же сделать такие структуры как плод, корабль итд у которых будет поле типа Point:
Код:
typedef struct {
    Point pos;
}Ship;
в идеале надо разделить графическую часть игры(инициализация окна, итд) от её механики и запускающую часть

Например я бы сделал такую структуру:
Код:
incude
   game.h // создание структур и прототипов функций
src
   game.c // реализация всех функций
   display.c // графическая часть (загрузка текстур итд)
main.c // главная часть (запускает игру)
спасибо за подсказку, сегодня - завтра думаю закончю.

у тех у кого игра не запустилась запихните все файлы *.bmp в папку textures (её нужно создать), эта проблема из-за моего архиватора
Это ещё не конец и даже не начало конца, это возможно только конец начала.
pufystyj вне форума Ответить с цитированием
Старый 21.07.2011, 11:13   #13
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

игру не запускал, посмотрел исходник.
Что сразу сильно не понравилось - зашкаливающее количество констант.
Код:
if (glfwGetKey(0x0057))//вперед, клавиша W
    {
        if (*y2 < 1.0)//чтобы не заходили за конци карты (верхняя точка, потому ток одна сменная :) )
        {
            *y1 = *y1 + 0.01;
            *y2 = *y2 + 0.01;
        }
    }
    else if (glfwGetKey (0x0053))//назад, клавиша S
    {
        if (*y1 > -1.0)
        {
            *y2 = *y2 - 0.01;
            *y1 = *y1 - 0.01;
        }
    }
    else if (glfwGetKey(0x0041))//влево, клавиша A
    {
        if (*x1 > - 1.0)
        {
            *x1 = *x1 - 0.01;
            *x2 = *x2 - 0.01;
        }
    }
    else if (glfwGetKey(0x0044))//вправо, клавиша D
    {
        if (*x2 < 1.0)
        {
            *x1 = *x1 + 0.01;
            *x2 = *x2 + 0.01;
        }
    }
с кодами клавиш еще можно согласиться, но 1, -1, 0.01 замените на какие-нибудь переменные. Видимо, 0.01 - это шаг, -1, 1 - границы. Вот и передавайте их в качестве аргументов в функцию.
-1 и 1 видимо берутся отсюда:
Код:
glOrtho (-1.0,1.0,-1.0,1.0,-1.0,1.0);
Если так - то при изменении "системы координат" вам придется вручную править все 0.01 на 0.02 ?

Форматирование не понравилось:
Код:
 if (v == 0)//наш плод, всек как и выше
        {
        LoadGLTextures(2);//грузим текстуру плода
        glEnable(GL_TEXTURE_2D);
            glBegin(GL_POLYGON);
                glTexCoord2f(0.0,0.0);
                glVertex2d(x1,y1);

                glTexCoord2f(0.0,1.0);
                glVertex2d(x1,y2);

                glTexCoord2f(1.0,1.0);
                glVertex2d(x2,y2);

                glTexCoord2f(1.0,0.0);
                glVertex2d(x2,y1);
            glEnd();
        }
        else if (v == 1)
и т.д. и т.п.
Кстати, посмотрите на логику в процитированном куске кода
Код:
if( !a ) { }
else
    if( a ) { }
МБ else не нужно.
rrrFer вне форума Ответить с цитированием
Старый 21.07.2011, 11:13   #14
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

чуть-чуть отформатированный main:
Код:
int main ( int argc, char *argv[ ] ) { //argv[0] название окна, функция рисования :)

	srand((unsigned)time(NULL));

	int running;//переменная по проверке работы окна
	double x1;//координаты плода
	double x2;
	double y1;
	double y2;

	float mex1 = -1.0;//ваши координаты, заданы первычные значения
	float mex2 = -0.8;
	float mey1 = -1.0;
	float mey2 = -0.8;

	int v = 1;//плод включен
	int l = 0;//количиство собраных плодов

	plods( &x1, &x2, &y1, &y2, &v );//выщитываем координаты плода

	if ( ! glfwInit( ) ) {//обьявляем работу с glfw
		glfwTerminate( );//если нет, отключаем и пишем сообщение об ошибке
		printf( "error: Init" );
		return 0;
	}

	if ( ! glfwOpenWindow( 256, 256, 0, 0, 0, 0, 0, 0, GLFW_WINDOW ) ) {//открываем окно
		glfwTerminate();
		printf( "error: open window" );
		return 0;
	}

	while( running ) {//проверка открытого окна и нажатия ESC
		LoadGLTextures( 1 );			// Загрузка текстуры фона

		glClear( GL_DEPTH_BUFFER_BIT); // Очищаем буфер глубины.
		glDisable( GL_DEPTH_TEST); // Выключаем буфер глубины, для создания фона (ЗА ИДЕЮ СПАСИБА An1ka, из programmersforum.ru)
		glEnable( GL_TEXTURE_2D );		// Разрешение наложение текстуры

		glClear(GL_COLOR_BUFFER_BIT);//очистка
		glOrtho ( -1.0, 1.0, -1.0, 1.0, -1.0, 1.0 );//создаем систему координат, знаю центр 0.0, 0.0 - не очень, но пусть уже будет так
		glLoadIdentity( );//сброс
		glBindTexture( GL_TEXTURE_2D, texture[ 0 ] );//ищем текстуру фона, следующий полигон будет для фона
		glBegin( GL_POLYGON );//рисуем полигон (для незнающих, это паралелограм, трапеция...)
		glTexCoord2f( 0.0, 0.0 );//выставляем вершину левого нижнего кута тексстуры
		glVertex2d( -1.0, -1.0 );//ставим точку полигона

		glTexCoord2f( 0.0, 1.0 );
		glVertex2d( -1.0, 1.0 );

		glTexCoord2f( 1.0, 1.0 );
		glVertex2d( 1.0, 1.0 );

		glTexCoord2f( 1.0, 0.0 );
		glVertex2d( 1.0, -1.0 );
		glEnd( );
		glEnable( GL_DEPTH_TEST ); // Включаем буфер глубины и можем нормально рисовать по фону!

		if ( ! v ) {//наш плод, всек как и выше
			LoadGLTextures( 2 );//грузим текстуру плода
			glEnable( GL_TEXTURE_2D );
			glBegin( GL_POLYGON );
			glTexCoord2f( 0.0, 0.0 );
			glVertex2d( x1,y1 );

			glTexCoord2f( 0.0, 1.0 );
			glVertex2d( x1, y2 );

			glTexCoord2f( 1.0, 1.0 );
			glVertex2d( x2, y2 );

			glTexCoord2f( 1.0, 0.0 );
			glVertex2d( x2, y1 );
			glEnd(  );
		}
		else 
			plods( &x1, &x2, &y1, &y2, &v );//выщитываем координаты плода

		movement( &mex1, &mex2, &mey1, &mey2, &v, &x1, &y1, &l );//мы ходим : )
		LoadGLTextures( 3 );//грузим текстуру кораблика
		glEnable( GL_TEXTURE_2D );
		glBegin( GL_POLYGON );//все как и выше
		glTexCoord2f( 0.0, 0.0 );
		glVertex2d( mex1, mey1 );

		glTexCoord2f( 0.0, 1.0 );
		glVertex2d( mex1, mey2 );

		glTexCoord2f( 1.0, 1.0 );
		glVertex2d( mex2, mey2 );

		glTexCoord2f( 1.0, 0.0 );
		glVertex2d( mex2, mey1 );
		glEnd( );
		glFlush( );
		glfwSwapBuffers( );
		running = !glfwGetKey( GLFW_KEY_ESC ) && glfwGetWindowParam( GLFW_OPENED );//если окно закрыто,  или нажата клавиша Esc - выход

	}
	glfwTerminate( );//удаляем ( мы должны удалять что создали ( балланс в природе ) )
	printf( "Vy sobrali %d plod( ov )", l );
	getch( );//для завершения нажмите любую клавишу

}
rrrFer вне форума Ответить с цитированием
Старый 21.07.2011, 11:58   #15
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

Код:
printf( "Vy sobrali %d plod( ov )", l );
сообщение выводится в консоль, это не хорошо. Надо выводить текст средствами GL


Код:
printf( "error: Init" );
printf( "error: open window" );
лучше сделать запись лога в отдельный файл
NiCola999 вне форума Ответить с цитированием
Старый 22.07.2011, 03:52   #16
pufystyj
Форумчанин
 
Аватар для pufystyj
 
Регистрация: 10.11.2010
Сообщений: 569
По умолчанию и так приступаем

Цитата:
Код ужасный.
исправлю

Цитата:
Половина функций работает с double, половина с float, не понятно зачем
найменьшая моя проблема, исправлю

Цитата:
Всюду магические числа
будут константы!

Цитата:
Ужасные логические условия
НО ЧТО ЗДЕСЬ НЕ ТАК, Я ТАК И НЕ ПОНЯЛ, ОБЬЯСНИТЕ!

Цитата:
Комментарии ни сколько не информативны.
Орфография на двойку.
Поправлю!

Цитата:
функция main должна быть примерно такой
а она такой и будет!

Цитата:
Координаты X и Y хранить в одной структуре, вроде такого
мне это понравилось, с этого и начну

ток загрузку текстуры я наверное не буду трогать (ток возможно сделаю загрузку всю в месте в буфер, а потом буду её пользоватся, из-за этого будет меньше лагов)

Цитата:
Проверку диапазона можно поместить в функцию
да

Цитата:
if(a == 1)
else if(a == 2)
else if(a == 3)
здесь только 3, как по мне свитча не требуется... возможно этого не будет, по причине выше!

Цитата:
переменным надо давать осмысленные имена, например texture3 можно было бы назвать ship_tex - текстура корабля
ок, ток не в этом случае, это мое единственное желание

Цитата:
в идеале надо разделить графическую часть игры(инициализация окна, итд) от её механики и запускающую часть
сделаю в самом конце, чисто для розработки других OpenGL'ивских программ.

Цитата:
Если так - то при изменении "системы координат" вам придется вручную править все 0.01 на 0.02 ?
исправлю... ток эта функция заглючила... так не хочю с этим игратся (с функцией), но прийдется!

Цитата:
Форматирование не понравилось
мне уже друг сделал по этому примичание.

Цитата:
if( !a ) { }
else
if( a ) { }
там наверное должно было быть else if ( a )
Это ещё не конец и даже не начало конца, это возможно только конец начала.
pufystyj вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как написать простую онлайн игру Demon_2009 Gamedev - cоздание игр: Unity, OpenGL, DirectX 20 22.06.2011 09:24
Написать игру! Masyanov Gamedev - cоздание игр: Unity, OpenGL, DirectX 6 04.06.2011 16:13
Как написать простенькую игру на с++? Banner Помощь студентам 1 10.02.2011 17:07
Написать игру Сокобан Goldcoding Фриланс 5 09.04.2010 15:46
как вы думаете можно с помощью delphi написать online игру ну к примеру как muonline 0pex Свободное общение 9 28.06.2007 14:20