Войти
ПрограммированиеФорум2D графика и изометрия

Вопрос по HGE

Страницы: 1 2 Следующая »
#0
12:20, 13 янв. 2011

Всем доброго времени суток.
Возникла у меня тут проблема, может кто-то сталкивался, вывожу стандартный слайдер таким макаром:

slider=new hgeGUISlider(22,208,162,86,160,tex_slider,0,0,16,16,true); 
slider->SetMode(50,400,HGESLIDER_SLIDER); 
slider->SetValue(50); 
gui->AddCtrl(slider);

При нажатии левой кнопкой мыши - слайдер залипает и едет за ней пока не клацнешь по нему снова. Вопрос, в чем может быть проблема? Можно ли как-нибудь вернуть состояние мыши и таким образом заставить слайдер отлипнуть? Или как это можно исправить иными средствами?

Заранее благодарю за помощь.


#1
14:43, 13 янв. 2011

Enemy
Не поленись, залезь в исходники, посмотри реализацию слайдера. Может что поменять/добавить нужно.
Хотя вроде у меня нормально работал.

#2
16:27, 13 янв. 2011

Да в том-то и дело, что вроде все в порядке и добавлять ничего не надо :( я уже изрылся, ошибок нет, понять в чем косяк не могу. Хотя бы наводку бы получить, где может быть косяк.

#3
18:01, 13 янв. 2011

Кинь исходники слайдера в проект и подключи их. Потом пройдись в нем пошагово и посмотри в каких местах и как он активируется/деактивируется.

#4
19:12, 13 янв. 2011

Enemy
Поставь ограничение на fps. Я серьезно.

#5
19:57, 13 янв. 2011

Возможно где-то  в "update" обрабатывается клик по слайдеру совместно с GUI_MENUITEM...
Покажи кусок кода обработки слайдера.

#6
12:36, 14 янв. 2011

Vitorio
Никакой разницы, что с ограничением, что без.

Dalex
Собственно так и есть, просто если из-за этого, то как это можно исправить?

Все манипуляции в 6-том примере. Вот сам код:

#include "..\..\include\hge.h"
#include "..\..\include\hgefont.h"
#include "..\..\include\hgegui.h"
#include "..\..\include\hgeguictrls.h"

#include "menuitem.h"

#include <math.h>

HGE *hge=0;

HEFFECT snd;
HTEXTURE tex;
HTEXTURE tex_slider;
hgeQuad quad;

hgeGUI *gui;
hgeGUISlider *slider;
hgeFont *fnt;
hgeSprite *spr;


bool FrameFunc()
{
  float dt=hge->Timer_GetDelta();
  static float t=0.0f;
  float tx,ty;
  int id;
  static int lastid=0;

  if(hge->Input_GetKeyState(HGEK_ESCAPE)) { lastid=5; gui->Leave(); }
  
  id=gui->Update(dt);
  if(id == -1)
  {
    switch(lastid)
    {
    case 1: { gui->Enter(); break; }
      case 2:
      case 3:
      case 4:
        gui->SetFocus(1);
        gui->Enter();
        break;

      case 5: return true;
    }
  }
  else if(id) { lastid=id; gui->Leave(); }

  t+=dt;
  tx=50*cosf(t/60);
  ty=50*sinf(t/60);

  quad.v[0].tx=tx;        quad.v[0].ty=ty;
  quad.v[1].tx=tx+800/64; quad.v[1].ty=ty;
  quad.v[2].tx=tx+800/64; quad.v[2].ty=ty+600/64;
  quad.v[3].tx=tx;        quad.v[3].ty=ty+600/64;

  return false;
}


bool RenderFunc()
{
  hge->Gfx_BeginScene();
  hge->Gfx_RenderQuad(&quad);
  gui->Render();
  fnt->SetColor(0xFFFFFFFF);
  fnt->printf(5, 5, HGETEXT_LEFT, "dt:%.3f\nFPS:%d", hge->Timer_GetDelta(), hge->Timer_GetFPS());
  hge->Gfx_EndScene();

  return false;
}


int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
  hge = hgeCreate(HGE_VERSION);

  hge->System_SetState(HGE_LOGFILE, "hge_tut06.log");
  hge->System_SetState(HGE_FRAMEFUNC, FrameFunc);
  hge->System_SetState(HGE_RENDERFUNC, RenderFunc);
  hge->System_SetState(HGE_TITLE, "HGE Tutorial 06 - Creating menus");
  hge->System_SetState(HGE_WINDOWED, true);
  hge->System_SetState(HGE_SCREENWIDTH, 800);
  hge->System_SetState(HGE_SCREENHEIGHT, 600);
  hge->System_SetState(HGE_FPS, 100);
  hge->System_SetState(HGE_SCREENBPP, 32);

  if(hge->System_Initiate())
  {
    quad.tex=hge->Texture_Load("bg.png");
    tex=hge->Texture_Load("cursor.png");
    snd=hge->Effect_Load("menu.wav");
    tex_slider=hge->Texture_Load("slider.png");
    if(!quad.tex || !tex || !snd)
    {
      MessageBox(NULL, "Can't load BG.PNG, CURSOR.PNG or MENU.WAV", "Error", MB_OK | MB_ICONERROR | MB_APPLMODAL);
      hge->System_Shutdown();
      hge->Release();
      return 0;
    }

    quad.blend=BLEND_ALPHABLEND | BLEND_COLORMUL | BLEND_NOZWRITE;

    for(int i=0;i<4;i++)
    {
      quad.v[i].z=0.5f;
      quad.v[i].col=0xFFFFFFFF;
    }

    quad.v[0].x=0; quad.v[0].y=0; 
    quad.v[1].x=800; quad.v[1].y=0; 
    quad.v[2].x=800; quad.v[2].y=600; 
    quad.v[3].x=0; quad.v[3].y=600; 

    fnt=new hgeFont("font1.fnt");
    spr=new hgeSprite(tex,0,0,32,32);

    gui=new hgeGUI();

    slider=new hgeGUISlider(1,80,80,86,160,tex_slider,0,0,16,16,true); 
    slider->SetMode(50,400,HGESLIDER_SLIDER); 
    gui->AddCtrl(slider);

    gui->SetCursor(spr);
    gui->SetFocus(1);
    gui->Enter();

    hge->System_Start();

    delete gui;
    delete fnt;
    delete spr;
    hge->Effect_Free(snd);
    hge->Texture_Free(tex);
    hge->Texture_Free(tex_slider);
    hge->Texture_Free(quad.tex);
  }

  hge->System_Shutdown();
  hge->Release();
  return 0;
}
#7
12:59, 14 янв. 2011

Попробуй убрать gui->Enter()  в обработке id слайдера.

#8
13:05, 14 янв. 2011

Пробовал, чуть передвигается и останавливается и с этого момента никакие манипуляции не воспринимает это если везде убрать gui->Enter(); если же только в обработке - то, все точно так же, бегает за мышкой.

#9
13:10, 14 янв. 2011

Измени else if(id) if(id != 1) { lastid=id; gui->Leave(); }

#10
13:18, 14 янв. 2011

Помогло, спасибо :)

#11
13:21, 14 янв. 2011

Ок... Удачи...

#12
13:47, 14 янв. 2011

>Измени else if(id) if(id != 1) { lastid=id; gui->Leave(); }
Чет мне такое решение совсем не нравится:)

#13
18:46, 14 янв. 2011

Yuko
GUI_MENUITEM обрабатывается по lastid, это нужно для эффектов.
Все остальные контролы по id...
Либо не используем  GUI_MENUITEM...
Либо прописываем исключения для всех контролов...

P.S. Найди другое...

#14
19:09, 14 янв. 2011

GUI_MENUITEM - это что такое?

Страницы: 1 2 Следующая »
ПрограммированиеФорум2D графика и изометрия

Тема в архиве.