cocos2dx 2048
时间:2022-05-03
本文章向大家介绍cocos2dx 2048,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
#include "GameScene.h"
#include "CardSprite.h"
#include "ScoreBoard.h"
#include "SimpleAudioEngine.h"
USING_NS_CC;
Scene* GameLayer::createScene()
{
auto scene = Scene::create();
auto layer = GameLayer::create();
scene->addChild(layer);
return scene;
}
bool GameLayer::init()
{
if (!Layer::init())
return false;
CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect("1.mp3");
auto size = Director::getInstance()->getVisibleSize();
auto listener = EventListenerTouchOneByOne::create();
listener->onTouchBegan = CC_CALLBACK_2(GameLayer::touchBegan, this);
listener->onTouchMoved = CC_CALLBACK_2(GameLayer::touchMoved, this);
listener->onTouchEnded = CC_CALLBACK_2(GameLayer::touchEnded, this);
auto dispacher = Director::getInstance()->getEventDispatcher();
dispacher->addEventListenerWithSceneGraphPriority(listener, this);
auto background = LayerColor::create(Color4B(255, 255, 255, 255));
addChild(background);
gameBoard = ScoreBoard::createBoard(2048, 120, 90, "Game", Vec2(15, size.height-100),Color4B(2,168,209,255));
addChild(gameBoard);
highBoard = ScoreBoard::createBoard(0, 90, 90, "high", Vec2(150, size.height - 100), Color4B(209, 168, 168, 255));
addChild(highBoard);
scoreBoard = ScoreBoard::createBoard(0, 90, 90, "score", Vec2(255, size.height - 100), Color4B(50, 100, 209, 255));
addChild(scoreBoard);
for (int i = 0; i < HCARDS; ++i)
{
for (int j = 0; j < VCARDS; ++j)
{
cards[i][j] = CardSprite::createCard(0, 90, Vec2(90 * i + CARDBORDER / 2, 90 * j + 80));
addChild(cards[i][j]);
}
}
win = false;
cardsNum = 0;
score = 0;
RandomCard();
RandomCard();
return true;
}
bool GameLayer::touchBegan(cocos2d::Touch* touch, cocos2d::Event*)
{
CCLOG("began");
beginPos = touch->getLocation();//GL
bNeedCheck = true;
return true;
}
void GameLayer::touchMoved(cocos2d::Touch* touch, cocos2d::Event*)
{
auto currentPos = touch->getLocation();
auto xoffset = currentPos.x - beginPos.x;
auto yoffset = currentPos.y - beginPos.y;
if (bNeedCheck)
{
if (xoffset > XOFFSET && abs(yoffset) <= YOFFSET)
{
if (moveRight())
{
CocosDenshion::SimpleAudioEngine::sharedEngine()->playEffect("1.mp3");
RandomCard();
bNeedCheck = false;
}
}
else if (xoffset < -XOFFSET && abs(yoffset) <= YOFFSET)
{
if(moveLeft())
{
CocosDenshion::SimpleAudioEngine::sharedEngine()->playEffect("1.mp3");
RandomCard();
bNeedCheck = false;
}
}
else if (yoffset > YOFFSET && abs(xoffset) <= XOFFSET)
{
if(moveUp())
{
CocosDenshion::SimpleAudioEngine::sharedEngine()->playEffect("1.mp3");
RandomCard();
bNeedCheck = false;
}
}
else if (yoffset < -YOFFSET && abs(XOFFSET) <= XOFFSET)
{
if(moveDown())
{
CocosDenshion::SimpleAudioEngine::sharedEngine()->playEffect("1.mp3");
RandomCard();
bNeedCheck = false;
}
}
scoreBoard->setScore(score);
}
}
void GameLayer::touchEnded(cocos2d::Touch*, cocos2d::Event*)
{
CCLOG("end");
beginPos = Vec2::ZERO;
bNeedCheck = false;
}
bool GameLayer::moveLeft()
{
bool hasMove = false;
CCLOG("Left");
for (int i = 0; i < VCARDS; ++i)
{
for (int j = 0; j < HCARDS; ++j)
{
for (int k = j + 1; k < HCARDS; ++k)
{
if (cards[k][i]->getNumber() > 0)
{
if (cards[j][i]->getNumber() <= 0)
{
cards[j][i]->setNumber(cards[k][i]->getNumber());
cards[k][i]->setNumber(0);
--j;
hasMove = true;
}
else if (cards[j][i]->getNumber() == cards[k][i]->getNumber())
{
cards[j][i]->setNumber(cards[k][i]->getNumber()*2);
cards[k][i]->setNumber(0);
score += cards[j][i]->getNumber();
--cardsNum;
hasMove = true;
if (cards[j][i]->getNumber() == 2048)
win = true;
}
break;//退出 for (int k = j + 1; k < HCARDS; ++k)
}
}
}
}
return hasMove;
}
bool GameLayer::moveRight()
{
bool hasMove = false;
CCLOG("Right");
for (int i = 0; i < VCARDS; ++i)
{
for (int j = HCARDS-1; j >=0; --j)
{
for (int k = j - 1; k >=0; --k)
{
if (cards[k][i]->getNumber() > 0)
{
if (cards[j][i]->getNumber() <= 0)
{
cards[j][i]->setNumber(cards[k][i]->getNumber());
cards[k][i]->setNumber(0);
++j;
hasMove = true;
}
else if (cards[j][i]->getNumber() == cards[k][i]->getNumber())
{
cards[j][i]->setNumber(cards[k][i]->getNumber() * 2);
cards[k][i]->setNumber(0);
score += cards[j][i]->getNumber();
--cardsNum;
hasMove = true;
if (cards[j][i]->getNumber() == 2048)
win = true;
}
break;//退出 for (int k = j + 1; k < HCARDS; ++k)
}
}
}
}
return hasMove;
}
bool GameLayer::moveUp()
{
bool hasMove = false;
CCLOG("Up");
for (int i = 0; i < HCARDS; ++i)
{
for (int j = VCARDS-1; j >= 0; --j)
{
for (int k = j - 1; k >= 0; --k)
{
if (cards[i][k]->getNumber()>0)
{
if (cards[i][j]->getNumber() <= 0)
{
cards[i][j]->setNumber(cards[i][k]->getNumber());
cards[i][k]->setNumber(0);
++j;
hasMove = true;
}
else if (cards[i][j]->getNumber() == cards[i][k]->getNumber())
{
cards[i][j]->setNumber(cards[i][j]->getNumber() * 2);
cards[i][k]->setNumber(0);
score += cards[i][j]->getNumber();
--cardsNum;
hasMove = true;
if (cards[i][j]->getNumber() == 2048)
win = true;
}
break;//退出 for (int k = j - 1; k >= 0; --k)
}
}
}
}
return hasMove;
}
bool GameLayer::moveDown()
{
bool hasMove = false;
CCLOG("Down");
for (int i = 0; i < HCARDS; ++i)
{
for (int j = 0; j < VCARDS; ++j)
{
for (int k = j + 1; k < VCARDS; ++k)
{
if (cards[i][k]->getNumber()>0)
{
if (cards[i][j]->getNumber() <= 0)
{
cards[i][j]->setNumber(cards[i][k]->getNumber());
cards[i][k]->setNumber(0);
--j;
hasMove = true;
}
else if (cards[i][j]->getNumber() == cards[i][k]->getNumber())
{
cards[i][j]->setNumber(cards[i][j]->getNumber() * 2);
cards[i][k]->setNumber(0);
score += cards[i][j]->getNumber();
--cardsNum;
hasMove = true;
if (cards[i][j]->getNumber() == 2048)
win = true;
}
break;//退出 for (int k = j - 1; k >= 0; --k)
}
}
}
}
return hasMove;
}
bool GameLayer::RandomCard()
{
if (cardsNum >= HCARDS*VCARDS)
return false;
srand(time(NULL));
int i = -1;
int j = -1;
do
{
i = rand() % 4;
j = rand() % 4;
if (cards[i][j]->getNumber() == 0)
{
cards[i][j]->setNumber(2);
break;
}
} while (true);
++cardsNum;
return true;
}
#include "CardSprite.h"
USING_NS_CC;
bool CardSprite::init()
{
if (!Sprite::init())
return false;
return true;
}
CardSprite* CardSprite::createCard(int number, int size, Vec2 pos)
{
auto card = new CardSprite();
if (card && card->init())
{
card->autorelease();
card->initCard(number, size, pos);
}
else
{
delete card;
card = NULL;
}
return card;
}
bool CardSprite::initCard(int number, int size, cocos2d::Vec2 pos)
{
this->number = number;
bg = LayerColor::create(Color4B(216, 210, 214, 255), size - CARDBORDER, size - CARDBORDER);
bg->setAnchorPoint(Vec2(0, 0));
bg->setPosition(pos);
if (number > 0)
{
label = Label::create(String::createWithFormat("%d", number)->getCString(),"Arial",36);
}
else
{
label = Label::create("", "Arial", 36);
}
label->setPosition(Vec2(size / 2 - CARDBORDER, size / 2 - CARDBORDER));
bg->addChild(label);
addChild(bg);
return true;
}
int CardSprite::getNumber()
{
return number;
}
bool CardSprite::setNumber(int num)
{
number = num;
if (number <= 0)
{
label->setString("");
bg->setColor(Color3B(216, 210, 214));
}
else
{
label->setString(String::createWithFormat("%d", number)->getCString());
if (number == 2)
{
bg->setColor(Color3B(255, 246, 247));
label->setColor(Color3B(33, 33, 7));
}
else if (number == 4)
{
bg->setColor(Color3B(255, 218, 163));
label->setColor(Color3B(255, 255, 255));
}
else if (number == 8)
{
bg->setColor(Color3B(255, 144, 91));
}
else if (number == 16)
{
bg->setColor(Color3B(255, 101, 46));
}
else if (number == 32)
{
bg->setColor(Color3B(255, 80, 46));
}
else if (number == 64)
{
bg->setColor(Color3B(254, 56, 60));
}
else if (number == 128)
{
bg->setColor(Color3B(6, 194, 240));
}
else if (number == 256)
{
bg->setColor(Color3B(5, 140, 240));
}
else if (number == 512)
{
bg->setColor(Color3B(4, 140, 200));
}
else if (number == 1024)
{
bg->setColor(Color3B(3, 112, 154));
}
else if (number == 2048)
{
bg->setColor(Color3B(2, 98, 131));
}
}
return true;
}
#include "ScoreBoard.h"
USING_NS_CC;
bool ScoreBoard::init()
{
if (!Sprite::init())
return false;
return true;
}
ScoreBoard* ScoreBoard::createBoard(int score, int width, int high, char* title, cocos2d::Vec2 pos, cocos2d::Color4B color)
{
auto board = new ScoreBoard();
if (board && board->init())
{
board->autorelease();
board->initBoard(score, width, high, title, pos,color);
}
else
{
delete board;
board = NULL;
}
return board;
}
bool ScoreBoard::initBoard(int score, int width, int high, char* title, cocos2d::Vec2 pos, cocos2d::Color4B color)
{
this->score = score;
bg = LayerColor::create(color, width, high);
bg->setAnchorPoint(Vec2(0, 0));
bg->setPosition(pos);
addChild(bg);
this->title = Label::create(title, "Arial", 30);
this->title->setPosition(width / 2, high *3 / 4);
bg->addChild(this->title);
label = Label::create(String::createWithFormat("%d", score)->getCString(), "Arial", 40);
label->setPosition(width / 2, high / 4);
bg->addChild(label);
return true;
}
int ScoreBoard::getScore()
{
return score;
}
bool ScoreBoard::setScore(int score)
{
this->score = score;
label->setString(String::createWithFormat("%d", score)->getCString());
if (score <= 1000 && score > 100)
label->setSystemFontSize(30);
else if (score > 1000)
label->setSystemFontSize(20);
return true;
}
- PowerDesigner使用教程|使用方法
- Java并发编程的艺术(一)——并发编程需要注意的问题
- 梯度下降法快速教程 | 第三章:学习率衰减因子(decay)的原理与Python实现
- Java并发编程的艺术(三)——volatile
- java学习手册-java 新手入门必看的30个题
- Java并发编程的艺术(五)——中断
- 简易的深度学习框架Keras代码解析与应用
- Java并发编程的艺术(六)——线程间的通信
- 轻量级线程池的实现
- python根据BM25实现文本检索
- 稳扎稳打JavaScript(一)——作用域链内存模型
- 稳扎稳打JavaScript(二)——图解对象内存模型
- Swift学习资源
- 稳扎稳打JavaScript(三)——创建对象的几种方式
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 百度地图电子围栏功能
- opencv使用中出现的问题
- 人生苦短,我用k8s--------------Pod资源控制进阶管理
- 人生苦短,我用k8s--------------kuberctl命令合集
- Android使用Intent实现页面跳转
- Android实现单页显示3个Item的ViewPager炫酷切换效果
- Android用文件存储数据的方法
- Android编程监听APK安装与删除等过程的方法
- 人生苦短,我用k8s--------------详解yaml文件
- 排障集锦:九九八十一难之第二十难!-----使用jenkins镜像出现的问题Can not write to /var/jenkins_home/copy_reference_file.log.
- 人生苦短,我用k8s--------------secret和configmap的配置管理
- Go Colly抓取豆瓣电影Top250
- knative client 使用knative client 使用
- Java_web 学习1 Maven安装和使用2 mybatis的配置文件的详解mybatis缓冲mybatis注解延迟加载${} 与 #{} 区别【笔试题】
- Python3 的面向对象