54
Advanced Topics for Game Developers JÚLIO PESCUITE COOPERGAMES [email protected] @JULIOPESCUITE

Advanced topics for game developers

Embed Size (px)

Citation preview

  • 1. Advanced Topics for Game Developers JLIO PESCUITE COOPERGAMES [email protected] @JULIOPESCUITE

2. Agenda 1.Sobre mim2.Introduo terica3.Tpicos nvel Bsico4.Tpicos nvel Intermedirio5.Tpicos nvel Avanado6.Q/A7.Fim 3. Sobre mim Graduado em Engenharia de Computao pela Veris Educacional - MetrocampEspecialista em Desenvolvimento de Jogos Digitais pela PUC - ParanMBA em Gesto Empreendedora de negcios pela ESAMC - CampinasDesenvolvedor de jogos desde 2004 onde atuou em empresas como Overplay, Vostu e Daitan Games Studio(consultoria)Fundador da empresa CooperGamesCoautor do livro "Design de Jogos: Fundamentos", publicado em 2008 pela editora Brasport. 4. Sobre mim HaroPlayAcquaNinjaPoo 5. Aviso aos navegantes Apenas o caminho das pedras, a ponta do iceberg......Assuntos complexos frente capito ! 6. Um pouco de teoria BUSQUEM CONHECIMENTO ET BILU 7. Anatomia de um jogo Android 8. Anatomia de um jogo AndroidControlesLgicaSadaTouch Acelermetro Botes RedeJogo Fsica UI RedeTela Sensores Musica Sons Rede 9. Elementos de uma game engine CoreFsicaMusica/SomJanelasFerramentasRendererInterfaceEntrada/SadaRede 10. Anatomia de um jogo AndroidCargaEntradaRenderizaoFinalizaoExecuoAtualizao 11. Engines e frameworks para jogos Android 12. Engines e frameworks para jogos Android Os exemplos de cdigo sero feitos usando por base a AndEngine, pois : uma engine open sourceGrtisCdigo fonte aberto e disponvel par olhar/estudar/entender/usar/melhorCheia de exemplosBem suportada pela comunidade e criadoresEngine intuitiva e classes de fcil usoPerformtica : Suporta OpenGL ES 2Bacana ;) 13. Mo na massa : Bsico PIECE OF CAKE 14. Don't repeat yourself A grande maioria dos jogos(ou mesmo Engines) dispe de um conjunto de classes bsicas e comuns ao seu desenvolvimento, independente do gnero.Tipicamente conhecidas como core game classesA classe fundamental o GameObject , que representa um elemento qualquer de jogo ( Sprite, Jogador, Inimigo, texto etc.)Cada engine/desenvolvedor organiza o GameObject da maneira mais genrica possvel adequada dentro do contexto do projeto do jogo. 15. Don't repeat yourself Outras classes comuns tambm esto presentes, como por exemplo Sprite(objetos animados em tela), GuiText( Textos dinmicos dentro do jogo) ,Background( fundo do jogo, podendo ser animado ou esttico).Todas as classes restantes do jogo herdam de GameObject. 16. Don't repeat yourself 17. Don't repeat yourself Ex. GameObject da Unity 3D 18. Grficos Recomendao quanto ao uso das APIS Grficas : Jogos 2D Simples: Puzzles, Plataformas simples, jogos de uma nica tela : Use Canvas 19. Grficos Recomendao quanto ao uso das APIS Grficas : Jogos 2.5 D, 3D ou com muita atualizao em tela : Use Opengl ES nem que seja a verso 1.0 20. Em suma : Sempre que possvel, opte pelo OpenGL ES 21. Grficos Acelerao por Hardware A partir da API 11(Android 3.0) a renderizao suportada por hardware Todas as operaes de desenho em tela so executadas usando a GPUMas...... Seu jogo IR consumir mais memria ;(Acelerao de hardware habilitada por padro a partir da API 14 mas deve ser feita explicitamente : 22. Tela cheia neles Jogos : Usualmente em tela cheia !Cdigo da Activity do game : requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION); 23. Tela cheia neles 24. Mo na massa : Conte o FPS Frame rate a frequncia (taxa) em que um dispositivo de imagem produz imagens nicas e consecutivas nicos chamadas framesFrame rate na maioria das vezes expressa em quadros por segundo (FPS)Importante contar para verificar se o jogo no ficou travado em alguma rotinaAndEngine this.mEngine.registerUpdateHandler(new FPSLogger());E Pronto 25. Mo na massa : Conte o FPS 26. Mo na massa : Desenhe alguns GameObjects Sprites !!Passo 1 : Criar e carregar a textura : this.mTexture = new BitmapTexture(this.getTextureManager(), new IInputStreamOpener() { @Overridepublic InputStream open() throws IOException { return getAssets().open("gfx/face_box.png"); }}); this.mTexture.load(); 27. Mo na massa : Desenhe alguns GameObjects Passo 2 : Criar e adicionar o Sprite na cena :Criar o Sprite : final Sprite face = new Sprite( centerX,centerY, this.mFaceTextureRegion ,this.getVertexBufferObjectManager());Adicionar na cena : scene.attachChild(face); 28. Mo na massa : Desenhe alguns GameObjects 29. Mo na massa : Leia as entradas TouchListener se estiver fazendo a prpria engine (Chuck Norris mode = ON )Ou, AndEngine !Habilitando o Multi Touch : engineOptions.getTouchOptions().setNeedsMultiTouch(true); 30. Mo na massa : Leia as entradas final Sprite sprite = new Sprite(...) { // Pegando eventos de toque em um Sprite @Override public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY) { switch(pSceneTouchEvent.getAction()) { case TouchEvent.ACTION_DOWN: // Touch em direo para baixo break; case TouchEvent.ACTION_MOVE: // Toque E movimento break; case TouchEvent.ACTION_UP: // Touch em direo para cima break; } return true; } } 31. Mo na massa : Leia as entradas 32. Mo na massa : Controles em tela !!! Sempre que possvel , use controles em tela pois :Independem dos controles fsicos em hardwareFornecem melhor ergonomia de jogo em smartphonesSo mais intuitivos de usar de calibrar por parte dos jogadores 33. Mo na massa : Controles em tela !!! 34. Mo na massa : Controles em tela !!! A AndEngine j possui uma classe prpria para controles em tela :AnalogOnScreenControl 35. Mo na massa : Controles em tela !!! public AnalogOnScreenControl ( final float pX, final float pY,final Camera pCamera, final ITextureRegion pControlBaseTextureRegion, final ITextureRegion pControlKnobTextureRegion, final float pTimeBetweenUpdates, final long pOnControlClickMaximumMilliseconds, final VertexBufferObjectManager pVertexBufferObjectManager, final IAnalogOnScreenControlListener pAnalogOnScreenControlListener ); 36. Mo na massa : Controles em tela !!! new IAnalogOnScreenControlListener() { @Override public void onControlChange(final BaseOnScreenControl pBaseOnScreenControl, final float pValueX, final float pValueY) { physicsHandler.setVelocity(pValueX * 100, pValueY * 100); }@Override public void onControlClick(final AnalogOnScreenControl pAnalogOnScreenControl) { face.registerEntityModifier(new SequenceEntityModifier(new ScaleModifier(0.25f, 1, 1.5f), new ScaleModifier(0.25f, 1.5f, 1)));} }); 37. Mo na massa : Controles em tela !!! 38. Mo na massa : Intermedirio e Avanado MOTHER OF GOD... 39. Mo na massa : Desenhe algumas partculas ! Partculas : Menor ponto renderizvel em uma cena de jogo, mas com tempo de vida, trajetria e caractersticas prpriasPermitem reproduzir efeitos de fumaa, fogo, jatos de agua, sprays etc. 40. Mo na massa : Desenhe algumas partculas ! Usando a AndEngine :this.mBitmapTextureAtlas = new BitmapTextureAtlas(this.getTextureManager(), 32, 32, TextureOptions.BILINEAR_PREMULTIPLYALPHA);this.mParticleTextureRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mBitmapTextureAtlas, this, "particle_point.png", 0, 0); 41. Mo na massa : Desenhe algumas partculas ! final CircleOutlineParticleEmitter particleEmitter = new CircleOutlineParticleEmitter(ParticleSystemSimpleExample.CAMERA_WIDTH * 0.5f, ParticleSystemSimpleExample.CAMERA_HEIGHT * 0.5f + 20, 80); final SpriteParticleSystem particleSystem = new SpriteParticleSystem(particleEmitter, 60, 60, 360, this.mParticleTextureRegion, this.getVertexBufferObjectManager()); particleSystem.addParticleInitializer(new ColorParticleInitializer(1, 0, 0)); particleSystem.addParticleInitializer(new AlphaParticleInitializer(0)); particleSystem.addParticleInitializer(new BlendFunctionParticleInitializer(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE)); -10));particleSystem.addParticleInitializer(new VelocityParticleInitializer(-2, 2, -20,particleSystem.addParticleInitializer(new RotationParticleInitializer(0.0f, 360.0f)); particleSystem.addParticleInitializer(new ExpireParticleInitializer(6)); 42. Mo na massa : Desenhe algumas partculas ! particleSystem.addParticleModifier(new ScaleParticleModifier(0, 5, 1.0f, 2.0f)); particleSystem.addParticleModifier(new ColorParticleModifier(0, 3, 1, 1, 0, 0.5f, 0, 0));particleSystem.addParticleModifier(new ColorParticleModifier(4, 6, 1, 1, 0.5f, 1, 0, 1)); particleSystem.addParticleModifier(new AlphaParticleModifier(0, 1, 0, 1)); particleSystem.addParticleModifier(new AlphaParticleModifier(5, 6, 1, 0)); scene.attachChild(particleSystem); 43. Mo na massa : Desenhe algumas particulas ! 44. Mo na massa : Use Tilemaps !! Tilemap : Tcnica de otimizao de mapeamento de texturas onde possvel se ter uma nica textura, dividida em blocos(azulejos) e um ou vrios cenrios com mapeamentos diferentes da mesma textura (sistema de matriz). 45. Mo na massa : Use Tilemaps !! TileSet: Conjunto de reas de textura delimitadas por uma regio fixa 46. Mo na massa : Use Tilemaps !! Tilemap : Tileset + Mapeamento usualmente feito com uma ou mais ferramentas por exemplo,tiled. 47. Mo na massa : Use Tilemaps !! Usando Tilemaps com a AndEngine : TMXTiledMap mTMXTiledMap; final TMXLoader tmxLoader = new TMXLoader(this.getAssets(), this.mEngine.getTextureManager(), TextureOptions.BILINEAR_PREMULTIPLYALPHA, this.getVertexBufferObjectManager(),null); this.mTMXTiledMap = tmxLoader.loadFromAsset("tmx/desert.tmx"); final TMXLayer = this.mTMXTiledMap.getTMXLayers().get(0); scene.attachChild(tmxLayer); 48. Mo na massa : Use Tilemaps !! 49. Grficos Carregar texturas em arquivos .PNG legal mas, quando se precisa carregar muitas imagens, com memria(VRAM) limitada....Soluo ?Usar compresso de texturas : PVRTC e PVRTC2 : Algoritmos de compresso de textura(com perda) implementados na maioria dos chips grficos dos dispositivos Android(dentre outros)Permitem o uso de texturas grandes comprimidas 50. Grficos 51. Grficos Criar a PVRTexture com a AndEngine : this.mTextureRGB565 = new PVRTexture(this.getTextureManager(), PVRTextureFormat.RGB_565, new TextureOptions(GLES20.GL_LINEAR, GLES20.GL_LINEAR, GLES20.GL_CLAMP_TO_EDGE, GLES20.GL_CLAMP_TO_EDGE, false)) { @Override protected InputStream onGetInputStream() throws IOException { return PVRTextureExample.this.getResources().openRawResource(R.raw.house_pvr_rgb_565);} };Implementar chamadas na mo via Chuck norris mode : Fica para os universitrios 52. Dicas Finais Garbage collector is our friend : Coopere com ele evitando alocaes de novos objetos dentro do game loopSomente habilite os sensores(acelerometro) quando realmente precisar para evitar descarregar a bateria rapidamente.O jogo deve respeitar o ciclo de vida de uma Activity : lembre-se de implementar os metodos de pause; resume, assim os jogadores podero restaurar o estado do jogo de onde foi parado. 53. Contatos : [email protected]@juliopescuite+55 19 9 8129 25 29Obrigado !