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

    [C#] delay causato dal KeyDown

    Salve a tutti. Sto cercando di fare un gioco diciamo "sciocco" quello dove ci sono due "bruchi" e uno deve "chiudere" l'altro ovvero limitarne le mosse. Vince chi non si schianta sul bordo o dove è già passato un bruco. Ho pensato di gestire il tutto creando un campo con delle textbox (70x70 celle). Quando un bruco si sposta sulla cella la coloro coloro modificandone il backcolor e refreshando quella cella (le text sono contenute in una matrice di text). Ogni x tempo il bruco si sposta e per fare questo ho usato un timer che ogni x tempo sposta i due bruchini. Per scegliere la direzione di dove spostarsi l'utente 1 usa i tasti direzionali mentre l'utente 2 WASD. Acquisisco i tasti attraverso l'evento KeyDown. Finché nessuno preme tasti i bruchi si spostano alla velocità voluta senza creare disagi ma quando avviene la pressione di un tasto si genera un delay di 1-2sec e dopo di esso il gioco riprende con lo spostamento del bruco e fila liscio fino alla prossima pressione di un tasto. Come posso risolvere questa cosa? Ho letto in giro e ho sostituito i vari if con degli switch per "alleggerire" il tutto ma con risultati moooooolto scarsi se non nulli. Non so più che pesci pigliare
    Grazie in anticipo a tutti quelli che risponderanno!!!!

  2. #2

    Re: [C#] delay causato dal KeyDown

    Originariamente inviato da XshadowX
    Finché nessuno preme tasti i bruchi si spostano alla velocità voluta senza creare disagi ma quando avviene la pressione di un tasto si genera un delay di 1-2sec e dopo di esso il gioco riprende con lo spostamento del bruco e fila liscio fino alla prossima pressione di un tasto.
    Benvenuto nel forum di HTML.it

    Sei sicuro che il ritardo sia così estremamente elevato? Il Timer ogni quanto esegue un ciclo?
    A patto che il codice del Timer e dell'evento KeyDown non siano eccessivamente lunghi, conviene postare il codice, ovviamente utilizzando gli appositi TAG CODE.

    Ciao

  3. #3
    Grazie mille dell'accoglienza MdE2005!!

    Tornando al programma purtroppo si è così lungo questo maledetto ritardo

    poso qui il codice così puoi dare un occhiata

    P.S. ho usato il previewKeyDown qui solo per una prova per vedere se cambiava qualcosa ma niente

    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;
    
    namespace WindowsFormsApplication1
    {
        public partial class frmGioco : Form
        {
            public frmGioco()
            {
                InitializeComponent();
            }
    
            public Label[,] matrtx = new Label[60, 60];
            public int posX1 = 0;
            public int posY1 = 30;
            public int posX2 = 59;
            public int posY2 = 30;
            //0=giu 1=sx 5=su 3=dx
            public int prec1 = 3;
            public int prec2 = 1;
            public bool vittoria = false;
    
    
            private void frmGioco_Load(object sender, EventArgs e)
            {
    
            }
    
            private void Gioca()
            {
    
                this.Focus();
                tmrSpostamento.Enabled=true;
    
            }
    
    
            private void btnStart_Click(object sender, EventArgs e)
            {
                btnStart.Visible = false;
                label1.Visible = false;
    
                int x = 0;
                int y = 0;
    
                for (int i = 0; i < 60; i++)
                {
                    y = 0;
                    for (int k = 0; k < 60; k++)
                    {
                        Label tx = new Label();
                        tx.BorderStyle = BorderStyle.FixedSingle;
                        tx.Height = 10;
                        tx.Width = 10;
                        tx.Location = new Point(x, y);
                        matrtx[i,k] = tx;
                        Controls.Add(tx);
                        y += 10;
                    }
                    x += 10;
    
                }
                this.Refresh();
                Gioca();
            }
    
            private void tmrSpostamento_Tick(object sender, EventArgs e)
            {
                tmrSpostamento.Stop();
                matrtx[posX1, posY1].BackColor = Color.RosyBrown;
                matrtx[posX1, posY1].Refresh();
                matrtx[posX2, posY2].BackColor = Color.Black;
                matrtx[posX2, posY2].Refresh();
                switch (prec1)
                {
                    case 1: posX1--; break;
                    case 0: posY1++; break;
                    case 3: posX1++; break;
                    case 5: posY1--; break;
                }
    
                switch (prec2)
                {
                    case 1: posX2--; break;
                    case 0: posY2++; break;
                    case 3: posX2++; break;
                    case 5: posY2--; break;
                }
    
    
                if (vittoria != true)
                {
                    tmrSpostamento.Start();
                }
                else
                    MessageBox.Show("il player ha vinto la partita!!");
            }
    
            private void frmGioco_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
            {
                tmrSpostamento.Stop();
                switch (e.KeyValue)
                {
                    case 87: if (prec2 != 5 && prec2 != 0) prec2 = 5; break;
                    case 65: if (prec2 != 1 && prec2 != 3) prec2 = 1; break;
                    case 83: if (prec2 != 5 && prec2 != 0) prec2 = 0; break;
                    case 68: if (prec2 != 1 && prec2 != 3) prec2 = 3; break;
                    case 38: if (prec1 != 5 && prec1 != 0) prec1 = 5; break;
                    case 40: if (prec1 != 5 && prec1 != 0) prec1 = 0; break;
                    case 39: if (prec1 != 1 && prec1 != 3) prec1 = 3; break;
                    case 37: if (prec1 != 1 && prec1 != 3) prec1 = 1; break;
                }
                tmrSpostamento.Start();
            }
        }
    }

  4. #4
    raga per favore aiutatemi che non riesco a venirne fuori!!!

  5. #5
    nessuno mi riesce ad aiutare??? Non riesco a trovare una soluzione corretta per abbassare questo maledetto delay

  6. #6
    L'esecuzione del tuo evento dovrebbe essere pressoché istantanea; piuttosto, il dubbio che mi viene è un altro: nell'evento stoppi e riavvii il timer, il che significa che il timer riparte da capo nel momento in cui viene premuto un qualunque tasto - per questo secondo me si avverte quel delay di cui parli.
    Elimina quelle chiamate a tmrSpostamento.Stop() e tmrSpostamento.Start(), in ogni caso sono inutili (il tuo codice è single-threaded, per cui non può accadere che il codice dei vari eventi venga eseguito in contemporanea).
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Grazie mille della risposta ma purtroppo non funziona ancora... Se ho inteso bene mi hai detto di fare così no??? (ci sono pure i controlli per la vittoria ora )

    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;
    
    namespace WindowsFormsApplication1
    {
        public partial class frmGioco : Form
        {
            public frmGioco()
            {
                InitializeComponent();
            }
    
            public Label[,] matrtx = new Label[60, 60];
            public int posX1 = 0;
            public int posY1 = 30;
            public int posX2 = 59;
            public int posY2 = 30;
            //0=giu 1=sx 5=su 3=dx
            public int prec1 = 3;
            public int prec2 = 1;
            public bool vittoria = false;
    
            private void frmGioco_Load(object sender, EventArgs e)
            {
    
            }
    
            private void Gioca()//(Label [,]campo)
            {
                this.Focus();
                MessageBox.Show("ok 1 ");
                tmrSpostamento.Start();
            }
    
    
            private void btnStart_Click(object sender, EventArgs e)
            {
                btnStart.Visible = false;
                label1.Visible = false;
                int x = 0;
                int y = 0;
                for (int i = 0; i < 60; i++)
                {
                    y = 0;
                    for (int k = 0; k < 60; k++)
                    {
                        Label tx = new Label();
                        tx.BorderStyle = BorderStyle.FixedSingle;
                        tx.BackColor = Color.White;
                        tx.Height = 10;
                        tx.Width = 10;
                        tx.Location = new Point(x, y);
                        matrtx[i,k] = tx;
                        Controls.Add(tx);
                        y += 10;
                    }
                    x += 10;
    
                }
                this.Refresh();
                MessageBox.Show("ok ");
                Gioca();
            }
    
            private void tmrSpostamento_Tick(object sender, EventArgs e)
            {
                tmrSpostamento.Stop();
    
                if (posX1 >= 0 && posX1 <= 59 && posY1 >= 0 && posY1 <= 59 && matrtx[posX1, posY1].BackColor == Color.White )
                    {
                        matrtx[posX1, posY1].BackColor = Color.RosyBrown;
                        matrtx[posX1, posY1].Refresh();
                    }
                    else
                    {
                        MessageBox.Show("Il giocatore due ha vinto la partita");
                        vittoria = true;
                        SpegniTimer();
                    }
    
                    if (posX2 >= 0 && posX2 <= 59 && posY2 >= 0 && posY2 <= 59 && matrtx[posX2, posY2].BackColor == Color.White)
                    {
                        matrtx[posX2, posY2].BackColor = Color.Black;
                        matrtx[posX2, posY2].Refresh();
                    }
                    else
                    {
                        MessageBox.Show("Il giocatore uno ha vinto la partita");
                        vittoria = true;
                        SpegniTimer();
                    }
    
                if (vittoria != true)
                {
                    switch (prec1)
                    {
                        case 1: posX1--; break;
                        case 0: posY1++; break;
                        case 3: posX1++; break;
                        case 5: posY1--; break;
                    }
    
                    switch (prec2)
                    {
                        case 1: posX2--; break;
                        case 0: posY2++; break;
                        case 3: posX2++; break;
                        case 5: posY2--; break;
                    }
    
                     tmrSpostamento.Start();
                }
                else
                {
                    MessageBox.Show("Un player ha vinto la partita!!");
                    SpegniTimer();
                    
                }
            }
    
            private void frmGioco_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
            {
                switch (e.KeyValue)
                {
                    case 87: if (prec2 != 5 && prec2 != 0) prec2 = 5; break;
                    case 65: if (prec2 != 1 && prec2 != 3) prec2 = 1; break;
                    case 83: if (prec2 != 5 && prec2 != 0) prec2 = 0; break;
                    case 68: if (prec2 != 1 && prec2 != 3) prec2 = 3; break;
                    case 38: if (prec1 != 5 && prec1 != 0) prec1 = 5; break;
                    case 40: if (prec1 != 5 && prec1 != 0) prec1 = 0; break;
                    case 39: if (prec1 != 1 && prec1 != 3) prec1 = 3; break;
                    case 37: if (prec1 != 1 && prec1 != 3) prec1 = 1; break;
                }
            }
    
            private void SpegniTimer()
            {
                tmrSpostamento.Enabled = false;
                tmrSpostamento.Stop();
            }
        }
    }

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 © 2025 vBulletin Solutions, Inc. All rights reserved.