Portando app JavaME S40 para C# WP7: Um estudo de caso real da app CalcSphere

Embed Size (px)

DESCRIPTION

Apresenta detalhes e diferenças técnicas observadas durante a atividade de portar a app CalcSphere de JavaME para C# no Windows Phone 7

Citation preview

  • 1. Portando app JavaME S40 para C# WP7:Um estudo de caso real da app CalcSphere@eloijrhttp://eloisjr.blogspot.com

2. Eloi Jr Iniciou na rea mobile em 2005 Palestrou em diversos eventos de TI Escreveu artigos tcnicos Trabalha com Java ME e Android Possui uma app JavaME no GetJar com + 74Kdownloads Projeto hospedado no java.net: Tranqueira Empreendedor no Maranho!?!?? 3. CalcSphere uma nova e intuitiva calculadora com umainterface completamente diferente de tudo oque voc j viu. Baseada em JavaME Free com ads e paga sem Ads 4. CalcSphere Asha 202, Asha 203, Asha 300, Asha 303, X3-02, C3-01, C2-02, C2-03, C2-06 Touch and type, 240x320 Nokia Store: 26/09/2012 + 400 downloads 5. Porque Portar pro WP7? INdT em Imperatriz-MA: Setembro/2012 Minicurso XNA Game API: @sergiocavalc Primeira vez no VS!!! Desafio! 6. Objetivo da Apresentao Port no finalizado ainda! Nada de guerra entre linguagens/plataformas Observaes de sintaxe Apresentar dificuldades no processo Alguns caminhos observados Iniciante em C#, WP7! 7. Desenvolvedor Mobile JavaME? iOS? Android? Windows Phone? 8. Desenvolvedor Mobile JavaME? iOS? Android? Windows Phone? A oportunidade pode ser a mesma!! 9. Framework JavaME: Game API (Java) C#: XNA Game API (WP7) 10. JavaME e C#(XNA): Game API JavaME: GameCanvas, Layer, Sprite,TiledLayer, LayerManager public class Midlet extends MIDlet { public void startApp() { } public void pauseApp() { } public void destroyApp(boolean uncon) { } } 11. JavaME e C#(XNA): Game API C#:class Game1 : Microsoft.Xna.Framework.Game { public Game1() {...} void Initialize() {...} void LoadContent() {...} void UnloadContent() {...} void Update(GameTime gmt) {...} void Draw(GameTime gmt) {} } 12. JavaME e C#(XNA): Game Loop JavaME:while (running) { long cStart = System.currentTimeMillis();input();render(g);long tStart = (cStart - System.currentTimeMillis());if (tStart < MS_PER_FRAME) { try { Thread.sleep(MS_PER_FRAME - tStart); } catch (InterruptedException e) { }}} 13. JavaME e C#(XNA): Game Loop C#(XNA):public Game1() {...// Frame rate is 30 fps by default for WP.TargetElapsedTime =TimeSpan.FromTicks(333333);...}Update(GameTime gmt) {...}Draw(GameTime gmt) {} 14. Design Imagens Original: 240x320 WP7: 480x800 Novas imagens??? 15. Design Imagens Redimensionamento de imagens:Draw(GameTime gt) { spriteBatch.Begin()spriteBatch.Draw( background, new Rectangle(0, 0, graphics.PreferredBackBufferWidth, graphics.PreferredBackBufferHeight), Color.White );spriteBatch.End();} 16. Design Imagens Redimensionamento de imagens:Draw(GameTime gt) { spriteBatch.Begin()spriteBatch.Draw( sphere, new Rectangle( X, Y,(sphere.Width * SCALE),(sphere.Height * SCALE) ), Color.White );spriteBatch.End();} 17. Carregar Imagens JavaME:Image background = Image.createImage("background.png"); C#(XNA):Texture2D background =Content.Load("background"); 18. Declarao Constantes JavaME:public static final int COLOR_DIGIT_BOX =0x57b8c0; C#(XNA):public const string COLOR_DIGIT_BOX ="#57b8c0"; 19. Collection JavaME:Vector[] memoryHistory = {null, null, null, null, null}; C#(XNA):List[] memoryHistory = { null, null, null,null, null }; 20. Drawing JavaME:Graphics g = getGraphics();g.drawImage(background, canvasWidth >> 1,CanvasHeight >> 1,Graphics.HCENTER |Graphics.VCENTER);...flushGraphics(); 21. Drawing C#(XNA):Draw(GameTime gt) { spriteBatch.Begin()spriteBatch.Draw( background, new Rectangle(0, 0, graphics.PreferredBackBufferWidth, graphics.PreferredBackBufferHeight), Color.White );spriteBatch.End();} 22. Mtodo calcAngle atan2() => Math.Atan2() Math.abs() => Math.Abs() Math.toDegress() => MathHelper.ToDegress() Math.PI == Math.PI!!! 23. Converses de Tipo (char to int) JavaME:char c = 1;...int n = Integer.parseInt(String.ValueOf(c)); C#(XNA):char c = 1;...int n = c 0; 24. Converses de Tipo (int to String) JavaME:int currentDigit = 1;...String conv = String.valueOf(currentDigit) C#(XNA):int currentDigit = 1;...String conv = Convert.ToString(currentDigit, 10); 25. Converses de Tipo (String to Double) JavaME:String value = 12.1;...double number2 = Double.parseDouble(value); C#(XNA):String value = 12.1...double number2 = Double.Parse(value); 26. Fragmentos sem Converso!private void setHistoryFromMemory(int m) {calc.setHistory(memoryHistory[m]);memoryHistory[m] = null;} 27. reas Touch Classes (Rectangle j existia!):Rectangle {isPointerInside(int x, int y) { }...}Circle {inCircle(int x, int y) { }...} 28. reas Touch: JavaME Mtodos PointerPressed(), PointerReleased() ePointerDragged() Timer para monitorar e gerenciar um Long Tap Monitoramento manual e individual dos tipos degestos e toques 29. reas Touch: C#(XNA) Definir tipos de gestos que deseja monitorar Monitoramento dos gestos Disparar aes 30. reas Touch: C#(XNA)protected override void LoadContent() {...TouchPanel.EnabledGestures =GestureType.DragComplete | GestureType.Tap |GestureType.FreeDrag | GestureType.Hold;...} 31. reas Touch: C#(XNA)protected override void Update(GameTime gt) { ... while (TouchPanel.IsGestureAvailable) { GestureSample gesture = TouchPanel.ReadGesture(); Vector2 pos = gesture.Position;switch (gesture.GestureType) { case GestureType.Tap: ChkTap((int)pos.X, (int)pos.Y); break; ... 32. Persistncia JavaME:RecordStore rsAppState = RecordStore.openRecordStore("appstate", true);if (rsAppState.getNumRecords() == 0)rsAppState.addRecord(null, 0, 0);ByteArrayOutputStream bout = new ByteArrayOutputStream();DataOutputStream dout = new DataOutputStream(bout);dout.writeInt(currentTheme); 33. Persistncia C#(XNA): IsolateStorageFileusing (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication())using (IsolatedStorageFileStream isfs = new IsolatedStorageFileStream("appstate.txt", FileMode.Create, isf))using (StreamWriter writer = new StreamWriter(isfs))writer.WriteLine(CurrentTheme); 34. Padres JavaME: Primeira letra do nome dos atributos emtodos em MINSCULO C#: Primeira letra do nome dos atributos emtodos em MAISCULO 35. Classes World Calc Historico Operation Rect Circle ScrollArea 36. Tarefas/Problemas Pendentes Desenho de primitivas (rectangle, circle) SplashScreen rea de Scroll para as operaes Efeito flick nas esferas de operadores e dgitos Seleo de Temas Menu 37. CalcSphere Free: store.ovi.com/content/313798CalcSphere Paga: store.ovi.com/content/313832Email: [email protected] @eloijr http://eloisjr.blogspot.com