hello,遇见好多好多萌新,心情好好。
前些天 yada给我推荐了一个游戏《四色方块》,《四色方块》是独立开发者xxpsoft最新开发的一款极具创意的休闲安卓游戏:
游戏中点击屏幕让方块旋转对应上面掉下的同色小球即是游戏的全部精华。
下载量也是非常的高:
效果:
这个游戏真的非常简单,但是还是可以用来练练手,再次熟悉类和对象和一些设计技巧。
现在就来教你如何开发属于自己的 《四色方块》。
首先,得来分析一下,游戏的原理,再确定如何开发。
1,小球从上往下落下,并在最高处时会随机改变小球的颜色
2,底下的方块分两个方向旋转
3,小球颜色与方块颜色要一致,否则游戏失败。。
。。。。。。。等等。
这里先想好如何检测,方块与小球颜色是否一致的。
这里的方块并不是用四个三角形组成的,检测的时候也不是检测它与小球的颜色是否相同。
这里的方案是,通过,小球每个index与方块每个三角面的颜色index是否对应相等来判断游戏是否正常进行。
现在为下落的小球写一个类:(下面是主要的方法和数据)
定义:
public:
CREATE_FUNC(Ball);//创建方法
virtual bool init();//初始化方法,用与初始化小球颜色和index
void change();//改变小球颜色
int getColorIndex();//外部获取到index
private:
ImageView*ball;//小球对象
int colorindex;//index
实现:
bool Ball::init(){
ball=ImageView::create("ballone.png");//初始化小球
this->setAnchorPoint(Point(0.5,0.5));
this->setContentSize(ball->getContentSize());
ball->setPosition(this->getContentSize()/2);
this->addChild(ball);
this->colorindex=1;//index初始化为1
return true;
}
void Ball::change(){
//这里通过生成0-4的随机数,决定小球随机颜色,同时设置相应的index
auto c=CCRANDOM_0_1()*4;
if(c>0&&c<=1){
ball->loadTexture("ballone.png");
this->colorindex=1;
}
if(c>1&&c<=2){
ball->loadTexture("balltwo.png");
this->colorindex=2;
}
if(c>2&&c<=3){
ball->loadTexture("ballthree.png");
this->colorindex=3;
}
if(c>3&&c<=4){
ball->loadTexture("ballfour.png");
this->colorindex=4;
}
}
int Ball::getColorIndex(){
return this->colorindex;//返回该index
}
方块:
定义:
下面是方块的一些重要方法是属性。
CREATE_FUNC(BoxSp);
virtual bool init();
void Roll();//右方向转
void RollR();//左方向转
int getIndex();//返回index
private:
int index;
实现:
bool BoxSp::init(){
this->initWithFile("coi.png");
this->setScale(0.6);
this->index=1;
return true;
}
//下面的判断是,如果刚开始就向右转,那么index为4的三角面就朝上。
void BoxSp::Roll(){
if(this->index==1){
this->index=4;
}
auto c=RotateBy::create(0.02, 90);
this->runAction(c);
this->index--;//index往下减,分别对应每一个90度后的颜色的index。
}
void BoxSp::RollR(){
//下面的判断是,如果向左转的时候index为4的三角面朝上,这里就是控制自加,或者自减后,index始终控制在1--4之间。
if(this->index==4){
this->index=1;
}
auto c=RotateBy::create(0.02, -90);
this->runAction(c);
this->index++;
}
int BoxSp::getIndex(){
return this->index;
}
使用:
score=0;//分数
label=LabelTTF::create("0", "Arial", 30);//分数便笺
label->setPosition(Point(400,400));
this->addChild(label,10);
auto bac=Sprite::create("background.jpg");
bac->setScale(0.4);
this->addChild(bac);
box=BoxSp::create();//创建方块
box->setPosition(Point(400,100));
this->addChild(box);
ball=Ball::create();//创建小球
ball->setPosition(Point(400,400));
this->addChild(ball);
下面代码的图解,小球往下掉路前,先进行颜色的改变,掉落到方块面上就进行检测,看是否三角面的颜色与小球相同,然后小球往上回到起点,由此反复,直到游戏结束。
auto ac1=MoveTo::create(1, Point(400,150));
auto ac2=CallFunc::create(CC_CALLBACK_0(TestScene::callC,this));
auto ac3=CallFunc::create(CC_CALLBACK_0(TestScene::callE,this));
auto ac4=MoveTo::create(1.5,Point(400,400));
auto seq=Sequence::create(ac2,EaseElasticIn::create (ac1,1),ac3,EaseElasticOut::create (ac4,1),NULL);
ball->runAction(RepeatForever::create(seq));
void TestScene::callC(){
ball->change();
}
触摸事件的时候,把屏幕分为左和右,点击不同侧,表示方块往不同的方向转动。
bool TestScene::onTouchBegan(Touch*touch, Event*event){
auto c=touch->getLocation();
if(c.x>400){
box->Roll();
}else{
box->RollR();
}
return true;
}
改变颜色:
void TestScene::callC(){
ball->change();
}
检测:
void TestScene::callE(){
auto i=box->getIndex();
auto j=ball->getColorIndex();
log("%i",j);
check(i, j);
}
//通过获取来的index判断是否为同一颜色。
void TestScene::check(int a,int b){
if(a==b){
score++;
label->setString(__String::createWithFormat("%i",score)->getCString());//写入分数
}else{
label->setString("gameover");
}
}
扩展:
游戏可不是那么简单就完成的,游戏中的速度还是会不断的加快,方块的个数和小球的个数会逐渐变为两个。
这些就交给你们自己去实现吧。
往后的故事:
欢迎关注日宅记~
祝假期愉快~
拜~