Portando app JavaME S40 para C# WP7:Um estudo de caso real da app CalcSphere                    @eloijr                   ...
Eloi Jr●   Iniciou na área mobile em 2005●   Palestrou em diversos eventos de TI●   Escreveu artigos técnicos●   Trabalha ...
CalcSphere●   É uma nova e intuitiva calculadora com uma    interface completamente diferente de tudo o    que você já viu...
CalcSphere●   Asha 202, Asha 203, Asha 300, Asha 303, X3-    02, C3-01, C2-02, C2-03, C2-06●   Touch and type, 240x320●   ...
Porque Portar pro WP7?●   INdT em Imperatriz-MA: Setembro/2012●   Minicurso XNA Game API: @sergiocavalc●   Primeira vez no...
Objetivo da Apresentação●   Port não finalizado ainda!●   Nada de guerra entre linguagens/plataformas●   Observações de si...
Desenvolvedor Mobile●   JavaME?●   iOS?●   Android?●   Windows Phone?
Desenvolvedor Mobile●   JavaME?●   iOS?●   Android?●   Windows Phone?●   A oportunidade pode ser a mesma!!
Framework●   JavaME: Game API (Java)●   C#: XNA Game API (WP7)
JavaME e C#(XNA): Game API●   JavaME: GameCanvas, Layer, Sprite,    TiledLayer, LayerManager           public class Midlet...
JavaME e C#(XNA): Game API●   C#:    class Game1 : Microsoft.Xna.Framework.Game {     public Game1() {...}     void Initia...
JavaME e C#(XNA): Game Loop●   JavaME:    while (running) {     long cStart = System.currentTimeMillis();        input(); ...
JavaME e C#(XNA): Game Loop●   C#(XNA):    public Game1() {      ...      // Frame rate is 30 fps by default for WP.      ...
Design Imagens●   Original: 240x320●   WP7: 480x800●   Novas imagens???
Design Imagens●   Redimensionamento de imagens:    Draw(GameTime gt) {     spriteBatch.Begin()        spriteBatch.Draw( ba...
Design Imagens●   Redimensionamento de imagens:    Draw(GameTime gt) {     spriteBatch.Begin()        spriteBatch.Draw( sp...
Carregar Imagens●   JavaME:    Image background =     Image.createImage("background.png");●   C#(XNA):    Texture2D backgr...
Declaração Constantes●   JavaME:    public static final int COLOR_DIGIT_BOX =    0x57b8c0;●   C#(XNA):    public const str...
Collection●   JavaME:    Vector[] memoryHistory = {null, null, null, null, null};●   C#(XNA):    List<Operation>[] memoryH...
Drawing●   JavaME:    Graphics g = getGraphics();    …    g.drawImage(background, canvasWidth >> 1,                       ...
Drawing●   C#(XNA):    Draw(GameTime gt) {     spriteBatch.Begin()        spriteBatch.Draw( background,         new Rectan...
Método calcAngle●   atan2() => Math.Atan2()●   Math.abs() => Math.Abs()●   Math.toDegress() => MathHelper.ToDegress()●   M...
Conversões de Tipo (char to int)●   JavaME:    char c = 1;    ...    int n = Integer.parseInt(String.ValueOf(c));●   C#(XN...
Conversões de Tipo (int to String)●   JavaME:    int currentDigit = 1;    ...    String conv = String.valueOf(currentDigit...
Conversões de Tipo (String to               Double)●   JavaME:    String value = “12.1”;    ...    double number2 = Double...
Fragmentos sem Conversão!private void setHistoryFromMemory(int m) {    calc.setHistory(memoryHistory[m]);    memoryHistory...
Áreas Touch●   Classes (Rectangle já existia!):    Rectangle {      …      isPointerInside(int x, int y) { … }      ...   ...
Áreas Touch: JavaME●   Métodos PointerPressed(), PointerReleased() e    PointerDragged()●   Timer para monitorar e gerenci...
Áreas Touch: C#(XNA)●   Definir tipos de gestos que deseja monitorar●   Monitoramento dos gestos●   Disparar ações
Áreas Touch: C#(XNA)protected override void LoadContent() {  ...  TouchPanel.EnabledGestures =      GestureType.DragComple...
Áreas Touch: C#(XNA)protected override void Update(GameTime gt) { ... while (TouchPanel.IsGestureAvailable) {   GestureSam...
Persistência●   JavaME:    RecordStore rsAppState =     RecordStore.openRecordStore("appstate", true);    if (rsAppState.g...
Persistência●   C#(XNA): IsolateStorageFile    using     (IsolatedStorageFile isf =     IsolatedStorageFile.GetUserStoreFo...
Padrões●   JavaME: Primeira letra do nome dos atributos e    métodos em MINÚSCULO●   C#: Primeira letra do nome dos atribu...
Classes●   World●   Calc●   Historico●   Operation●   Rect●   Circle●   ScrollArea
Tarefas/Problemas Pendentes●   Desenho de primitivas (rectangle, circle)●   SplashScreen●   Área de Scroll para as operaçõ...
CalcSphere Free: store.ovi.com/content/313798CalcSphere Paga: store.ovi.com/content/313832                Email: eloimuon@...
Upcoming SlideShare
Loading in …5
×

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

1,076 views
977 views

Published on

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

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

  • Be the first to like this

No Downloads
Views
Total views
1,076
On SlideShare
0
From Embeds
0
Number of Embeds
6
Actions
Shares
0
Downloads
1
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

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

  1. 1. Portando app JavaME S40 para C# WP7:Um estudo de caso real da app CalcSphere @eloijr http://eloisjr.blogspot.com
  2. 2. Eloi Jr● Iniciou na área mobile em 2005● Palestrou em diversos eventos de TI● Escreveu artigos técnicos● Trabalha com Java ME e Android● Possui uma app JavaME no GetJar com + 74K downloads● Projeto hospedado no java.net: Tranqueira● Empreendedor no Maranhão!?!??
  3. 3. CalcSphere● É uma nova e intuitiva calculadora com uma interface completamente diferente de tudo o que você já viu.● Baseada em JavaME● Free com ads e paga sem Ads
  4. 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. 5. Porque Portar pro WP7?● INdT em Imperatriz-MA: Setembro/2012● Minicurso XNA Game API: @sergiocavalc● Primeira vez no VS!!!● Desafio!
  6. 6. Objetivo da Apresentação● Port não finalizado ainda!● Nada de guerra entre linguagens/plataformas● Observações de sintaxe● Apresentar dificuldades no processo● Alguns caminhos observados● Iniciante em C#, WP7!
  7. 7. Desenvolvedor Mobile● JavaME?● iOS?● Android?● Windows Phone?
  8. 8. Desenvolvedor Mobile● JavaME?● iOS?● Android?● Windows Phone?● A oportunidade pode ser a mesma!!
  9. 9. Framework● JavaME: Game API (Java)● C#: XNA Game API (WP7)
  10. 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. 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. 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. 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. 14. Design Imagens● Original: 240x320● WP7: 480x800● Novas imagens???
  15. 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. 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. 17. Carregar Imagens● JavaME: Image background = Image.createImage("background.png");● C#(XNA): Texture2D background = Content.Load<Texture2D>("background");
  18. 18. Declaração Constantes● JavaME: public static final int COLOR_DIGIT_BOX = 0x57b8c0;● C#(XNA): public const string COLOR_DIGIT_BOX = "#57b8c0";
  19. 19. Collection● JavaME: Vector[] memoryHistory = {null, null, null, null, null};● C#(XNA): List<Operation>[] memoryHistory = { null, null, null, null, null };
  20. 20. Drawing● JavaME: Graphics g = getGraphics(); … g.drawImage(background, canvasWidth >> 1, CanvasHeight >> 1, Graphics.HCENTER | Graphics.VCENTER ); ... flushGraphics();
  21. 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. 22. Método calcAngle● atan2() => Math.Atan2()● Math.abs() => Math.Abs()● Math.toDegress() => MathHelper.ToDegress()● Math.PI == Math.PI!!!
  23. 23. Conversões 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. 24. Conversões 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. 25. Conversões 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. 26. Fragmentos sem Conversão!private void setHistoryFromMemory(int m) { calc.setHistory(memoryHistory[m]); memoryHistory[m] = null;}
  27. 27. Áreas Touch● Classes (Rectangle já existia!): Rectangle { … isPointerInside(int x, int y) { … } ... } Circle { … inCircle(int x, int y) { … } ... }
  28. 28. Áreas Touch: JavaME● Métodos PointerPressed(), PointerReleased() e PointerDragged()● Timer para monitorar e gerenciar um Long Tap● Monitoramento manual e individual dos tipos de gestos e toques
  29. 29. Áreas Touch: C#(XNA)● Definir tipos de gestos que deseja monitorar● Monitoramento dos gestos● Disparar ações
  30. 30. Áreas Touch: C#(XNA)protected override void LoadContent() { ... TouchPanel.EnabledGestures = GestureType.DragComplete | GestureType.Tap | GestureType.FreeDrag | GestureType.Hold; ...}
  31. 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. 32. Persistência● 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. 33. Persistência● C#(XNA): IsolateStorageFile using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication()) using (IsolatedStorageFileStream isfs = new IsolatedStorageFileStream("appstate.txt", FileMode.Create, isf)) using (StreamWriter writer = new StreamWriter(isfs)) writer.WriteLine(CurrentTheme);
  34. 34. Padrões● JavaME: Primeira letra do nome dos atributos e métodos em MINÚSCULO● C#: Primeira letra do nome dos atributos e métodos em MAIÚSCULO
  35. 35. Classes● World● Calc● Historico● Operation● Rect● Circle● ScrollArea
  36. 36. Tarefas/Problemas Pendentes● Desenho de primitivas (rectangle, circle)● SplashScreen● Área de Scroll para as operações● Efeito flick nas esferas de operadores e dígitos● Seleção de Temas● Menu
  37. 37. CalcSphere Free: store.ovi.com/content/313798CalcSphere Paga: store.ovi.com/content/313832 Email: eloimuon@gmail.com @eloijr http://eloisjr.blogspot.com

×