Большой Воронежский Форум
Страница 4 из 13
< 1234 5678910 > Последняя »
» Программирование>Создание игры!!!(кто хочет помочь все сюда!!!)
xxx-men 21:03 20.12.2007

Сообщение от DeniSS1:
Есть вопросы: 1) Как сделать текстуру на всё окно? 2) Как установить цвет на всё окно?
Всё - в OpenGL. Трафика нет, помоги

блин, искать неахота

и ваще не надо загоняца с текстурами если всетаки решил шашки клепать
помнишь в школе на бейсике домик рисовали?
там были операторы
линия
кружочеГ
заливка
ОГл все это же самое умеет, и так же просто. [Ответ]
xxx-men 21:09 20.12.2007

Сообщение от xxx-men:
там были операторы
линия
кружочеГ
заливка

mfc тоже умеет [Ответ]
xxx-men 21:26 20.12.2007
glBegin(GL_LINES);
glVertex2f (0,0);
glVertex2f (100,100);
glEnd();
как то так линия будет


Сообщение от :
www.forum.vingrad.ru - форумы по программированию. Программирование на С++
Задать вопрос на форуме по C++


--------------------------------------------------------------------------------

Шаг 13 - Текстуры
Ну вот и свершилось наконец-то. Я родил шаг номер 13. Хммм... цифра наводит на мысли

Но не будем о грустном. Как я и обещал когда-то раньше, в этом шаге объекты на экране получат текстуру.

Сначала я хотел пойти в том же ключе, что и раньше, т.е. 2 объекта, текстура на одном, текстура на другом, стереосистема справа, стереосистема слева и ... и потом решил, что все это не интересно. Решил потратить время на "прикольную" текстуру. Начал искать, полез на свою станцию и нашел забавный живой телевизор, он, оказывается, входит в комплект поставки Irix 6.2 от SGI. Но вот проблема встала - телевизор там в видео ролике. И решил я, что надо динамическую текстурку слепить, да посмотреть что из этого получится. Слепил, посмотрел, ничего, жить будет, для учебных целей пойдет.

Прежде всего бросьте читать эти буковки и посмотрите код. Мне кажется и объяснять-то там нечего, но раз уж назвался ... то я полез в печку.

И так - объяснения.

Программка практически копирует предыдущие. Т.е. берем опять скелет win32 приложения (проще всего взять от PiraCube), вырезаем оттуда все лишнее и вставляем все нужное, куда уж проще
. Ну, а если серьезно, то изменения такие:

В глобальных переменных:

#define FRAME_RATE 7

Это предельное значение счетчика LoopCount. Нужен он потому, что моя лень победила и мне не хотелось писать код, который бы менял текстуру 25 раз в секунду, т.е. как в TV. Поэтому, если у вас ролик крутится медленно или быстро, то можно поменять эту цыфирьку и станет лучше (может быть
)
BOOL Fm;

Сие опять моя лень, т.е. просто булева переменная, по изменению которой мы переключаемся на новый элемент массива текстур
int LoopCount;

Об этом "левом" счетчике я уже говорил. Поместил я его в цикл while(1)
GLint TexNum;

А это собственно и сам номер картинки.

В функциях:

Изменения претерпела функция LoadGLTexture, сейчас она выглядит так:

GLvoid LoadGLTexture(GLvoid)
{
int i;
char buffer[30];
AUX_RGBImageRec *txtre[12];

for(i=1; i<=12; i++)
{
sprintf(buffer,"./Images/0%d.bmp",i);
txtre[i-1] = auxDIBImageLoad(buffer);

glBindTexture (GL_TEXTURE_2D, i);
glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexImage2D(GL_TEXTURE_2D, 0, 3, txtre[i-1]->sizeX, txtre[i-1]->sizeY,
0, GL_RGB, GL_UNSIGNED_BYTE, txtre[i-1]->data);
}
}

В начале объявляется массив из 12 указателей на картинки, которые мы загрузим из bmp файлов, а далее в цикле загружаем текстуры в буфер текстур и настраиваем свойства. Я думаю, что перечислять назначение всех функций и их аргументы, это просто повторять MSDN, но в по сути происходит следующее - glBindTexture как бы индексирует текстуру в буфере текстур, glPixelStorei - устанавливает режим pixel storage, glTexParameteri и glexEnvf - устанавливают многочисленные параметры текстур, посмотрите MSDN, его (MSDN) профи пишут, не в пример мне. Ну, а glTexImage2D собственно загружает текстуру.

В Initial добавился вызов функции LoadGLTexture. Изменения в Draw:

glEnable (GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,TexNum);

Соответственно включают режим текстурирования и выбирают текстуру по номеру из тех, что лежат в буфере.
glBegin(GL_QUADS);
glNormal3f(0.0, 0.0, -1.0);
glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, 1.0f, -1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(1.0f, -1.0f, -1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, 1.0f, -1.0f);

glNormal3f(0.0, 0.0, 1.0);
glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, 1.0f, 1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f);

glNormal3f(1.0, 0.0, 0.0);
glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, 1.0f, 1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(1.0f, 1.0f, -1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, -1.0f, -1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, -1.0f, 1.0f);

glNormal3f(-1.0, 0.0, 0.0);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f);

glNormal3f(0.0, 1.0, 0.0);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(1.0f, 1.0f, -1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, 1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f);

glNormal3f(0.0, -1.0, 0.0);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(1.0f, -1.0f, -1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
glEnd();

glDisable(GL_TEXTURE_2D);

Xrot += 0.1f;
Yrot += 0.2f;
Zrot += 0.25f;

if(Fm)
{
TexNum++;
if(TexNum == 13)
TexNum = 1;
Fm = FALSE;
}

Далее мы просто рисуем куб, при этом с каждой вершиной грани связываем соответствующий угол текстуры, выключаем текстурирование, увеличиваем углы поворотов, проверяем не пора ли нам переключиться на следующую в буфере текстуру. Если да, то проверяем выход за пределы карты мира, т.е. у нас всего 12 картинок и если уже 12-я, то опять на 1-ю.

И последнее изменение касается WinMain:

LoopCount++;
if(LoopCount >= FRAME_RATE)
{
Fm = TRUE;
LoopCount = 0;
}

Draw();
SwapBuffers(hDC);

Просто и не затейливо увеличиваем счетчик при каждом проходе цикла, как только он больше чем задано, включаем условие переключения картинки и обнуляем счетчик.

И последнее - не забудте в настройке проекта добавить библиотеки: opengl32.lib; glu32.lib; glaux.lib;.


--------------------------------------------------------------------------------
Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Kirill V. Ratkin.
--------------------------------------------------------------------------------
[AD]





--------------------------------------------------------------------------------


www.forum.vingrad.ru - форумы по программированию. Программирование на С++
Задать вопрос на форуме по C++

--------------------------------------------------------------------------------

[Ответ]
Amur 23:20 20.12.2007

Сообщение от DeniSS1:
Amur, за первые 2 строки - +1! Но мы-то делаем шахматы! Так что всё будет путём.

Хороший выбор для начала(ИМХО куда лучше чем 0x12A05F200-ый тетрис).
Мне тока интересно как вы ИИ писать собираетесь? (ну там что принимать будете перед написаним, какой будет диаметр бубна и тп.)

Сообщение от xxx-men:

Сообщение от xxx-men:
там были операторы
линия
кружочеГ
заливка

mfc тоже умеет

О, боже! Ты уже стал цитировать сам себя... )))))) [Ответ]
DeniSS1 15:56 21.12.2007
xxx-men, спасибо. Просто при рисовании чёрных клеток на чёрном фоне они сливаются. Нужно будет либо сделать экран другим цветом, либо наложить текстуру стола. Как рисовать фигуры из примитивов уже придумал. [Ответ]
DeniSS1 19:58 21.12.2007
Вопрос: почему не работает (не рисует 8 клеток вместо 4) этот код?

void display()
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Очищаем буфера
glColor3f(1.0f,1.0f,1.0f);
glLoadIdentity(); // Грузим нулевую матрицу
glPushMatrix();
glTranslatef(-9, -5, -15);
glBegin(GL_QUADS); // Здесь рисуем доску и клетки!
glVertex3f(1, 0, 0);
glVertex3f(1, 1, 0);
glVertex3f(0, 1, 0);
glVertex3f(0, 0, 0);
glVertex3f(1, 1, 0);
glVertex3f(1, 2, 0);
glVertex3f(2, 2, 0);
glVertex3f(2, 1, 0);
glVertex3f(2, 2, 0);
glVertex3f(2, 3, 0);
glVertex3f(3, 3, 0);
glVertex3f(3, 2, 0);
glVertex3f(3, 3, 0);
glVertex3f(3, 4, 0);
glVertex3f(4, 4, 0);
glVertex3f(4, 3, 0);


glTranslatef(2, 0, 0); // Рисуем те же 4 клетки, но со сдвигом.
glVertex3f(1, 0, 0);
glVertex3f(1, 1, 0);
glVertex3f(0, 1, 0);
glVertex3f(0, 0, 0);
glVertex3f(1, 1, 0);
glVertex3f(1, 2, 0);
glVertex3f(2, 2, 0);
glVertex3f(2, 1, 0);
glVertex3f(2, 2, 0);
glVertex3f(2, 3, 0);
glVertex3f(3, 3, 0);
glVertex3f(3, 2, 0);
glVertex3f(3, 3, 0);
glVertex3f(3, 4, 0);
glVertex3f(4, 4, 0);
glVertex3f(4, 3, 0);

glEnd();
glPopMatrix();

glFlush(); // Досрочное завершение рисования (ф-я необязательна)
} [Ответ]
xxx-men 17:47 22.12.2007

Сообщение от DeniSS1:
Вопрос: почему не работает (не рисует 8 клеток вместо 4) этот код?

а что он рисует?

надо просто внимаельнее почитать про:

Сообщение от DeniSS1:
GL_QUADS

[Ответ]
xxx-men 17:56 22.12.2007

Сообщение от Amur:
(ну там что принимать будете перед написаним, какой будет диаметр бубна и тп.)

ии штука не трудная если в рекусию его вогнать, никакой каспаров не одолеет, тока тормоза жуткие будут
такой ии можно на шахматных задачках потестить....
если рекурсию делать до определенной степени вложенности(число продумываемых ходов), то он суко будет обычный тупой ии как во всех шахматах

я этим как то в школе загонялся
[Ответ]
DeniSS1 17:58 22.12.2007
xxx-men, я тоже в школе, и тоже загоняюсь! :-) [Ответ]
xxx-men 19:22 22.12.2007
ии будет выглядить как функция
struct mov{int x1,y1,x2,x2,result};//шахматный ход, е2 на е4 например, и его результативность

mov megaAI(pole* p; bool zxcv;int n){
/*
функция которая возвращает оптимальный ход
в параметрах: указатель шахматное поле и какая сторона ходит(черные или белые) и степень вложенности

алгоритм такой

1)загнать в список все возможные ходы нашей стороны( имеем указатель на щахматную доску и сторону)
элемент списка выглядит примерно так:
tempMove
{
int r;//рейтинг хода
figure* map[8][8];//копия карты
tempMove* next;//следуюций элемент
};

2)
для каждого возможного хода, назовем его mov x;
пишем:
создать массив доски такой же как передали нашей функции, poleX например
изменить его с учетом хода х(!)
оценить рейтинг хода(ну например данный ход снес фигуру у вражины значит данному ходу +сколько то очков)

если позволит степень вложенности
{
предположить как пойдет противник: megaAI(poleX, zxcv==false);
к рейтингу хода добавить суматный рейтинг который вернет функция
оценить результат хода противника (вдруг фигуру снесет тогда минус нах)
}
3)прогнать весь список ходов и найти лучшие(с максимальным рейтингом) вернуть случайный из них
*/
}



если гнать рекурсию до конца, то по сравнению с этим ии каспаров нервно курит [Ответ]
sshsecurity 23:10 22.12.2007
...ипать какие умники... [Ответ]
[nuso2f] 15:11 23.12.2007
ппц вы жжоте. ржунимагу. [Ответ]
Amur 21:24 25.12.2007

Сообщение от xxx-men:
ии штука не трудная если в рекусию его вогнать, никакой каспаров не одолеет, тока тормоза жуткие будут
такой ии можно на шахматных задачках потестить....
если рекурсию делать до определенной степени вложенности(число продумываемых ходов), то он суко будет обычный тупой ии как во всех шахматах

я этим как то в школе загонялся

Насколько мне известно все нормальные шахматные ИИ тупо перебирают все варианты и находят оптмальный. Это очень логично и так же поступает мозг простого смертного чела. Но что то мне подсказывает что рекурсия это хоть и самый простой метод реализации но самый ресурсоемкий. Мне кажется комп слишком долго будет думать особенно в начале партии.
А вот если хранить в памяти все расчеты компа(скажем на 30 ходов вперед), то после хода противника, можно вместо перерасчета отыскать в памяти сценарий и сразу его применить. И походу игры отбрасывать ненужные сценарии и дописывать новые ветки в примененном (ограничиваясь опять таки 30 ходами). Тогда комп будет долго думать лишь на 1 ходу.
Можно увеличить глубину вложения и тогда сложность игры автоматом повысится(или наоборот)
[Ответ]
xxx-men 23:01 02.01.2008
Amur, просто рекурсия проходит на определеную глубину. в начале или в конце партии это не важно, я так делал, это не сложно

заранее отработаные сценарии какраз и используют нормальные ИИ, хочу как нить это опробывать на шашках, тока не на 30 ходов, а на всю партию ......ды и на шахматах можно, хоть и оперативки не хватит точно, но если подключить винт то вполне может быть..... [Ответ]
The_God 00:17 03.01.2008
а ты прикидывал а сколько лет займёт процесс перебора хотябы на 10 ходов вперед ?

если мы можем в данный момент пойти любой из 10 фигурок ( знаю что их 16 , но пусть мы можем пойти только 10 из них ), после нашего хода ходит противник, путь у него тоже доступны 10 любых фигурок для хода, вот чтобы прикинуть наши 10 ходов вперед, нужно прикинуть и его ответные 10 ходов а это уже 20
получается 10 в 20 степени ходов нужно сходить "в уме" компьютеру
если он ходит 1млн ходов в секунду то получится что продумать партию на 10 ходов вперед это всеголиш нужно 3 млн лет

игра для тех кто не спешит


думаю нужна БД уже сыгранных людьми партий, из которых компьютер будет подбирать наиболее подходящие к текущему раскладу и уметь подводить текущий расклад к известному раскладу из БД.

[Ответ]
The_God 00:32 03.01.2008
если игра будет обыгрывать человека со 99% вероятностью, то в неё никто играть не будет

людям ведь нравится быть победителями, и не думаю что они будут рады узнать что они в чемто глупее железки, купленной для развлечения


такую программу для игры в шахматы уже надо будет называть не игрой для обычных людей, а симулятором игры в шахматы для профессионалов.
[Ответ]
xxx-men 17:36 03.01.2008

Сообщение от The_God:
а ты прикидывал а сколько лет займёт процесс перебора хотябы на 10 ходов вперед ?

у меня 486й улетал в неограниченый ступор при продумывании рекурсии на 6 ходов вперед, компы стали быстрее, но если поставить 7 ходов то результат будет тот же

блин, мне прям захотелось непобедимые шашки накатать

Сообщение от The_God:
думаю нужна БД уже сыгранных людьми партий

думаю нужна БД уже сыгранных компьтерами партий

Сообщение от The_God:
если игра будет обыгрывать человека со 99% вероятностью, то в неё никто играть не будет

и я потеряю многомилионную прибыль с её продаж?
[Ответ]
xxx-men 18:12 03.01.2008
поправьте меня если где ошибся:
поле для шашек это массив 4х4, 16 клеток
каждая клетка может принимать значения: белая шашка, белая дамка, черная шашка, черная дамка, пустая клетка. 5 значений.
считаем все возможные варианты заполнения массива
5^16=152 587 890 625 , очень дохрена комбинаций
варианты расположения фигур, ограничивают правила. уже комбинаций на много(!) меньше
каждая комбинация хранит список ссылок на возможные комбинации
разными путями можно притти к одной и той же комбинации, то есть база уже не дерево а граф
в результате эта база, из всех(!) возможных ходов точно влезет на винт

то есть с непобедимыми шашками это реально? [Ответ]
xxx-men 23:14 09.01.2008
задачка про шашки:
поле для шашек выглядит как массив , он отображает какую то игровую ситуацию = комбинацию фигур

допостим на 15 ходу игры мы пришли к какой то комбинации, назовем её комбинация "Ы"©
мы точно, к комбинации "Ы", можем прийти другим порядком ходов
вопрос такой:
на каком ходу мы можем прийти к комбинации "Ы"
только на 15 ходу?
возможно и на другом количестве ходов?
[!]рассматриваюца партии играные до появляния дамок[/!] [Ответ]
The_God 23:59 11.01.2008
в игры надо играть, а не делать.

когда делание игр становится работой то удовольствие от игр уже не получаешь, видиш лиш технологии которые авторы использовали в играх....

да и не такая это лёгкая работа как кажется
[Ответ]
Charlie 12:50 12.01.2008
что-то мне все это вот это напоминает )
http://rus-os.narod.ru/ [Ответ]
@MO:ZG@ 20:28 17.01.2008
ээ, а может лучше на флеше чёнить замутить, ибо времени меньше, а при наличии прямых рук можно замутить чтонить достойное... [Ответ]
TPYH 20:11 19.01.2008
Если, вопрос о выборе движка еще стоит, то советую GLScene (под Delphi), бесплатный, постоянно обновляемый, с полностью (!) открытыми исходниками, работать с ним просто, широкие возможности визуального программирования, и приемлимая производительность.
ссылка


Единственная проблема - документация, но она стоит только поначалу. =) [Ответ]
The_God 12:55 22.01.2008
ну че как успехи ?
выложите пару скриншотов [Ответ]
xxx-men 19:01 22.01.2008

Сообщение от The_God:
ну че как успехи ?

финальный ролик дописываю

Сообщение от The_God:
выложите пару скриншотов

ды лови
Изображения
[Ответ]
The_God 19:03 22.01.2008
ничетак шахматишки на скриншоте [Ответ]
xxx-men 19:10 22.01.2008

Сообщение от The_God:
ничетак шахматишки на скриншоте

это у белых, а у черных ядерная ракета [Ответ]
DeniSS1 17:26 03.02.2008
Всё, после долгого перерыва принимаюсь за дело! Послезавтра ждите альфа-версию без ИИ.
xxx-men, а может, действительно сделать спецэффекты? Т.е. вместо фигур - люди? Пешки - ополчение, кони - кавалерия и т.д. А когда одна фигура бьёт другую - прокручивается ролик. Вариантов роликов нужно не так уж много - 64 штуки.
[Ответ]
Gillbert 15:55 04.02.2008
Мош тогда сетевые сделаете? Ато с ИИ, мне кажется, ничего интересного не получиться. Если только где-то алгоритм надыбать... [Ответ]
xxx-men 20:13 04.02.2008

Сообщение от DeniSS1:
xxx-men, а может, действительно сделать спецэффекты?

нафег не нада, резноцвецветных кружочков хватит, просто участок кода который овечает за графику сделай максимально независимый




блин, с непобедимыми шашками реально? [Ответ]
Страница 4 из 13
< 1234 5678910 > Последняя »
Вверх