forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   Алгоритм игры Lines (http://forum.boolean.name/showthread.php?t=3896)

impersonalis 22.09.2007 00:49

Re: Алгоритм игры Lines
 
Цитата:

НУ НАКОНЕЦ-ТО, ГЛЮК ИСПРАВИЛ!!!
А мы тебя давно спрашивали про индексы ;)
Цитата:

Но почему-то обнаружился новый: шары при каждом вызове функции выводятся шары в одни и те же места?
Для начала попробуй просто:
Цитата:

#include<time.h>
....
srand(time(NULL));

Alex_90 27.10.2007 23:04

Re: Алгоритм игры Lines
 
Всем привет
Вот не понял, что я тут назимичел, вероятно что- нибудь не так, потому что при вводе с клавиатуры прога зависает:
Вот как я получаю координаты шара с клавиатуры (Enter):
Из "Var.h":
Цитата:

//Основной массив игры
int g[14][14];
...
int xCl,yCl=1;//Положение курсора на игровом поле
bool razreshenie=false;//Разрешение в игре перемещать курсор
bool shphere_is;//Шар взят
Из "Message.h":
Цитата:

void OnTimer(HWND hwnd)
{

if(keys[VK_ESCAPE])
SendMessage(hwnd, WM_CLOSE,0,0);

SendMessage(hwnd, WM_PAINT, 0, 0);
int xCPos,yCPos;//Объявляем переменные положения курсора на момент начала игры
xCPos=xCl;
yCPos=yCl;
/*обработка анимации*/
if (keys[VK_UP])
{
...
if (mode==2&&razreshenie==true)//Для игры
{
yCl++;
Cursor (xCl,yCl);
}
}
if (keys[VK_DOWN])
{
...
if (mode==2&&razreshenie==true)//Для игры
{
yCl--;
Cursor (xCl,yCl);
}
}
if (keys[VK_RIGHT])
{
...
if (mode==2&&razreshenie==true)//Только для игры
{
xCl++;
Cursor (xCl,yCl);
}
}
if (keys[VK_LEFT])
{
...
if (mode==2&&razreshenie==true)//Только для игры
{
xCl--;
Cursor (xCl,yCl);
}
}
...
if(yCl>14)yCl=14;
if(yCl<1)yCl=1;
if(xCl>14)xCl=14;
if(xCl<1)xCl=1;
...
//Обработка нажатия на кнопки
...
if (keys[VK_RETURN]&&mode==2&&razreshenie==true)
{
if (g[xCl][yCl]!=0)
{
shphere_is=true;
}
}

Из "Graph.h":
Цитата:

void HodIgroca ()
{
...
//Получение места, откуда взят шар
razreshenie=true;//Разрешаем перемещать курсор
...
shphere_is=false;
while (shphere_is!=true )//Проверка, взят ли шар или там ни чего нет
{
}
В последнем цикле в Graph.h содержимое отстутствует: цикл будет жать, пока shphere_is станет равным true, то есть пока не будет взят шар. Если шар взят то программа идет дальше, однако до выбора шара дело не доходит: программа зависает еще на этапе отрисовки окна (видет только фрейм окна на сером фоне). Debuggerom установленно, что этот цикл выполняется до бесконечности.

Magus 27.10.2007 23:38

Re: Алгоритм игры Lines
 
Цитата:

Debuggerom установленно, что этот цикл выполняется до бесконечности.
Ясен пень:цикл не передает управления самой программе, а внутри цикла, насколько я вижу. значение sphere_is не меняется.
Таким образом, если у тебя при входе в цикл sphere_is равна 0, получается бесконечный цикл из разряда
while(1)
{
}

Alex_90 28.10.2007 21:10

Re: Алгоритм игры Lines
 
А че можно сделать с этим циком, чтобы он проверял, взят ли шар. Может OnTimer вызывать в содержимом этого цикла?;)

Magus 29.10.2007 00:03

Re: Алгоритм игры Lines
 
Для начала зачем тебе проверять, убрали ли из ячейки шар?
Может, можно найти более простой вариант решения задачи, чем цикл?

Alex_90 29.10.2007 22:27

Re: Алгоритм игры Lines
 
Цитата:

Для начала зачем тебе проверять, убрали ли из ячейки шар?
Я это и не проверяю!:)
Задача этого цикла дождаться, когда пользователь нажмет Enter, и если там, где был курсор на момент нажатия Enter был шар, то передать управление дальше, а если шара нет, то опять ждать, когда опять будет нажата Enter.
Цитата:

Может, можно найти более простой вариант решения задачи, чем цикл?
Только goto, да и то не уверен. Хотя...

dimanche13 29.10.2007 22:50

Re: Алгоритм игры Lines
 
Код:

while (shphere_is!=true )//Проверка, взят ли шар или там ни чего нет
{
  if(keys[VK_RETURN] && !isEmptyPos(x,y)) shphere_is = true;
}

что-то типа того...
если нажат ентер и клетка не пуста, то ...

Alex_90 29.10.2007 23:49

Re: Алгоритм игры Lines
 
Именно это и было у меня до того: а фигня тут в том, что пока работает цикл, нажате на клавиши не проверяется, хоть ты по ним кувалдой стучи.
Получается следующее: запускается цикл, проверяется, нажата ли клавиша, показывается, что не нажата, цикл идет по второму кругу, опять проверяется (пользователь уже по Enter кувалдой стучит) - и опять не нажата (так как выполняется цикл, и следовательно не проверяется нажатие на клавишы), и опять цикл идет по новой и так до бесконечности! Так вот как то надо сделать, чтоб и цикл работал, и нажате на клавишы проверялось, а для этого (вероятно) надо разместить проверку на нажатие клавиш прямо внутри цикла, то есть скопировать туда содержимое функции OnTimer (). Но это невозможно, так как программный код увеличится приверно в 2 раза! Может есть другие идеи?;)

Alex_90 30.10.2007 23:55

Re: Алгоритм игры Lines
 
А все таки, когда может проверяться нажатеие на клавишы?;)
Только когда не выполняется ни чего дрогого (в данном случа цикл), или всегда должно проверяться?

Magus 31.10.2007 00:37

Re: Алгоритм игры Lines
 
так. примерная структура программы на псевдокоде:
Код:

WinMain
{
  /*
  инициализация
  */

  while  //основной цикл программы
  {
      /*
      получение сообщений. Пусть сообщение хранится в msg
      */
      switch(msg)
      {
      case WM_KEYDOWN:
            //обработка
      case WM_KEYUP:
            //обработка
      case WM_PAINT:
            //обработка
      case WM_TIMER:
            //обработка
      /*
      и так далее для всех нужных сооббщений
      */
      } //switch
    }  //while
} //WinMain

Надеюсь, отсюда видно, где и как обрабатывается клавиатура.

dimanche13 01.11.2007 21:08

Re: Алгоритм игры Lines
 
я считаю раз ты взялся за С++ то надо применять ООП-мышление. Так создай класс CField в котором будут содержаться классы ячеек поля игры CCell. Отдельный класс для шаров CBall
[highlight = cpp]
class CField {
// здесь весь код что относится ко всему полю...
}

class CCell {
// здесь все что относится к ячейке
}

class CBall {
// здесь все что относится к шару, координаты там ,цвет, активен ли он и т.д
}
[/hightlight]

Alex_90 08.01.2008 21:01

Ответ: Алгоритм игры Lines
 
Вложений: 1
В связи с неудобством работы с клавиатурой для перемещения по игровому полю и большим количеством глюков при вводе с клавиатуры стрелками и кнопкой Enter, из-за которых работа стоит практически с лета, я решил отказаться от клавиатуры и использовать для перемещиния по полю мышь с самонарисованным курсором. Но! Проблема в том, что сцена у меня трехмерная, а мышь перемещается только в двухмерном режиме "по экрану".
Вложение 4174 Работа с проекциями провалилась, так как ничего не работало. У меня есть идея проверять пересечение нормали к экрану с клетками игрового поля, но при рисовании координаты сместились так, что отстледить и выяснить, куда именно провести прямую, что бы она была нормалью к экрану невозможно. Можно ли как-то перейти к глобальным координатам, чтоб нормалью к экрану была какоя-то ось, например z. Есть две функции:
glPushMatrix ();
она сохраняет координаты и
glPopMatrix ();
она возвращает координаты, сохраненные в предыдущей функции.
Можно ли так проверять нахождение курсора над клеткой поля или есть идеи лучше?:)

Magus 08.01.2008 21:28

Ответ: Алгоритм игры Lines
 
glPushMatrix, если не ошибаюсь, сохраняет текущую матрицу проекции в стеке, а glPopMatrix, соответственно, достает ее из стека и восстанавливает.
То есть можно сделать так:
Код:

<меняем матрицу проекции>
<выводим что-либо>
glPushMatrix();
<обнуляем матрицу проекции>
<опять изменяем ее>
<выводим что-либо в новых координатах, т.е. с новым значением
смещения(glTranslatef) и поворота (glRotatef)>
glPopMatrix(); // вернулись к первой матрице проекции

не очень понимаю, как с помощью этих функций можно привести в соответствие позицию мыши на экране и 3д-точку в сцене.
Хотя если у тебя получится, расскажешь, как. :)

P.S.: где-то видел какую-то статью на тему переноса 2д координат мыши в сцену, если найду - дам линк.

Alex_90 08.01.2008 21:34

Ответ: Алгоритм игры Lines
 
Цитата:

Можно ли как-то перейти к глобальным координатам, чтоб нормалью к экрану была какоя-то ось, например z.
Тут главное вот-что!

Magus 08.01.2008 21:38

Ответ: Алгоритм игры Lines
 
Цитата:

Сообщение от Alex_90
Цитата:

Можно ли как-то перейти к глобальным координатам, чтоб нормалью к экрану была какоя-то ось, например z.
Тут главное вот-что!

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

Цитата:

P.S.: где-то видел какую-то статью на тему переноса 2д координат мыши в сцену, если найду - дам линк.
нашел

Alex_90 08.01.2008 22:36

Ответ: Алгоритм игры Lines
 
Как загрузить свой курсор мыши?;)

alcoSHoLiK 08.01.2008 22:54

Ответ: Алгоритм игры Lines
 
Не пробовал glUnProject использовать?
http://www.gamedev.net/community/for...topic_id=65558

Alex_90 08.01.2008 23:03

Ответ: Алгоритм игры Lines
 
Это преобрзование 3D координат в 2D (проекция на экран)?;)

Magus 09.01.2008 00:58

Ответ: Алгоритм игры Lines
 
Цитата:

Сообщение от Alex_90
Это преобрзование 3D координат в 2D (проекция на экран)?

Читай, что там написано. ;)
Цитата:

This code gets the position of the center of the screen and stores it in pos3D_x, y, z.

Alex_90 13.01.2008 19:49

Ответ: Алгоритм игры Lines
 
Все!
Пришел опять к проекциям.
Как мне на основании координат щелчка мыши (x,y) получить z координату пересечения с полем (по которой уже надо вычислять, какая это клетка поля).;)
см. картинку из сообщения №76
Может есть отдельная функция для этого в OpenGl?;)

dimanche13 13.01.2008 19:59

Ответ: Алгоритм игры Lines
 
Alex_90, а ты уже "2Д линии" сделал? :offtop:

Alex_90 13.01.2008 20:12

Ответ: Алгоритм игры Lines
 
Цитата:

Alex_90, а ты уже "2Д линии"
:4to:
Я вроде как 3D делаю!
А откуда информация о 2D?;)

Alex_90 21.02.2008 20:43

Ответ: Алгоритм игры Lines
 
Как проверить, есть ли в данной точке что либо (плоскость) или ничего нет. ;)
Нужно для того, чтобы проверить пересечение луча, выпущенного из координат щелка мыши под прямым углом к экрану какой либо плоскостью (и соответствено получения z координаты этой плоскости).:)

Alex_90 26.02.2008 23:45

Ответ: Алгоритм игры Lines
 
В OpenGl есть матрица проекций GL_PROJECTION.
Как ее получить в массив?;) (с целью домножить на нее матрицу игрового поля, чтоб получилась проекционная картинка игрового поля на экран).:)

alcoSHoLiK 27.02.2008 11:43

Ответ: Алгоритм игры Lines
 
glGet*
Код:

GL_PROJECTION_MATRIX
    params returns sixteen values: the projection matrix on the top of the projection matrix stack. Initially this matrix is the identity matrix. See glPushMatrix.

http://www.dei.isep.ipp.pt/~matos/ca.../glGet.3G.html


Часовой пояс GMT +4, время: 05:00.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot