PDA

Visualizza la versione completa : [DELPHI:] Pressione di un tasto


gokan
19-08-2003, 22:42
Salve a tutti, come faccio a collegare un insieme di eventi alla pressione di un tasto?
Mi spiego meglio, ipotizziamo questa procedura:


procedure TTennisForm.FormKeyPress(Sender: TObject; var Key: Char);
begin
{La racchetta non deve uscire fuori dal campo}
case Key of
'A', 'a':if cpu1=FALSE then
if not (pnRacchetta1.Top<=0) then //se é oltre non si muove
if (pnRacchetta1.Top-12)<0 then //se continua si ferma al limite
pnRacchetta1.Top:=0
else //normale
pnRacchetta1.Top:=(pnRacchetta1.Top-12);
// //così anche per gli altri
'Z', 'z':if cpu1= FALSE then
if not ((pnRacchetta1.Top+pnRacchetta1.Height)>=pnCampo.Height) then
if (pnRacchetta1.Top+pnRacchetta1.Height+12)>pnCampo.Height then
pnRacchetta1.Top:=(pnCampo.Height-pnRacchetta1.Height)
else
pnRacchetta1.Top:=(pnRacchetta1.Top+12);
'J', 'j':if cpu2= FALSE then
if not (pnRacchetta2.Top<=0) then
if (pnRacchetta2.Top-12)<0 then
pnRacchetta2.Top:=0
else
pnRacchetta2.Top:=(pnRacchetta2.Top-12);
'M', 'm':if cpu2= FALSE then
if not ((pnRacchetta2.Top+pnRacchetta2.Height)>=pnCampo.Height) then
if (pnRacchetta2.Top+pnRacchetta2.Height+12)>pnCampo.Height then
pnRacchetta2.Top:=(pnCampo.Height-pnRacchetta2.Height)
else
pnRacchetta2.Top:=(pnRacchetta2.Top+12);
'X','x':Poteri;

'L','l':Poteri2;

end;


Vorrei che in qualunque parte del codice potessi richiamare la pressione di un tasto. Nella fattispecie sto tentando di realizzare l'intelligenza artificiale, in maniera tale che in determinate condizioni, ad esempio la racchetta "gestita" dalla cpu prema "virtualmente" X (richiamando cosi la procedura POTERI). Volevo insomma evitare di ricopiare del codice presente nella procedura POTERI.
Spero di essermi spiegato dignitosamente (è più facile a farsi che a dirsi).
ciao

piccaweb
20-08-2003, 01:17
Vuoi richiamare all'interno della procedura TTennisForm.FormKeyPress(Sender: TObject; var Key: Char); un'altra funzione che si riferisce alla pressione di un tasto, come se fosse stato l'utente a premerlo ?

alka
20-08-2003, 10:38
Originariamente inviato da gokan
Vorrei che in qualunque parte del codice potessi richiamare la pressione di un tasto. Nella fattispecie sto tentando di realizzare l'intelligenza artificiale, in maniera tale che in determinate condizioni, ad esempio la racchetta "gestita" dalla cpu prema "virtualmente" X (richiamando cosi la procedura POTERI). Volevo insomma evitare di ricopiare del codice presente nella procedura POTERI.
Spero di essermi spiegato dignitosamente (è più facile a farsi che a dirsi).

Se vuoi gestire la risposta della CPU in base alle tue azioni, credo che sia brutto legare il movimento alla pressione del tasto: in questo modo, quando non premi nulla, il gioco è fermo.

Credo che tu debba usare come minimo un timer o, per essere performante al massimo e garantire una fluidità basilare al gioco, servirti di un thread.

Ciao! :ciauz:

gokan
20-08-2003, 13:51
Ragazzi, forse ho risolto, vi faccio sapere......
Appena posso vi faccio provare la versione "unstable" :gren: del gioco così ci capiamo meglio..

gokan
20-08-2003, 22:44
Originariamente inviato da alka
Se vuoi gestire la risposta della CPU in base alle tue azioni, credo che sia brutto legare il movimento alla pressione del tasto: in questo modo, quando non premi nulla, il gioco è fermo.

Credo che tu debba usare come minimo un timer o, per essere performante al massimo e garantire una fluidità basilare al gioco, servirti di un thread.

Ciao! :ciauz:
Cosa è un thread, nel mio programmino faccio uso di un TTimer per gestire i movimenti delle racchette e della pallina..

alka
20-08-2003, 22:59
Un thread è un blocco di codice che viene eseguito in modo concorrenziale, trattato dalla CPU in modo simile a come vengono eseguiti i task (le applicazioni) in Windows (alternativamente, selezionandoli in base alla loro priorità).

Per creare un thread in Delphi, basta selezionare la voce di menu [New|Other...] e successivamente "Thread". Delphi creerà un discendente della classe TThread che incapsula già le funzioni API per attivarlo...l'unica cosa da fare è scrivere il blocco di codice del metodo Execute, che è in definitiva la porzione di codice da eseguire in modo asincrono.

L'uso dei thread e la loro interazione con la parte grafica (e con i componenti della VCL) richiede comunque qualche accorgimento e un discorso più approfondito a riguardo.

Sul newsgroup it.comp.lang.delphi, un partecipante ha pubblicato un esauriente tutorial a riguardo. Puoi consultarlo all'indirizzo che segue:
http://makeashorterlink.com/?V6C0518A5.

Ciao! :ciauz:

Loading