在cocos2dx2.2.6游戲中嵌入iOS的UIWebView旋膳,并做屏幕適配

由于cocos2dx-2.2.6引擎中沒有提供WebView控件,只能通過與iOS和Android交互來顯示網(wǎng)頁熊户。

需求說明:在某個Layer中點擊打開網(wǎng)頁按鈕時萍膛,在指定位置加載指定大小的網(wǎng)頁(已經(jīng)加載過的顯示出來就行);點擊Layer中其他功能按鈕時嚷堡,隱藏網(wǎng)頁蝗罗;點擊關(guān)閉Layer按鈕時移除網(wǎng)頁。

由于我們的項目是按照1136x640尺寸來橫屏布局的,所以相關(guān)的(X, Y, W, H)也是相對于1136x640尺寸來說绿饵,iOS上需要根據(jù)實際屏幕尺寸來適配欠肾。但是,cocos2dx中坐標(biāo)系與iOS中坐標(biāo)系分別是這樣的:錨點A不一樣(默認(rèn)狀態(tài)下cocos2dx中一般控件在中心點拟赊,panel刺桃、layer在左下角,也可自定義)吸祟,也就是需要設(shè)置坐標(biāo)的點瑟慈,用來確定控件的位置。傳坐標(biāo)給iOS時屋匕,就按照iOS坐標(biāo)系來傳值:X值就是控件頂點(左上角)距離左邊的距離葛碧,Y值就是控件頂點(左上角)距離頂部的距離。

另外过吻,cocos2dx中采用 ?縮放比例scale = ? screenW/1136 ?與 screenH/640 中的小值进泼;那么在iOS中也采用這種適配方式。

kResolutionShowAll ? MIN(橫向比纤虽,縱向比) 拉伸 乳绕,會出現(xiàn)黑邊

kResolutionExactFit ? 橫向按橫向比拉伸,縱向按縱向比拉伸

利用Jni實現(xiàn)C++與iOS交互

Cocos2dx游戲端:

在JniCmd.h文件中逼纸,定義消息變量:

#define CMD_CTJ_OPEN_SMALL_WEB ? ? ? ? 20114 ? ? ? ? ? ? ? //打開內(nèi)嵌網(wǎng)頁

#define CMD_CTJ_CLOSE_SMALL_WEB ? ? ? 20115 ? ? ? ? ? ? ? //關(guān)閉(隱藏)內(nèi)嵌網(wǎng)頁

#define CMD_CTJ_REMOVE_SMALL_WEB? ? 20116? ? ? ? ? ? ? //移除內(nèi)嵌網(wǎng)頁

在JniSink.h文件中聲明方法:

// 打開內(nèi)嵌網(wǎng)頁:鏈接洋措,頂點坐標(biāo)x,y杰刽,網(wǎng)頁大小w菠发,h

void OpenSmallWeb(cocos2d::CCObject *pTarget, SEL_CallFuncJni pSEL_CallFuncJni,const char*szUrl,int iX, int iY, int iWidth, int iHeight );

// 關(guān)閉內(nèi)嵌網(wǎng)頁

void CloseSmallWeb();

// 移除內(nèi)嵌網(wǎng)頁

void removeSmallWeb();

在JniSink.cpp文件中實現(xiàn)方法:

void JniSink::OpenSmallWeb( cocos2d::CCObject *pTarget, SEL_CallFuncJni pSEL_CallFuncJni,const char*szUrl, int iX, int iY, int iWidth, int iHeight )

{

????????addJniRes(pTarget, pSEL_CallFuncJni);

????????char szBuf[240];

????????sprintf(szBuf, "%s,%d,%d,%d,%d",szUrl, iX, iY, iWidth, iHeight);

????????#if ( CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

????????callJavaCommand(CMD_CTJ_OPEN_SMALL_WEB, szBuf);

????????#elif ( CC_TARGET_PLATFORM == CC_PLATFORM_IOS)

????????ObjectCHelper::share()->cppCallOc(CMD_CTJ_OPEN_SMALL_WEB, szBuf);

????????#else

????????//javaCallback(CMD_CTJ_OPEN_SMALL_WEB, "1");

????????#endif

}

void JniSink::CloseSmallWeb()

{

????????#if ( CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

????????callJavaCommand(CMD_CTJ_CLOSE_SMALL_WEB, NULL);

????????#elif ( CC_TARGET_PLATFORM == CC_PLATFORM_IOS)

????????ObjectCHelper::share()->cppCallOc(CMD_CTJ_CLOSE_SMALL_WEB, NULL);

????????#else

????????#endif

}

void JniSink::removeSmallWeb()

{

????????#if ( CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

????????callJavaCommand(CMD_CTJ_REMOVE_SMALL_WEB, NULL);

????????#elif ( CC_TARGET_PLATFORM == CC_PLATFORM_IOS)

????????ObjectCHelper::share()->cppCallOc(CMD_CTJ_REMOVE_SMALL_WEB, NULL);

????????#else

????????#endif

}

具體的Layer中調(diào)用:

JniSink::share()->OpenSmallWeb(this, callfuncjni_selector(NewInfoLayer::JniCallback), szURL, 305, 103, 718, 452);

JniSink::share()->CloseSmallWeb();

JniSink::share()->removeSmallWeb();

iOS端,自定義WebViewHeler單利類:

把UIWebView加到[UIApplication?sharedApplication].keyWindow.rootViewController.view上贺嫂,也可以直接加到[UIApplication?sharedApplication].keyWindow上

WebViewHeler.h文件

#import<Foundation/Foundation.h>

@interface WebViewHelper : NSObject

????????@property (nonatomic, strong) UIWebView *webView;

????????@property (nonatomic, assign) BOOL? bHidden;

????????+ (instancetype)sharedWebViewHelper;

????????- (void)loadWebViewWithParam:(NSString * )param;

????????- (void)removeVebView;

@end

WebViewHeler.mm文件(.mm結(jié)尾的文件滓鸠,可進(jìn)行cocos2dx與iOS混編)

+?(instancetype)sharedWebViewHelper{

????????static?id?instance?=?nil;

????????static?dispatch_once_t?onceToken;

????????dispatch_once(&onceToken,?^{

????????????????instance?=?[[self?alloc]?init];

????????});

????????return?instance;

}

-?(void)loadWebViewWithParam:(NSString * )param{

//?分割字符串

NSArray?*arr?=?[param?componentsSeparatedByString:@","];

//?獲取鏈接字符串

NSString?*httpStr?=?arr.firstObject;

NSLog(@"httpStr?%@",?httpStr);

//?獲取生成frame

//?參數(shù)傳的是5、5s的實際像素,是物理尺寸2倍

if?(arr.count?<?5)?{

?return;

}

//?改成單倍尺寸

CGFloat?x?=?[arr[1]?floatValue]/2;

CGFloat?y?=?[arr[2]?floatValue]/2;

CGFloat?width?=?[arr[3]?floatValue]/2;

CGFloat?height?=?[arr[4]?floatValue]/2;

CGFloat?scaleX?=?kScreenWidth?/?568.0f;

CGFloat?scaleY?=?kScreenHeight?/?320.0f;

// 防止橫屏狀態(tài)下涝婉,獲取的寬和高是豎屏狀態(tài)下的寬和高哥力,目的是確定 W > H

if?(kScreenWidth?<?kScreenHeight)?{

scaleX?=?kScreenHeight?/?568.0f;

scaleY?=?kScreenWidth??/?320.0f;

}

//如果游戲按照?MIN(橫向比,縱向比) 拉伸墩弯,則 width??x ???height ??y 分別為:

CGFloat?scale?=?scaleX?<?scaleY???scaleX?:?scaleY;

width?*=?scale;

x?*=?scale;

height?*=?scale;

y?*=?scale;

//如果游戲按照橫向縱向拉伸適配吩跋,則 width?x ??height ?y 分別為:

//width?*=?scaleX;

//x?*=?scaleX;

//height?*=?scaleY;

//y?*=?scaleY;

CGRect?newframe?=?CGRectMake(x,?y,??width,?height);

NSLog(@"width?=?[%f]??height?=?[%f]??x?=?[%f]?y?=?[%f]",?width,?height,?x,?y);

//?加載網(wǎng)頁

self.webView?=?[[UIWebView?alloc]?initWithFrame:newframe];

self.webView.backgroundColor?=?[UIColor?colorWithRed:50/256.0?green:57/256.0?blue:96/256.0?alpha:1];

self.webView.scalesPageToFit?=?YES;

self.webView.scrollView.bounces?=?NO;

self.webView.delegate?=self;

//?根據(jù)需要給webView 切圓角,這里采用貝塞爾曲線

self.webView?=?[self?clipCornerWithView:self.webView?andTopLeft:YES?andTopRight:YES?andBottomLeft:YES?andBottomRight:YES];

NSURLRequest?*urlRequest?=?[[NSURLRequest?alloc]?initWithURL:[NSURL?URLWithString:httpStr]];

//?添加webView到根視圖

[[UIApplication?sharedApplication].keyWindow.rootViewController.view?addSubview:self.webView];

//?開始請求

[self.webView?loadRequest:urlRequest];

self.webView.hidden?=?true;

self.bHidden?=?true;

//?測試本地

//????[self?loadLocalHtml:self.webView?fileName:httpStr];

}

#pragma?mark?-?WebView?Delegate

-?(void)webViewDidStartLoad:(UIWebView?*)webView{

????????if?(self.webView.isLoading)?{

? ? ? ? ? ? ? return;

????????}

????????NSLog(@"開始加載");

}

-?(void)webViewDidFinishLoad:(UIWebView?*)webView{

????????if?(self.bHidden?==?false)?{

????????????????return;

????????}

????????NSLog(@"加載完成");

????????self.bHidden?=?false;

????????self.webView.hidden?=?false;

????????// 告訴Cocos2dx 加載成功

????????ObjectCHelper::share()->ocCallCpp(CMD_CTJ_OPEN_SMALL_WEB,?"1");

}

-?(void)webView:(UIWebView?*)webView?didFailLoadWithError:(NSError?*)error{

????????NSLog(@"加載失敗");

????????// 告訴Cocos2dx 加載失敗

????????ObjectCHelper::share()->ocCallCpp(CMD_CTJ_OPEN_SMALL_WEB,?"0");

? ? ? ? ?// webView加載失敗后渔工,置為nil锌钮,重新加載時會重新創(chuàng)建?

????????self.webView?=?nil;

}

iOS中 處理OC與C++交互的類 ObjectCHelper.mm文件 調(diào)用OC方法

ObjectCHelper?*ObjectCHelper::g_pObjectCHelper?=?NULL;

ObjectCHelper?*ObjectCHelper::share(){??

? ? ?if?(g_pObjectCHelper?==?NULL)?{????????

????????????g_pObjectCHelper?=?new?ObjectCHelper;???

?????}????

? ? ? return?g_pObjectCHelper;

}

std::string?ObjectCHelper::cppCallOc(const?int?cmd,?const?char?*szParam){

?????????if?(CMD_CTJ_OPEN_SMALL_WEB==?cmd){

? ? ? ?????????if(szParam){

????????????????????????// webView存在就顯示出來,不存在就重新加載

????????????????????????if([WebViewHelper?sharedWebViewHelper].webView?){

????????????????????????????????[WebViewHelper?sharedWebViewHelper].webView.hidden?=?false;

????????????????????????????????ObjectCHelper::share()->ocCallCpp(CMD_CTJ_OPEN_SMALL_WEB,?"1");

????????????????????????}else{

????????????????????????????????NSString?*strList?=?[NSString?stringWithUTF8String:szParam];

????????????????????????????????[[WebViewHelper?sharedWebViewHelper]?loadWebViewWithParam:strList];

????????????????????????}

? ? ? ? ? ? ? ? }

????????}else?if?(CMD_CTJ_CLOSE_SMALL_WEB==?cmd){

????????????????????if([WebViewHelper?sharedWebViewHelper].webView?){

????????????????????????????[WebViewHelper?sharedWebViewHelper].webView.hidden?=?true;

????????????????????}

? ? ? ? ?}else?if?(CMD_CTJ_REMOVE_SMALL_WEB==?cmd){

????????????????[[WebViewHelper?sharedWebViewHelper]?removeVebView];

????????}

}

void?ObjectCHelper::ocCallCpp(const?int?cmd,?const?char?*szParam){

? ? ? ? JniSink::share()->javaCallback(cmd,?szParam);

}


中間的圖片就是由WebView加載的html內(nèi)容

cocos2dx嵌入安卓平臺webView的方法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末引矩,一起剝皮案震驚了整個濱河市梁丘,隨后出現(xiàn)的幾起案子侵浸,更是在濱河造成了極大的恐慌,老刑警劉巖氛谜,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掏觉,死亡現(xiàn)場離奇詭異,居然都是意外死亡值漫,警方通過查閱死者的電腦和手機澳腹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來杨何,“玉大人酱塔,你說我怎么就攤上這事∥J” “怎么了羊娃?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長埃跷。 經(jīng)常有香客問我蕊玷,道長,這世上最難降的妖魔是什么捌蚊? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任集畅,我火速辦了婚禮,結(jié)果婚禮上缅糟,老公的妹妹穿的比我還像新娘。我一直安慰自己祷愉,他們只是感情好窗宦,可當(dāng)我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著二鳄,像睡著了一般赴涵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上订讼,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天髓窜,我揣著相機與錄音,去河邊找鬼欺殿。 笑死寄纵,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的脖苏。 我是一名探鬼主播程拭,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼棍潘!你這毒婦竟也來了恃鞋?” 一聲冷哼從身側(cè)響起崖媚,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎恤浪,沒想到半個月后畅哑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡水由,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年敢课,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绷杜。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡直秆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鞭盟,到底是詐尸還是另有隱情圾结,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布齿诉,位于F島的核電站筝野,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏粤剧。R本人自食惡果不足惜歇竟,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望抵恋。 院中可真熱鬧焕议,春花似錦、人聲如沸弧关。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽世囊。三九已至别瞭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間株憾,已是汗流浹背蝙寨。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留嗤瞎,地道東北人墙歪。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像猫胁,于是被迫代替她去往敵國和親箱亿。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容