2016年11月30日水曜日

cocos2d-x ios の UIWebView を WKWebViewに変更する。

ios10 にアップデートしたあたりから、UIWebViewの挙動がどうもおかしい。
不意に落ちたり、ほかのアニメーション実行中に落ちたりするような
よくわからないエラーが多数発生するようになった。


UIWebViewをどんだけいじってもらちがあかなさそうだったのでWKWebViewに思い切って変えてやろうと思った。
変更箇所は比較的少なくてすぐに変更はできた。 ライブラリーに WebKitを追加して
#
# cocos2d-x-3.13.1
#
# cocos2d-x/cocos/ui/UIWebViewImpl-ios.mm


#include "ui/UIWebViewImpl-ios.h"
#include "renderer/CCRenderer.h"
#include "base/CCDirector.h"
#include "platform/CCGLView.h"
#include "platform/ios/CCEAGLView-ios.h"
#include "platform/CCFileUtils.h"
#include "ui/UIWebView.h"

#import   // 追記


// 100行目あたり
@interface UIWebViewWrapper ()  //変更
@property(nonatomic, retain) WKWebView *uiWebView; //  変更


// 120行目あたり
- (void)dealloc {
    self.uiWebView.navigationDelegate = nil;   // 変更
    self.uiWebView.UIDelegate = nil;           // 変更 
    [self.uiWebView removeFromSuperview];
    self.uiWebView = nil;
    self.jsScheme = nil;
    [super dealloc];
}

- (void)setupWebView {
    if (!self.uiWebView) {
        self.uiWebView = [[[WKWebView alloc] init] autorelease]; //  変更
        self.uiWebView.navigationDelegate = self; //  変更
        self.uiWebView.UIDelegate = self; //  変更

        [self.uiWebView setOpaque:NO];
        [self.uiWebView setBackgroundColor:[UIColor clearColor]];
        
    }
    if (!self.uiWebView.superview) {
        auto view = cocos2d::Director::getInstance()->getOpenGLView();
        auto eaglview = (CCEAGLView *) view->getEAGLView();
        [eaglview addSubview:self.uiWebView];
    }
}


// 220行目あたり
- (void)evaluateJS:(const std::string &)js {
    if (!self.uiWebView) {[self setupWebView];}
//    [self.uiWebView stringByEvaluatingJavaScriptFromString:@(js.c_str())]; // コメントアウト
    
    // 以下を追記 コールバックは省略
    [self.uiWebView evaluateJavaScript:@(js.c_str()) completionHandler:^(NSString *result, NSError *error){
        NSLog(@"Error %@", error);
        NSLog(@"Result %@", result);
    }];
}

- (void)setScalesPageToFit:(const bool)scalesPageToFit {
    if (!self.uiWebView) {[self setupWebView];}
//    self.uiWebView.scalesPageToFit = scalesPageToFit; // WKWebViewでは使わなさそうなのでとりあえずコメントアウト
}

今はこれで動いているがまぁ問題があればそこでまた考えよう。

2016年11月22日火曜日

cocos2d-x pushSceneからのenterSceneしたいので、pushEnterSceneの作成

pushSceneをした後に、enterSceneをすると、scenesStackごと破棄されてしまうので
今いるSceneを移動するように pushEnterSceneを作成した。


※ replaceScene で同じことができるようなのでいらなかった。。。


# CCDirector.cpp

void Director::pushEnterScene(Scene *scene)
{
CCASSERT(scene, "the scene should not null");

// _sendCleanupToScene = false;

#if CC_ENABLE_GC_FOR_NATIVE_OBJECTS
auto sEngine = ScriptEngineManager::getInstance()->getScriptEngine();
if (sEngine)
{
sEngine->retainScriptObject(this, scene);
}
#endif // CC_ENABLE_GC_FOR_NATIVE_OBJECTS
_scenesStack.popBack(); // pushScene にこれを追加しただけ
_scenesStack.pushBack(scene);
_sendCleanupToScene = true;
_nextScene = scene;
}

2016年11月13日日曜日

Bitbucketで、コミット間の差分を確認したい場合


https://bitbucket.org/<OWNER>/<REPO>/branches/compare/<commit-hash>..<commit-hash-older>#diff

ブラウザの操作からは、コミット間の差分表示方法がわかりませんでしたが
直接URLを入力するとできるみたいです。

2016年11月4日金曜日

Lua 例外処理 try-catch

Luaには、直接的な例外処理はないみたいなので
pcallを応用して、try-catch的なものを代替わり案としてみる。

--
-- try-catch関数
--

function try_catch(what)
  local status, result = pcall(what.try)
  if not status then
    what.catch(result)
  end
  return result
end


--
-- 使い方
--
  try_catch{
    try=function()
      -- 何か実行する
    end,
    catch=function(error)
      print("caught error " .. error)
    end
  }

2016年11月2日水曜日

Lua ロングカッコ

[===[文字列]===] 文字列の囲み文字は任意の数のイコールとカッコを使ってあらわされれる。 

[=[文字列]=]
[==[文字列]==]
[===[文字列]===]
[====[文字列]====]
[=====[文字列]=====]
[======[文字列]======]
[=======[文字列]=======]
[========[文字列]=========] 

最初、この文字が出てきたときふざけてるのかと思ったけど ちゃんとしたものでした。
1段開き長括弧、2段開き長括弧とか読むらしい。