1. 程式人生 > >Cocos2D遊戲之旅(三):卡牌翻轉效果的實現(上)

Cocos2D遊戲之旅(三):卡牌翻轉效果的實現(上)

曉石頭的部落格

郵箱:[email protected]

滑鼠點選一次,卡牌蓋住

再次點選,卡牌翻開


效果演示圖

之前一直認為卡牌翻轉是通過幀動畫實現的,當看到@笨木頭用ScaleTo做出來時候,再一次深刻體會到什麼叫大道至簡。

一、先談思路

一共兩張圖片

1、正面


2、背面


第一步:將正面的寬度慢慢縮小至0;產生卡牌翻轉到中間的效果

第二步:將一開始就把寬度縮小至0的背面放大到正常,產生卡牌蓋住的效果

嘿嘿,是不是一種恍然大悟的感覺!^_^


二、再說實現

bool HelloWorld::init()
{
    if (!Layer::init())
    {
        return false;
    }
    Size visibleSize = Director::getInstance()->getVisibleSize();

	//新增背景
	CCSprite* bk = CCSprite::create("bk.png");
	bk->setPosition(Point(visibleSize.width / 2, visibleSize.height / 2));
	this->addChild(bk);

	//cardFlag為偶數時,表示牌翻開,否則蓋上
	cardFlag = 0;

	//觸控事件
	EventListenerTouchOneByOne* event = EventListenerTouchOneByOne::create();
	event->setSwallowTouches(true);
	event->onTouchBegan = CC_CALLBACK_2(HelloWorld::onTouchBegan, this);
	event->onTouchMoved = CC_CALLBACK_2(HelloWorld::onTouchMoved, this);
	event->onTouchEnded = CC_CALLBACK_2(HelloWorld::onTouchEnded, this);
	_eventDispatcher->addEventListenerWithSceneGraphPriority(event, this);

	/* 建立第一個精靈 */
	sprite1 = Sprite::create("card.jpg");
	sprite1->setPosition(Point(visibleSize.width / 2, visibleSize.height / 2));
	this->addChild(sprite1);

	/* 建立第二個精靈 */
	sprite2 = Sprite::create("bkCard.png");
	sprite2->setPosition(Point(visibleSize.width / 2, visibleSize.height / 2));
	this->addChild(sprite2);

	/* 第二個精靈預設x拉伸至0.0,於是第二個精靈在一開始是看不見的*/
	sprite2->setScaleX(0.0f);

    return true;
}


void HelloWorld::closeCard()
{
	/* x方向拉伸至0的動作 */
	ScaleTo* scaleToHide = ScaleTo::create(0.6f, 0.0f, 1.0f);

	/* 建立卡牌放大的回撥函式 */
	auto funcScaleToShow = [=](){
		ScaleTo* scaleToShow = ScaleTo::create(0.6f, 1.0f, 1.0f);
		sprite2->runAction(scaleToShow);
	};

	/* 將回調函式封裝為動作 */
	CallFunc* callFuncSpr2 = CallFunc::create(funcScaleToShow);

	/* 依次執行動作 */
	Sequence* sequence = Sequence::create(scaleToHide, callFuncSpr2, NULL);

	sprite1->runAction(sequence);
}

void HelloWorld::openCard()
{
	/* x方向拉伸至0的動作 */
	ScaleTo* scaleToHide = ScaleTo::create(0.6f, 0.0f, 1.0f);

	auto funcScaleToShow = [=](){
		ScaleTo* scaleToShow = ScaleTo::create(0.6f, 1.0f, 1.0f);
		sprite1->runAction(scaleToShow);
	};

	CallFunc* callFuncSpr1 = CallFunc::create(funcScaleToShow);
	Sequence* sequence = Sequence::create(scaleToHide, callFuncSpr1, NULL);

	sprite2->runAction(sequence);
}

bool HelloWorld::onTouchBegan(Touch *touch, Event *unused_event)
{
	return true;
}
void HelloWorld::onTouchMoved(Touch *touch, Event *unused_event)
{

}

void HelloWorld::onTouchEnded(Touch *touch, Event *unused_event)
{
	/* cardFlag為偶數則蓋住卡牌,基數則開啟卡牌 */
	if (0 == cardFlag%2)
	{
		closeCard();
	}
	else
	{
		openCard();
	}
	cardFlag++;
}

原始碼免積分下載地址:

程式碼一:卡牌翻轉效果的實現(只有當滑鼠點中卡牌才翻轉)

程式碼二:卡牌翻轉效果的實現(有點選事件就翻轉)

對比學習會對觸控事件有更深入的理解。



相關推薦

Cocos2D遊戲翻轉效果實現

曉石頭的部落格 郵箱:[email protected] 滑鼠點選一次,卡牌蓋住 再次點選,卡牌翻開 效果演示圖 之前一直認為卡牌翻轉是通過幀動畫實現的,當看到@笨木頭用ScaleTo做出來時候,再一次深刻體會到什麼叫大道至簡。 一、先談思路 一共兩張圖片

Cocos2D遊戲翻轉效果實現

曉石頭的部落格 郵箱:[email protected] 上篇講解了用ScaleTo縮放卡牌,達到翻轉的效果。 條條大道通羅馬,RotateBy 旋轉卡牌同樣能夠實現,而且效果更棒,就看你喜歡哪種了! 效果對比圖 一、先談思路: 用ScaleTo縮放卡

Cocos2D遊戲主角血條的實現

血槽血量的變化是有兩個元素構成的: 1.血槽圖 2.紅色的進度條 當進度條的進度值不斷減少的時候,就產生血量減少的效果。 UI的佈局我採用了CocoStudio的UI編輯器,感覺不錯,挺容易上手的,如果需要相關資料的給我留言。繼續上圖~ 二、再說實現 bool HelloWorld::init()

RPG遊戲《黑暗光》流程介紹與程式碼分析角色控制系統的實現

第三章:角色控制本篇部落格主要對人物移動及其相關操作進行分析,主要包括主角以及鏡頭的移動。在遊戲介面中,我們使用Camera作為視角。為了方便之後判斷當前tag,我們新建一個Tag指令碼,存入一些tag資訊,之後呼叫就不容易出錯using UnityEngine; using

python的遊戲-- 數字 字串 列表 元組 字典 即為遊戲職業

        ---恢復內容開始--- 一,個人心得 我覺得學習python就想玩一款遊戲,python的基本資料型別(字串 數字 列表 元組 字典)可以看做一個遊戲職業,每個職業都有相應的技能。 玩好這些職業,讓我們的python之旅更加容易。 &n

Python 遊戲Pygame

Pygame是跨平臺Python模組,專為電子遊戲設計,包含影象、聲音。建立在SDL基礎上,允許實時電子遊戲研發而無需被低階語言(如機器語言和組合語言)束縛。基於這樣一個設想,所有需要的遊戲功能和理念都(主要是影象方面)都完全簡化為遊戲邏輯本身,所有的資源結構都可以由高階語言提供。   Pyga

敏捷開發系列認識FDD特徵驅動開發

上篇文章中,我們探討了什麼是XP極限程式設計,以及極限程式設計的管理思想、核心價值觀等等。在敏捷開發之旅的第三站,我想要和大家一起分享FDD特徵驅動開發方法。 特徵驅動開發——Feature Driven Development 還是老規矩,討論之前,我們先了解一下什麼

Stereo Matching文獻筆記經典演算法Semi-Global MatchingSGM碉堡的動態規劃

上一篇部落格中提到了SGM的第一部分,基於分層互資訊(HMI)的代價計算,本文繼續說說自己對SGM代價聚合部分的理解。 (轉載:http://blog.csdn.net/wsj998689aa/article/details/50488249, 作者:迷霧forest)

[寒江孤葉丶的Cocos2d-x_22]Cocos2d-x如何不進入待機螢幕保持喚醒 不鎖屏 不變黑……

原創文章,歡迎轉載,轉載請註明:文章來自[寒江孤葉丶的Cocos2d-x之旅系列] 部落格地址:http://blog.csdn.net/qq446569365 方法很簡單,一行程式碼就可以輕鬆搞定…… 首先是IOS的實現: 在AppController.mm檔案

《OneForAll框架搭建》前端篇微前端架構設計Vue

心之所向,勇往直前!記錄開發過程中的那些小事,給自己加點經驗值。 前言 作為一個.Net後端開發,在競爭愈加激烈的當下,掌握點前端配菜好像已經是家常便飯了。 剛好在工作的第5個年頭,辭去小主管職務的我要再次踏上面試之路,為了要避免被面試官吊打,除了複習《吊打面試

在STM32實現NTFS4GPT分區表的C語言實現1主GPT表頭的實現

center mbr分區 sum 對齊 字節數 決定 容器 alt 水平 題外話:在荒廢了很久沒有更新之後……某日突然收到讀者的站內信!內容大體是詢問GPT分區表信息的讀取方式,筆者激動萬分之下,決定繼續解剖NTFS……其實GPT嚴格上不算是NTFS的內容, GPT和M

學習 WebService 第一個簡單的實例SoapUI測試REST項目

方法 資源 ima .com required tle margin 導出 ont 原文地址:SOAPUI測試REST項目(六)——REST服務和WADL ↑↑↑ 原文用的SoapUI,2018-3-19時,這個軟件已經更名為ReadyAPI(集成了SoapUI),因此下文

資料結構實驗棧與佇列六下一較大值SDUT 3333

#include <bits/stdc++.h> using namespace std; int a[1000006]; int b[1000006]; int sta[100006]; int main() { int t,n,i,j,top; while(~sc

資料結構實驗棧與佇列五下一較大值SDUT 3332

#include <bits/stdc++.h> using namespace std; int a[1005]; int main() { int t,n,i,j; while(~scanf("%d",&t)) { while(t-

資料結構實驗棧與佇列五下一較大值

資料結構實驗之棧與佇列五:下一較大值(一) Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description 對於包含n(1<=n<=1000)個整數的序列,對於序列中的每一元素,

資料結構實驗棧與佇列五下一較大值一,二

資料結構實驗之棧與佇列五:下一較大值(一,二) Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description 對於包含n(1<=n<=1000)個整數的序列,對於序

區塊鏈技術基礎語言Go語言常用工具包

原文連結:區塊鏈技術基礎語言(三十):Go語言常用工具包(下) 一、JSON處理 JSON(JavaScript Object Notation)是一種輕量級的資料交換格式,方便人們閱讀和編寫,也方便程式地解析和生成。雖然JSON是JavaScript的子集,但其格式完全獨立於程式語言,表現

6、CentOS7 安裝Docker擴充套件個技巧,將Docker映象體積減小90%

三個技巧,將Docker映象體積減小90% 在構建Docker容器時,應該儘量想辦法獲得體積更小的映象,因為傳輸和部署體積較小的映象速度更快。 但RUN語句總是會建立一個新層,而且在生成映象之前還需要使用很多中間檔案,在這種情況下,該如何獲得體積更小的映象呢? 你可能

資料結構實驗棧與佇列六下一較大值(因為資料量大所以用棧來操作)

資料結構實驗之棧與佇列六:下一較大值(二) Time Limit: 150 ms Memory Limit: 8000 KiB Problem Description 對於包含n(1<=n<=100000)個整數的序列,對於序列中的每一元素,在序列中查詢

資料結構實驗棧與佇列六下一較大值

Time Limit: 150 ms Memory Limit: 8000 KiB Problem Description 對於包含n(1<=n<=100000)個整數的序列,對於序列中的每一元素,在序列中查詢其位置之後第一個大於它的值,如果找到,輸出所找到的