Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





pequeño problema con timer

Iniciado por RobiHm, 10 de Diciembre de 2007, 07:07:32 PM

« anterior - próximo »

RobiHm

bueno no se si esto es un bug del timer o mio
lo que intento es guardar un descanso de x milisegundos entre turno de jugador y judaor

tengo en el bucle principal algo así

cuando la acción es fin turno realiza lo siguiente

If p.pausa Then    'comprobamos si ha pasado el tiempo de espera
 p.siguiente_jugador  'busca el jugador siguiente
 juego.accion = "recursos" 'cambiamos a la acción por defecto
End If




'contador de las pausas entre jugadores
private tim_pausa As Long  'guarda el identificador del timer
private pide_pausa As Boolean 'indicador de si anda activado o no
'el timer ya se encuentra activado

Public Function pausa() As Boolean
   'si no anda activo el timer lo activamos
   If pide_pausa = False Then
       m_System.TIMER_Reset (tim_pausa)
       pide_pausa = True
   End If
  'comprobamos tiempos
   If pide_pausa And (m_System.TIMER_GetValue(tim_pausa) >= 600) Then
      'tiempo ok
       pide_pausa=false
       pausa = True
   Else
      'tiempo no
       pausa = False
   End If
End Function



Public Function pausa() As Boolean
   
   If pide_pausa = False Then
       tim_pausa = m_System.TIMER_Create()
       pide_pausa = True
       pausa = False
   Else
       If m_System.TIMER_GetValue(tim_pausa) >= 600 Then
           m_System.TIMER_Kill (tim_pausa)
           pide_pausa = False
           pausa = True
       Else
           pausa = False
       End If
   End If
   
End Function


la segunda función funciona y la primera no ... y no entiendo el porque, al meterle el reset lo reinicia a 0, pero sigue contando no?
Web : Indómita
Blog : MiBlog
Evobas : Evobas
Kobox : Kobox

[EX3]

Cita de: "RobiHm"al meterle el reset lo reinicia a 0, pero sigue contando no?
Exacto. TIMER_Reset() reinicia el valor del cronometro a 0 pero el cronometro sigue su cuenta a partir de 0. Aqui tienes un breve ejemplo de implementacion de espera por intervalo de tiempo con un cronometro:
Option Explicit

Dim m_System As New dx_System_Class
Dim timerID As Long
Dim value As Long

Private Sub Form_Load()
   Call Me.Show
   timerID = m_System.TIMER_Create()
   Do
       If (Interval(1000)) Then
           value = value + 1
           Cls
           Print CStr(value)
       End If
       DoEvents
   Loop
End Sub

Private Function Interval(Time As Long) As Boolean
   If (m_System.TIMER_GetValue(timerID) >= Time) Then
       Call m_System.TIMER_Reset(timerID)
       Interval = True
   End If
End Function

Private Sub Form_Unload(Cancel As Integer)
   Call m_System.TIMER_Kill(timerID)
   Set m_System = Nothing
   End
End Sub

El reincio del cronometro solo deberas hacerlo si la condicion de tiempo con el cronometro es verdadera, por lo que el estado de espera de un intervalo siempre sera verdadero o falso. El codigo que has puesto arriba me ha despistado un poco al ver que tienes 3 casos en el que uno resetea el cronometro, otro lo evalua y otro devuelve falso.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

RobiHm

en el primer ejemplo he desglobado todo para que se viese mejor
taba en un if, como el crono no tiene un pause (una gran desventaja frente a los timers) le agrego esa variable que dice si ha sido reseteado o no xk después del intervalo como bien has dicho sigue a su rollo y claro supongo que sale "más rentable" destruirlo y volverlo a crear que dejarlo que siga y comprobar con la variable si ha sido activado ... un cipote por el tema de no tener pause xD

gracias por el ejemplo pero no es aplicable cuando la comprobación no es continua
Web : Indómita
Blog : MiBlog
Evobas : Evobas
Kobox : Kobox

[EX3]

Vale, si no he entendido mal lo que buscas a groso modo es poder pausar el cronometro. Dicho esto una breve modificacion e implementacion en el ejemplo anterior:
Form1.frm
Option Explicit

Public m_System As New dx_System_Class
Dim tTimer As New Timer
Dim value As Long

Private Sub Command1_Click()
   tTimer.Paused = Not tTimer.Paused
   If tTimer.Paused Then Command1.Caption = "Continuar" Else Command1.Caption = "Pausa"
End Sub

Private Sub Form_Load()
   Me.AutoRedraw = True
   Call Me.Show
   Set tTimer = New Timer
   Do
       If (Interval(1000)) Then
           value = value + 1
           Cls
           Print CStr(value)
       End If
       DoEvents
   Loop
End Sub

Private Function Interval(Time As Long) As Boolean
   If (tTimer.value() >= Time) Then
       Interval = True
       Call tTimer.Reset
   End If
End Function

Private Sub Form_Unload(Cancel As Integer)
   Set tTimer = Nothing
   Set m_System = Nothing
   End
End Sub

La implementacion que yo haria del cronometro:
Timer.cls
Option Explicit

Private timerID As Long
Private paused_ As Boolean

Public Property Get Paused() As Boolean
   Paused = paused_
End Property

Public Property Let Paused(value As Boolean)
   paused_ = value
   If Not Value Then Call Form1.m_System.TIMER_Reset(timerID)
End Property

Public Property Get value() As Long
   If Not paused_ Then value = Form1.m_System.TIMER_GetValue(timerID)
End Property

Public Sub Reset()
   Call Form1.m_System.TIMER_Reset(timerID)
End Sub

Private Sub Class_Initialize()
   timerID = Form1.m_System.TIMER_Create()
End Sub

Private Sub Class_Terminate()
   Call Form1.m_System.TIMER_Kill(timerID)
End Sub

Con esto pausas el cronometro para que no te devuelva valor alguno y reinicie el conteo desde 0. No se si es exactamente lo que buscas o si se acerca a lo que necesitas. Es que en verdad destruir y crear de nuevo el cronometro surte el mismo efecto que si lo reseteas, osea, obtener un cronometro a tiempo 0.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.