2016年7月7日木曜日

[Swift] NSURLSessionでカスタムヘッダーを追加する

どうも俺です。

 NSURLSessionに独自のユーザーエージェントなど、ヘッダー内をカスタマイズする方法。
Swift v2です。

let url = NSURL(string:"http://hogehoge.com")
let config = NSURLSessionConfiguration.defaultSessionConfiguration()

// ここからヘッダー追加
config.HTTPAdditionalHeaders = ["User-Agent": "MyOriginalUserAgent"]
config.hTTPAdditionalHeaders = ["Custom-Header": "This is MyCustomHeader"]

let session = NSURLSession(configuration: config)
let request = NSURLRequest(URL: url)
let task = session.dataTaskWithRequest(request)
task.resume()

これで追加できます。
サーバー側でログを確認すると、
HTTP_USER_AGENT : MyOriginalUserAgent
HTTP_CUSTOM_HEADER : This is MyCustomHeader

のように、
・PREFIXに「HTTP_」が付く。
・全て大文字に変換される。
・「-(ハイフン)」は「_(アンダースコア)」に変換される。
という変換処理が内部的に走るようです。


以上でぇぇぇす。

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を参照。

以上でぇぇぇす。

2016年4月8日金曜日

[cocos2d-x] 究極マインスイーパー開発しました

どうも、俺です。
cocos2d-x(v2.2.6)で「究極マインスイーパー」というアプリを開発しました。






cocos2d-x v2.2.6で開発するアプリはこれが最後になると思います。
これからはv3系です。

マインスイーパーを開発しよう!と決まってから
ネットでマインスイーパーについて調べてると、
どうやら「マインスイーパー2000」というのがとても難しい、という情報をゲット。
この「マニア」というモードを選択すると、
マスサイズ ... 68x48
爆弾 ... 777個
という難易度だという。。

今回開発した究極マインスイーパーは、最後のLV1000まで進むと、
マスサイズ ... 100x100
爆弾 ... 2594個(だったと思う)
です。

安心してください。
LV1から始められるのでいきなりそんな激ムズではありません。

ただし、これだけほど大きなステージだと、「」でゲームを進めなければならない場面に遭遇します。
そうです、マインスイーパーはたまに運に左右されるゲームなのです。

それを解消するため、究極マインスイーパーでは「虫メガネ」というアイテムを考えました。


虫メガネを使えば、まだ開けていないマスを透かしてみる事ができます。
また、
コンティニューや自動保存機能も実装したので、
タップミスで終わってしまったり、電話が鳴ってゲームが終了してしまっても安心の親切設計。

恐らく地球上最ムズのマインスイーパーだと思います。

・iOS
 https://itunes.apple.com/jp/app/ultimate-minesweeper-challenge/id1093416456?mt=8
・Android
 https://play.google.com/store/apps/details?id=jp.marge.android.minesweeper
・プレイ動画
 https://www.youtube.com/watch?v=Jfl6GP-PADI









以上でぇぇぇぇぇす。