AndroidデバイスでのObjective-Cコードの実行

物語の始まり



cocos2dで書かれたプロジェクトが修正のために来ました。 パズルを集めて言葉を学ぶ必要がある子供向けのゲーム。 仕事は仕事に似ていますが、主な問題は、私の前にインドの特定の少女がプロジェクトに取り組んだことです。 そして、とても楽しい期間を始めました。 私が見なければならなかったもの、何をすべきか、そしてそれがすべて終わった方法の例は、カットの下にあります。





Indocodeは終日ムードを提供します
//SelectPuzzle.m - (void)imagePickerController:(UIImagePickerController *)pickerView didFinishPickingMediaWithInfo:(NSDictionary *)info { [[NSUserDefaults standardUserDefaults]setObject:nil forKey:@"cameraImage"]; UIImage *resiZedImage=[info objectForKey:UIImagePickerControllerOriginalImage]; UIInterfaceOrientation interfaceOrientation = [[UIApplication sharedApplication] statusBarOrientation]; if (UIInterfaceOrientationIsPortrait(interfaceOrientation)) { isportrait=YES; resiZedImage=[self ImageResize:resiZedImage]; } else { isportrait=NO; resiZedImage=[self imageByCropping:resiZedImage toRect:CGRectMake(800,300,1006,1258)]; } [[NSUserDefaults standardUserDefaults]setInteger:preDefined6 forKey:imageIndex]; [[NSUserDefaults standardUserDefaults]setObject:[NSData dataWithData:UIImagePNGRepresentation(resiZedImage)] forKey:@"cameraImage"]; [[NSUserDefaults standardUserDefaults]synchronize]; [self performSelector:@selector(dismissCameraView:) withObject:pickerView afterDelay:1.0]; [[CCDirector sharedDirector]replaceScene:[PlayScene scene]]; } //PlayScene.m -(void)init{ self = [super init]; if(self){ //... //... camera = YES; NSData* imageData = [[NSUserDefaults standardUserDefaults] objectForKey:@"cameraImage"]; UIImage* cameraImage = [[[UIImage alloc] initWithData:imageData]autorelease]; puzzleObject=[CCSprite spriteWithCGImage:cameraImage.CGImage key:nil]; //... //... } return self; }
      
      









ただし、この投稿は、私が修正しなければならなかったエラーに関するものではなく、まったく別の問題に関するものです。

プロジェクトでの数か月の作業の後、主な問題が解決されたときに、顧客からAndroidデバイス用のビルドをビルドするように依頼されました。 その後、最初の開発者がcocos2d-x用に記述することになっていたことについて驚くべき会話があり、アプリケーションはどのデバイスでも簡単に実行できるはずです。 私はすでに問題を解決しなければならず、私の選択はApportableにかかっていました。



実際にトピック



公式ウェブサイトによると、Apportable SDKはiOSおよびAndroidデバイスで同じxCodeプロジェクトを実行できるシステムです。 まず第一に、これはcocos2dで書かれたゲームに適用されます。 一部のコアシステムフレームワークの移植には問題があります。

このゲームは実質的に純粋なココナッツで書かれており、UIKit要素は2か所でしか使用されていません。

じゃあ 始めましょう。



最初に行うことは、MacにSDKをインストールすることです。 これを行うには、サイトの指示に従って、ターミナルに入力するだけです



  (echo; echo PATH=~/.apportable/SDK/bin:$PATH) >> ~/.bash_profile; source ~/.bash_profile
      
      







SDKには約2GBの空きディスク容量とxCode 5のインストールが必要です。



これらすべてがダウンロードされている間に、必要なコードをプロジェクトに追加できます。

最初に、画面エミュレーションモードを設定します。 いくつかのオプションがあります。

例:

UIScreenIPhone3GEmulationMode-アプリケーションがRetinaデバイスのグラフィックをサポートしていない場合に使用されます。 仮想画面のサイズは320px / 480px、スケール-1.0です

UIScreenScaledAspectFitEmulationMode-Androidデバイスの画面サイズに応じてアプリケーションを拡大します。 Retinaグラフィックを使用しません。

UIScreenBestEmulatedMode-Androidデバイスの画面サイズに応じてアプリケーションを拡大します。 最も適切なグラフィックを使用します。 このモードが正しく機能するためには、すべてのiPhoneおよびiPadの画面にグラフィックが必要です。 そうでない場合、最適に表示されない場合があります。



 int main(int argc, char *argv[]) { @autoreleasepool { #ifdef ANDROID [UIScreen mainScreen].currentMode = [UIScreenMode emulatedMode:UIScreenAspectFitEmulationMode]; #endif int retVal = UIApplicationMain(argc, argv, nil, @"AppController"); return retVal; } }
      
      





すべてのオプション
 typedef NS_ENUM(NSUInteger, UIScreenEmulationMode) { UIScreenIPhone3GEmulationMode, UIScreenIPhone4EmulationMode, UIScreenIPhone5EmulationMode, UIScreenIPadEmulationMode, UIScreenIPadRetinaEmulationMode, UIScreenAspectFitEmulationMode, UIScreenScaledAspectFitEmulationMode, UIScreenBestEmulationMode, UIScreenBestEmulatedMode = UIScreenBestEmulationMode, UIScreenNativeMode, UIScreenNativeRetinaMode, UIScreenBestNativeMode, };
      
      









次にやり直さなければならなかったのは、要素の位置です。

 [item setPosition:ccp(400, 600)];
      
      







 [item setPosition:ccp(puzzle.contentSize.width * 0.2, puzzle.contentSize.height * 0.772)];
      
      





クリックを追跡する場合も同じです。



その後、ターミナルのプロジェクトフォルダーに移動して、次のように入力します。

  apportable load
      
      





このコマンドはapkファイルを作成し、接続されたデバイスにダウンロードし、インストールして実行します。 理想的です。 常に起こるとは限りません。 ファイルリンクエラーは考慮しません。それらは非常に個別のエラーです。 ただし、apportableが特定のデバイスを認識しない場合があります。 アプリケーションをテストした7つのデバイスのオフィスでは、3にインストールできませんでした。

この場合の対処方法 すべてが非常に簡単です。 Apportableはまずapkファイルを作成してから、それをデバイスにダウンロードしようとします。 したがって、このファイルはどこかにあります。 より正確には、ここ:

  /Users/username/.apportable/SDK/Build/android-armeabi-debug/ProjectName
      
      





apkファイルはこのフォルダーにあり、デバイスに転送してインストールするだけです。 このために、Android File Transferアプリケーションを使用しました(箱から出してすぐのポピーでは、Androidデバイスのメモリにアクセスできません)。



それだけですか? 利益? 残念ながらいいえ。

カメラに問題があります。 カメラが呼び出されて写真を撮りましたが、確認ボタンが押されると、アプリケーションがクラッシュしました。 問題はグーグルではなく、大きな問題をもたらすと約束されていましたが、... Androidの開発者からヘルプが寄せられました。 マニフェストと権限が何であるかを見つけました。

これは何? iOS開発者向け
info.plistの類似物。 マニフェストには、基本設定、すべての権限および構成が含まれています。





など。 apportableを使用してビルドを作成した後、ProjectName.aprojフォルダーがプロジェクトディレクトリに表示されました。 このフォルダーには、構成ファイルとコンパイルされていないファイル(リソースなど)が含まれています。

configuration.jsonファイルに興味があります。 その中で、Androidのプロジェクトコンパイル設定を変更できます。 たとえば、許可を追加します。 カメラには書き込み権限が必要です。

そして、行を変更します

  "FEATURES": ["opengles2","landscape"]
      
      







  "FEATURES": ["opengles2","landscape","write_external_storage"]
      
      





魔法のように問題を解決しました。



デバイス画面上のアプリケーション名のローカライズには微妙な違いもあります。 各言語について、 strings.xmlファイルを追加し、ProjectName / java / res / values- [lang_description]フォルダーに入れます



strings.xml
 <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">Localization name</string> </resources>
      
      









そしてconfiguration.jsonに追加します:

 //A list of java resource directories "java_res_dirs": ["java/res"]
      
      







最後のいくつかのポイント:






All Articles