pondělí 21. prosince 2015

Jak převést aplikaci pro Android na iPhone a iPad

Jak možná víte, náš herní engine GameStylus odstartoval jako aplikace pro Android (v Javě) a na počátku vývoje jsme neměli tušení, jestli a případně jak jej budeme portovat na jinou platformu. Ale po několika měsících bylo rozhodnuto - rozhodně chceme engine portovat na iOS (a Objective-C). Ale jak? Pokud se snažíte najít odpověď na stejnou otázku, možná tento text s popisem našich kroků bude pro vás aspoň trochu užitečný.

Jak zkonvertovat aplikaci pro Android do iOS, z Java do Objective-C

Pravděpodobně nebudete potřebovat představivost úspěšného romanopisce, aby vám bylo jasné, jak jsme začali: Ano, na Google.com. Spousta vyhledávání, spousta klíčových slov a co jsme dostali? Mnoho lidí tvářících se jako experti, kteří tvrdili, že to prostě není možné. Tedy - není to možné bez spousty ruční práce. Operační systémy (Android, iOS) jsou velmi odlišné, víte, Android užívá Java Virtual Machine, problémy s licencemi, Apple má speciální API, jsou tu unikátní uživatelská rozhraní iPhone a iPadu... A Java je velmi, velmi odlišná od Objective-C... Znáte to: spousta bla, bla, bla...
Pak tam byly jiné rady, většinou doporučující používat projekt j2objc od Google. Ale většinou jen teoretické rady, žádné skutečné zkušenosti.
Pokud nevíte, co j2objc je, pak tedy: j2objc je open source projekt od společnosti Google, který umí převést kód v jazyce Java do Objective-C (nebo, v krátkosti, Obj-C). A výsledný kód by měl být velmi dobrý - tak dobrý, že jej můžete prostě vzít a zkompilovat jej. Zní to příliš dobře, aby to byla pravda?
Google slibuje, že tento nástroj umožňuje kódu v Javě stát se doslova součástí aplikací pro iOS, žádná editace vytvořených souborů není nutná. Myšlenka je tato: Vytvoříte samostatné UI (uživatelské rozhraní) a příslušný kód UI pro obě platformy, ale aplikační logika a datové modely budou stejné - pro oba projekty. Ano, to zní dobře a my jsme to rozhodně museli zkusit...

Je j2objc tím pravým řešením pro překlad Javy do Obj-C?

Chcete-li použít j2objc (http://j2objc.org/), musíte jej stáhnout, rozbalit a použít tím správným způsobem - což znamená, že budete muset dát hlavičkové soubory a knihovny na to správné místo, aby je váš kompilátor našel - a používal je. A nastavit kompilátor, samozřejmě. Proč? Protože jakmile si přeložíte svůj projekt z Javy do Objective-C, kompilátor bude potřebovat tyto hlavičkové soubory a knihovny, aby vytvořil vaši finální aplikaci pro iOS.
Budeme zcela upřímní: Trvalo hodně času projít celou (zcela nedostatečnou) dokumentaci j2objc i rady jiných lidí, aby to aspoň trochu fungovalo, a když jsme se konečně dostali k přeloženému Objective-C kódu, nebyli jsme zdaleka tak šťastní, jak jsme očekávali. Protože kód není určen pro další změny. Metody jsou přejmenovány (názvy jsou srozumitelné, ale docela dlouhé), jiné metody přidány a celý výsledek je trochu nepřehledný.
Ale buďme spravedliví: Tohle není problém tohoto nástroje - to je náš problém. Měli jsme nějaká (nevhodná) očekávání a ta nebyla splněna. Naše představa byla přeložit kód z Javy do Obj-C a pak udělat nějaké změny a získat pěkný Obj-C kód, kde budeme moci dělat tolik změn, kolik bude dnes - nebo v budoucnu - potřeba. Ale to není účelem tohoto konvertovacího nástroj.
Trochu jsme si pak hráli s tímto nástrojem i s výsledným kódem. Není možné využít některé konverze a použít je pro náš účel? Znova trochu upřímnosti: Raději bychom nepoužívat žádné knihovny z Google (jako v každém kódu, i tam jsou nepochybně nějaké chyby a proč přidávat chyby Googlu k těm našim?). A chtěli jsme kód udělat srozumitelnějším. Ale v jednu chvíli to už bylo jasné: Ne, to není ten správný způsob, jak převést naši aplikaci pro Android do iOS.

Našli jsme ten správný nástroj pro převod

A pak jsme našli další open source nástroj, čtyři nebo pět let starý java2objc (https://code.google.com/p/java2objc/). Jméno může vypadat podobně, ale není to totéž jako j2objc. Tento kód je zveřejněna pod licencí Apache a jeho účel je jiný. Výsledný kód může být nedokonalý, ale je velmi dobře použitelný. Tento nástroj se zabývá jednotlivými zdrojovými soubory v Javě místo konkrétními třídami a pokusí se dle vlastní dokumentace vytvořit "dobře řemeslně vytvořený Objective C kód, jako by byl psaný člověkem". A velmi snadno se používá.
Nemusíte dělat žádné složité nastavení - stačí spustit: run xxx.java - z příkazové řádky, kde xxx.java je váš Java kód, který chcete přeložit do Objective-C. Java2objc je také velmi rychlý - po několika sekundách je přeložený kód ve výstupní složce - pojmenované output. Můžete přeložit všechny soubory jeden po druhém nebo více Java souborů najednou - a pak je použít v XCode. Bez jakéhokoliv zdlouhavého přepisování Javy do Objective-C vám tato aplikaci vytvoří zdrojový kód v Objective-C.

Zdokonalování kódu

V dokumentaci k java2objc si můžete přečíst, že výsledný kód pravděpodobně nebude fungovat podle očekávání - a pravděpodobně nebude ani zkompilován. Tak tomu bylo i v případě našeho kódu - ale bylo to pro nás naprosto OK. Vzhledem k tomu, že provést potřebné změny bylo docela snadné.
Jistě, je třeba změnit všechny věci, které mají co do činění s uživatelským rozhraním. Přepsali jsme grafickou knihovnu, což bylo docela snadné, protože metody grafiky v iOS API jsou jednodušší, než ty, které jsou v Androidu, hudební knihovnu (stejný případ), dotykové ovládání a vstupy/výstupy souborů.
Pak jsme museli opravit hlavně některé funkce/metody pro práci s řetězci a pole. Abychom si věci zjednodušili, rozhodli jsme se použít převážně standardní pole ve stylu jazyka C, která byla pro naše účely zcela dostačující. Jen jedna věc zde byla k řešení - dynamická pole v C neví, jak jsou velká, takže jsme si to museli pamatovat v dalších proměnných.
Celá struktura souborů je velmi podobná v Xcode iOS i v Androidu, takže pokud používáte architekturu Model-View-Controller na Androidu, je poměrně snadné znovu totéž stvořit se stejnými soubory na iOS. Pokud jde o assets, byla tam jen jedna věc, kterou jsme museli převést - běžné grafické formáty jsou stejné, ale v Apple iOS API není žádná podpora mid souborů a ogg souborů. Tak jsme převedli mid soubory do ogg (pomocí skvělého softwaru LMMS) a poté použili Audacity pro převod všech ogg souborů (zvuků i hudby) do aac souborů.

A to je vše... Díky java2objc celá konverze z Javy do kódu Objective-C trvala mnohem kratší dobu, než jsme předpokládali - a i když hned po konverzi bylo zobrazeno v XCode mnoho chyb, vyrovnali jsme se s nimi poměrně rychle. Doufejme, že stejná taktika může být dobrá i pro vaše projekty.

GameStylus tým
(GameStylus je herní engine a editor pro adventure hry, který může použít kdokoli. Zkuste to! Můžete tak snadno vytvářet hry pro Android a iOS.)

neděle 20. prosince 2015

How to convert Android application to iPhone and iPad app

As you may know, our GameStylus game engine started as an app for Android (in Java) and at the beginning of the development we had no idea if or how we will port it to another platform(s) in the future. But after a few months the decision has been made – we definitely had to port this Android application to iOS (and Objective-C). But how? If you are trying to find an answer to the same question, maybe this text with description of our steps could be useful for you.

How to move Android app to iOS, Java to Objective-C

You probably don't need an imagination of a successful novel writer to know, how we started: Yes, at Google.com. Many searches, many keywords and what we got? Many people masquerading themselves as experts, said this simply is not possible. At least not automatically without weeks of hard work. The operating systems (Android, iOS) are very different, you know, Java Virtual Machine, licenses, Apple special API, unique user interface of iPhones and iPads... And Java is very, very different form Objective-C... You know, all this blah, blah, blah...
Then there were other advices, mostly recommending to use Google j2objc project. But mostly theoretical, no real experiences.
If you don't know, what j2objc is, then: j2objc is an open source project from Google that can convert Java code to Objective-C (or, in short, Obj-C) code. And the resulting code should be very good – as good that you can just take it and compile it. Sounds too good to be true?
Google promises that this tool enables Java source to be part of an iOS application's build, no editing of the generated files is necessary. The idea is this: You will create a separate UI (user interface) code for both platforms, but application logic and data models will be the same – for both projects. Yes, this sounds good and we definitely gave it a try...

Is  j2objc the right solution for translating Java to Obj-C?

If you want to use  j2objc (http://j2objc.org/), you have to download it, unzip it and use it the right way – which means you have to put header files and libraries to the right place for your compiler to find them – and to use them. And set the compiler, of course. Why? Because once you translate your project from Java to Objective-C the compiler will need these header files and libraries to create your final app for iOS.
To be absolutely honest: It took a lot of time to go through the whole quite inadequate documentation  of j2objc and through advices of other people to make it work and when we got the final translated Objective-C code we were not as happy as we expected to be. Because the code is not intended to any additional changes. Methods are renamed (the names are comprehensible, but quite long), other methods added and the whole thing is a little bit confusing.
But we must be fair: This is not a problem of this tool – this is our problem. We had some (inadequate) expectations and these were not met. Our idea was to translate the code from Java to Obj-C and then to do some changes to get a nice Obj-C code where we would do as much changes as we now – or in the future – need. But this is not the purpose of this conversion tool.
We were playing with the tool and with the resulting code. Isn't it possible to make some changes and use it for our purpose? To be honest: We would prefer not to use any libraries from Google (as in every code there are bugs and why to add Google's bugs to our bugs?) and to make the code more comprehensible, but at one moment it came clear to us: No, this is not the right way to move our Android app to iOS.

We found the right conversion tool

And then we found another open source tool, four or five years old java2objc (https://code.google.com/p/java2objc/). No, the name may look similar, but it is not the same thing as j2objc. This code is published under Apache license and the purpose is different. The resulting code may be imperfect, but very well usable. This tool works on Java source files instead of class files and attempts to create “well-crafted Objective C code as if written by hand”. And it is very easy to use.
You don't have to do any complicated settings – you just need to run: run xxx.java – from command line, where xxx.java is your Java code which you want to translate to Objective-C. It is very fast - after a few seconds the translated code is in the output folder – named output. You can translate all your files one by one or more Java files at once and then use them in XCode. Without any tedious rewriting of Java to Objective-C you get your app source code in Obj-C.


Polishing of the code

In the documentation for  java2objc you can read that the resulting code probably won't work as you expect – and probably won't compile at all. That was the case for our code – but it was perfectly OK for us. Because to make necessary changes was quite easy.
Sure, you have to change all things which have anything to do with user interface. We rewrote our graphics library, which was quite easy, as the graphics methods in iOS API are simpler than those on Android, sound library (the same case), touch input and file inputs/outputs.
Then we had to correct some methods working with strings and arrays. To make things simpler we decided to use mostly standard C-style arrays, which were perfectly OK for our purposes. Only one thing to solve here – dynamic C-style arrays don't know how big they are so we had to remember this in additional variables.
The whole structure of files is very similar in XCode iOS as on Android so if you use Model-View-Controller architecture on Android it is quite easy to recreate the same with the same files on iOS. Regarding assets there was only one thing we had to convert – graphics formats are the same, but there is no mid file support and ogg file support in Apple iOS API. So we converted mid files to ogg (using great LMMS software) and then used Audacity to convert all ogg files (sounds and music) to aac files.

And that's all... Thanks to  java2objc the whole conversion from Java to Objective-C code took much less time than we expected and while right after the conversion there were many errors  shown in XCode, we could cope with them quite quickly. Let's hope the same tactic can be good for your projects as well.

GameStylus team
(GameStylus is an adventure game engine and editor which can be used by anyone. Try it! You can easily create games for Android and iOS this way.)

pátek 18. prosince 2015

New Adventure games for iPhone and iPad / Nové adventury pro iPhone a iPad

EN: We've promised last time, now we deliver: You can now download all major games from GameStylus for your iPad and iPhone: Mutants vs. The Chosen, Mutants vs. The Chosen 2: Traitor, our game for small kids Boy and Cat, learning app Boy, Dinosaurs and Numbers and - of course - already mentioned Alvin Fish celebrates Christmas.
The first episode of Mutants and Boy with Cat can be downloaded for free, the second part of Mutants, Boy with dinosaurs and numbers and Alvin for 1-2 euro. On the Android platform all the games together were downloaded over 35,000 times so far and now we are looking forward to all players from Apple :).

CZ: Už jsme to slibovali minule, teď je to skutečnost: Pro iPhone a iPad si můžete nově stáhnout všechny hlavní hry GameStylus: Mutanti vs. Vyvolení, Mutanti vs. Vyvolení 2: Zrádce, dětskou hříčku Chlapec a kočka, hru pro výuku počtů Chlapec, dinosauři a čísla i - samozřejmě - již minule zmiňovanou Rybku Alvina slavící Vánoce.
První díl Mutantů a Chlapec s kočkou jsou ke stažení zdarma, druhý díl Mutantů, Chlapec s dinosaury a čísly a Alvin za 1-2 eura. Na Androidu mají všechny hry dohromady zatím něco přes 35 tisíc stažení, těšíme se na všechny hráče od Apple :).

iPhone Screenshot 2

sobota 12. prosince 2015

GameStylus NEWS: A game engine for Android and iOS / Herní engine pro Android a iOS

GameStylus NEWS: A game engine for Android and iOS / Herní engine pro Android a iOS


EN: Create games on GameStylus.com and they will be available not only on Android, but on iPad and iPhone too! Yes, here it is: The thing we recently worked on was porting our game engine GameStylus to iOS (iPhone, iPad). It has been tested, we placed first data there - and the first game has already been approved by Apple App Store - Alvin and Christmas. Any game created on GameStylus.com can be easily run on iOS now. And so we exported data (images, music, game instructions etc.) of our other games and - and even more of GameStylus games are awaiting approval from Apple right now.
Just two more things:
1) Yes, to create a game for Android and iOS is really so easy now! (And free, of course!) Simply create an adventure game on GameStylus.com send it to us for approval (just a short e-mail) and then it is easy to make your game available for all owners of Android phones and tablets - and all iPhone and iPad owners.
2) It is still true that your game can be - without any approval (or, exactly, without our approval, you must approve it, of course :)) - played by anyone on Android - using our GameStylus.com app. (Yes, it is the same app which you can use to fine tune your game.) We don't plan to publish any similar app for iOS right now...

From now on the GameStylus engine is multiplatform! Of course we think about other platforms as well - to make all the games (yours and ours) available for as much players as possible!


CZ: Hry, které vytvoříte na GameStylus.com, si teď můžou zahrát i majitelé iPadů a iPhonů! Ano, je to tady: Věc, na které jsme v poslední době pracovali, byla portování našeho herního engine GameStylus na operační systém iOS (pro iPhone, iPad). Otestováno, vložena první data - a první hra už byla schválena na Apple App Store - Alvin a Vánoce. Protože opravdu stačí hru na GameStylus.com vytvořit pouze jednou a poté lze data (obrázky, hudbu, instrukce ve hře apod.) využít jak na Androidu, tak na iOS, připravili jsme rovnou i další vyšlé hry pro iOS - a nyní čekají na schválení u Apple.
Zbývají dodat dvě věci:
1) Ano, vytvořit hru pro Android i iOS je opravdu tak snadné (a zdarma, samozřejmě!); jednoduše adventure hru vytvoříte na GameStylus.com, pošlete nám ke schválení (stačí krátký e-mail) a pak už nic nebrání tomu, aby si hru mohli zahrát jak majitelé telefonů a tabletů s Androidem, tak majitelé iPhonů a iPadů.
2) Stále platí, že si vaši hru bez jakéhokoli našeho schvalování (vy to ale, samozřejmě, schválit musíte :)) může zahrát také kdokoli, kdo si na Android ze stránek GameStylus.com stáhne naši aplikaci - a vaši hru si do ní nahraje. (A v této aplikaci můžete i vy svou hru ladit.) Podobnou aplikaci pro iOS zatím neplánujeme, do budoucna se to ale může změnit.
Odteď je tedy GameStylus engine multiplatformní. Uvažujeme samozřejmě i o dalších platformách, aby se vaše (i naše, samozřejmě) hry dostaly k co největšímu počtu hráčů!