【新手入门篇】cocos2d-x创建一个可移动的角色

前言:

上一篇我们说了 cocos2d-x 如何创建第一个hello World工程以及游戏窗口运行机制与生命周期讲解
所以大家应该是对cocos2d-x有所了解

本篇来说一下我们的主角 sprite 精灵
创建一个角色可以控制一下简单的移动
效果图:
在这里插入图片描述

精灵Sprite

精灵是屏幕上移动的对象,它能被控制。你喜欢玩的游戏中主角可能就是一个精灵,我知道你在想是不是每个图形对象都是一个精灵,不是的,为什么? 如果你能控制它,它才是一个精灵,如果无法控制,那就只是一个节点(Node)。

准确的说,精灵(Sprite) 是一个能通过改变自身的属性:角度,位置,缩放,颜色等,变成可控制动画的 2D 图像。

精灵的创建

可以使用一张图片来创建精灵,PNG, JPEG, TIFF, WebP, 这几个格式都可以。
当然也有一些其它的方式可以创建精灵,如使用 图集 创建,通过 精灵缓存 创建,我们会一个一个的讨论。本节介绍通过图片创建精灵。

auto sprite = CCSprite::create("APimg[306].png");

上面直接使用了 APimg[306].png 图像来创建精灵。精灵会使用整张图像,图像是多少的分辨率,创建出来的精灵就是多少的分辨率。比如图像是 200 x 200,Sprite 也是 200 x 200。
在这里插入图片描述
这就是我们的主角 118*116像素的图片

但是如果你想创建一个尺寸只有原始图像一部分的精灵,那你可以在创建的时候指定一个矩形,指定矩形需要四个值,初始 x 坐标,初始 y 坐标,矩形宽,矩形高

auto mySprite = Sprite::create("APimg[306].png", Rect(0,0,40,40));

精灵的控制

基本的控制有移动 旋转 缩放 倾斜等
如果涉及旋转缩放和倾斜又涉及到锚点 也就是旋转的中心点

我们本节只有简单的上下左右的位置移动没有包含其他的

设置精灵的位置

sprite->setPosition(ve2(x,y));

创建菜单

菜单项

auto up = CCMenuItemFont::create("up",CC_CALLBACK_1(HelloWorld::menuClickCallBack,this));

第二个参数是传入了个回调函数 ,就是让点击菜单项时触发的函数

函数的声明

void menuClickCallBack(Ref* sender);

创建4个菜单项 代表上下左右
在这里插入图片描述

菜单

auto menu = CCMenu::create(up, down, left, right,NULL);
menu->alignItemsVertically();

创建菜单包含上面4个菜单项,设置菜单项自动垂直对齐

我们给每个节点都设置一个tag 便于后面寻找 也就想当于每个人的身份证

//设置菜单tag
	up->setTag(1);
	down->setTag(2);
	left->setTag(3);
	right->setTag(4);

菜单项点击的回调函数

在这里插入图片描述
这个参数sender是发送者也就是我们点击的谁
然后我们根据他的tag 来判断是点击的那个菜单项
sprite 就是我们的机器人主角 我们也给设置了tag 是0

下面switch 根据点击的菜单项设置主角的位置

完整的code:

我们的代码是写到 init()中
在这里插入图片描述
在这里插入图片描述下面

	CCSize winSize = CCDirector::sharedDirector()->getWinSize();

	CCPoint center = ccp(winSize.width / 2, winSize.height / 2);
	
	scheduleUpdate();

	auto sprite = CCSprite::create("APimg[306].png");
	sprite->setPosition(center);
	sprite->setTag(0);
	addChild(sprite);



	//创建菜单
	auto up = CCMenuItemFont::create("up",CC_CALLBACK_1(HelloWorld::menuClickCallBack,this));
	auto down = CCMenuItemFont::create("down", CC_CALLBACK_1(HelloWorld::menuClickCallBack, this));
	auto left = CCMenuItemFont::create("left", CC_CALLBACK_1(HelloWorld::menuClickCallBack, this));
	auto right = CCMenuItemFont::create("right", CC_CALLBACK_1(HelloWorld::menuClickCallBack, this));


	auto menu = CCMenu::create(up, down, left, right,NULL);
	menu->setPosition(100, 330);
	addChild(menu);
	menu->alignItemsVertically();

	//设置菜单tag
	up->setTag(1);
	down->setTag(2);
	left->setTag(3);
	right->setTag(4);
void HelloWorld::menuClickCallBack(Ref * sender)
{
	CCLOG("click menuitem");
	Node* node = dynamic_cast<Node*>(sender);
	int tag = node->getTag();
	Node* sprite = this->getChildByTag(0);
	if (NULL != node && NULL != sprite)
	{
		switch (tag)
		{
		case 1:
			sprite->setPositionY(sprite->getPositionY() + 10.0f);
			break;
		case 2:
			sprite->setPositionY(sprite->getPositionY() - 10.0f);
			break;
		case 3:
			sprite->setPositionX(sprite->getPositionX() - 10.0f);
			break;
		case 4:
			sprite->setPositionX(sprite->getPositionX() + 10.0f);
			break;
		default:
			break;
		}
	}
	
}
发布了171 篇原创文章 · 获赞 386 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/weixin_42837024/article/details/102895579