#include "GameScene.h"
#include "SpriteShape.h"
#include "MainScene.h"
#include "GameOverScene.h"
using namespace CocosDenshion;
GameScene::GameScene()
: spriteSheet(NULL)
, m_time(60)
, score(0)
, isFillSprite(false)
, isAction(true)//start with drop animation
, isTouchEna(true)
, staSprite(NULL)
, endSprite(NULL)
, fourBoom(true)//drop animation is vertical
{
}
Scene* GameScene::createScene( )
{
auto scene = Scene::create();
auto layer = GameScene::create();
scene -> addChild( layer );
return scene;
}
bool GameScene::init( )
{
if( !Layer::init() ){
return false;
}
// 添加背景图片
auto sprite = Sprite::create("scene_bg.png");
sprite->setPosition(Point(GAME_SCREEN_WIDTH/2,GAME_SCREEN_HEIGHT/2));
this->addChild(sprite,-1);
// 添加返回按钮
auto backItem = MenuItemImage::create(
"btn_back01.png",
"btn_back02.png",
CC_CALLBACK_1(GameScene::menuBackCallback, this));
backItem->setPosition(Vec2(GAME_SCREEN_WIDTH-backItem->getContentSize().width/2,backItem->getContentSize().height/2));
auto menu = Menu::create(backItem, NULL);
menu->setPosition(Vec2::ZERO);
this -> addChild( menu );
if(!userDefault->getIntegerForKey("Int")){
userDefault->setIntegerForKey("Int",0);
}
TTFConfig config("haibaoti.ttf",30);
// 最高分
auto labelHScore = Label::createWithTTF(config, "Highest: 0");
labelHScore -> setPosition(Vec2( GAME_SCREEN_WIDTH - labelHScore->getContentSize().width , GAME_SCREEN_HEIGHT - labelHScore->getContentSize().height ));
labelHScore -> setString( StringUtils::format("Highest: %d ",userDefault->getIntegerForKey("Int")));
this->addChild(labelHScore);
// 分数
auto labelScore = Label::createWithTTF(config,"Score: 0");
labelScore -> setPosition(Vec2( GAME_SCREEN_WIDTH/2 , GAME_SCREEN_HEIGHT - labelScore->getContentSize().height*2.6 ));
labelScore -> setTag(10);
this->addChild(labelScore);
// 时间
auto labelTime = Label::createWithTTF(config,"Time: 60");
labelTime -> setPosition(Vec2( labelTime->getContentSize().width , GAME_SCREEN_HEIGHT - labelTime->getContentSize().height ));
labelTime -> setTag(11);
this ->addChild(labelTime);
// 初始化坐标值
mapLBX = (GAME_SCREEN_WIDTH - SPRITE_WIDTH * COLS - (COLS - 1) * BOADER_WIDTH) / 2;
mapLBY = (GAME_SCREEN_HEIGHT - SPRITE_WIDTH * ROWS - (ROWS - 1) * BOADER_WIDTH) / 2;
// 加载plist和png
SpriteFrameCache::getInstance()->addSpriteFramesWithFile("icon.plist");
spriteSheet = SpriteBatchNode::create("icon.png");
addChild(spriteSheet);
initMap();
scheduleUpdate();
schedule(schedule_selector(GameScene::myClock),1.0f );
// 触摸事件处理
auto touchListener = EventListenerTouchOneByOne::create();
touchListener->onTouchBegan = CC_CALLBACK_2(GameScene::onTouchBegan, this);
touchListener->onTouchMoved = CC_CALLBACK_2(GameScene::onTouchMoved, this);
_eventDispatcher->addEventListenerWithSceneGraphPriority(touchListener, this);
return true;
}
void GameScene::createSprite( int row , int col )
{
// 先创建一个寿司
SpriteShape *spr = SpriteShape::create(row, col);
// 创建动作动画
Point endPosition = positionOfItem(row, col);
Point startPosition = Point(endPosition.x, endPosition.y + GAME_SCREEN_HEIGHT / 2);
spr->setPosition(startPosition);
float speed = startPosition.y / (1.5 * GAME_SCREEN_HEIGHT );
spr->runAction(MoveTo::create(speed, endPosition));
// 加入到spriteSheet中,等待绘制
spriteSheet->addChild(spr);
// 数组相应位置,置上寿司对象
map[row][col] = spr;
}
// 获取坐标值
Point GameScene::positionOfItem(int row, int col)
{
float x = mapLBX + (SPRITE_WIDTH + BOADER_WIDTH) * col + SPRITE_WIDTH / 2;
float y = mapLBY + (SPRITE_WIDTH + BOADER_WIDTH) * row + SPRITE_WIDTH / 2;
return Point(x, y);
}
// 初始化二维数组
void GameScene::initMap( )
{
for( int r = 0 ; r < ROWS ; ++r ){
for( int c = 0 ; c < COLS ; ++c ){
createSprite(r,c);
}
}
}
// 更新函数
void GameScene::update( float t )
{
// 检测是否在执行动作
if ( isAction ) {
// 设置为false
isAction = false;
for( int r = 0 ; r < ROWS ; ++r ) {
for( int c = 0 ; c < COLS ; ++c ) {
SpriteShape* spr = map[r][c];
if (spr && spr->getNumberOfRunningActions() > 0) {
isAction = true;
break;
}
}
}
}
// 如果寿司正在移动中,忽视触摸事件
isTouchEna = !isAction;
if (!isAction) {
if ( isFillSprite ) {
//爆炸效果结束后才掉落新寿司,增强打击感
fillSprite();
isFillSprite = false;
// 检测有没有可移动精灵
if( isHaveMove() == false )
{
for( int r = 0 ; r < ROWS ; ++r )
for( int c = 0 ; c < COLS ; ++c )
map[r][c]->setIsNeedRemove(true);
removeSprite();
}
} else {
checkAndRemoveSprite();
}
}
// 分数变化
Label *labelScore = (Label *)this -> getChildByTag(10);
labelScore -> setString( StringUtils::format("Score: %d ",this->getScore()));
}
void GameScene::fillSprite()
{
// 重置移动方向标志
fourBoom = true;
isAction = true;
int sum = 0;
int *colEmptyInfo = (int *)malloc(sizeof(int) * COLS);
memset((void *)colEmptyInfo, 0, sizeof(int) * COLS);
// 将存在的寿司降落下来
SpriteShape *spr = NULL;
for (int c = 0; c < COLS; c++) {
int removedSpriteOfCol = 0;
// 自底向上
for (int r = 0; r < ROWS; r++ ) {
spr = map[r][c];
if ( spr == NULL ) {
++removedSpriteOfCol;
} else {
if ( removedSpriteOfCol > 0) {
// evey item have its own drop distance
int newRow = r - removedSpriteOfCol;
// switch in matrix
map[newRow][c] = spr;
map[r][c] = NULL;
// move to new position
Point startPosition = spr->getPosition();
Point endPosition = positionOfItem(newRow, c);
float speed = (startPosition.y - endPosition.y) / GAME_SCREEN_HEIGHT*3;
spr->stopAllActions();// must stop pre drop action
spr->runAction(CCMoveTo::create(speed, endPosition));
// set the new row to item
spr->setRow(newRow);
}
}
}
// 记录相应列数移除的数量
colEmptyInfo[c] = removedSpriteOfCol;
sum+=removedSpriteOfCol;
}
// 新建新的寿司,并降落
for (int c = 0; c < COLS; ++c ) {
for (int r = ROWS - colEmptyInfo[c]; r < ROWS ; ++r ) {
createSprite(r,c);
}
}
setScore(getScore()+sum*30);
free(colEmptyInfo);
}
void GameScene::checkAndRemoveSprite()
{
SpriteShape *spr;
// 设定寿司的忽视检查
for( int r = 0 ; r < ROWS ; ++r ) {
for( int c = 0 ; c < COLS ; ++c ) {
spr = map[r][c];
if( !spr ) {
continue;
}
spr -> setIgnoreCheck(false);
}
}
for( int r = 0 ; r < ROWS ; ++r ) {
for( int c = 0 ; c < COLS ; ++c ) {
spr = map[r][c];
if( !spr ) {
continue;
}
if( spr -> getIsNeedRemove() ) {
continue;
}
if ( spr -> getIgnoreCheck() ) {
continue;// 新变化的特殊寿司,不消除
}
std::list< SpriteShape *> colChainList;
getColChain( spr , colChainList );
std::list< SpriteShape *> rowChainList;
getRowChain( spr , rowChainList );
std::list< SpriteShape *> &longerList = colChainList.size() > rowChainList.size() ? colChainList : rowChainList;
if( longerList.size() < 3 ) {
continue;
}
std::list<SpriteShape *>::iterator itList;
bool isSetedIgnoreCheck = false;
for( itList = longerList.begin() ; itList != longerList.end
没有合适的资源?快使用搜索试试~ 我知道了~
Cocos2d-x 3.2《万圣大作战》消除游戏源码
共57个文件
png:28个
h:9个
cpp:8个
4 下载量 4 浏览量
2022-12-07
23:28:36
上传
评论
收藏 15.72MB ZIP 举报
温馨提示
Cocos2d-x 3.2《万圣大作战》消除游戏源码 cocos精品小游戏源码 , 完整项目源码 是整个项目的压缩包 , 新建空项目直接导入到项目里面就可以运行了,无需其他操作。 适合二次开发和学习使用,都是经典游戏,需要其他游戏源码包可以看我主页。 直接可以运行 , 如果运行不了 请切换编译器版本 , 经过测试是没问题的 如果打不开请切换编译器版本。 有别的资源或代码需求可以通过我的主页联系 谢谢! cocos游戏代码 ,cocos经典游戏源码 , cocos休闲游戏源码, cocos容易上手的游戏源码,cocos小游戏源码,cocos新手练习源码,cocos个人开发源码,cocos优秀项目。
资源推荐
资源详情
资源评论
收起资源包目录
Cocos2d-x 3.2《万圣大作战》消除游戏源码.zip (57个子文件)
Cocos2d-x 3.2《万圣大作战》消除游戏源码
Resources
rese
inkmoo_flash.png 585KB
btn_setting02.png 24KB
btn_ret.png 29KB
haibaoti.ttf 11.45MB
music_fail.mp3 158KB
music_gameOver.mp3 139KB
colorVDown.png 7KB
colorVUp.png 4KB
sprite_plus3.png 18KB
icon.plist 10KB
btn_setting01.png 21KB
btn_musOn.png 28KB
music_bg.mp3 2.45MB
yuehei.otf 1.39MB
btn_restart01.png 23KB
sprite_newRecord.png 26KB
btn_exit01.png 21KB
colorHRight.png 4KB
music_win.wav 725KB
Marker Felt.ttf 25KB
btn_musOff.png 29KB
icon.png 50KB
btn_restart02.png 25KB
btn_back01.png 23KB
btn_exit02.png 22KB
btn_start02.png 25KB
scene_sta.png 318KB
btn_setting.png 21KB
btn_start01.png 23KB
music_explodeOne.wav 264KB
btn_back02.png 25KB
colorHLeft.png 6KB
circle.png 9KB
music_mainScene.mp3 3.17MB
inkmoo_flash.plist 37KB
music_explode.wav 295KB
pic_gameover.png 55KB
scene_bg.png 293KB
scene_end.png 291KB
scene_abo.png 244KB
Classes
InkmooFlash.cpp 1KB
GameScene.cpp 26KB
AppDelegate.cpp 2KB
GameOverScene.cpp 3KB
HelloWorldScene.h 612B
AppDelegate.h 1009B
HelloWorldScene.cpp 3KB
SpriteShape.h 646B
InkmooFlash.h 280B
MainScene.cpp 3KB
Developer.h 559B
Developer.cpp 5KB
GameScene.h 2KB
MainScene.h 551B
GameDefine.h 1KB
SpriteShape.cpp 1004B
GameOverScene.h 381B
共 57 条
- 1
资源评论
若风华浊世间
- 粉丝: 63
- 资源: 164
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功