===== Jocs en Android ===== Ens basarem en els [[https://ioc.xtec.cat/materials/FP/Materials/2252_DAM/DAM_2252_M08/web/html/index.html|apunts de M8 de la IOC]]. {{tag> #FpInfor #Dam #DamMp08 #DamMp08Uf3 #DamMp08Uf03}} Per introduir-nos als jocs en Android podem començar pel [[https://ioc.xtec.cat/materials/FP/Materials/2252_DAM/DAM_2252_M08/web/html/WebContent/u4/a1/activitats.html|tutorial de la IOC per moure una bola amb el sensor del acceleròmetre]]. Mira d'entendre bé el codi que apareix en l'exemple proposat als apunts, sobretot en com es fa per moure la ''ImageView'' amb la bola. ==== Pilota rebotant ==== - Comença un nou projecte i pinta una pilota de forma similar en com has fet al projecte anterior, amb un ''ImageView'' sobre un ''RelativeLayout''. - Implementa un ''Android Timer'' (és similar als //timers// de Java, però la llibreria és una mica diferent. Necessitaràs un Timer + TimerTask. - Sobreescriu el mètode ''TimerTask.run'' i fes que la posició X i Y de la ''ImageView'' es vagi incrementant. - Detecta quan la bola arriba als límits i fes-la rebotar, canviant la seva velocitat X o Y. Per veure com detectar els límits pots fer un cop d'ull al codi que hem fet en la pràctica inicial. - Si veus que no rebota en els límits exactes segurament serà perquè has de tenir en compte el tamany de la bola. Aplica una correcció a la detecció de límits. - Si vols que els límits siguin exactes, hauràs de tenir en compte la ''ActionBar''. Pots: - Calcular el seu tamany i compensar el límit similarment en com has fet amb les dimensions de la bola. - Amagar-la (hide). En el cas que al voler amagar-la la aplicació falli, mira d'accedir a la ''SupportActionBar'' enlloc de la ''ActionBar''. ==== Millorant model per disposar de diverses boles ==== L'objectiu ara serà crear diverses boles a la pantalla i que es moguin lliurement amb diferents velocitats. Per a dur-ho a terme, pensa que: - Necessites pensar bé l'objecte ''Bola'' perquè contingui els atributs necessaris independents a cada instància. - Hauràs de crear un ArrayList de enlloc de tenir una de sola. - Has d'associar una ''ImageView'' a cada objecte ''Bola'', i NO el pots crear des del GUI del IDE. Busca com crear una ''ImageView'' **programàticament** (//programmatically//) i afegir cadasuna d'elles al //layout// principal de l'aplicació. - El ''Timer'' ara haurà d'actualitzar la posició de cadascuna de les boles. - Fes que cada bola tingui una imatge diferent. - Intenta canviar el tamany de la boles (per exemple, passats 5 segons o després de 1000 repintades). Què passa? Quin error dona? - Intenta canviar el tamany de les boles quan arribi un //touch event// qualsevol. Funciona ara? Perquè? ==== Col·lisions ==== Ja has fet algo similar a les col·lisions quan has controlat el rebot de la pilota als límits de la pantalla. Ara volem extendre aquest fenomen i fer que les pilotes col·lisionin entre sí. Tingues en compte que: - Ens caldrà un mètode ''intersecta'' a l'objecte bola, i que ens dirà si s'està tocant amb una altra bola. Pots simplificar el model de la bola i pensar que és un quadrat que va de (x,y) a (x+w,y+h). Si els dos quadrats de les boles s'intersecten és que hi ha col·lisió. - Quan detectem una col·lisió, hauríem de saber per quin costat ha succeït. De moment simplifiquem per tenir una aproximació, i simplement canviem el signe (multipliquem per -1) de la velocitat X. - Ara estem efectuant la col·lisió un cop s'ha produït. De vegades això pot provocar efectes estranys. Seria millor canviar les velocitats //abans// que succeeixi la col·lisió. Potser convindria un mètode per precalcular el següent estat de la pilota i calcular la col·lisió en l'instant següent, i no aquest. - Pensa alguna manera de preveure si per quin costat serà la col·lisió, i quina velocitat de la pilota cal afectar en el rebot, si la Vx o la Vy.