PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Все о Timer


Все о Timer

Сообщений 1 страница 10 из 10

1

Уважаемые форумчане, подскажите как правильно пользоваться таймером (в Алгоритме это секундомер). Суть такая: есть кнопка, по нажатию на которую должен, как я понимаю, включиться таймер в течение которого кнопка будет плавно перемещаться вправо до какой-то определенной координаты. В конце соответственно условие: если X больше допустим 150, то таймер Стоп.
И вообще, есть ли разновидности работы с данным объектом? Вот код:

Код:
; PureBasic Visual Designer v3.95 build 1485 (PB4Code)


;- Window Constants
;
Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
;
Enumeration
  #Button_0
EndEnumeration


Procedure Open_Window_0()
  If OpenWindow(#Window_0, 296, 218, 507, 135, "Timer",  #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered )
    If CreateGadgetList(WindowID(#Window_0))
      ButtonGadget(#Button_0, 30, 50, 85, 25, "Нажми меня")
      
    EndIf
  EndIf
EndProcedure

Open_Window_0()

Repeat
event=WaitWindowEvent()
gadget=EventGadget()

If event=#PB_Event_Gadget And gadget=#Button_0
 ;тут видимо должна быть процедура таймера. Х/з вообщем
EndIf 
Until event=#PB_Event_CloseWindow

0

2

Таймер создаётся с помощью функции AddWindowTimer, а останавливается с помощью RemoveWindowTimer.

Код:
; PureBasic Visual Designer v3.95 build 1485 (PB4Code)


;- Window Constants
;
Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
;
Enumeration
  #Button_0
EndEnumeration


Procedure Open_Window_0()
  If OpenWindow(#Window_0, 296, 218, 507, 135, "Timer",  #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered )
    If CreateGadgetList(WindowID(#Window_0))
      ButtonGadget(#Button_0, 30, 50, 85, 25, "Нажми меня")
      
    EndIf
  EndIf
EndProcedure

Open_Window_0()

Repeat
event=WaitWindowEvent()
gadget=EventGadget()

If event=#PB_Event_Gadget And gadget=#Button_0
   ButtonPos=0
   AddWindowTimer(#Window_0, 2, 50)
ElseIf event=#PB_Event_Timer
   If EventTimer()=2
     ButtonPos+2
     ResizeGadget(#Button_0, ButtonPos, #PB_Ignore, #PB_Ignore, #PB_Ignore)
     SetWindowTitle(#Window_0, "Timer "+Str(ButtonPos))
     If ButtonPos>=150
       RemoveWindowTimer(#Window_0, 2)
     EndIf
   EndIf
EndIf 
Until event=#PB_Event_CloseWindow

Эти функции появились в версии 4.40, а в предыдущих, работать с таймером нужно с помощью API функций SetTimer и KillTimer соответственно.

Код:
; PureBasic Visual Designer v3.95 build 1485 (PB4Code)


;- Window Constants
;
Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
;
Enumeration
  #Button_0
EndEnumeration

Procedure Timer1()
 Shared ButtonPos
 ButtonPos+2
 ResizeGadget(#Button_0, ButtonPos, #PB_Ignore, #PB_Ignore, #PB_Ignore)
 SetWindowTitle(#Window_0, "Timer "+Str(ButtonPos))
 If ButtonPos>=150
   KillTimer_(WindowID(#Window_0), 2)
 EndIf
EndProcedure

Procedure Open_Window_0()
  If OpenWindow(#Window_0, 296, 218, 507, 135, "Timer",  #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered )
    If CreateGadgetList(WindowID(#Window_0))
      ButtonGadget(#Button_0, 30, 50, 85, 25, "Нажми меня")
      
    EndIf
  EndIf
EndProcedure

Open_Window_0()

Repeat
event=WaitWindowEvent()
gadget=EventGadget()

If event=#PB_Event_Gadget And gadget=#Button_0
   ButtonPos=0
   SetTimer_(WindowID(#Window_0), 2, 50, @Timer1() )
EndIf 
Until event=#PB_Event_CloseWindow

0

3

Пётр написал(а):

Таймер создаётся с помощью функции AddWindowTimer, а останавливается с помощью RemoveWindowTimer

спасибо!

0

4

помогите, или подскажите с таймером
есть вот такая процедура

Код:
;входящие аргументы процедуры
;object =  изображение спрайта
;curentangel = начальный угол, (направление) спрайта
;targetangel = конечный угол
;speedrotate - скорость поворота
Procedure RotateSprite(object, curentangel, targetangel,speedrotate)
  
 AddWindowTimer(0,1,speedrotate)
    If event = #PB_Event_Timer And EventTimer() = 1
        curentangel +speedrotate
        MP_RotateSprite(object,curentangel)
       If curentangel >= targetangel
           curentangel = targetangel
           RemoveWindowTimer(0,1)
       EndIf
       
    EndIf
   
EndProcedure

и в главном цикле вызов этой процедуры

Код:
While  Not WindowEvent()=#PB_Event_CloseWindow
   Global event = WaitWindowEvent()
    MP_DrawSprite(tank,x,y)
    If MP_KeyHit(#PB_Key_Right)
            RotateSprite(tank,0,90,10)
           
        EndIf

    MP_RenderWorld()
    MP_Flip()
    
    
Wend
End

не знаю что, или почему процедура работает не правильно(
по нажатию кнопки вправо спрайт должен плавно повернутся на угол который указан в процедуре
процедура MP_RotateSprite(object,curentangel) поворачивает объект на указанный угол

Отредактировано владимир123 (07.09.2012 18:39:21)

0

5

владимир123 написал(а):

If event = #PB_Event_Timer And EventTimer() = 1

Это условие не выполняется никогда.

0

6

Как можно изменить значение Timeout - время в миллисекундах между событиями для таймера программно (не в конструкторе)?

0

7

Удалить и заново создать таймер.

0

8

Повесил код на слайдер.

Код:
                RemoveWindowTimer(#Window_0, 12)
                DebugSpeed
                SetTimer_(#Window_0, 12, Speed, @KlTimer())

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

0

9

Вопрос снят. Вместо #Window_0 нужно WindowID(#Window_0). :blush:

0

10

Функция AddWindowTimer() работает в паре с RemoveWindowTimer().
А WinAPI функция SetTimer_() с KillTimer_().

Смешивать библиотечную функцию с WinAPI, ИМХО неправильно и есть вероятность что код работать не будет.

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Все о Timer