ラベル cocos2d-x の投稿を表示しています。 すべての投稿を表示
ラベル cocos2d-x の投稿を表示しています。 すべての投稿を表示

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;
}