Orario: 22-05-2013, 1:49 Benvenuto ospite! (Log inRegistrati)


Rispondi 
come gestisco l'attesa tra un tasto e l'altro
Autore Messaggio
daygoshen
Indieveloper

Messaggi: 95
Registrato: Jul 2009
Offline Offline
#1 come gestisco l'attesa tra un tasto e l'altro
0
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
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Maico
Senior Member

Messaggi: 261
Registrato: Oct 2009
Online Online
#2 RE: come gestisco l'attesa tra un tasto e l'altro
0
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
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Tano
Ninja Scientist

Messaggi: 1,408
Registrato: Nov 2008
Offline Offline
#3 RE: come gestisco l'attesa tra un tasto e l'altro
0
Non puoi verificare ad ogni ciclo in che stato ti trovi.. Dai un occhiata a questo post: http://www.indievault.it/forum/showthrea...4#pid31424

Sisi

"..Credevamo di aver successo un giorno, al teatro delle commedie, con due soli spettatori.." Takeshi Kitano.

[Immagine: linkedin-icon.png]
Gaetano Lenoci
Studio Leaves
Coward Knight
09-09-2010 10:17
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Xaldyz
Esoterico

Messaggi: 2,385
Registrato: Apr 2010
Offline Offline
#4 RE: come gestisco l'attesa tra un tasto e l'altro
0
(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 Smile

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 Smile ti devi creare una classe per ogni stato
mi ha preceduto infatti Asd
(Questo messaggio è stato modificato l'ultima volta il: 09-09-2010 10:17 da Xaldyz.)
09-09-2010 10:17
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
daygoshen
Indieveloper

Messaggi: 95
Registrato: Jul 2009
Offline Offline
#5 RE: come gestisco l'attesa tra un tasto e l'altro
0
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 Smile .... butto giù qualcosa e la posto così gentilmente mi date dei consigli Smile
09-09-2010 10:42
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Eclipse
npc in fps 4 food

Messaggi: 11,272
Registrato: Sep 2004
Offline Offline
#6 RE: come gestisco l'attesa tra un tasto e l'altro
0
ciao daygoshen è bello rivederti sul forum!

Giuseppe Navarria - Moonloop
[Immagine: twittericon.png] [Immagine: linkedinicon.png] [Immagine: steamicon.png]
09-09-2010 12:01
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
kunos
Gatto Incavolato

Messaggi: 2,355
Registrato: Jul 2010
Offline Offline
#7 RE: come gestisco l'attesa tra un tasto e l'altro
0
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
[Immagine: acsign.jpg]
09-09-2010 12:22
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Corralx
Graph Lover

Messaggi: 810
Registrato: Jul 2010
Offline Offline
#8 RE: come gestisco l'attesa tra un tasto e l'altro
0
(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
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Tano
Ninja Scientist

Messaggi: 1,408
Registrato: Nov 2008
Offline Offline
#9 RE: come gestisco l'attesa tra un tasto e l'altro
0
(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! Fermosu 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.

[Immagine: linkedin-icon.png]
Gaetano Lenoci
Studio Leaves
Coward Knight
09-09-2010 13:13
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
kunos
Gatto Incavolato

Messaggi: 2,355
Registrato: Jul 2010
Offline Offline
#10 RE: come gestisco l'attesa tra un tasto e l'altro
0
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
[Immagine: acsign.jpg]
09-09-2010 13:13
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
daygoshen
Indieveloper

Messaggi: 95
Registrato: Jul 2009
Offline Offline
#11 RE: come gestisco l'attesa tra un tasto e l'altro
0
grazieeee eclipse!!! quando vuoi cè sempre quel "mandarino e limone" !!! Sorriso...cmq sono tornato a programmare il mio progetto ed iniziano le difficoltà Piange

grazie kunos, diciamo che non ho mai programmato in c... è vero programmo ancora con la logica del basic Smile .... 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 Piange
09-09-2010 13:33
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
daygoshen
Indieveloper

Messaggi: 95
Registrato: Jul 2009
Offline Offline
#12 RE: come gestisco l'attesa tra un tasto e l'altro
0
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
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Xaldyz
Esoterico

Messaggi: 2,385
Registrato: Apr 2010
Offline Offline
#13 RE: come gestisco l'attesa tra un tasto e l'altro
0
(09-09-2010 15:14)daygoshen ha scritto:  ...
gamestato
...
TASTOisDown
....
TASTOisUp

Facepalm

comunque, riquoto Tano, e ti linko anche questo (italiano)

poi, qui trovi una guida su come implementarlo
09-09-2010 15:58
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
daygoshen
Indieveloper

Messaggi: 95
Registrato: Jul 2009
Offline Offline
#14 RE: come gestisco l'attesa tra un tasto e l'altro
0
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
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Rispondi 


Vai al forum: