Суббота, 15 Июня 2024, 14:19

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Tetris на hge
cradisДата: Понедельник, 06 Сентября 2010, 14:45 | Сообщение # 1
был не раз
Сейчас нет на сайте
Кто делал тетрис на hge или других (самописных) движках, подскажите, как реализовать управление фигурой.
У меня сейчас во FrameFunc фигура сама движется по таймеру вниз, там же написаны обработчики нажатий клавиш.
Так вот, если во время движения фигуры нажать клавишу влево или вправо, то фигура смещается не сразу, как я предполагал, а через какое-то время.
Чаще через еще 1 тик таймера, т.е. примерно через секунду. Если почаще понажимать то с каждым тиком она идет по диагонали.
Подскажите, что не так.
P.S. Если поставить небольшое смещение и маленькое время тика на таймере, т.е. чтобы фигура двигалась не рывками, а плавно, то влево и вправо двигается нормально.


Сообщение отредактировал cradis - Понедельник, 06 Сентября 2010, 14:50
DekaSoftДата: Понедельник, 06 Сентября 2010, 22:20 | Сообщение # 2
почетный гость
Сейчас нет на сайте
У меня так:
Code


   if (hge->Input_GetKey()==(HGEK_LEFT))                         // именно эта функция!!!
    {
     if(CheckPosition(CurFig->X-1,CurFig->Y,CurFig->Bitmask))  CurFig->X--;
    }
   if (hge->Input_GetKey()==(HGEK_RIGHT))
    {
     if(CheckPosition(CurFig->X+1,CurFig->Y,CurFig->Bitmask))  CurFig->X++;
    }

   if (hge->Input_GetKey()==(HGEK_UP)) // поворот
    {
     if(CheckPosition(CurFig->X,CurFig->Y,RotateFigure(CurFig->Bitmask)))  
            CurFig->Bitmask=RotateFigure(CurFig->Bitmask);
    }



http://dekasoftware.narod.ru
http://www.dekagames.com
cradisДата: Вторник, 07 Сентября 2010, 18:21 | Сообщение # 3
был не раз
Сейчас нет на сайте
Не помогло.
Покажи лучше, пожалуйста, код с таймером.
DekaSoftДата: Среда, 08 Сентября 2010, 00:53 | Сообщение # 4
почетный гость
Сейчас нет на сайте
В каком смысле с таймером? Фигура двигается не по пикселям, а по клеточкам поля. Соответственно перед каждым ее смещением вниз необходимо выждать некоторую паузу. Чем меньше эта пауза - тем выше сложность игры.

Code

     delay=delay+dt;
     level=1+scores/100;

    // Фигура падает с задержкой
     if((delay>(1.0/level)) && !IsDown )    
      {
      (CurFig->Y)++;     
         channel = SQUALL_Sample_Play(sample, 0, 0, 1);
      delay=0;
      }

Как-то так.

А в предыдущем моем посте - обработчик влево-вправо. Все это находится в FrameFunc. По-моему все понятно. Я мог бы скинуть тебе исходник, но так неинтересно. А сам мой тетрис можешь скачать по адресу в моей подписи.


http://dekasoftware.narod.ru
http://www.dekagames.com


Сообщение отредактировал DekaSoft - Среда, 08 Сентября 2010, 01:01
cradisДата: Четверг, 09 Сентября 2010, 19:20 | Сообщение # 5
был не раз
Сейчас нет на сайте
В том то и дело, что не понятно, как эту паузу поставить.
У тебя в коде не видно, как это работает. Двигается фигура по таймеру, т.е. раз в 800ms тик и смещение вниз.
Таймер есть, но сделать обработку одновременно влево и вправо я не понимаю как, хоть ты тресни.
Code
bool FrameFunc()
{
  int current_time = timeGetTime();
  int ms = 800;
  bool end = false;
  while (!end) {
   if (timeGetTime() > current_time+ms) {
    end = true;
    y+=32;
    if (y>FIELDHEIGHT-64) y = FIELDHEIGHT-64;
    figure.inc_y();
   }
   if (hge->Input_KeyDown(HGEK_LEFT)) {
    x-=32;
    if (x<0) x = 0;
    figure.dec_x();
   }
   if (hge->Input_KeyDown(HGEK_RIGHT)) {
    x+=32;
    if (x>FIELDWIDTH-96) x = FIELDWIDTH-96;
    figure.inc_x();
    int a = figure.get_y();
    int c = 1;
   }
   if (hge->Input_KeyDown(HGEK_DOWN)) {
    y+=32;
    if (y>FIELDHEIGHT-64) y = FIELDHEIGHT-64;
    figure.inc_y();
   }
   if (hge->Input_KeyDown(HGEK_ESCAPE)) return true;
  }
  return false;
}

Вот моя последняя попытка. До этого while и прочее, связанное с таймером было в функции, но толку было 0.
Кто-нибудь, помогите разобраться.
nilremДата: Четверг, 09 Сентября 2010, 20:07 | Сообщение # 6
Просветленный разум
Сейчас нет на сайте
Вот тут можешь посмотреть исходник тетриса.

Windmill 2

WindMill 2D Game Engine
DekaSoftДата: Четверг, 09 Сентября 2010, 22:20 | Сообщение # 7
почетный гость
Сейчас нет на сайте
Объясняю "на пальцах". FrameFunc вызывается уже в цикле (так организован HGE). Каждый раз при входе в FrameFunc ты должен получить время прошедшее с момента предыдущего вызова: dt=hge->Timer_GetDelta(); Это очень маленькая величина. Ты ее накапливаешь в каждой итерации : delay=delay+dt; И при достижении определенного значения, двигаешь фигуру вниз:
Code

          // Фигура падает с задержкой       
           if((delay>(1.0/level)) && !IsDown )          
            {       
            (CurFig->Y)++;           
               channel = SQUALL_Sample_Play(sample, 0, 0, 1);       
            delay=0;       
            }
       

Твоя же организация цикла while во FrameFunc просто на каждой итерации игрового цикла "подвешивает" игру, поэтому и все остальное не получается. Не надо пытаться выжидать время, задерживая FrameFunc, она должна постоянно отрабатывать, а задержку введи так, как я говорю. То есть свой таймер делать не надо, он уже запускается с запуском HGE на максимально возможной скорости (или надо менять HGE_FPS). А у тебя в цикле основного таймера ты запускаешь еще свой самопальный. Логики нет.


http://dekasoftware.narod.ru
http://www.dekagames.com


Сообщение отредактировал DekaSoft - Четверг, 09 Сентября 2010, 22:40
cradisДата: Четверг, 09 Сентября 2010, 23:51 | Сообщение # 8
был не раз
Сейчас нет на сайте
DekaSoft
Спасибо, все работает.
DekaSoftДата: Пятница, 10 Сентября 2010, 01:45 | Сообщение # 9
почетный гость
Сейчас нет на сайте
ok Всегда пожалуйста.

http://dekasoftware.narod.ru
http://www.dekagames.com
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг