elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  Problema con evento KeyDown.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema con evento KeyDown.  (Leído 3,146 veces)
Charlie BoT

Desconectado Desconectado

Mensajes: 15


Ver Perfil
Problema con evento KeyDown.
« en: 21 Agosto 2019, 01:37 am »

Saludos, les comento que estoy con ganas de hacer un juego simple con gdi+ en mis ratos libres y me dispuse a armar los controles, todo iba sobre ruedas hasta que me encontré con el problema de que si desplazo mi personaje por la pantalla de lado a lado va todo mas que bien. El problema viene al intentar simular un salto usando dos rutinas una para ascender y otra para descender que funcionan muy bien pero uso la barra de espacio para saltar y las flechas derecha e izquierda para moverme.

me muevo a los lados y si salto el evento keydown cancela la tecla sostenida y da lugar a la nueva pulsada, eso lo comprendo pero no se como emular una solución, si alguien me puede tirar alguna idea me seria de gran ayuda!

Dejo lo que tengo por ahora...
Código
  1.  

Código:
Public Class Form1

    Dim jumpLimit As Short = 100
    Dim charGround As Short = 200

    Private charSize As New Size(30, 30)
    Private charPos As New Point(200, charGround)
    Private character As Rectangle

    Private WithEvents tmrRefresh As New Timer
    Private GameRefresh As Short = 60   ' ms.

    Private counterTimer As Short = 0

    Private _jumpAction As Byte = 0
    Public Property JumpAction() As Byte
        Get
            Return _jumpAction
        End Get
        Set(ByVal value As Byte)
            _jumpAction = value
            Select Case value
                Case Is = 0     ' De pie.
                    ' *****
                Case Is = 1     ' Ascendiendo.                   
                    Call JumpUp()
                Case Is = 2     ' Descendiendo.
                    Call JumpDown()
            End Select
        End Set
    End Property

    Public Sub New()
        ' Llamada necesaria para el diseñador.
        InitializeComponent()
        ' Agregue cualquier inicialización después de la llamada a InitializeComponent().
        Me.SetStyle(ControlStyles.UserPaint, True)
        Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
        Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
        Me.DoubleBuffered = True
        tmrRefresh.Interval = GameRefresh
        tmrRefresh.Start()
    End Sub

    Private Sub Form1_KeyDown(sender As Object,
                              e As KeyEventArgs) Handles Me.KeyDown
        Select Case e.KeyCode
            Case Is = Keys.Left
                charPos.X -= 2
            Case Is = Keys.Right
                charPos.X += 2
            Case Is = Keys.Space
                JumpAction = 1
        End Select
    End Sub

    Private Sub JumpUp()
        If charPos.Y = jumpLimit Then JumpAction = 2 : Exit Sub
        If charPos.Y > jumpLimit And JumpAction = 1 Then
            charPos.Y -= 5
        End If
    End Sub

    Private Sub JumpDown()
        If charPos.Y = charGround Then JumpAction = 0 : Exit Sub
        charPos.Y += 5
    End Sub

    Private Sub tmrRefresh_Tick(sender As Object,
                                e As EventArgs) Handles tmrRefresh.Tick
        ' Contador de tiempo.
        If counterTimer < 99 Then
            counterTimer += 1 : Else : counterTimer = 0
        End If
        If JumpAction = 1 Then JumpUp()
        If JumpAction = 2 Then JumpDown()
        Me.Refresh()
    End Sub

    Private Sub draw(e As PaintEventArgs)
        character = New Rectangle(charPos, charSize)
        e.Graphics.FillRectangle(Brushes.Red, character)
    End Sub

    Protected Overrides Sub OnPaint(e As PaintEventArgs)
        MyBase.OnPaint(e)
        Call draw(e)
    End Sub




End Class


En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.866



Ver Perfil
Re: Problema con evento KeyDown.
« Respuesta #1 en: 22 Agosto 2019, 00:17 am »

me muevo a los lados y si salto el evento keydown cancela la tecla sostenida y da lugar a la nueva pulsada, eso lo comprendo pero no se como emular una solución, si alguien me puede tirar alguna idea me seria de gran ayuda!

La solución es muy simple: ignorar la repetición de tecla generada en el evento KeyDown hasta que la correspondiente tecla sea procesada posteriormente en el evento KeyUp.

Para ello, simplemente añade una condición adicional para comprobar si el personaje ya está saltando...

Un ejemplo:

Código
  1. Private isBusyJump As Boolean
  2.  
  3. Private Sub Form1_KeyDown(sender As Object, e As KeyEventArgs) Handles MyBase.KeyDown
  4.  
  5.    If (e.KeyCode = Keys.Space) AndAlso Not (Me.isBusyJump) Then
  6.        Me.isBusyJump = True
  7.        ' Do jump here...
  8.    End If
  9.  
  10. End Sub
  11.  
  12. Private Sub Form1_KeyUp(sender As Object, e As KeyEventArgs) Handles MyBase.KeyUp
  13.  
  14.    If (e.KeyCode = Keys.Space) AndAlso (Me.isBusyJump) Then
  15.        Me.isBusyJump = False
  16.    End If
  17.  
  18. End Sub

Saludos.


« Última modificación: 22 Agosto 2019, 00:21 am por Eleкtro » En línea



Charlie BoT

Desconectado Desconectado

Mensajes: 15


Ver Perfil
Re: Problema con evento KeyDown.
« Respuesta #2 en: 22 Agosto 2019, 01:42 am »

Bueno primero que nada te agradezco la ayuda elektro...

Probé tu sugerencia y no soluciona el problema, porque mi personaje pierde su movimiento hacia los lados.

Lo que yo pretendo es que si yo voy avanzado hacia la derecha y sin soltar la tecla de avance presiono la de salto (SPACE) que el personaje no cancele el avance y ejecute su salto sino que si voy avanzando y se ejecuta el salto, el salto sea hacia arriba y siga avanzando porque no he soltado la tecla direccional. Esto es lo mas necesario en un juego dado a que nadie va poder jugar bien a un juego donde la dirección se suelta y esperar a que salte para comenzar a direccionar el salto, es algo que en los juegos se hace en simultaneo..

Se que no es imposible de hace, pero en este momento no se me ocurre una solución  :-\
En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.866



Ver Perfil
Re: Problema con evento KeyDown.
« Respuesta #3 en: 22 Agosto 2019, 11:11 am »

Lo que yo pretendo es que si yo voy avanzado hacia la derecha y sin soltar la tecla de avance presiono la de salto (SPACE) que el personaje no cancele el avance y ejecute su salto sino que si voy avanzando y se ejecuta el salto, el salto sea hacia arriba y siga avanzando porque no he soltado la tecla direccional.

Pensé que el problema principal que describiste era que el salto se repetía por mantener presionada la tecla de salto. De todas formas creo que tu programa debería determinar si el personaje se está moviendo para evitar que se cancele el desplazamiento a izquierda o derecha cuando se presiona la tecla de salto, entonces podrías empezar por declarar una variable con nombre "isMoving" para ello, e intentando adaptar el código del ejemplo de arriba a tus necesidades...

No me atrevo a sugerir más ideas ni realizar modificaciones al código que mostraste por si en lugar de ayudar consigo lo contrario, ya que la programación orientada al gaming no es lo mio, y, aunque con el suficiente tiempo examinando el código que mostraste + ensayo y error podría encontrarte una solución, seguro que no sería la solución más óptima o estandarizada para este tipo de situaciones en programación de video juegos.

es algo que en los juegos se hace en simultaneo..

Se que no es imposible de hace, pero en este momento no se me ocurre una solución  :-\

Ya, bueno, imposible no es, pero no es lo mismo hacer todos los cálculos y operaciones necesarias a pelo (con el lenguaje que sea), que utilizar un framework para abstraer cierta complejidad... (ej. Unity: https://forum.unity.com/threads/how-to-make-a-jump-in-c.40411/ )

Se que no es de mucha ayuda lo que te dije, pero de todas formas aquí deberías encontrar alguna solución:

Fíjate que en los códigos que encontrarás suele haber ciertos factores definidos de forma arbiraria como velocidad y gravedad, y con ello se consigue hacer el salto en movimiento, por lo que quizás esto pueda ser un indicativo de que el planteamiento de tu código sencillamente no sea el más adecuado para llevar a cabo el control de movimiento y salto del "personaje". Creo que deberías examinar algunos ejemplos de los resultados de Google, a ver si sacas algo más en claro.

PD: ¿donde está el usuario Abderramah cuando se le necesita?. jeje.

Saludos.
« Última modificación: 22 Agosto 2019, 11:41 am por Eleкtro » En línea



Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda, problema evento keypressed
Java
ChavalChavito 1 2,730 Último mensaje 14 Febrero 2011, 17:47 pm
por NetJava
[Problema]Evento sencillo javascript « 1 2 »
Desarrollo Web
KuraraGNU 17 9,872 Último mensaje 27 Abril 2011, 10:17 am
por KuraraGNU
[C#]Problema con el evento Keypress. « 1 2 »
.NET (C#, VB.NET, ASP)
Bernabe_22 16 17,540 Último mensaje 26 Mayo 2016, 02:36 am
por litronix
[Resuelto]Problema con evento
.NET (C#, VB.NET, ASP)
kondrag_X1 1 2,017 Último mensaje 23 Abril 2015, 16:34 pm
por kondrag_X1
Problema con evento de Jquery
Desarrollo Web
yoelrodguez 0 1,619 Último mensaje 24 Enero 2016, 21:12 pm
por yoelrodguez
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines