Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [C#]Timer e XNA
Forum - C# / VB.NET - [C#]Timer e XNA

Avatar
GiuseppeOliva_97 (Normal User)
Rookie


Messaggi: 35
Iscritto: 01/07/2012

Segnala al moderatore
Postato alle 22:51
Martedì, 25/09/2012
Salve a tutti sto creando un piccolo giochino con C# e XNA e mi serve una mano.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Timers;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace WindowsGame2
{
    class Controller : Sprite
    {
        public Controller(Texture2D texture, Vector2 posizione, float velocita, Color colore)
            : base(texture, posizione, velocita, colore)
        {

        }

        public override void Update(GameTime game)
        {

            if (Keyboard.GetState().IsKeyDown(Keys.D) && posizione.X < MieVariabili.larghezzaFinestre - texture.Width - 10.0f)
                posizione.X += velocita;
            if (Keyboard.GetState().IsKeyDown(Keys.A) && posizione.X > 10.0f)
                posizione.X -= velocita;
            //Predisposizione comandi sali e scendi
            /* if (Keyboard.GetState().IsKeyDown(Keys.W))
                posizione.Y += velocita;
            if (Keyboard.GetState().IsKeyDown(Keys.S))
                posizione.Y -= velocita; */
            if (Keyboard.GetState().IsKeyDown(Keys.Q))
                MieVariabili.logLaser.Add(new Laser(MieVariabili.texLaser, MieVariabili.posizioneLaser, MieVariabili.velocitaLaser, MieVariabili.coloreLaser));
            base.Update(game);
        }

        public override void Draw(GameTime game, SpriteBatch spriteBatch)
        {
            base.Draw(game, MieVariabili.spriteBatch);
        }

        public override Vector2 qualePosizione
        {
            get
            {
                return base.qualePosizione;
            }
        }
    }
}
Come potete notare alla pressione del tasto Q viene aggiunto un oggetto laser ad una lista e poi la lista viene disegnata a schermo in un altro punto del programma (foreach). Il problema è che potenzialmente si possono sparare un' infinità di laser e mi piacerebbe poter fare un doppio controllo alla Q. Una casa tipo questo: "Se q premuto e passati 2 secondi dal' ultimo laser allora aggiungi un nuovo laser alla lista";

Grazie mille in anticipo e ciao :-)

Risposta Citazione

PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 22:57
Martedì, 25/09/2012
Mi sembra un problema concettualmente facile da risolvere, alla generazione del laser verifichi una variabile bool tipo ready se true procedi se no niente laser e poi dopo la verifica con esito positivo imposti a false la varibile ready e crei un timer che dopo due secondi invoca una funzione che porta a true ready, semplice, no?!

PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 1:07
Mercoledì, 26/09/2012
Testo quotato

Postato originariamente da Roby94:

Mi sembra un problema concettualmente facile da risolvere, alla generazione del laser verifichi una variabile bool tipo ready se true procedi se no niente laser e poi dopo la verifica con esito positivo imposti a false la varibile ready e crei un timer che dopo due secondi invoca una funzione che porta a true ready, semplice, no?!



ommioddio che idea malsana!
e se uno tenesse premuto il tasto? che fa il tuo sistema, si mette ad istanziare timer ad ogni tick? una follia...

invece basta salvarsi in un campo della classe l'istante in cui avviene il primo sparo, se il tasto viene premuto di nuovo si controlla se è passato abbastanza tempo, se sì spara di nuovo:

Codice sorgente - presumibilmente C# / VB.NET

  1. // Globali
  2. DateTime lastShoot = DateTime.Now;
  3. TimeSpan shootDelay = new TimeSpan(0,0,2);
  4.  
  5. [...]
  6.  
  7. // Nella funzione Update dopo il check del tasto
  8. if (DateTime.Now - lastShoot >= shootDelay)
  9. {
  10.     // Codice dello sparo
  11.     [...]
  12.     // Imposto l'istante di sparo
  13.     lastShoot = DateTime.Now;    
  14. }
  15.  
  16. [...]


Ultima modifica effettuata da HeDo il 26/09/2012 alle 1:10
PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 14:05
Mercoledì, 26/09/2012
Testo quotato

Postato originariamente da HeDo:
ommioddio che idea malsana!
e se uno tenesse premuto il tasto? che fa il tuo sistema, si mette ad istanziare timer ad ogni tick? una follia...


Scusa ma leggi bene, il timer viene istanziato al massimo una volta ogni 2 secondi, cioè solo se la varibile ready è impostata a true

PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 15:27
Mercoledì, 26/09/2012
Testo quotato

Postato originariamente da Roby94:

Scusa ma leggi bene, il timer viene istanziato al massimo una volta ogni 2 secondi, cioè solo se la varibile ready è impostata a true



si ma in questo caso un'istanza ogni due secondi ci sta, ma metti che volessi temporizzare a mezzo secondo, sono già due istanze al secondo, e così via se diminuiamo il delay.
con il mio metodo non c'è bisogno di istanziare nulla :)

Ultima modifica effettuata da HeDo il 26/09/2012 alle 16:00
PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 16:08
Mercoledì, 26/09/2012
A beh ok se una critica al metodo generale ci sta, ma visto che chiedeva 2 secondi non mi sono fatto tanti problemi.

PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2268
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 16:18
Martedì, 02/10/2012
Ottimo consiglio Hedo.

Quel sistema e usato da quasi tutti i programmatori :)
compreso me.


https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 19:36
Martedì, 02/10/2012
Testo quotato

Postato originariamente da Thejuster:

Ottimo consiglio Hedo.

Quel sistema e usato da quasi tutti i programmatori :)
compreso me.



questo mi fa onore :k:

PM Quote