#include "SceneGame.h"
SceneGame::SceneGame()
{
}
CCScene* SceneGame::scene(bool red)
{
CCScene* scene = CCScene::create();
SceneGame* layer = SceneGame::create(red);
scene->addChild(layer);
return scene;
}
//自定义create函数
SceneGame* SceneGame::create(bool red)
{
SceneGame* pRet = new SceneGame();
if(pRet)
{
if(pRet->init(red))
{
pRet->autorelease();
}
else
{
pRet->release();
return NULL;
}
}
else
{
return NULL;
}
return pRet;
}
bool SceneGame::init(bool red)
{
//调用父类CCLayer
if(!CCLayer::init())
{
return false;
}
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
//设置棋盘的偏移值
this->_plateOffset = ccp(20,10);
//设置棋子的偏移值
this->_stoneOffset = ccp(60, 33);
//设置棋子的直径为46
this->_d = 46;
//初始化时,没有选中棋子
_selectid = -1;
//走棋时,切换棋子的颜色
_redTrun = true;
//棋盘上玩家摆红旗
_redSide = red;
//创建桌子
CCSprite* desk = CCSprite::create("floor.jpg");
this->addChild(desk);
//设置桌子的位置
desk->setPosition(ccp(winSize.width / 2, winSize.height / 2));
//压缩桌子
desk->setScaleX(winSize.width / desk->getContentSize().width);
desk->setScaleY(winSize.height / desk->getContentSize().height);
//创建棋盘
CCSprite* plate = CCSprite::create("background.png");
this->addChild(plate);
//设置描点为(0,0)
plate->setAnchorPoint(CCPointZero);
//设置棋盘的位置
plate->setPosition(_plateOffset);
//压缩棋盘:(窗口的高度 - 偏移的y坐标 * 2) / 图片的高度
plate->setScale((winSize.height -_plateOffset.y *2)/ plate->getContentSize().height);
//摆棋子
for(int i=0; i<32; i++)
{
//创建棋子
_s[i] = Stone::create(i, red);
addChild(_s[i]);
//设置棋子的初始位置为随机位置
_s[i]->setPosition(ccp(CCRANDOM_0_1() * winSize.width,
CCRANDOM_0_1() * winSize.height));
//隐藏棋子
_s[i]->setVisible(false);
}
//创建一个选择框
//当选中某个棋子的时候,选择框会套在选好的棋子上
_selectSprite = CCSprite::create("selected.png");
addChild(_selectSprite);
//隐藏选择框
_selectSprite->setVisible(false);
//设置选择框的优先级
_selectSprite->setZOrder(1000);
//压缩选择框
_selectSprite->setScale(.8f);
//创建Menu
CCMenu* menu = CCMenu::create();
this->addChild(menu);
//创建开始按钮
CCMenuItem* itemStart = CCMenuItemImage::create("start.jpg", "start.jpg",
this, menu_selector(SceneGame::Start));
menu->addChild(itemStart);
itemStart->setPositionX(190);
itemStart->setPositionY(120);
//创建新局按钮
CCMenuItem* itemNew = CCMenuItemImage::create("new.jpg", "new.jpg",
this, menu_selector(SceneGame::New));
menu->addChild(itemNew);
itemNew->setPositionX(itemStart->getPositionX());
itemNew->setPositionY(itemStart->getPositionY() + 60);
//创建悔棋按钮
CCMenuItem* item = CCMenuItemImage::create("regret.jpg", "regret.jpg",
this, menu_selector(SceneGame::Back));
menu->addChild(item);
item->setPositionX(itemStart->getPositionX());
item->setPositionY(itemStart->getPositionY() - 60);
//创建暂停按钮
CCMenuItem* itemPause = CCMenuItemImage::create("pause.jpg", "pause.jpg",
this, menu_selector(SceneGame::Pause));
menu->addChild(itemPause);
itemPause->setPositionX(itemStart->getPositionX());
itemPause->setPositionY(itemStart->getPositionY() - 60 - 60);
//创建难度按钮
CCMenuItem* itemDifficulty = CCMenuItemImage::create("difficulty.jpg", "difficulty.jpg",
this, menu_selector(SceneGame::Difficulty));
menu->addChild(itemDifficulty);
itemDifficulty->setPositionX(itemStart->getPositionX());
itemDifficulty->setPositionY(itemStart->getPositionY() - 60 - 60 - 60);
//创建播放背景音乐按钮
CCMenuItem* itemVoice = CCMenuItemImage::create("openVolice.png", "closeVolice.png",
this, menu_selector(SceneGame::Voice));
menu->addChild(itemVoice);
itemVoice->setPositionX(itemStart->getPositionX());
itemVoice->setPositionY(itemStart->getPositionY() - 60 - 60 - 60 - 60);
CCLog("x=%lf", itemStart->getPositionX());
CCLog("y=%lf", itemStart->getPositionY() - 240);
//创建一个字体,并且以此为字体的文字
CCLabelTTF* label = CCLabelTTF::create("Voice", "Arial", 25);
addChild(label);
//设置文字的位置
label->setPosition(ccp(winSize.width/2 + 120, winSize.height/2 - 120));
//设置文字的颜色
label->setColor(ccc3(0, 0, 0));
//创建数组
_steps = CCArray::create();
_steps->retain();
//创建精灵显示游戏结果
sprite = CCSprite::create("yingjiemian.png");
addChild(sprite);
sprite->setPosition(ccp(winSize.width / 2, winSize.height / 2));
//隐藏结果
sprite->setVisible(false);
visible = false;
//走棋
setTouchEnabled(true);
setTouchMode(kCCTouchesOneByOne);
return true;
}
//通过点击选择棋子,走棋子
bool SceneGame::ccTouchBegan(CCTouch* pTouch, CCEvent* pEvent)
{
CCObject* obj = (CCObject*)pTouch;
//获取触摸点的窗口坐标
CCPoint ptInWin = pTouch->getLocation();
if(sprite->boundingBox().containsPoint(ptInWin) && visible == true)
{
//隐藏游戏结果
sprite->setVisible(false);
visible = false;
New(obj);
}
int x, y;//保存触摸点的棋盘坐标
//通过触摸点的窗口坐标获取棋盘的x坐标和y坐标
if(!getClickPos(ptInWin, x, y))
{
return false;
}
//通过触摸点在棋盘中的坐标获取选中的棋子的id
int clickid = getStone(x, y);
//当触摸点的位置上有棋子的时候,clickid为选中的棋子的id,表示玩家在选棋
//当触摸点的位置上没有棋子的时候,clickid为-1,表示玩家在走棋
//-1 == _selectid表示没有选中棋子
if(-1 == _selectid)
{
setSelectId(clickid);
}
else
{
//移动棋子
//第一个参数:移动的棋子的id
//第二个参数:通过触摸点的位置判断触摸点上是否有棋子
//第三个参数:触摸点的x坐标
//第四个参数:触摸点的y坐标
//moveStone执行了两个步骤选棋和走棋
//选棋子:当_selectid == clickid时,表示选定了id为_selectid的棋子
//走棋子:当selectid != clickid时, 表示将id为_selectid的棋子移动到(x,y)所在的位置上
moveStone(_selectid, clickid, x, y);
}
// CCLog("_selectid=%d, clickid=%d", _selectid, clickid);
//CCLog("x=%d, y=%d", x, y);
return true;
}
//得到鼠标点击在棋盘上的坐标点
//当鼠标点击的位置在棋盘外返回false
//通过窗口坐标获得棋盘坐标
bool SceneGame::getClickPos(CCPoint ptInWin, int &x, int &y)
{
for(x=0; x<=8; x++)
{
for(y=0; y<=9; y++)
{
//计算棋盘上的格子在窗口上的位置
CCPoint ptInPlate = getStonePos(x, y);
// CCLog("ptInPlate.x=%lf ptInPlate.y=%lf", ptInPlate.x, ptInPlate.y);
//寻找与鼠标点击的位置距离小于棋子的半径的格子
//如果找到了,return true,否则返回 return false
if(ptInWin.getDistance(ptInPlate) < _d / 2)
{
return true;
}
}
}
return false;
}
//通过坐标的下标获取棋子的ID
//如果坐标上没有棋子,返回-1
int SceneGame::getStone(int x, int y)
{
Stone* s;
//遍历32个棋子
for(int i=0; i<32; i++)
{
s
评论18
最新资源