前几天一直在尝试cocos游戏开发,遇到了很多挫折,在本大侠的坚持努力下,成功做成了一个简单的界面。
主要步骤是在官网:COCOS中找到的。按照他们的步骤,你就可以完成初步的环境搭配。我建议初学者在linux环境下搭建,因为我在windows下搭建,很不顺利,到后面都没有成功过,主要在windows环境下,按照cocos creator很麻烦,比如屏幕分辨率必须大于1280×760,还有就是必须按照windows的.net环境,这个软件特别大,简直不敢想象,要10G .
所以我们初学者,就是要简单点,能快速的调试看效果。
首先看我的调试效果,很简单,请不要喷
最开始的效果:
经过补充后的效果:
上面的图片中,圆点触摸后放大一倍,可以拖动,手指离开后恢复原大小。
实现代码如下:
/****************************************************************************
http://www.cocos2d-x.org
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
****************************************************************************/
#include "HelloWorldScene.h"
#include "SimpleAudioEngine.h"
USING_NS_CC;
Scene* HelloWorld::createScene()
{
return HelloWorld::create();
}
// Print useful error message instead of segfaulting when files are not there.
static void problemLoading(const char* filename)
{
printf("Error while loading: %s\n", filename);
printf("Depending on how you compiled you might have to add 'Resources/' in front of filenames in HelloWorldScene.cpp\n");
}
// on "init" you need to initialize your instance
bool HelloWorld::init()
{
//
// 1. super init first
if ( !Scene::init() )
{
return false;
}
auto visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
/
// 2. add a menu item with "X" image, which is clicked to quit the program
// you may modify it.
// add a "close" icon to exit the progress. it's an autorelease object
auto closeItem = MenuItemImage::create(
"CloseNormal.png",
"CloseSelected.png",
CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));
if (closeItem == nullptr ||
closeItem->getContentSize().width <= 0 ||
closeItem->getContentSize().height <= 0)
{
problemLoading("'CloseNormal.png' and 'CloseSelected.png'");
}
else
{
float x = origin.x + visibleSize.width - closeItem->getContentSize().width/2;
float y = origin.y + closeItem->getContentSize().height/2;
closeItem->setPosition(Vec2(x,y));
}
// create menu, it's an autorelease object
auto menu = Menu::create(closeItem, NULL);
menu->setPosition(Vec2::ZERO);
this->addChild(menu, 1);
/
// 3. add your codes below...
// add a label shows "Hello World"
// create and initialize a label
auto label = Label::createWithTTF("Hello baby", "fonts/Marker Felt.ttf", 24);
if (label == nullptr)
{
problemLoading("'fonts/Marker Felt.ttf'");
}
else
{
// position the label on the center of the screen
label->setPosition(Vec2(origin.x + visibleSize.width/2,
origin.y + visibleSize.height - label->getContentSize().height));
// add the label as a child to this layer
this->addChild(label, 1);
}
// add "HelloWorld" splash screen"
//auto sprite = Sprite::create("CloseNormal.png");
/*if (sprite == nullptr)
{
problemLoading("'HelloWorld.png'");
}
else
{
// position the sprite on the center of the screen
sprite->setPosition(Vec2(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));
// add the sprite as a child to this layer
this->addChild(sprite, 0);
}*/
auto listener = EventListenerTouchOneByOne::create();
listener->setSwallowTouches(true);
listener->onTouchBegan = [](Touch* touch, Event* event){
// your code
// auto point = Sprite::create("CloseNormal.png");
// auto vec2 = touch->getLocation();
// vec2.add(origin);
// point->setPosition(vec2);
// this->addChild(point,0);
auto currentSprite = static_cast<Sprite*>(event->getCurrentTarget());
Point pos = Director::getInstance()->convertToGL(touch->getLocationInView());
if(currentSprite->getBoundingBox().containsPoint(pos)) {
currentSprite->setOpacity(100);
currentSprite->setScale(3,3);
return true;
}
log("onTouch");
return false;
};
/*listener->onTouchMoved = [](Touch * touch , Event* event){
auto currentSprite = static_cast<Sprite*>(event->getCurrentTarget());
currentSprite->setPosition(touch->getLocation());
};*/
listener->onTouchEnded = [](Touch * touch , Event* event){
auto currentSprite = static_cast<Sprite*>(event->getCurrentTarget());
currentSprite->setOpacity(0xff);
currentSprite->setScale(1,1);
};
//_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, sprite);
auto note_wid = visibleSize.width/19;//sprite->getContentSize().width;
auto note_heg = visibleSize.height/13;//sprite->getContentSize().height;
for (int i = note_wid/2; i < visibleSize.width; i+=note_wid) {
for (int j = note_heg/2; j < visibleSize.height; j+=note_heg) {
auto polygon = AutoPolygon::generatePolygon("CloseNormal.png");
auto note = Sprite::create(polygon);
note->setPosition(Vec2(i +origin.x, j + origin.y));
//note->setRotation(i+j);
//note->setAnchorPoint(Vec2(i/note_wid,j/note_heg));
//note->setScale(2,2);
//note->setColor(Color3B(i%0xff,j%0xff,(i+j)%0xff));
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener->clone(), note);
this->addChild(note);
}
}
auto texture = TextureAtlas::create("light.bmp",56);
return true;
}
void HelloWorld::menuCloseCallback(Ref* pSender)
{
//Close the cocos2d-x game scene and quit the application
Director::getInstance()->end();
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
exit(0);
#endiftop
/*To navigate back to native iOS screen(if present) without quitting the application ,do not use Director::getInstance()->end() and exit(0) as given above,instead trigger a custom event created in RootViewController.mm as below*/
//EventCustom customEndEvent("game_scene_close_event");
//_eventDispatcher->dispatchEvent(&customEndEvent);
}
因为本人主要是做java,所以对c++代码熟悉。上面的代码是通过搜索而来的,关键是如果给精灵注册监听事件:
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, sprite);
如果没有上面的这句代码,是没有事件相应的。
还有就是cpp中有一个lamda表达式,这个东西在java中是没有的,所以我也不怎么了解,据我估计,应该是编译器对代码进行了补充优化。
另外listener,进行clone,这个东西比java好,创建对象比较快。