Oppure

Loading
25/09/12 20:51
GiuseppeOliva_97
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
aaa
25/09/12 20:57
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?!
aaa
25/09/12 23:07
HeDo
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:


// Globali
DateTime lastShoot = DateTime.Now;
TimeSpan shootDelay = new TimeSpan(0,0,2);

[...]

// Nella funzione Update dopo il check del tasto
if (DateTime.Now - lastShoot >= shootDelay)
{
    // Codice dello sparo
    [...]
    // Imposto l'istante di sparo
    lastShoot = DateTime.Now;    
}

[...]

Ultima modifica effettuata da HeDo 25/09/12 23:10
aaa
26/09/12 12:05
Roby94
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
aaa
26/09/12 13:27
HeDo
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 26/09/12 14:00
aaa
26/09/12 14:08
Roby94
A beh ok se una critica al metodo generale ci sta, ma visto che chiedeva 2 secondi non mi sono fatto tanti problemi.
aaa
02/10/12 14:18
Thejuster
Ottimo consiglio Hedo.

Quel sistema e usato da quasi tutti i programmatori :)
compreso me.
mire.forumfree.it/ - Mire Engine
C# UI Designer
02/10/12 17:36
HeDo
Postato originariamente da Thejuster:

Ottimo consiglio Hedo.

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


questo mi fa onore :k:
aaa