日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > 綜合技術 > cocos2dx簡單實現自己的一套ui

cocos2dx簡單實現自己的一套ui

來源:程序員人生   發布時間:2015-01-06 08:07:39 閱讀次數:3886次

版本:2.x

目標:基于cocos2dx底層實現1個自己簡單的1套的ui,改屏幕坐標原點為右上角。

首先我們通過繼承CCNodeRGBA來實現自己的基類,為何要繼承CCNodeRGBA而不是CCNode,由于CCNodeRGBA有對node的色彩與透明度的設置

#pragma once #include "cocos2d.h" class View:public cocos2d::CCNodeRGBA { public: View(void); ~View(void); void draw(); void setPosition(cocos2d::CCPoint & pos); };
#include "View.h" using namespace cocos2d; View::View(void) { this->setAnchorPoint(ccp(0,1)); this->ignoreAnchorPointForPosition(true);// setCascadeColorEnabled(true); //開啟ccnodergba的色彩設置 setCascadeOpacityEnabled(true); //開啟ccnodergba的透明度設置 } View::~View(void) { } void View::draw() { //ccDrawLine(ccp(0,0), ccp(200,200)); //CCNode::draw(); glLineWidth(2.0f); ccDrawColor4B(0,255,0,255); ccDrawRect(ccp(0,0),ccp(getContentSize().width, -getContentSize().height)); } void View::setPosition(cocos2d::CCPoint & pos) { CCNodeRGBA::setPosition(ccp(pos.x, -pos.y)); }

說1下:ignoreAnchorPointForPosition

cocos2dx1個node有兩個點,

1個是錨點,與父級相干,父級會根據這個點設置該node的位置。

另外一個是原點,與子級相干,子級設置位置會以這個點為標準,這個默許為node的左下角。

所以你設置node的 錨點(setAnchorPoint(ccp(0,1));)其實不會修改到原點,哪怎樣樣才能讓原點隨著錨點的位置變,就是ignoreAnchorPointForPosition(true),這句話。

例子:現在畫的框已相當于view的子節點了

先看下創建代碼:(寫在helloworld.cpp里就能夠) 

View *xx = new View; xx->setContentSize(CCSize(150,150)); xx->CCNodeRGBA::setPosition(ccp(200,200)); this->addChild(xx, 0); Image *img = new Image; img->create("close2.png"); img->setPosition(ccp(0,10)); xx->addChild(img);

先看1下沒注釋view 沒注釋ignoreAnchorPointForPosition(true),的效果,很明顯是以左上角對齊的


看1下,注釋ignoreAnchorPointForPosition(true)的效果,由于我設置位置是200,200, 寬度是150,150,框是向下畫的,所以在屏幕上面露出50像素的高度,很明顯框是左下角對齊來畫的。


實現坐標點為右上角的原理:首先我們先把view的錨點與原點設置為右上角,重寫draw方法,畫1個關于X翻轉過的框,-getContentSize.height,實際上view的位置是正的height的才對。然后我們重寫 setPosition方法,對Y的位置取反,然后再設置位置。這樣就給人1個坐標原點是右上角的假象,

例如:我加入1個view設置大小為屏幕大小,位置設置為(0,getWin,hegiht),這樣我的view就會在屏幕上畫1個框,實際上他在屏幕上方的外面,我的錨點與原點設置在屏幕的左上角,這樣我view中加入1個子node,setposition(ccp(0,0)),就會以左上角對齊,設置為為0,100,通太重載的setposition,就是(0,⑴00),這樣就正好顯示在屏幕上了


然后我們看1下上的image類的實現,

#pragma once #include "View.h" class Image:public View { public: Image(void); ~Image(void); cocos2d::CCSprite * create(char *pszFileName); void draw(); /*void setViewPosition(cocos2d::CCPoint & pos);*/ cocos2d::CCSprite * sprite; };

#include "Image.h" using namespace cocos2d; Image::Image(void) { sprite = NULL; setAnchorPoint(ccp(0,1)); ignoreAnchorPointForPosition(true); } Image::~Image(void) { } void Image::draw() { ccDrawRect(ccp(0,0),ccp(sprite->getContentSize().width, -sprite->getContentSize().height)); } cocos2d::CCSprite * Image::create(char *pszFileName) { sprite = CCSprite::create(pszFileName); sprite->setAnchorPoint(ccp(0,1)); //sprite->ignoreAnchorPointForPosition(true); this->addChild(sprite); return sprite; }

image類我我們組合了1個CCSprite對象,創建的時候,并把它加入到Image的子節點下,然后通過管理imgae對象來管理下面的ccsprite

我們設置位置為0,10,看1下效果


完善啊。。。。


不好的地方,由于是簡單的實現,

1 、上面那種內存管理上會出現問題,要是時刻想著delete,否則會泄漏。

改進方法:仿照cocos2dx的create方式來創建新ui的對象,利用援用計數與自動釋放池來管理內存,不要讓使用者來new這個對象,也可自己寫這些東西。

2、上面的基礎view對象,要調用之前的設置位置的函數,這里看起來有點怪怪的,這里可以對他進1步的封裝,封裝在1個類的內部,這樣暴露出來的坐標原點就會是屏幕的左上角了。

3、有了這樣的架構,我們就能夠寫1套自己的ui,使用在自己的游戲中了。如果有特殊需求,改起來也很方便,再寫1套解析xml的工具類,就能夠完全實現自己的ui了。



生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 免费99视频 | 欧美在线一区二区三区 | 国产精品久久久久久久久免费丝袜 | 成人免费视频在线看 | 精品电影一区二区 | 久久精品国产免费 | 久久久久免费看 | 在线看无码的免费网站 | 国产综合久久 | 熟女毛片| 黄色的网站在线观看 | 久久久无码精品亚洲日韩按摩 | 日本成人在线播放 | 中文字幕av网站 | 黄且免费的视频 | 日韩毛片免费视频一级特黄 | 成人欧美一区二区三区 | 中文字幕一二三 | 国产精品一区二区三区四区视频 | 欧美 日韩 中文字幕 | 中文字幕在线三区 | 最新亚洲 | 精品成人一区二区三区 | 欧美精品在线一区二区三区 | 亚洲成人av在线 | 日韩av一区二区在线 | 精品免费国产一区二区三区四区 | 日韩欧美视频一区 | 日韩在线精品强乱中文字幕 | 91九色网 | 日韩久久久 | 亚洲精彩免费视频 | www国产亚洲精品久久网站 | 中文一区在线 | 久热国产精品视频一区二区三区 | 国产精选h网站 | 东北寡妇特级毛片免费 | 99在线看 | 在线视频亚洲一区 | 国产九九精品 | 久久国产精品伦理 |