哇!板球 源碼分析三

守門員出場

守門員出場,每個守門員是從屏幕的右側中間的位置隨機方向向左側移動

FielderSprite* fielderSprite1 = FielderSprite::create("pic/fielder.png");
	//守門員精靈初始位置爲右側中間位置
	fielderSprite1->setPosition(ccp(GOALKEEPER_X, GOALKEEPER_Y));
	fielderSprite1->setAnchorPoint(ccp(0.5, 0.5));//默認錨點爲0.5,0.5
	//將fielder精靈添加到佈景中
	this->addChild(fielderSprite1, GAME_LEVEL_WYF);


動作序列中的6個動作,終點都在最左側

	CCActionInterval* at1=CCMoveBy::create(3.5,CCPointMake(-800,-170));
	CCActionInterval* at2=CCMoveBy::create(4,CCPointMake(-800,-100));
	CCActionInterval* at3=CCMoveBy::create(2.5,CCPointMake(-800,-30));
	CCActionInterval* at4=CCMoveBy::create(4.5,CCPointMake(-800,40));
	CCActionInterval* at5=CCMoveBy::create(5,CCPointMake(-800,110));
	CCActionInterval* at6=CCMoveBy::create(3,CCPointMake(-800,180));


隨機移動的6條線路

	int r = rand()%6;
	switch(r)
	{
	case 0:
		fielderSprite1->runAction(at1);
		fielderSprite1->ccat=at1;
		fielderSprite1->mark=1;break;
	case 1:
		fielderSprite1->runAction(at2);
		fielderSprite1->ccat=at2;
		fielderSprite1->mark=2;break;
	case 2:
		fielderSprite1->runAction(at3);
		fielderSprite1->ccat=at3;
		fielderSprite1->mark=3;break;
	case 3:
		fielderSprite1->runAction(at4);
		fielderSprite1->ccat=at4;
		fielderSprite1->mark=4;break;
	case 4:
		fielderSprite1->runAction(at5);
		fielderSprite1->ccat=at5;
		fielderSprite1->mark=5;break;
	case 5:
		fielderSprite1->runAction(at6);
		fielderSprite1->ccat=at6;
		fielderSprite1->mark=6;break;
	}


將定時器在一次被調用的時間內創建的守門員都添加到pArr中,用於後面檢測是否與球碰撞了

array->addObject(fielderSprite1);

 

 

道具出場

道具5秒隨機出現一次

	if(outPropFlag)//5'置一次ture
	{
		outPropFlag = false;
		outProp();//出道具
	}


進入outProp(), 創建道具從左上角往下落,若發射的球擊中道具,會增額外的技能

	Prop * propSprite1 = NULL;//道具對象
	//3種道具隨機出
	int w = rand()%3;
	switch(w)
	{
	case 0:
		propSprite1 = Prop::create("pic/red.png");
		propSprite1->mark=0;break;
	case 1:
		propSprite1 = Prop::create("pic/black.png");
		propSprite1->mark=1;break;
	case 2:
		propSprite1 = Prop::create("pic/blue.png");
		propSprite1->mark=2;break;
	}

	//設置道具精靈的初始位置
	propSprite1->setPosition(ccp(0,480 ));
	propSprite1->setAnchorPoint(ccp(0.5, 0.5));
	this->addChild(propSprite1, GAME_LEVEL_WYF);


道具的3種運動線路, 都是貝塞爾曲線動作

ccBezierConfig bezier_7;//貝塞爾曲線
	bezier_7.controlPoint_1 = ccp(100, 460);
	bezier_7.controlPoint_2 = ccp(150, 400);
	bezier_7.endPosition = ccp(200,30);
	CCActionInterval*  cat_7 = CCBezierTo::create(2.5, bezier_7);

	ccBezierConfig bezier_8;//貝塞爾曲線
	bezier_8.controlPoint_1 = ccp(50, 480);
	bezier_8.controlPoint_2 = ccp(200, 400);
	bezier_8.endPosition = ccp(250,30);
	CCActionInterval*  cat_8 = CCBezierTo::create(2, bezier_8);

	ccBezierConfig bezier_9;//貝塞爾曲線
	bezier_9.controlPoint_1 = ccp(100, 480);
	bezier_9.controlPoint_2 = ccp(250, 400);
	bezier_9.endPosition = ccp(300,30);
	CCActionInterval*  cat_9 = CCBezierTo::create(3, bezier_9);

	CCSequence* cc_7 = CCSequence::create
	(
		cat_7,
		CCCallFuncND::create(this, callfuncND_selector(BanQiuLayer::removeProp), NULL),
		NULL
	);

	CCSequence* cc_8 = CCSequence::create
	(
		cat_8,
		CCCallFuncND::create(this, callfuncND_selector(BanQiuLayer::removeProp), NULL),
		NULL
	);

	CCSequence* cc_9 = CCSequence::create
	(
		cat_9,
		CCCallFuncND::create(this, callfuncND_selector(BanQiuLayer::removeProp), NULL),
		NULL
	);


每次隨機走1條路線

	int r = rand()%3;
	switch(r)
	{
	case 0:
		propSprite1->runAction(cc_7);break;
	case 1:
		propSprite1->runAction(cc_8);break;
	case 2:
		propSprite1->runAction(cc_9);break;
	}


將定時器在一次被調用的時間內創建的道具都添加到pArr中,用於後面檢測是否與球碰撞了

	pArr->addObject(propSprite1);


 

發球:

 

在屏幕上點哪球就往哪方向發

點屏屏幕時獲取其位置

void BanQiuLayer::ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent)
{
	long ct = getCurrentTime();

	//發球的時間間隔大於0.3秒
	if((ct-currTime)>SPACE_TIME)
	{
		outBallFlag = true;//發球標誌位
		currTime = ct;//把這次發球時間給currTime
	}

	//獲取第一個觸點位置,保存
	CCSetIterator it = pTouches->begin();
	CCTouch* touch = (CCTouch*)(*it);
	location = touch->getLocation();
}

創建小球

	BallTest* ballSprite = BallTest::create("pic/ball.png");
	ballSprite->setXY(location.x,location.y);//設置小球的方向
	//設置小球的起點位置
	ballSprite->setPosition(ccp(OUTBALL_X,OUTBALL_Y));
	//設置hitFlag標誌位爲true
	ballSprite->setHitFlag(true);
	ballSprite->setAnchorPoint(ccp(0.5, 0.5));//默認錨點爲0.5,0.5

將定時器在一次被調用的時間內創建的小球都添加到arr中,用於後面檢測是否與球碰撞了

	arr->addObject(ballSprite);
	//將精靈添加到佈景中
	this->addChild(ballSprite, BACKGROUND_LEVEL_WYF);
出球動作

	float vx = ballSprite->x;
	float vy = ballSprite->y;
	//出球動作
	CCActionInterval* at=CCMoveBy::create(OUTBALL_T,CCPointMake(BALL_V*vx,BALL_V*vy));
	seq = CCSequence::create
	(
		at,
		CCCallFuncND::create(this, callfuncND_selector(BanQiuLayer::removeBall), NULL),
		NULL
	);

	if(ballCount%10==0)//每5個小球裏出來一個帶火的小球
	{
		ballSprite->setMark(1);//給1代表帶火的球, 粒子效果
	}

	ballCount++;//發出球的總數加1
	ballSprite->runAction(at);//執行出球動作
發球的聲音

	if(MUSIC)
	{
		//播放出球音樂
		CocosDenshion::SimpleAudioEngine::sharedEngine()->playEffect
		(
				"sound/fire.mp3"
		);
	}






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章