Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





¿Cómo hacer que el puntero del mouse se mueva aleatoriamente?

Iniciado por Ezrael, 21 de Junio de 2010, 07:23:08 AM

« anterior - próximo »

Ezrael

Hola. Mi duda sería la del titulo. ¿Cómo puedo hacer para que el puntero del mouse se mueva aleatoriamente dentro de un formulario? Creería que se podría hacer con el metodo Mouse_SetPossition y un Timer.
Según mi teoria le damos la posición actual del mouse al metodo y le agregamos X nº a la coordenadas X e Y para que se mueva. Y con el Timer le decimos cada que tiempo se tendria que mover. Aunque el movimiento no sería de forma aleatoria  ^_^' .
Como dije esta sería mi teoria (pero no lo puedo hacer andar  :'( ), si alguien me podría hechar una mano se lo agradecería.

Muchas gracias de ante mano.

PD: Si por una de esas casualidades de la vida esto no llega a ir aca o no se entender lo que quise decir: PERDON  :-[

[EX3]

Pero aleatoriamente te refieres a que se mueva siguiendo una ruta concreta al azar (vamos, que se mueva de continuo) o que se mueva a una posicion cualquiera de la pantalla?

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

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

valnar

Creo que se refiere (corrigeme si me equivoco), a que el puntero se mueva siguiendo una ruta aleatoria (por lo de andar). Esto, si entiendo bien tu pregunta, se podría hacer con un timer, y haciendo un random de 1 a 8. Esto haria que el puntero se moviera en cualquiera de las 8 direcciones (arriba, abajo, izq, derecha, y las 4 diagonales), o si quieres que se quede en su sitio tambien, hacer el random de 1 a 9, cada vez que salte el timer. Para "ejecutar esas direcciones, según lo que salga en tu random tienes que sumar 1, -1 o 0 a tu X del puntero, y lo mismo a la Y, consiguiendo así los 8 o 9 movimientos posibles. Por ejemplo, si sumas 0 a la X, y -1 a la Y, sería un movimiento hacia abajo del puntero. Sin embargo, si únicamente quieres mover el puntero entre posiciones aletorias (sin una ruta), sólo tienes que hacer un random de 0 al tamaño de tu pantalla para X y para Y, y asignarle esos valores al puntero.

Por otro lado, me gustaría preguntar a mi algo que viene relacionado con el random (para no tener que abrir otro hilo, ya que igual es una chorrada). Al hacer un random (de 0 a 2 por ejemplo) con el system de dxlib al inicio del programa, siempre me sale el mismo valor...es como si el random seed fuera siempre el mismo al iniciar el programa- ¿Esto tiene lógica?¿O tengo que mirar a ver si se me ha colado una declaracion de random seed por ahi? Por otra parte tengo que comentar que con el random de .NET me funciona correctamente.
Valnar Games
All your base are belong to us.
@valnar

[EX3]

Cita de: valnar en 21 de Junio de 2010, 09:36:21 AM
Por otro lado, me gustaría preguntar a mi algo que viene relacionado con el random (para no tener que abrir otro hilo, ya que igual es una chorrada). Al hacer un random (de 0 a 2 por ejemplo) con el system de dxlib al inicio del programa, siempre me sale el mismo valor...es como si el random seed fuera siempre el mismo al iniciar el programa- ¿Esto tiene lógica?¿O tengo que mirar a ver si se me ha colado una declaracion de random seed por ahi? Por otra parte tengo que comentar que con el random de .NET me funciona correctamente.
Yo tambien note diferencias entre mis funciones Random (que son las de VB6.0) y las de .NET con mejores resultados la segunda :( Este es el codigo que tengo implementado en la libreria:
Public Function MATH_Rand(Max As Single, Min As Single) As Single
    On Local Error Resume Next
    MATH_Rand = CSng((Max - Min + 1) * Rnd + Min)
End Function

Public Sub MATH_RandSeed(Seed As Single)
    Call Randomize(Seed)
End Sub

No se si esta implementado correctamente. Es el mismo algorritmo que viene en la documentacion de la MSDN para Visual Basic 6.0:
Int((Límite_superior - límite_inferior + 1) * Rnd + límite_inferior)
Acabo de hacer una prueba al vuelo y la verdad, yo diria que funcionar funciona  ???
Option Explicit

Private Sub Form_Load()
    Call MATH_RandSeed(Timer)
    Dim i As Long, s As String
    For i = 0 To 6
        s = s & CStr(MATH_Rand(3, 0)) & "; "
    Next
    Debug.Print s
End Sub

Public Function MATH_Rand(Max As Single, Min As Single) As Single
    On Local Error Resume Next
    MATH_Rand = CSng((Max - Min + 1) * Rnd + Min)
End Function

Public Sub MATH_RandSeed(Seed As Single)
    Call Randomize(Seed)
End Sub

Este es el resultado de varias ejecuciones:
2,304673; 2,748747; 3,285421; 1,818711; 0,5389078; 1,168113; 1,661112;
1,254075; 1,088042; 2,705037; 0,2473612; 3,190458; 3,400962; 0,4000647;
2,144089; 3,792998; 2,465169; 1,341966; 2,781645; 2,402782E-03; 0,4707434;
2,311326; 2,541289; 0,4702961; 0,5765848; 1,327787; 3,613975; 3,886027;
3,688157; 2,285796; 1,611776; 2,714634E-02; 2,351103; 2,419029; 1,845865;

Si hay forma de mejorar la formula sera bienvenida :)

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

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

valnar

Ok, gracias por la molestia EX3. A ver si luego a la tarde-noche cuando llegue a casa le echo un vistazo y hago pruebas.

Saludos!
Valnar Games
All your base are belong to us.
@valnar

Ezrael

Perdon por no haber puesto un ejemplo para que se entendiera mejor  ^_^' .
Lo que quería hacer era que el mouse tuviera un movimiento constante y aleatorio, para poderlo usar como mira de un arma en mi proyecto.
Tengo hecho un escenario con unos hombrecitos que aparecen cada X tiempo y una imagen de una cruz que se mueva segun las coordenadas del mouse como mira. Pero es muy aburrido dispararle a los muñequitos, no hay mucha dificultad. Entonces pencé que haciendo que se mueva aleatoriamente al mouse tendría mas emocion  :-[ .
Si alguien me podria explicar como hacer un random se lo agradeceré enormemente. Mi dominio del VB no es muy amplio   ^_^'

PD: Uso VB 6.0

Hechelion

No me ha quedado para nada claro.

¿Quieres que la mira siga al ratón pero presentando oscilaciones en la ruta o quieres que la mira tenga "ruido" imitando el temblor de las manos del tirador?.

Sobre el random, lo primero que tienes que hacer es generar la semilla, lo más fácil es usar "Randomize()" al inicio de tu proyecto (No es necesario que inicies la semilla cada vez que usas la función random)

Luego solo usas "Rnd()" para obtener un número  entre 0 y 1 (no incluyendo 1)

Si por ejemplo quieres obtener un número entre 1 y 20 entonces usas la siguiente formula
Int(Rnd() * 20) +1

Ezrael

Perdon por no expresarme correctamente  :-[ .
Esperemos que esta vez me salga explicarlo  ^_^' .
Tengo una imagen que cambia de posicion según la ubicacion del mouse (una mira común como en el Counter Strike). Ahora lo que quisiera hacer es que el mouse se moviera aleatoriamente para que fuera mas dificil apuntar (Como la mira de un rifle de franco tirador que se mueve simulando la respiración (?) del tirador)
Ahora creo que se entiende  :-[
Gracias por el dato del random  ;)

Hechelion

Hay dos cosas entonces.

Uno es ruido aleatorio, el cual puedes generar de forma muy simple:

Código (vb6) [Seleccionar]


Private Function Ruido() As Double
Dim RuidoX As Double

RuidoX = Rnd() * 100 + 1
If RuidoX < 5 Then
   Ruido = 1
ElseIf RuidoX > 95 Then
   Ruido = -1
Else
   Ruido = 0
End If

End Function

'*********************************
' La usas de la siguiente manera
Mouse.X = Mouse.X + Ruido


La función ruido tiene 10% de posibilidad de cambiar en 1 el valor X del mouse (5% positivo y 5% negativo)

Si quieres simular la respiración, entonces tienes que usar una función como Sin, porque la respiración no es azarosa,si no que sigue un ciclo.

Código (vb6) [Seleccionar]

Private Function Respiracion(Byval Amp as double) As Double
Static Alfa As Double
Alfa = (Alfa + 1) Mod 360

Respiracion = Sin(Alfa * 3.14 / 180) * Amp

End Function


Y luego la usas sumando el valor Y del mouse, por ejemplo
DiburjarMira(X, Y + Respiracion(10))

El valor Amp dentro de la función Respiracion se usa como amplitud, un valor de 10 hace que la función oscile entre 10 y -10 pixel





Ezrael

Muchas gracias Hechelion por tomarte la molestia de responderme. Era justo lo que necesitaba  ;)
Cuando me surja alguna otra duda volveré a molestar por aqui  :-[

PD: Gracias también a [EX3] y a valnar por tratar de responder mi pregunta. Y mis disculpas por no haberme expresado bien para facilitarle el trabajo  ^_^'

[EX3]

+1 Hechelion

Con mi mala base matematica ya me estaba lanzando hacer chapuzas con la funcion dx_System.MATH_RotatePoint() y hierbas similares xDDDD Tomo nota, que a mi me vendra bien tambien este codigo para futuros usos ;)

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

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

valnar

Vale, ya he hecho unas pocas pruebas. Tanto el método de Hechelion, como el que he visto por ahi (random.next), me funcionan.

En cambio, al utilizar el system de dxlib32:

       sys = New dx_lib32.dx_System_Class
       num = sys.MATH_Rand(10, 0)
       System.Console.WriteLine(num)


Me salen siempre los mismos números en cada ejecución. Yo pienso que algo estoy haciendo mal, al igual que se hace un Randomize, se debería hacer algo con el MATH_RandSeed de dxlib32 (en tu caso EX3 haces esto):

Call MATH_RandSeed(Timer)

¿De dónde sacas esa variable Timer? Si no se le pone ningún valor, sería el temporizador del sistema (que me imagino que será ese timer, de alguna manera). Al hacer yo un Randomize(), no afecta a la función MATH_Rand...por lo que yo creo que ahi tengo mi problema. No se qué valor darle a la función RandSeed para que sea distinto cada vez que ejecuto el programa. En cambio si utilizo el Randomize() sin nada (y el Rnd() o el Random.next), me coge un valor diferente cada vez que inicializo. Total, lo uso así y ya esta, no hay problema xD

PD: Muy interesante el código de la respiración  :D
Valnar Games
All your base are belong to us.
@valnar

[EX3]

Cita de: valnar en 22 de Junio de 2010, 04:12:16 PM
Me salen siempre los mismos números en cada ejecución. Yo pienso que algo estoy haciendo mal, al igual que se hace un Randomize, se debería hacer algo con el MATH_RandSeed de dxlib32 (en tu caso EX3 haces esto):

Call MATH_RandSeed(Timer)

¿De dónde sacas esa variable Timer?
Mis disculpas, me acabo de dar cuenta que estas programando en VB.Net  ^_^'

Timer() a secas, no confundir con el control Timer de Visual Basic, es una instruccion de Visual Basic 6.0 que te devuelve un valor Single que representa el número de segundos transcurridos desde la medianoche (devuelve partes fraccionales de un segundo). En VB6.0 es una de las pocas formas seguras de lograr un valor unico distinto y viene genial para inicializar la semilla de los numeros aleatorios sin tener que recurrir a la API de Windows. En .NET ahora mismo no recuerdo cual seria su equivalente (no seria System.Thread.Tick() o como fuere ya que este devuelve el tiempo en milisegundos).

Salu2...

P.D.: Yo cuando programe con dx_lib32 en .NET no solia utilizar las funciones de MATH_Random u otras funciones de la libreria que ya ofreciera el Framework de .NET, como funciones de listados de archivos de dx_System pudiendo usar las de System.IO o las funciones de ordenacion de listas pudiento utilizar las colecciones genericas por ejemplo. En el asutero Visual Basic 6.0 tiene sentido, ¿en .NET para que? ;)
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

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

valnar

Cierto...vale, muchas gracias por la aclaración EX3. Utilizaré los random de .NET y listo.

Saludos!
Valnar Games
All your base are belong to us.
@valnar

[EX3]

De nada, y ya me contaras con que andas liado, que ultimamente veo gente usando la libreria incluso fuera de stratos pero no dicen para que :D

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.