O documento descreve a portabilidade de um aplicativo JavaME para calculadora esférica para a plataforma Windows Phone 7 usando C# e o framework XNA. Detalha as semelhanças e diferenças entre as APIs de jogo em cada plataforma e os desafios encontrados ao converter tipos, áreas sensíveis ao toque, armazenamento de dados e outras funcionalidades.
Portando app JavaME S40 para C# WP7: Um estudo de caso real da app CalcSphere
1. Portando app JavaME S40 para C# WP7:
Um estudo de caso real da app CalcSphere
@eloijr
http://eloisjr.blogspot.com
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. 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
5. Porque Portar pro WP7?
● INdT em Imperatriz-MA: Setembro/2012
● Minicurso XNA Game API: @sergiocavalc
● Primeira vez no VS!!!
● Desafio!
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!
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) {…}
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. 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. 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);
27. Áreas Touch
● Classes (Rectangle já existia!):
Rectangle {
…
isPointerInside(int x, int y) { … }
...
}
Circle {
…
inCircle(int x, int y) { … }
...
}
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. Áreas Touch: C#(XNA)
● Definir tipos de gestos que deseja monitorar
● Monitoramento dos gestos
● Disparar ações
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. 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. 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. Classes
● World
● Calc
● Historico
● Operation
● Rect
● Circle
● ScrollArea
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