detener el código

Iniciado por Hans el Topo, 14 Enero 2007, 22:23 PM

0 Miembros y 1 Visitante están viendo este tema.

Hans el Topo

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?
 

Hendrix

Puedes pausar el codigo kon este bucle:

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

"Todos los días perdemos una docena de genios en el anonimato. Y se van. Y nadie sabe de ellos, de su historia, de su peripecia, de lo que han hecho, de sus angustias, de sus alegrías. Pero al menos una docena de genios se van todos los días sin que sepamos de ellos". - Juan Antonio Cebrián

Hans el Topo

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

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
 

NYlOn

Lo correcto seria usar la clase Timer:

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.-