cocos2d-x 3.3 之卡牌设计 NO.3 卡牌移动

上次说了如何播放卡牌翻转的动画,卡牌翻到正面后,就需要让玩家将卡牌拖拽至出场区域或者墓地区域了。

这里重复一下之前的内容:

1.重载触控函数:

	virtual	bool onTouchBegan(Touch* touch, Event* event);
	virtual void onTouchMoved(Touch* touch, Event* event);
	virtual void onTouchEnded(Touch* touch, Event* event);

2.在init里添加:

	//-------------------------------------------------------------添加鼠标监听
	listener->setSwallowTouches(true);//保证同时只能触摸到一个精灵
	listener->onTouchBegan = CC_CALLBACK_2(Game::onTouchBegan, this);
	listener->onTouchMoved = CC_CALLBACK_2(Game::onTouchMoved, this);
	listener->onTouchEnded = CC_CALLBACK_2(Game::onTouchEnded, this);
	_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);

好了,现在开始实现移动卡牌的功能:

1.假设我们已经选取了翻转过的卡牌(未翻转前的卡牌不能移动):

bool Game::onTouchBegan(Touch* touch, Event* event)
{

    Point touchpoint=touch->getLocation();
    this->selectSpriteForTouch(touchpoint);
    return true;
}
void Game::selectSpriteForTouch(Point touchpoint)
{
	Player* player;//比上次多了玩家的指针,因为一局游戏有两个玩家,每个玩家都有自己的卡牌
	if(who_turn==1)
	{
		player=player_1;
	}
	else
	{
		player=player_2;
	}
	int x,y;
	x=(int)touchpoint.x;
	y=(int)touchpoint.y;
    for (OpenCard *sprite: player->openSprites)//在容器中遍历卡牌精灵
    {
		if (sprite->card_isTouched(x,y) && sprite->isOpend==0 && (player->player_magic_now>=sprite->need_magic))//如果点击的区域存在精灵&这个精灵没有被翻开过
        {
			CCLOG("open a card");
			isTouchCard=1;
			sprite->card_set_openCard();
			player->player_magic_now-=sprite->need_magic;
			print_players_message();
			sprite->isOpend=1;
            Open_sel = sprite;
            break;
        }
		else if(sprite->card_isTouched(x,y) && sprite->isOpend==1 && sprite->touchable==1)//这里是这次的重点,移动卡牌
		{
			isTouchMove=1;//翻转后就可以移动
			sprite->card_show_message(true);//移动的时候显示卡牌的信息
			sprite->card_setsize_big(2);//移动的时候卡牌变大2
			sprite->setZOrder(100);//覆盖其他精灵
			Open_sel=sprite;//操作的精灵指针指向这个精灵
			break;
		}
    }
}

2.现在是移动卡牌:

void Game::onTouchMoved(Touch* touch, Event* event)
{
	if(isTouchMove==1 && Open_sel->touchable==1)
	{
		int x,y;
		x=(int)touch->getLocation().x;
		y=(int)touch->getLocation().y;
		Open_sel->card_set_position(x,y);
	}
}

这样就能实现卡牌跟随触摸点移动了。

3.但是游戏不能只做到上面两步,当我们把卡牌移动到不同地方的时候卡牌需要做不同的动作,我分成了3个部分

1)移动到非法位置,卡牌自动回到手牌

2)移动到出牌区域,卡牌自动对准位置

3)移动到墓地,卡牌自动对准位置,并关闭卡牌

void Game::onTouchEnded(Touch* touch, Event* event)
{
	Player* player;
	if(who_turn==1)
	{
		player=player_1;
	}
	else
	{
		player=player_2;
	}
	int locate_try=0;
	if(isTouchMove==1)
	{
		if(((locate_try=Open_sel->card_judge_is_out())!=0) && had_card(locate_try,Open_sel->card_type))//如果卡牌移动到了出牌区域
		{
			Open_sel->card_home_to_out(locate_try);//卡牌移动到尝试区域
			Open_sel->card_loc_num=locate_try;//卡牌位置编号等于尝试的区域编号
			Open_sel->card_setsize_small();//卡牌恢复大小
			Open_sel->card_show_message(false);//卡牌不显示移动时的信息
			auto playcard=CardSprite::create(Open_sel->card_loc_num,Open_sel->card_num);//创建游戏卡牌精灵(与之前播放动画的卡牌精灵不同)
			Point point=playcard->card_get_locate(Open_sel->card_loc_num);
			CCLOG("create a cardsprite in %f,%f",point.x,point.y);
			playcard->setPosition(point);
			playcard->setGlobalZOrder(0);
			this->addChild(playcard);
			player->cardSprite.pushBack(playcard);

		}
		else if(Open_sel->card_home_to_die())//如果移动到了墓地
		{
			player->player_magic_now+=Open_sel->need_magic/2;//玩家恢复一般翻开这张卡牌的魔法
			print_players_message();
			Open_sel->card_setsize_small();
			Open_sel->card_show_message(false);

		}
		else
		{
			Open_sel->card_setsize_small();
			Open_sel->card_show_message(false);
			Open_sel->setZOrder(0);
			Open_sel->card_go_home();//卡牌回手牌
		}

	}

	Open_sel = NULL;
	isTouchCard=0;
	isTouchMove=0;
}

这里和之前的有重复,就不做阐述了

时间: 2024-08-07 09:52:23

cocos2d-x 3.3 之卡牌设计 NO.3 卡牌移动的相关文章

cocos2d-x 3.3 之卡牌设计 NO.4 定时器的使用(清理内存)

我的卡牌游戏卡牌有两个类,分别是OpenCard和CardSprite. 不知道分成两个是不是有些奇怪,我分开的原因是:一个卡牌用来当手牌,一个用来当场上的牌,这样说是不是更加奇怪了.. 玩家类里定义了两个容器,分别存放两种卡牌类: Vector<CardSprite *> cardSprite;//卡牌精灵容器 Vector<OpenCard *> openSprites;//翻转卡牌精灵容器 游戏开始: 1.调用函数player_1->player_deal_cards(

谈什么是卡片式设计?

卡片式设计 卡片,你或许不熟悉这个术语,但是你绝对不会对卡片的概念感觉陌生.现在,卡片在网页设计中是普遍存在的,并且还将越来越流行.事实上,Google,Twitter和Facebook这三大受推崇的网页全是这么设计的,所以至少粗略的看一下卡片是很值得的.但是,因为我们不想在这浅谈,所以让我们直接深入地了解一下吧! 什么是卡片? 简单的回答,卡片就是交互信息的承载体,通常以矩形的方式呈现.就像信用卡或者棒球卡,网页卡片以一个浓缩的形式提供了快速并且相关的信息. 所有的卡片特点就是交互性.不仅仅是

网络麻将的宝牌设计

今天在帮客户改东北乾安的麻将,乾安麻将的宝牌比效复杂,需求如下:6.1 宝牌:可以替代任何牌的"万能牌".6.2 宝牌产生:牌墙中的最后一张牌为"宝"牌.6.3 宝牌不能查看.6.4 换宝:宝牌被宝杠以后,牌墙中倒数第2张牌为宝牌.6.5 用户听牌后才能使用宝牌. 开始搞了,首选给宝牌定一个变量:看了一下代码,直接把财神当宝牌用了. 首先在开始游戏的地方把宝牌重置. 在用户听牌的动作上加一个读取宝牌的代码,从库存牌变量里取最后一张,这里注意,库存牌里最后一张的key

代码实现:模拟斗地主洗牌和发牌并对牌进行排序的代码实现

package com.loaderman.test; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.TreeSet; public class Test{ /** * * A:案例演示 * 模拟斗地主洗牌和发牌并对牌进行排序的代码实现 * * 分析: * 1,买一副扑克,其实就是自己创建一个集合对象,将扑克牌存储进去 * 2,洗牌 * 3,

被破解的mifare classic卡是不是就是MF1 S50卡啊?

M1本来就不安全哟    可参考:M1卡解码测试装置(需提供合法证明)      http://www.eastaegis.com/products/zhinenkatezhongjiju/2010/0108/84.html而且现在也出现了可以改写M1内部物理序列号的芯片  可参考:内部序列号烧码测试装置(需提供合法证明)      http://www.eastaegis.com/products/xinpintuijian/tezhongjiju/2012/0822/174.html 被破解

手机三种SIM卡 你所不知道的剪卡“秘密”

SIM卡物理尺寸的发展是逐渐轻薄化,尺寸逐渐缩小的一个过程,最早手机中的卡都是2FF,2003年国际标准提出3FF,当前很多终端都使用这种形态的卡,4FF在2011年的国际标准会议中提出,2012年纳入国际标准 小编最近入手一款新手机,正在嘚瑟的时候,突然发现还得需要剪卡,虽说自己有一个剪卡器,但小编这笨手笨脚,还是不要拿自己当小白鼠的好,果断去找移动MM来解决~ 但MM却说,剪卡可能会剪坏,打算给小编换张新的卡,小编心里纳了个闷,这换手机时究竟什么时候能对原来的SIM卡直接裁剪,什么时候不能呢

德卡Z90读卡器读取社保卡,德卡Z90读卡器CSharp示例程序源码

前言,最近学习调用 医保卡业务,使用德卡读卡器,主要就是调用一个DLL,动态库文件. 借着自学的机会把心得体会都记录下来,方便感兴趣的小伙伴学习与讨论. 内容均系原创,欢迎大家转载分享,但转载的同时别忘了注明作者和原文链接哦.本文内容和图片如果有侵犯您的权利,请联系[email protected]. 一,准备工作: 先到德卡官网下载相关资料,下载动态库.http://www.decard.com/download/downloadcategoryid=10&isMode=false.html下

cocos2d-x 3.3 之卡牌设计 NO.6 Loading界面(异步加载图片,plist)

刚开始做卡牌的时候没有想到要做loading,因为小游戏资源不多. 但是后来不断的加图片,直到在真机上发现卡顿的问题,我才知道该需要加loading了...... 首先,我们先定义类: class Loading : public Layer { public: bool init(); CREATE_FUNC( Loading); static Scene* CreateScene(); int total_pic_num;//需加载图片数 int total_sound_num;//需加载声

【原创软件】M1卡充值软件,水卡破解复制修改必备!【吾爱首发】 By:Sunshines

声明:这个软件发出来是出于学习和研究的目的,请勿用于违法行为!前几天看了论坛上的xx卡破解教程,自己也买了个PN532来玩玩(昨天刚下单ACR122U-A9,正在路上,玩的好的话可以试试PM3),然后把两个学校的两张卡给破解了.破解之后呢自然会想去做一些羞羞的事情,比如change一下money什么的,无奈光改金额不行,还得算出校验位是怎么来的,然后每次想把money改成多少多少,都要拿系统自带程序员计算器在那里按来按去,很是麻烦,对于我这种懒人来说,必定要偷偷懒的(同时也方便了要改很多卡的人,