Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [C#] Gestione tastiera

    Ciao, sto realizzando una interfaccia grafica per muovere un piccolo robot. Per utilizzare il gamepad ho fatto uso delle librerie di XNA e non ho avuto alcun problema. I problemi si sono presentati quando ho tentato di implementare il controllo c tramite tastiera. In pratica, dando modo all'utente di usare le frecce direzionali per muovere l'automa.

    Posto il codice utilizzato:

    codice:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using Microsoft.Xna.Framework;
    using Microsoft.Xna.Framework.Input.Touch;
    using Microsoft.Xna.Framework.Input;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                while (true)
                {
                    Microsoft.Xna.Framework.Input.KeyboardState statoTastiera = Microsoft.Xna.Framework.Input.Keyboard.GetState(PlayerIndex.One);
                    if (statoTastiera.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.Up))
                    {
                        MessageBox.Show("freccia su", "messaggio");
                    }
                }
            }
        }
    }
    In pratica con questo codice, non avviene nulla, premo freccia su ma senza risultati. Quale può essere il problema?
    Grazie.

  2. #2
    Utente di HTML.it L'avatar di escocat
    Registrato dal
    Feb 2012
    Messaggi
    308
    Ma controlla la tastiera solo se clicchi su Button?

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Ma tu fai prima click sul button, visto che il codice è all'interno di quell'evento?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    Si, clicco sul bottone della form per lanciare il ciclo. In realtà, nel programma vero e proprio, il tutto è all'interno di una BackgroundWorker.

    codice:
    // Controllo tramite tastiera
            private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
            {
                Boolean avanti = false;
                Boolean indietro = false;
                Boolean sinistra = false;
                Boolean destra = false;
    
                textBox1.Enabled = false;
    
                while (connesso == true)
                {
                    if (controlloTastiera == true)
                    {
                        if (Microsoft.Xna.Framework.Input.Keyboard.GetState().IsKeyDown(Microsoft.Xna.Framework.Input.Keys.Up))
                        {
                            MessageBox.Show("freccia su");
                        }
                        
                    }
                }
            }

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Ma questo codice è diverso dal primo ... qual è quello di cui si discute?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Prendi per buono l'ultimo postato, quello all'interno della BackgroundWorker.

  7. #7
    Con questo codice:

    codice:
    // Controllo tramite tastiera
            private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
            {
                while (connesso == true)
                {
                    if (controlloTastiera == true)
                    {
                        
                        // Rilevazione dello stato della tastiera
                        
                        // Nessun tasto direzionale premuto
                        if ((!Microsoft.Xna.Framework.Input.Keyboard.GetState(PlayerIndex.One).IsKeyDown(Microsoft.Xna.Framework.Input.Keys.Up)) && (!Microsoft.Xna.Framework.Input.Keyboard.GetState(PlayerIndex.One).IsKeyDown(Microsoft.Xna.Framework.Input.Keys.Down)) && (!Microsoft.Xna.Framework.Input.Keyboard.GetState(PlayerIndex.One).IsKeyDown(Microsoft.Xna.Framework.Input.Keys.Left)) && (!Microsoft.Xna.Framework.Input.Keyboard.GetState(PlayerIndex.One).IsKeyDown(Microsoft.Xna.Framework.Input.Keys.Right)))
                        {
                            portaSeriale.Write("f");
                            //MessageBox.Show("Non premuto");        
                        }
                        
                        // Freccia giù
                        if (Microsoft.Xna.Framework.Input.Keyboard.GetState(PlayerIndex.One).IsKeyDown(Microsoft.Xna.Framework.Input.Keys.Down))
                        {
                            portaSeriale.Write("i");
                            MessageBox.Show("GIU");
                        }
    
                        // Freccia su
                        if (Microsoft.Xna.Framework.Input.Keyboard.GetState(PlayerIndex.One).IsKeyDown(Microsoft.Xna.Framework.Input.Keys.Up))
                        {
                            portaSeriale.Write("a");
                            MessageBox.Show("SU");
                        }
    
                        // Freccia sinistra
                        if (Microsoft.Xna.Framework.Input.Keyboard.GetState(PlayerIndex.One).IsKeyDown(Microsoft.Xna.Framework.Input.Keys.Left))
                        {
                            portaSeriale.Write("s");
                            MessageBox.Show("SINISTRA");
                        }
    
                        // Freccia destra
                        if (Microsoft.Xna.Framework.Input.Keyboard.GetState(PlayerIndex.One).IsKeyDown(Microsoft.Xna.Framework.Input.Keys.Right))
                        {
                            portaSeriale.Write("d");
                            MessageBox.Show("DESTRA");
                        }
                    }
                }
            }
    quando avvio il controllo da tastiera, se non premo nulla, compare la MessageBox che inidica che nessun tasto è stato premuto, poi premi un tasto freccia, clicco su Ok della MessageBox e il controllo funziona dandomi il messaggio del tasto premuto.

    Se non passo dal primo controllo (quello su nessun tasto direzionale premuto) o non metto al suo interno una istruzione bloccante come la MessageBox, premendo i tasti direzionali non avviene nulla, come se non venissero controllati.

    Non capisco dove si trovi l'errore.

  8. #8
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,539
    prova ad aggiungere un thread.sleep(1) dentro il while, dovrebbe funzionare.


Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.