|
come gestisco l'attesa tra un tasto e l'altro
|
| Autore |
Messaggio |
daygoshen
Indieveloper
Messaggi: 95
Registrato: Jul 2009
Offline
|
#1
come gestisco l'attesa tra un tasto e l'altro
ciao ragazzi...
nel mio codice tutto è impostato a STATI.... se la variabile STATO=0.... sul metodo Update() e Draw() eseguo il draw e update di ogni classe che mi interessa.
Game1.cs
public static int STATO=0;
intro introduzione=new intro();
title titoli=new title();
level livello=new level();
protected override void Update(GameTime gameTime)
{
if (STATO==0)
{ introduzione.Update(ga....) }
if (STATO==1)
{ titoli.Update(ga....) }
if (STATO==2)
{ livello.Update(ga....) }
}
protected override void Draw(GameTime gameTime)
{
if (STATO==0)
{ introduzione.Draw(Spr....) }
if (STATO==1)
{ titoli.Draw(ga....) }
if (STATO==2)
{ livello.Draw(ga....) }
}
Sull'Update della classe introduzione e della classe titoli ..........ho programmato che se premo ENTER dalla tastiera assegno un valore alla variabile STATO.
Accade che premendo enter quando mi trovi su introduzione....mi passa direttamente al livello....
in parole povere credo che dovrei creare un input manager che gestisca uno i tasti premuti e di attesa da un tasto all'altro
Potete darmi delle dritte su come gestire questa attesa per favore?
Personal Site
|
|
| 09-09-2010 9:31 |
|
Maico
Senior Member
Messaggi: 261
Registrato: Oct 2009
Online
|
#2
RE: come gestisco l'attesa tra un tasto e l'altro
tiro ad indovinare...
probabilmente devi aggiornare la variabile di stato quando avviene la pressione del pulsante (ossia passa da non premuto a premuto) e non quando risulta semplicemente premuto... in questo modo aggiorni la variabile ad ogni pressione... per aggiornarla ripetutamente devi premere e rilasciare, premere e rilasciare....
quindi... XNA ti permette di sapere esclusivamente se un bottone è premuto o meno... quello che devi fare è scrivere un gestore della tastiera che ricavi informazioni aggiuntive riguardo i bottoni, ossia:
- FREE: il bottone è in stato di riposo
- HOLD: il bottone è mantenuto premuto
- PRESSED: il bottone è passato dallo stato FREE (o RELEASED) allo stato HOLD
- RELEASED: il bottone è passato dallo stato HOLD (o PRESSED) allo stato FREE
puoi facilmente ottenere queste informazioni confrontando ad ogni frame lo stato attuale dei tasti con quello del frame precedente...
una volta che sarai in grado di distinguere tra questi 4 stati potrai collegare l'aggiornamento della variabile STATO con lo stato PRESSED del tasto e non HOLD (come succede ora)
Marco "Maico" Canala
- Gameplay programmer @ SpinVector Spa -
"vedi lo sviluppo dei videogiochi è come la mafia una volta che cominci poi non puoi più uscirne, ne esci solo con la morte" (cit. blgames)
(Questo messaggio è stato modificato l'ultima volta il: 09-09-2010 10:30 da Maico.)
|
|
| 09-09-2010 9:42 |
|
Xaldyz
Esoterico
Messaggi: 2,385
Registrato: Apr 2010
Offline
|
#4
RE: come gestisco l'attesa tra un tasto e l'altro
(09-09-2010 9:42)Maico ha scritto: - FREE: il bottone è in stato di riposo
- HOLD: il bottone è mantenuto premuto
- PRESSED: il bottone è passato dallo stato FREE allo stato HOLD
- RELEASED: il bottone è passato dallo stato HOLD allo stato FREE
permettimi di farti una piccolissima correzione:
- RELEASED: il bottone è passato dallo stato HOLD (o PRESSED) allo stato FREE
è raro che capiti, ma può succedere
ora, tornando in topic.. il nostro amico Tano ti direbbe "fai un'interfaccia State, estendila e poi usa quegli oggetti!"
Perchè è impensabile gestire 250 stati in un unico file  ti devi creare una classe per ogni stato
mi ha preceduto infatti
(Questo messaggio è stato modificato l'ultima volta il: 09-09-2010 10:17 da Xaldyz.)
|
|
| 09-09-2010 10:17 |
|
daygoshen
Indieveloper
Messaggi: 95
Registrato: Jul 2009
Offline
|
#5
RE: come gestisco l'attesa tra un tasto e l'altro
grazie ragazzi!!!
Xaldyz, gestisco ogni stato in separate classe...
esempio:
gamestato = 0 -> classe introduzione
gamestato = 1 -> classe presentazione
gamestato = 2 -> classe titolo
gamestato = 3 -> classe menu
infatti sulla classe principale Game1 sul metodo Update() e Draw() quando gamestato=0 esegue l'Update e il Draw della classe introduzione ..quando gamestato=1 esegue l'update e il Draw della classe presentazione ecc....
Premendo enter quando gamestato=0 dovrebbe passare a gamestato=1....solo che mi passa direttamente al 3....
devo crearmi questa classe inputmanager  .... butto giù qualcosa e la posto così gentilmente mi date dei consigli
|
|
| 09-09-2010 10:42 |
|
kunos
Gatto Incavolato
Messaggi: 2,355
Registrato: Jul 2010
Offline
|
#7
RE: come gestisco l'attesa tra un tasto e l'altro
mi sembra un esempio di come non fare gli stati.
Non te ne fregherà nulla.. .ma, molto IMO:
1) STATO dovrebbe essere almeno STATE, o, meglio State, o anche meglio, non ci dovrebbe proprio essere.
2) I numeri 0,1,2,3 saranno estremamente significativi per te ADESSO.. ma per un altro sviluppatore, o per te stesso fra 4 mesi saranno un totale mistero. Se proprio devi andare di switchone anni 90, almeno fai un enum.
Lo scheletro per gestire gli stati in maniera molto piu' elegante potrebbe essere:
class Game
{
public map<string,GameState> gameStates;
GameState currentGameState;
public void setCurrentGameState(GameState newgs)
{
... codice per avvertire gli stati del cambio di attivita'
}
public void onIdle()
{
currentGameState.onIdle();
}
}
lo switchone o gli if in catena sono garanzia di bug e mal di testa.
Stefano Casillo
www.assettocorsa.net
www.netkar-pro.com
Twitter
|
|
| 09-09-2010 12:22 |
|
Corralx
Graph Lover
Messaggi: 810
Registrato: Jul 2010
Offline
|
#8
RE: come gestisco l'attesa tra un tasto e l'altro
(09-09-2010 12:22)kunos ha scritto: ubercut
Domanda fuori dal contesto.
Io ho sempre usato gli Enum per gestire gli stati.
Consigli di passare ad una gestione tramite Map<String, GameState>?
Come mai ora si fa questa scelta? che vantaggi porta?
Matteo "Corralx" Bertello
|
|
| 09-09-2010 12:58 |
|
Tano
Ninja Scientist
Messaggi: 1,408
Registrato: Nov 2008
Offline
|
#9
RE: come gestisco l'attesa tra un tasto e l'altro
(09-09-2010 12:58)Corralx ha scritto: (09-09-2010 12:22)kunos ha scritto: ubercut
Io ho sempre usato gli Enum per gestire gli stati.
Leggetevi lo State Pattern!  C'è tutto quello che vi serve! La struttura di ricerca dello state può essere poi fatto con un Map.. Ma leggetevi lo State Pattern, risponde a molte domande!
"..Credevamo di aver successo un giorno, al teatro delle commedie, con due soli spettatori.." Takeshi Kitano.
Gaetano Lenoci
Studio Leaves
Coward Knight
|
|
| 09-09-2010 13:13 |
|
kunos
Gatto Incavolato
Messaggi: 2,355
Registrato: Jul 2010
Offline
|
#10
RE: come gestisco l'attesa tra un tasto e l'altro
lo faccio semplicemente perche' in questo modo è facile accedere a classi "sconosciute" senza linkarle direttamente.
se sono in una login screen e voglio andare al main menu posso fare:
game.setCurrentGameState( game.gameStates["mainMenu"] );
si possono tranquillamente rendere tutti membri della sottoclasse di Game cmq e chiamarli direttamente.
Cmq l'idea era quella di evitare il mega switch:
case LOGIN:
...
case MAINMENU:
...
case LUNAPIENA:
...
ecc
decisamente poco OO
Stefano Casillo
www.assettocorsa.net
www.netkar-pro.com
Twitter
|
|
| 09-09-2010 13:13 |
|
daygoshen
Indieveloper
Messaggi: 95
Registrato: Jul 2009
Offline
|
#11
RE: come gestisco l'attesa tra un tasto e l'altro
grazieeee eclipse!!! quando vuoi cè sempre quel "mandarino e limone" !!!  ...cmq sono tornato a programmare il mio progetto ed iniziano le difficoltà
grazie kunos, diciamo che non ho mai programmato in c... è vero programmo ancora con la logica del basic  .... le mie basi.... con il c# ho iniziato solo con la guida di wilez e learning xna.... ho molte lacune. Ho bisogno di fare e vedere esempi semplici per capire.
tano scusami c'è qualche cosa in italiano o un tutorial più semplice dello State Pattern? faccio fatica a capirlo e applicarlo da wiki
|
|
| 09-09-2010 13:33 |
|
daygoshen
Indieveloper
Messaggi: 95
Registrato: Jul 2009
Offline
|
#12
RE: come gestisco l'attesa tra un tasto e l'altro
cmq il problema del tasto ho risolto creandomi una classe input manager...
con questa logica
if (gamestato==1 and TASTOisDown)
{gamestato=2;}
if (gamestato==2 and TASTOisUp)
{
if (TASTOisDown)
{gamestato=3;}
}
TASTOisDown è un bool:
currentkey.IsKeyDown(Keys.Enter) && oldkey.IsKeyDown(Keys.Enter);
TASTOisUp è un bool:
currentkey.IsKeyUp(Keys.Enter) && oldkey.IsKeyUp(Keys.Enter);
|
|
| 09-09-2010 15:14 |
|
Xaldyz
Esoterico
Messaggi: 2,385
Registrato: Apr 2010
Offline
|
#13
RE: come gestisco l'attesa tra un tasto e l'altro
(09-09-2010 15:14)daygoshen ha scritto: ...
gamestato
...
TASTOisDown
....
TASTOisUp
comunque, riquoto Tano, e ti linko anche questo ( italiano)
poi, qui trovi una guida su come implementarlo
|
|
| 09-09-2010 15:58 |
|
daygoshen
Indieveloper
Messaggi: 95
Registrato: Jul 2009
Offline
|
#14
RE: come gestisco l'attesa tra un tasto e l'altro
grazie xaldyz! conosco già la guida linkata...
Essendo sincero a primo impatto la trovai un po ostica per il mio livello...
adesso cercherò di dargli un occhiata approfondita! se ho problemi e domande a riguardo posto sempre qui in questo topic!!
ancora grazie
|
|
| 09-09-2010 16:51 |
|