Newsgroup: it.comp.lang.pascal
Titolo: movimento?????????

ciao ragazzi,
potete crearmi un codice che possa far muovere un oggetto, una parola,un
segno,sullo schermo utilizzando i tasti direzionali della tastiera, oppure
indicarmi codici sorgenti di videogiochi molto semplici????????
grazie

> potete crearmi un codice che possa far muovere un oggetto,
No, ma posso darti una mano
Prima di tutto se ti serve una funzione che legga i tasti speciali della
tastiere come F1..F12, freccette etc etc.
Quella che segue fa al caso tuo
function LeggiTasto : Word;
{ Legge il buffer di tastiera, se trova un carattere lo legge e lo
  restituisce, altrimenti restituisce 0
  La funzione assegna un codice superiore a 256 per i tasti speciali
}
var C : Word;
begin
  asm
                           mov ah, 01h
                           int 16h
                           jnz @Key         { Z = 0 c'S tasto   }
                           xor ax, ax
                           jmp @ExitLeggi
      @Key           :     xor  ah, ah
                           int  16h
                           test al, al      { se al = 0 tasto speciale  }
                           jz   @Speciale
                           xor  ah, ah
                           jmp  @ExitLeggi
      @Speciale      :     xchg al, ah       { tasto speciale =    }
                           inc  ah           { codice tasto + 256  }
      @ExitLeggi     :     mov  C, ax
  end;
  LeggiTasto:=C;
end;
Questa funzione ha 2 particolarità :
la prima ritorna un codice per ogni tasto della tastiera (tastiera standard
quindi non legge i tasti multimediali)
ritornado un doppio byte i tasti speciali hanno un valore superiore a 256,
la seconda particolarità è che non aspetta che venga battuto un tasto, penso
che sia ottima per realizzare un videogioco rudimentale dove ci sono più
elementi che si muovono sul video e solo uno e codizionato dalla tastiera.
La funzione quindi ritorna un codice (ora non ricordo tutta la mappatura fai
delle prove) se è stato battuto un pasto, ritorna 0 altrimenti
Proviamo adesso a spostare una A sul video in modalità testo
    var X,Y : integer;
            tasto : word;
    begin
        X:=40; Y:=12; write('A');
        repeat
            gotoxy(X,Y); write(' ');(*c'è uno spazio tra le virgolette *)
            tasto:=LeggiTasto;
            case tasto of
                FrecciaDx :
                                    begin
                                        X:=X+1;
                                        if X>79 then X=1;
                                    end;
                FrecciaSx :
                                    begin
                                        X:=X-1;
                                        if X<1 then X:=79;
                                    end;
                FrecciaSu :
                                    begin
                                        Y:=Y-1;
                                        if Y<1 then Y:=23;
                                    end;
                FrecciaGiu :
                                    begin
                                         Y:=Y+1;
                                         if Y>23 then Y:=1;
                                    end
                end;
                gotoxy(X,Y); write('A');
        until  tasto=27;
    end.
Prova un po il codice l'ho scritto direttamente sul post quindi nn so se ci
sono errori fammi sapere
ReDiCuori
--
L'informatica è un arte
---------------------------------------------------------
 
www.pascallike.too.it
 
http://utenti.lycos.it/pascallike
 il sito sulla programmazione pascal e non solo
---------------------------------------------------------

"ReDiCuori" <redicu...@NOSPAMinwind.it> ha scritto nel messaggio
news:eaXg9.109587$pX1.3...@news2.tin.it...

di che tipo devo dichiarare frecciadx,freccia......con char mi da errore


Nel codice ho messo Frecciadx... perchè non ricordavo il codice che la
funzione ritorna
al posto di tutte quelle frecce metti il valore che la funzione ritorna
quando premi una freccia.
Ciao ReDiCuori


      @ExitLeggi     :     mov  C, ax
infatti non fai altro che copare un valore da AX per meterlo in Mem
per poco dopo rimeterlo in AX (le funzioni Word usano AX come valore
di ritorno, Al per quelle byte)
ottieni essatamente la stessa cosa solo ke devi scrivere "assembler"
accando al nome della funzione... cioè
function LeggiTasto : Word;  Assembler
asm
  tuo testo
end;
ke credo sia meglio (1 si risparmiano 2 Byte di var e 2 istruzioni
(da AX a Mem e da Mem ad AX)
cmq credo ke ancke il pascal normale (con ReadKey e Keypressed)
non è cosi malvagio...
Function LeggiTasto : Word
Var Result : Word;
Begin
   Result := 0;
   If Keypreesed
     Then Begin
        Result := ReadKey;
        If Result = 0
          Then Result := ReadKey * 256
        End;
End;
Cmq anke il tuo codice ASM è perfetto :D PS
ti volevo chiedere
    @Speciale      :     xchg al, ah       { tasto speciale =    }
                           inc  ah           { codice tasto + 256  }
perke dopo aver scambiato (con xchg) il contenuto con al e ah
incrementi ah  di 1? e come se faresti
Risultato = AL * 256 + 256
Il Razziatore,
The Only Good Windows is an uninstalled Windows
-----------------------------------------------
E-MAILs : IlRazziat...@NOSPAMnetscape.net
WEB     : 
http://www.razziatore.dns2go.com/
ICQ     : 67552596

 Risultato = AL * 256 + 256
Quando viene battuto un tasto speciale viene ritornato un doppio byte
quindi ah=codice tasto  al=0
xchg se ricordo bene fa il gioco delle 3 carte quindi sposta il contenuto di
ah in al e viceversa
quindi ho un registro del tipo
AX
ah: 0  al :codice
incrementando ah di uno ho una cosa del genere
ah 1 al : codice
tieni presente che "codice" non va oltre il valore 255 mettedo 1 in ah non
ho fatto altro che
ritornare
Risultato=Al+256;
Ciao ReDiCuori



Se tu vuo ke in AX
venga
0 codicenormale
oppure
codicespeciale 0
non bastave mettere 0 su ah e poi fare lo xchg
se invece di usare lo xchg potevi shiftare la cifra da un registro
all'altro ma non so quanto ti convenga...
io nel mio algoritmo ho moltiplicato per 256 (100h) e tanti saluti
