Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: Hans el Topo en 14 Enero 2007, 22:23 pm



Título: detener el código
Publicado por: Hans el Topo en 14 Enero 2007, 22:23 pm
buenas, ave quien me exa una mano con un problemilla porque no se me ocurre nada para solventarlo

ando haciendo un jueguecillo basado en turnos
cuando la IA de las tropas controladas por el ordenador se van a mover buscan zonas a su alrededor factibles, baratan posibilidades,
 
una de esas posibilidades es atacar a otra unidad, entonces aparece una pequeña animación del combate, pero claro como los calculos son rapidismos y la animación es más lenta pues he añadido un timer que controle el tema,

el problema aparece cuando dos unidades atacan a una misma,
usease cuando ataca a una que se supone que esta luchando, puesto que el proceso sigue aunque la animación este apareciendo, mi pregunta es como detener el proceso durante unos instantes,
he probado con sleep pero detiene todo, y un bucle es sobrecargar la cpu sin sentido

¿a alguien se le ocurre alguna solución?


Título: Re: detener el código
Publicado por: Hendrix en 14 Enero 2007, 22:30 pm
Puedes pausar el codigo kon este bucle:

Código:
Private Sub Wait(ByVal nSec As Integer)
    'Esperar un número de segundos
    Dim t1 As Date, t2 As Date

    t1 = Second(Now)
    t2 = t1 + nSec
    Do
        DoEvents
    Loop While t2 > Second(Now)
End Sub

No se sobrecargaria gracias al DoEvents.

Es una alternativa al sleep que uso bastante.

Salu2



Título: Re: detener el código
Publicado por: Hans el Topo en 14 Enero 2007, 23:00 pm
creo que tu código esta mal no?

guardas lo que devuelve second (un valor variant entre 0-59) en un date, por lo tanto el date te lo inicia a por defecto, que es 1900 bla bla bla

luego le sumas a t2, que es una fecha t1 que es el valor por defecto (t1 y t2 valen lo mismo) le sumas los segundos... y luego comparas una fecha con segundos?

bueno estuve revisandola y creo que asi si queda como pretendias

Código:
Private Sub Wait(ByVal nSec As Integer)
    'Esperar un número de segundos
    Dim t2 As Date

    t2 = DateAdd("s", nSec, Now)
    Do
        DoEvents
    Loop While t2 > Now
End Sub

de este modo evitamos el problema que tendríamos al pasarnos del valor 59 si solo lo hiciesemos con segundos

muchas gracias Hendrix


Título: Re: detener el código
Publicado por: NYlOn en 15 Enero 2007, 09:22 am
Lo correcto seria usar la clase Timer:
Código:
Public Sub Esperar(Segundos As Long)
    Dim n1 As Long
    n1 = Timer
    Do While Timer - n1 < Segundos
        DoEvents
    Loop
End Sub

Aunque hay muchas alternativas funcionales...

Saludos.-