Imparare a fare un semplice gioco con Python!

Questo è un post del membro del team Tutorial Julian Meyer, uno sviluppatore python di 13 anni. Lo potete trovare su Google + e Twitter.

Vi siete mai chiesti come vengono creati i videogiochi? Non è così complicato come si potrebbe pensare!

In questo tutorial, creerai un semplice gioco chiamato Bunnies and Badgers, in cui l’eroe, il coniglio, deve difendere un castello contro un’orda di tassi., : O

Per scrivere questo gioco, userai Python. No, non sto parlando di un grosso serpente! :]

Python è un linguaggio di programmazione per computer. Abbiamo scelto Python per questo tutorial perché è un linguaggio semplice per iniziare, ed è divertente e facile da imparare.

Se sei nuovo di Python, prima di iniziare dai un’occhiata a questo libro: Pensa a Python: come pensare come un informatico. Dovrebbe aggiornarti.

Poi tuffati di nuovo qui e preparati – c’è una guerra in arrivo tra i conigli e i tassi. Continua a leggere per saltare nella mischia!,

Guida introduttiva: Installazione di Python

Se vuoi provare questo tutorial su un PC Windows, devi installare Python. Assicurati di prendere la versione 2.7.3 e NON la versione 3.3.0! Dopo aver eseguito il programma di installazione, si dovrebbe avere inattivo nella cartella Tutti i programmi nel menu start. Avvia IDLE per iniziare.

Se sei su un Mac, hai già installato Python! Basta aprire il terminale (/Applicazioni / Utilità / Terminale.app), digitare python e premere Invio.

Nota: Se si installa Python da python.,org (e potrebbe essere necessario se vuoi far funzionare PyGame), allora avrai anche accesso a IDLE anche su Mac. Dovrebbe essere nella cartella “/ Applications / Python 2.7”.

Se l’hai fatto correttamente, dovresti vedere qualcosa del genere:

Nota: Se vuoi uscire dal prompt Python (le parentesi angolari triple,>>>), puoi digitare exit() al prompt Python e premere Invio oppure è possibile premere Control+D.,

Una volta che sei al prompt di Python, per verificare se Python funziona correttamente, digita print 1+1 e premi Invio / Invio. Dovrebbe stampare 2. Hai appena scritto il tuo primo programma Python!

Ora che sai che Python funziona correttamente, devi installare PyGame per scrivere un gioco usando Python.

PyGame è una libreria Python che rende la scrittura di giochi molto più facile! Esso fornisce funzionalità come la gestione delle immagini e la riproduzione del suono che si può facilmente incorporare nel vostro gioco.,

Vai qui e scarica il programma di installazione di PyGame appropriato per il tuo sistema. Assicurati di scaricare una versione di Python 2.7.

Nota: Il programma di installazione di PyGame dal link sopra non funzionerà con il Python predefinito di Apple installato su un Mac. Avrai bisogno di scaricare Python da python.org e installarlo al fine di utilizzare PyGame. Oppure, puoi installare sia Python che PyGame tramite MacPorts.

Per verificare che PyGame sia installato correttamente, apri IDLE o esegui Python tramite il Terminale e digita import pygame al prompt Python., Se questo non si traduce in alcun output, allora sei a posto.

Se, d’altra parte, emette un errore come quello mostrato di seguito, PyGame non è installato.

Se ricevi un errore come questo, pubblica sui forum e ti aiuterò a farlo funzionare.

Esecuzione del codice Python dal file

Mentre è possibile eseguire brevi bit di codice Python al prompt Python, se si desidera lavorare su un programma più grande (come un gioco), probabilmente si desidera salvare il codice in un file in modo da non dover digitare più e più volte.

Esistono diversi modi per eseguire un programma Python come file., Un modo è quello di utilizzare un editor di testo come Blocco note (Windows), o TextEdit (Mac). Apri un nuovo file di testo, digita il tuo codice Python (come print 1+1). Quindi salvarlo come XXX.py (Il XXX può essere qualsiasi nome di file descrittivo).

Quindi su Windows, fare doppio clic su questo file per eseguirlo. Su Mac, apri Terminale e digita python, quindi trascina il file salvato nella finestra del terminale e premi Invio.

L’altro modo è quello di digitare il codice utilizzando l’editor di inattività, che è quello che si sta andando a fare in questo tutorial. Per eseguire idle, è sufficiente digitare idle dal Terminale., Quindi scegli File \ Nuova finestra dal menu IDLE e dovresti avere una finestra dell’editor di testo in cui puoi digitare il codice Python. È possibile salvare le modifiche al codice tramite File\Save e persino eseguire il codice tramite Run\Run Module (F5).

Si noti che il menu Esegui è disponibile solo se si dispone di un file aperto in una finestra dell’editor.

Aggiungendo le risorse di gioco

Sei quasi pronto per creare il tuo gioco. Ma che cosa è un gioco senza alcuni grandi grafica ed effetti sonori? Ho messo insieme tutta la grafica e gli effetti sonori di cui avrai bisogno per il tuo gioco in un archivio ZIP. Puoi scaricarlo qui.,

una Volta scaricato il file, creare una cartella per il gioco sul vostro disco rigido ed estrarre la cartella di risorse in quella cartella in modo che la vostra cartella di gioco ha una sottocartella denominata risorse, con le varie risorse raggruppate in cartelle aggiuntive all’interno di esso, come:

ora Siete pronti per iniziare a creare i Coniglietti e il Tasso. :]

Passo 1: Hello Bunny

Esegui IDLE e apri una nuova finestra dell’editor di testo, come menzionato nella sezione precedente., Digitare il seguente codice nella finestra dell’editor:

Salvare il file nella cartella di gioco (quella in cui si trova la sottocartella risorse) e denominarlo game.py.

Passiamo attraverso il codice sezione per sezione:

  1. Importa la libreria PyGame. Ciò consente di utilizzare le funzioni della libreria nel programma.
  2. Inizializza PyGame e imposta la finestra di visualizzazione.
  3. Carica l’immagine che userai per il coniglio.
  4. Continua a scorrere il seguente codice rientrato.,

    Nota: Dove altri linguaggi come Objective-C, Java o PHP usano parentesi graffe per mostrare un blocco di codice da eseguire all’interno di un ciclo while o un’istruzione if, Python usa il rientro per identificare i blocchi di codice. Quindi il rientro corretto è molto importante in Python-tienilo a mente. :]

  5. Riempire lo schermo con il nero prima di disegnare qualsiasi cosa.
  6. Aggiungi l’immagine del coniglio che hai caricato sullo schermo a x = 100 e y = 100.
  7. Aggiorna lo schermo.
  8. Controlla eventuali nuovi eventi e se ce n’è uno, ed è un comando quit, esci dal programma.,

    Nota: secondo la documentazione di PyGame, non dovresti aver bisogno di chiamare pygame.quit () poiché l’interprete lo chiamerà automaticamente quando l’interprete si spegne. Tuttavia, almeno su Mac OS, il gioco si bloccherebbe in uscita a meno che pygame.quit () è stato chiamato.

Se si esegue il codice ora (tramite il modulo Run\Run nel menu Idle), si dovrebbe vedere una schermata simile a quella qui sotto:

w00t il coniglio è nella scena, e pronto per l’azione!

Ma il gioco sembra spaventoso e solitario con il coniglio solo in piedi lì su uno sfondo nero., È ora di abbellire un po ‘ le cose. :]

Passo 2: Aggiungi scenario

Iniziamo aggiungendo uno sfondo alla scena di gioco. Questo può essere fatto con un altro paio di schermo.blit () chiamate.

Alla fine della sezione #3, dopo aver caricato l’immagine del lettore, aggiungere il seguente codice:

grass = pygame.image.load("resources/images/grass.png")castle = pygame.image.load("resources/images/castle.png")

Questo carica le immagini e le inserisce in variabili specifiche. Ora devono essere disegnati sullo schermo. Ma se controlli l’immagine dell’erba, noterai che non coprirà l’intera area dello schermo, che è 640 x 480., Ciò significa che devi affiancare l’erba sopra l’area dello schermo per coprirlo completamente.

Aggiungi il seguente codice a game.py all’inizio della sezione # 6 (prima che il giocatore venga disegnato sullo schermo):

Come puoi vedere, l’istruzione for passa prima attraverso x. Quindi, all’interno di quel ciclo for, passa attraverso y e disegna l’erba ai valori x e y generati dai cicli for. Il prossimo paio di righe basta disegnare i castelli sullo schermo.

Se si esegue il programma ora, si dovrebbe ottenere qualcosa di simile:

Molto meglio – questo sta iniziando a guardare bene!, :]

Passo 3: Fai muovere il coniglio

Successivamente devi aggiungere alcuni elementi di gioco reali, come far rispondere il coniglio alle pressioni dei tasti.

Per fare ciò, prima implementerai un buon metodo per tenere traccia di quali tasti vengono premuti in un dato momento. È possibile farlo semplicemente facendo una serie di stati chiave che contiene lo stato di ogni chiave che si desidera utilizzare per il gioco.

Aggiungi il seguente codice a game.py alla fine della sezione # 2 (dopo aver impostato l’altezza e la larghezza dello schermo):

keys = playerpos=

Questo codice è abbastanza auto-esplicativo., L’array keys tiene traccia dei tasti premuti nel seguente ordine: WASD. Ogni elemento nell’array corrisponde a una chiave: la prima a W, la seconda a A e così via.

La variabile playerpos è dove il programma attira il giocatore. Dal momento che il gioco si sposta il giocatore in posizioni diverse, è più facile avere una variabile che contiene la posizione del giocatore e poi semplicemente disegnare il giocatore in quella posizione.

Ora è necessario modificare il codice esistente per disegnare il lettore per utilizzare la nuova variabile playerpos., Modificare la seguente riga nella sezione #6:

 screen.blit(player, (100,100))

In:

 screen.blit(player, playerpos)

Quindi, aggiornare l’array di chiavi in base a quali tasti vengono premuti. PyGame rende facile rilevare le pressioni dei tasti aggiungendo eventi.funzioni chiave.

Alla fine della sezione #8, subito dopo il controllo del blocco per l’evento.tipo = = pygame.ESCI, metti questo codice (allo stesso livello di rientro del pygame.ESCI se blocco):

Wow! Sono un sacco di righe di codice. Se lo scomponi nelle dichiarazioni if, non è così complicato.,

In primo luogo si controlla per vedere se un tasto viene premuto o rilasciato. Quindi si controlla quale tasto viene premuto o rilasciato e, se il tasto viene premuto o rilasciato è uno dei tasti che si sta utilizzando, si aggiorna la variabile keys di conseguenza.

Infine, è necessario aggiornare la variabile playerpos in risposta alla pressione dei tasti. Questo è in realtà molto semplice.

Aggiungi il seguente codice alla fine del gioco.,py (con un livello di indentazione, mettendolo allo stesso livello del ciclo for):

 # 9 - Move player if keys: playerpos-=5 elif keys: playerpos+=5 if keys: playerpos-=5 elif keys: playerpos+=5

Questo codice controlla semplicemente quale dei tasti viene premuto e aggiunge o sottrae dalla posizione x o y del giocatore (a seconda del tasto premuto) per spostare il giocatore.

Eseguire il gioco e si dovrebbe ottenere un giocatore proprio come prima. Prova a premere WASD. Evviva! Funziona.,

Passo 4: Girare il coniglietto

Sì, il tuo coniglietto ora si muove quando premi i tasti, ma non sarebbe ancora più bello se potessi usare il mouse per ruotare il coniglietto per affrontare una direzione a tua scelta, quindi non sta affrontando sempre lo stesso modo? È abbastanza semplice da implementare usando la trigonometria.,

guarda l’illustrazione riportata di seguito:

Nell’immagine sopra, se (5,3) è la posizione di bunny e (2,4) è la posizione corrente del mouse, è possibile trovare l’angolo di rotazione (z) applicando il atan2 funzione trigonometrica per la differenza di distanza tra i due punti. Naturalmente, una volta che si conosce l’angolo di rotazione, si può semplicemente ruotare il coniglio di conseguenza. :]

Se sei un po ‘ confuso su questa parte, non preoccuparti: puoi continuare comunque. Ma questo è il motivo per cui si dovrebbe prestare attenzione in classe di matematica!, :] Userai questa roba tutto il tempo nella programmazione del gioco.

Ora devi applicare questo concetto al tuo gioco. Per fare ciò, puoi usare la superficie PyGame.ruota (gradi) funzione. Per inciso, tieni presente che il valore Z è in radianti. : Che ne dici di lasciare che il coniglio spara ai nemici usando le frecce? Questo non è un coniglio mite!

Questo passaggio è un po ‘ più complicato perché devi tenere traccia di tutte le frecce, aggiornarle, ruotarle ed eliminarle quando vanno fuori dallo schermo.,

Prima di tutto, aggiungi le variabili necessarie alla fine della sezione di inizializzazione, sezione #2:

acc=arrows=

La prima variabile tiene traccia della precisione del giocatore e il secondo array tiene traccia di tutte le frecce. La variabile di precisione è essenzialmente un elenco del numero di colpi sparati e il numero di tassi colpiti. Più tardi, useremo queste informazioni per calcolare una percentuale di precisione.

Quindi, caricare l’immagine della freccia alla fine della sezione #3:

arrow = pygame.image.load("resources/images/bullet.png")

Ora quando un utente fa clic con il mouse, una freccia deve sparare., Aggiungi quanto segue alla fine della sezione # 8 come nuovo gestore di eventi:

Questo codice controlla se il mouse è stato cliccato e se lo è stato, ottiene la posizione del mouse e calcola la rotazione della freccia in base alla posizione del giocatore ruotato e alla posizione del cursore. Questo valore di rotazione viene memorizzato nell’array frecce.

Successivamente, devi effettivamente disegnare le frecce sullo schermo. Aggiungi il seguente codice subito dopo la sezione # 6.1:

I valori vely e velx sono calcolati usando la trigonometria di base. 10 è la velocità delle frecce., L’istruzione if controlla solo se il proiettile è fuori dai limiti e se lo è, elimina la freccia. Il secondo per l’istruzione passa attraverso le frecce e le disegna con la rotazione corretta.

Prova ad eseguire il programma. Si dovrebbe avere un coniglio che spara frecce quando si fa clic con il mouse! : D

Passo 6: Prendere le armi! Tassi!

OK, hai un castello e hai un eroe che può muoversi e sparare. Allora, cosa manca? I nemici che attaccano il castello che l’eroe può sparare a!,

In questo passaggio, creerai tassi generati casualmente che girano al castello. Ci saranno sempre più tassi man mano che il gioco progredisce. Quindi, facciamo una lista di ciò che ti serve per fare.

  1. Aggiungere cattivi a un elenco di un array.
  2. Aggiorna l’array di cattivi ogni fotogramma e controlla se sono fuori dallo schermo.
  3. Mostra i cattivi.

Facile, giusto?, :]

Per prima cosa, aggiungi il seguente codice alla fine della sezione #2:

badtimer=100badtimer1=0badguys=]healthvalue=194

Quanto sopra imposta un timer (così come alcuni altri valori) in modo che il gioco aggiunga un nuovo tasso dopo un po ‘ di tempo. Si diminuisce il badtimer ogni fotogramma fino a quando non è zero e poi si genera un nuovo tasso.

Ora aggiungi quanto segue alla fine della sezione # 3:

badguyimg1 = pygame.image.load("resources/images/badguy.png")badguyimg=badguyimg1

La prima riga sopra è simile a tutto il precedente codice di caricamento dell’immagine. La seconda riga imposta una copia dell’immagine in modo da poter animare il cattivo molto più facilmente.,

Successivamente, devi aggiornare e mostrare i cattivi. Aggiungi questo codice subito dopo la sezione # 6.2:

Un sacco di codice da superare. :] La prima riga controlla se badtimer è zero e se lo è, crea un tasso e imposta di nuovo badtimer in base a quante volte badtimer è stato eseguito finora. Il primo ciclo for aggiorna la posizione x del tasso, controlla se il tasso è fuori dallo schermo e rimuove il tasso se è fuori dallo schermo. Il secondo ciclo for disegna tutti i tassi.

Al fine di utilizzare la funzione casuale nel codice di cui sopra, è inoltre necessario importare la libreria casuale., Quindi, aggiungere quanto segue alla fine della sezione #1:

import random

Infine, aggiungere questa riga subito dopo l’istruzione while (sezione #4) per diminuire il valore di badtimer per ogni frame:

badtimer-=1

Provare tutto questo codice con l’esecuzione del gioco. Ora si dovrebbe iniziare a vedere un po ‘ di gioco reale-si può sparare, spostare, girare, e tassi cercano di correre a voi.

Ma aspetta! Perche ‘ i tassi non fanno saltare in aria il castello? Aggiungiamo rapidamente che in…

Aggiungi questo codice subito prima dell’indice + =1 sul primo ciclo for nella sezione # 6.,3:

Questo codice è abbastanza semplice. Se il valore x del tasso è inferiore a 64 a destra, elimina quel cattivo e riduci il valore della salute del gioco di un valore casuale compreso tra 5 e 20. (In seguito, verrà visualizzato il valore di salute corrente sullo schermo.)

Se costruisci ed esegui il programma, dovresti ottenere un gruppo di tassi attaccanti che svaniscono quando colpiscono il castello. Anche se non si può vedere, i tassi sono in realtà abbassando la vostra salute.,

Passo 7: Collisioni con tassi e Frecce

I tassi stanno attaccando il tuo castello ma le tue frecce non hanno alcun effetto su di loro! Come fa un coniglio a difendere la sua casa?

È ora di impostare le frecce per uccidere i tassi in modo da poter salvaguardare il vostro castello e vincere la partita! Fondamentalmente, devi scorrere tutti i cattivi e all’interno di ciascuno di questi loop, devi scorrere tutte le frecce e controllare se si scontrano. Se lo fanno, quindi eliminare il tasso, eliminare la freccia, e aggiungere uno al vostro rapporto di precisione.

Subito dopo la sezione #6.3.,1, aggiungi questo:

C’è solo una cosa importante da notare in questo codice. L’istruzione if è una funzione PyGame integrata che controlla se due rettangoli si intersecano. L’altro paio di righe fa solo quello che ho spiegato sopra.

Se si esegue il programma, si dovrebbe finalmente essere in grado di sparare e uccidere i tassi.

Passo 8: Aggiungi un HUD con Misuratore di salute e orologio

Il gioco sta procedendo abbastanza bene. Hai i tuoi attaccanti e hai il tuo difensore. Ora tutto ciò che serve è un modo per mantenere il punteggio e per mostrare quanto bene il coniglio sta facendo.,

Il modo più semplice per farlo è quello di aggiungere un HUD (Heads Up Display) che mostra il livello di salute corrente del castello. È inoltre possibile aggiungere un orologio per mostrare quanto tempo il castello è sopravvissuto.

Prima aggiungi l’orologio. Aggiungi il seguente codice subito prima dell’inizio della sezione #7:

Il codice precedente crea semplicemente un nuovo font usando il font PyGame predefinito impostato su dimensione 24. Quindi quel carattere viene utilizzato per rendere il testo del tempo su una superficie. Successivamente, il testo viene posizionato e disegnato sullo schermo.

Quindi aggiungi la barra dello stato., Ma prima di disegnare la barra della salute, è necessario caricare le immagini per la barra. Aggiungi il seguente codice alla fine della sezione # 3:

healthbar = pygame.image.load("resources/images/healthbar.png")health = pygame.image.load("resources/images/health.png")

La prima è l’immagine rossa utilizzata per l’intera barra dello stato. Il secondo è l’immagine verde utilizzata per mostrare il livello di salute corrente.

Ora aggiungi il seguente codice subito dopo la sezione # 6.4 (che hai appena aggiunto) per disegnare la barra della salute sullo schermo:

 # 6.5 - Draw health bar screen.blit(healthbar, (5,5)) for health1 in range(healthvalue): screen.blit(health, (health1+8,8))

Il codice disegna prima la barra della salute tutta rossa. Poi disegna una certa quantità di verde sopra la barra, in base a quanta vita il castello ha rimanente.,

Se si costruisce ed esegue il programma, si dovrebbe avere un timer e una barra di salute.

Passo 9: Vincere o perdere

Ma cos’è questo? Se giochi abbastanza a lungo, anche se la tua salute scende a zero, il gioco continua ancora! Non solo, puoi continuare a sparare anche ai tassi. Non funzionera’, vero? Hai bisogno di una sorta di vittoria/perdere scenario per rendere il gioco vale la pena giocare.

Quindi cerchiamo di aggiungere la vittoria e perdere condizione così come la vittoria o perdere schermo. :] Lo fai uscendo dal ciclo principale e entrando in un ciclo win / lose., Nel ciclo win / lose, devi capire se l’utente ha vinto o perso e visualizzare lo schermo di conseguenza.

di seguito è una struttura di base di vincere/perdere scenari:

Se il tempo è up (90000 ms o 90 secondi) poi:

  • Interrompere il gioco in esecuzione
  • Set di risultati di gioco per 1 o vincere

Se il castello è distrutto, quindi:

  • Stop running game
  • Set di risultati di gioco per 1 o vincere

Calcolare la precisione in entrambi i modi.

Nota: acc * 1.0 sta solo convertendo acc in un float., Se non lo fai, l’operando di divisione restituirà un numero intero come 1 o 2 invece di un float come 1.5

Aggiungi queste righe alla fine di game.py:

Questo è il bit di codice più lungo ancora! Ma non è così complicato.

La prima istruzione if controlla se il tempo è scaduto. Il secondo controlla se il castello è distrutto. Il terzo calcola il rapporto di precisione. Successivamente, una rapida dichiarazione if controlla se hai vinto o perso e visualizza l’immagine corretta.

Naturalmente, se si desidera visualizzare le immagini per la vittoria e perdere schermi, allora quelle immagini devono essere caricati prima., Quindi aggiungi il seguente codice alla fine della sezione # 3:

gameover = pygame.image.load("resources/images/gameover.png")youwin = pygame.image.load("resources/images/youwin.png")

Un’altra cosa veloce. Cambia sezione # 4 da:

# 4 - keep looping throughwhile 1: badtimer-=1

A:

# 4 - keep looping throughrunning = 1exitcode = 0while running: badtimer-=1

La variabile in esecuzione tiene traccia di se il gioco è finito e la variabile del codice di uscita tiene traccia di se il giocatore ha vinto o perso.

Esegui di nuovo il gioco e ora puoi trionfare o morire provandoci! Cool. :]

Passo 10: Musica gratuita ed effetti sonori!

Il gioco sembra abbastanza buono, ma come suona? E ‘un po’ tranquillo, vero?, L’aggiunta di alcuni effetti sonori può cambiare l’intera sensazione di un gioco.

PyGame rende il caricamento e la riproduzione di suoni super semplice. Per prima cosa, devi inizializzare il mixer aggiungendo questo alla fine della sezione #2:

pygame.mixer.init()

Quindi caricare i suoni e impostare il livello del volume alla fine della sezione #3:

La maggior parte del codice sopra è semplicemente caricare i file audio e configurare i livelli del volume audio. Ma fai attenzione al pygame.mixer.musicale.load line-quella linea carica la musica di sottofondo per il gioco e la riga successiva imposta la musica di sottofondo per ripetere per sempre.,

Che si occupa della configurazione audio. :] Ora tutto quello che dovete fare è quello di riprodurre i vari effetti sonori, se necessario. Fallo come da istruzioni nei commenti per il codice qui sotto:

Esegui il gioco ancora una volta e noterai che ora hai musica di sottofondo ed effetti sonori per collisioni e riprese. Il gioco si sente che molto più vivo! :]

Dove andare da qui?

Dovresti essere orgoglioso di te stesso: hai appena finito di creare un divertente gioco ricco di musica, effetti sonori, un coniglio assassino, tassi kamikaze e altro ancora. Te l’avevo detto che ce l’avresti fatta!, :]

È possibile scaricare il codice sorgente finale per il gioco qui.

A questo punto, sentitevi liberi di estendere questo gioco nella vostra creazione! Forse provare a sostituire l’arte con i propri disegni, o l’aggiunta di diverse armi o tipi di mostri nel gioco!

Avete domande o commenti su quello che hai fatto in questo tutorial? Se è così, partecipare alla discussione nei forum! Mi piacerebbe sentirti.


Questo è un post del membro del team Tutorial Julian Meyer, uno sviluppatore python di 13 anni.

raywenderlich.,com Settimanale

Il raywenderlich.com newsletter è il modo più semplice per rimanere up-to-date su tutto quello che c’è da sapere come uno sviluppatore mobile.

Ottieni un digest settimanale dei nostri tutorial e corsi e ricevi un corso e-mail di approfondimento gratuito come bonus!

Valutazione media

4.1 / 5

Aggiungi una valutazione per questo contenuto

Accedi per aggiungere una valutazione

15 valutazioni

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *