Advanced topics for game developers

287 views
200 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
287
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
11
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Advanced topics for game developers

  1. 1. Advanced Topics for Game Developers JÚLIO PESCUITE COOPERGAMES JULIO@COOPERGAMES.COM.BR @JULIOPESCUITE
  2. 2. Agenda 1. Sobre mim 2. Introdução teórica 3. Tópicos nível Básico 4. Tópicos nível Intermediário 5. Tópicos nível Avançado 6. Q/A 7. Fim
  3. 3. Sobre mim  Graduado em Engenharia de Computação pela Veris Educacional - Metrocamp  Especialista em Desenvolvimento de Jogos Digitais pela PUC - Paraná  MBA em Gestão Empreendedora de negócios pela ESAMC - Campinas  Desenvolvedor de jogos desde 2004 onde atuou em empresas como Overplay, Vostu e Daitan Games Studio(consultoria)  Fundador da empresa CooperGames  Coautor do livro "Design de Jogos: Fundamentos", publicado em 2008 pela editora Brasport.
  4. 4. Sobre mim Haro PlayAcqua NinjaPoo
  5. 5. Aviso aos navegantes  Apenas o caminho das pedras, a ponta do iceberg......  Assuntos complexos à frente capitão !
  6. 6. Um pouco de teoria BUSQUEM CONHECIMENTO – ET BILU
  7. 7. Anatomia de um jogo Android
  8. 8. Anatomia de um jogo Android Controles Lógica Saída •Touch •Acelerômetro •Botões •Rede •Jogo •Física •UI •Rede •Tela •Sensores •Musica •Sons •Rede
  9. 9. Elementos de uma game engine Core Física Musica/Som Janelas Ferramentas Renderer Interface Entrada/Saída Rede
  10. 10. Anatomia de um jogo Android Carga Entrada Renderização Finalização Execução Atualização
  11. 11. Engines e frameworks para jogos Android
  12. 12. Engines e frameworks para jogos Android  Os exemplos de código serão feitos usando por base a AndEngine, pois :  É uma engine open source  Grátis  Código fonte aberto e disponível par olhar/estudar/entender/usar/melhor  Cheia de exemplos  Bem suportada pela comunidade e criadores  Engine intuitiva e classes de fácil uso  Performática : Suporta OpenGL ES 2  Bacana ;)
  13. 13. Mão na massa : Básico PIECE OF CAKE
  14. 14. Don't repeat yourself  A grande maioria dos jogos(ou mesmo Engines) dispõe de um conjunto de classes básicas e comuns ao seu desenvolvimento, independente do gênero.  Tipicamente conhecidas como core game classes  A 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 genérica possível adequada dentro do contexto do projeto do jogo.
  15. 15. Don't repeat yourself  Outras classes comuns também estão presentes, como por exemplo Sprite(objetos animados em tela), GuiText( Textos dinâmicos dentro do jogo) ,Background( fundo do jogo, podendo ser animado ou estático).  Todas as classes restantes do jogo herdam de GameObject.
  16. 16. Don't repeat yourself
  17. 17. Don't repeat yourself  Ex. GameObject da Unity 3D
  18. 18. Gráficos  Recomendação quanto ao uso das APIS Gráficas :  Jogos 2D Simples : Puzzles, Plataformas simples, jogos de uma única tela : Use Canvas
  19. 19. Gráficos  Recomendação quanto ao uso das APIS Gráficas :  Jogos 2.5 D, 3D ou com muita atualização em tela : Use Opengl ES nem que seja a versão 1.0 
  20. 20. Em suma : Sempre que possível, opte pelo OpenGL ES
  21. 21. Gráficos – Aceleração por Hardware  A partir da API 11(Android 3.0) a renderização é suportada por hardware   Todas as operações de desenho em tela são executadas usando a GPU Mas......  Seu jogo IRÁ consumir mais memória ;(  Aceleração de hardware é habilitada por padrão a partir da API 14 mas deve ser feita explicitamente : <application android:hardwareAccelerated="true" ...>
  22. 22. Tela cheia neles  Jogos : Usualmente em tela cheia !  Código 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. 23. Tela cheia neles
  24. 24. Mão na massa : Conte o FPS  Frame rate é a frequência (taxa) em que um dispositivo de imagem produz imagens únicas e consecutivas únicos chamadas frames  Frame rate é na maioria das vezes expressa em quadros por segundo (FPS)  Importante contar para verificar se o jogo não ficou travado em alguma rotina  AndEngine this.mEngine.registerUpdateHandler(new FPSLogger());  E Pronto 
  25. 25. Mão na massa : Conte o FPS
  26. 26. Mão na massa : Desenhe alguns GameObjects  Sprites !!  Passo 1 : Criar e carregar a textura : this.mTexture = new BitmapTexture(this.getTextureManager(), new IInputStreamOpener() { @Override public InputStream open() throws IOException { return getAssets().open("gfx/face_box.png"); } }); this.mTexture.load();
  27. 27. Mão 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. 28. Mão na massa : Desenhe alguns GameObjects
  29. 29. Mão na massa : Leia as entradas  TouchListener se estiver fazendo a própria engine (Chuck Norris mode = ON )  Ou, AndEngine !  Habilitando o Multi Touch : engineOptions.getTouchOptions().setNeedsMultiTouch(true);
  30. 30. Mão 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 direção para baixo break; case TouchEvent.ACTION_MOVE: // Toque E movimento break; case TouchEvent.ACTION_UP: // Touch em direção para cima break; } return true; } }
  31. 31. Mão na massa : Leia as entradas
  32. 32. Mão na massa : Controles em tela !!!  Sempre que possível , use controles em tela pois :  Independem dos controles físicos em hardware  Fornecem melhor ergonomia de jogo em smartphones  São mais intuitivos de usar de calibrar por parte dos jogadores
  33. 33. Mão na massa : Controles em tela !!!
  34. 34. Mão na massa : Controles em tela !!!  A AndEngine já possui uma classe própria para controles em tela :  AnalogOnScreenControl
  35. 35. Mão 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. 36. Mão 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. 37. Mão na massa : Controles em tela !!!
  38. 38. Mão na massa : Intermediário e Avançado MOTHER OF GOD...
  39. 39. Mão na massa : Desenhe algumas partículas !  Partículas : Menor ponto renderizável em uma cena de jogo, mas com tempo de vida, trajetória e características próprias  Permitem reproduzir efeitos de fumaça, fogo, jatos de agua, sprays etc.
  40. 40. Mão na massa : Desenhe algumas partículas !  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. 41. Mão na massa : Desenhe algumas partículas ! 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<Sprite>(1, 0, 0)); particleSystem.addParticleInitializer(new AlphaParticleInitializer<Sprite>(0)); particleSystem.addParticleInitializer(new BlendFunctionParticleInitializer<Sprite>(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE)); -10)); particleSystem.addParticleInitializer(new VelocityParticleInitializer<Sprite>(-2, 2, -20, particleSystem.addParticleInitializer(new RotationParticleInitializer<Sprite>(0.0f, 360.0f)); particleSystem.addParticleInitializer(new ExpireParticleInitializer<Sprite>(6));
  42. 42. Mão na massa : Desenhe algumas partículas ! particleSystem.addParticleModifier(new ScaleParticleModifier<Sprite>(0, 5, 1.0f, 2.0f)); particleSystem.addParticleModifier(new ColorParticleModifier<Sprite>(0, 3, 1, 1, 0, 0.5f, 0, 0)); particleSystem.addParticleModifier(new ColorParticleModifier<Sprite>(4, 6, 1, 1, 0.5f, 1, 0, 1)); particleSystem.addParticleModifier(new AlphaParticleModifier<Sprite>(0, 1, 0, 1)); particleSystem.addParticleModifier(new AlphaParticleModifier<Sprite>(5, 6, 1, 0)); scene.attachChild(particleSystem);
  43. 43. Mão na massa : Desenhe algumas particulas !
  44. 44. Mão na massa : Use Tilemaps !!  Tilemap : Técnica de otimização de mapeamento de texturas onde é possível se ter uma única textura, dividida em blocos(“azulejos”) e um ou vários cenários com mapeamentos diferentes da mesma textura (sistema de matriz).
  45. 45. Mão na massa : Use Tilemaps !!  TileSet: Conjunto de áreas de textura delimitadas por uma região fixa
  46. 46. Mão na massa : Use Tilemaps !!  Tilemap : Tileset + Mapeamento usualmente feito com uma ou mais ferramentas por exemplo,tiled.
  47. 47. Mão 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. 48. Mão na massa : Use Tilemaps !!
  49. 49. Gráficos  Carregar texturas em arquivos .PNG é legal mas, quando se precisa carregar muitas imagens, com memória(VRAM) limitada....  Solução ?  Usar compressão de texturas :  PVRTC e PVRTC2 : Algoritmos de compressão de textura(com perda) implementados na maioria dos chips gráficos dos dispositivos Android(dentre outros)  Permitem o uso de texturas grandes comprimidas
  50. 50. Gráficos
  51. 51. Gráficos  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 mão via Chuck norris mode : Fica para os universitários 
  52. 52. Dicas Finais  Garbage collector is our friend : Coopere com ele evitando alocações de novos objetos dentro do game loop  Somente 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 poderão restaurar o estado do jogo de onde foi parado.
  53. 53. Contatos :  www.coopergames.com.br  julio@coopergames.com.br  @juliopescuite  +55 19 9 8129 25 29 Obrigado !

×