2016年6月30日木曜日

UITableView#reloadData()がうまく動かん

どうも、俺です。
最近はSwiftをいろいろ触っています。

さてタイトルのとおり、
例えば、NSURLSessionを使って
サーバーから取得したデータをUITableViewの各セルに表示させようとして、

  func hoge()
  {
    let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
    let request = NSURLRequest(URL: NSURL("https://xxxx.example.com"))
    let task = session.dataTaskWithRequest(request, completionHandler: self.getData)
    task.resume()
  }

  func getData(data:NSData?, res:NSURLResponse?,error:NSError?)
  {
    // ここで取得したデータをゴニョニョして...


    // ↓reload()してんのに表示変わらん!
    self.tableView.reloadData()
  } 

このような現象になっている場合。
安心してください。大丈夫です。
上記の例の場合、tableViewのreloadData()がメインスレッドから呼ばれていないことが原因なので、
reloadData()の呼び出しは


  dispatch_async(dispatch_get_main_queue(), {
    self.tableView.reloadData()
  })

こうしてやればOKです。

以上でェェェえす。

2016年6月8日水曜日

iOS/Androidアプリ「究極リバーシ」 リリースしました

どうも、俺です。 cocos2d-x v3.10で開発したアプリ「究極リバーシ」をリリースしました。
・iOS
https://itunes.apple.com/jp/app/ultimate-reversi/id1114493417?mt=8 
・Android
https://play.google.com/store/apps/details?id=jp.marge.android.reversi

最近よく耳にする、人工知能(AI)と対戦するリバーシアプリです。



はじめてのcocos2d v3系でしたが、
殆どの部分でv2系と同じような実装ができたので、それほど大きく戸惑う事はありませんでした。
一番困ったのは、CCArrayとCCDictionaryがなくなったことでしょうか。
Vectorクラス or Mapクラスを使うかstd::vectorを使うか、、、
結局std::vectorを一番使いました。

また、今回リバーシAIを実装するということで、
いろんなサイトからリバーシのAIについて勉強しまくりました。
ゲーム機探索や盤面の評価方法、MinMax/AlphaBeta/NegaScout法など、
ゲームのAIを実装する上で必要なノウハウを色々学べました。

あと、6/1からiOS審査でIPv6-only Networkで動作出来ることが必須になったということで、
急遽cocos2d-x v3.11.1でもビルドして試してみたのですが、
なぜかAndroid v4系で、
Jniの呼び出しでクラッシュが発生してしまい、諦めました。

一応、対応方法はここを参考に。



以上でぇぇぇす。

2016年6月7日火曜日

[cocos2d-x] OpenGL error 0x0506が出てフリーズ

どうも、俺です。
cocos2d-x(v3.10)で開発していて、
動画広告(今回はAppLovin)を表示し終わってアプリに戻ってきた時に、

2016-06-07 19:01:38.787 XXXXX-mobile[9739:3517670] cocos2d: surface size: 640x1136
2016-06-07 19:02:15.736 XXXXX-mobile[9739:3517670] failed to call context
2016-06-07 19:02:15.737 XXXXX-mobile[9739:3517670] cocos2d: surface size: 0x0
2016-06-07 19:02:15.737 XXXXX-mobile[9739:3517670] Failed to make complete framebuffer object 0x8CD6
OpenGL error 0x0506 in /Users/XXXXX_name/Documents/cocos2d-x/v3.10/XXXXX-mobile/cocos2d/cocos/renderer/CCFrameBuffer.cpp applyFBO 445

FrameBuffer Status Error 36054
OpenGL error 0x0506 in /Users/XXXXX_name/Documents/cocos2d-x/v3.10/XXXXX-mobile/cocos2d/cocos/renderer/CCFrameBuffer.cpp applyFBO 445

FrameBuffer Status Error 36054
FrameBuffer Status Error 36054
OpenGL error 0x0506 in /Users/XXXXX_name/Documents/cocos2d-x/v3.10/XXXXX-mobile/cocos2d/cocos/renderer/CCRenderer.cpp saveRenderState 161

OpenGL error 0x0506 in /Users/XXXXX_name/Documents/cocos2d-x/v3.10/XXXXX-mobile/cocos2d/cocos/renderer/CCTextureAtlas.cpp drawNumberOfQuads 691

OpenGL error 0x0506 in /Users/XXXXX_name/Documents/cocos2d-x/v3.10/XXXXX-mobile/cocos2d/cocos/renderer/CCRenderer.cpp restoreRenderState 192

FrameBuffer Status Error 36054
OpenGL error 0x0506 in -[CCEAGLView swapBuffers] 324
OpenGL error 0x0506 in /Users/XXXXX_name/Documents/cocos2d-x/v3.10/XXXXX-mobile/cocos2d/cocos/renderer/CCFrameBuffer.cpp applyFBO 445

FrameBuffer Status Error 36054
OpenGL error 0x0506 in /Users/XXXXX_name/Documents/cocos2d-x/v3.10/XXXXX-mobile/cocos2d/cocos/renderer/CCFrameBuffer.cpp applyFBO 445

FrameBuffer Status Error 36054
FrameBuffer Status Error 36054
OpenGL error 0x0506 in /Users/XXXXX_name/Documents/cocos2d-x/v3.10/XXXXX-mobile/cocos2d/cocos/renderer/CCRenderer.cpp saveRenderState 161

OpenGL error 0x0506 in /Users/XXXXX_name/Documents/cocos2d-x/v3.10/XXXXX-mobile/cocos2d/cocos/renderer/CCTextureAtlas.cpp drawNumberOfQuads 691

OpenGL error 0x0506 in /Users/XXXXX_name/Documents/cocos2d-x/v3.10/XXXXX-mobile/cocos2d/cocos/renderer/CCRenderer.cpp restoreRenderState 192
こんなエラーが出まくって何もできなくなってしまった場合。

RootViewController.mmに以下を追記しましょう。

-(void)viewWillAppear:(BOOL)animated
{
    cocos2d::Director::getInstance()->resume();
    cocos2d::Director::getInstance()->startAnimation();
}

- (void)viewWillDisappear:(BOOL)animated
{
    cocos2d::Director::getInstance()->pause();
    cocos2d::Director::getInstance()->stopAnimation();
}

Quiteを参照。

以上でぇぇぇす。