1效果图:

这个是《Cocos2d-X by Example Beginner's Guide》上的第一个例子,我稍微重构了下代码。是一个简单的IPad上的双人游戏,把球射入对方的球门就得分了。当然我这是在Windows上的截图,用鼠标模拟手指的触摸。这游戏做的还不行,最大速度不能控制,很容易乱窜,但作为一个简单的入门游戏还不错。

2.cocos2d-x Touch 事件

我建了一个Player的类,就是上图中的两个白色可以触摸移动的物体。需要继承CCTargetedTouchDelegate,然后主要重写ccTouchBegan,ccTouchMoved,ccTouchEnded 3个方法。

#ifndef _PLAYER_H_
#define _PLAYER_H_ #include "cocos2d.h" USING_NS_CC; class Player : public CCSprite, public CCTargetedTouchDelegate//1. need inherit CCTargetedTouchDelegate
{ public:
Player(void);
virtual ~Player(void); /** 2.Overwrite some virtual function @{ */
virtual void onEnter();
virtual void onExit();
virtual bool ccTouchBegan(CCTouch* touch, CCEvent* event);
virtual void ccTouchMoved(CCTouch* touch, CCEvent* event);
virtual void ccTouchEnded(CCTouch* touch, CCEvent* event);
virtual void touchDelegateRetain();
virtual void touchDelegateRelease();
/** @} */ }; #endif

在ccTouchMoved里主要限制了白色物体的范围。还有是设置了向量,等碰撞的时候用。

void Player::ccTouchMoved(CCTouch* touch, CCEvent* event)
{ CCAssert(m_state == kPlayerStateGrabbed, "Player - Unexpected state!");
CCSize screenSize = CCDirector::sharedDirector()->getWinSize(); CCPoint tap = touch->getLocation();
CCPoint nextPosition = tap;
//keep player in court
nextPosition = ccp(max(nextPosition.x, radius()), max(nextPosition.y, radius()));
nextPosition = ccp(min(nextPosition.x, screenSize.width - radius()) ,
min(nextPosition.y, screenSize.height - radius())); //keep player in its area
if (getPositionY() < screenSize.height * 0.5f) {
nextPosition.y = min(nextPosition.y, screenSize.height / 2 - radius());
} else {
nextPosition.y = max(nextPosition.y, screenSize.height / 2 + radius());
} setNextPosition(nextPosition);
setVector(ccp(tap.x - getPositionX(), tap.y - getPositionY())); //setPosition(nextPosition);
}

3.谈谈球与桌面的摩擦

这游戏没有用到物理引擎,球与桌面的摩擦,就是简单地把球的向量乘以0.98,这样物体最终看起来就停止了。非常的简单。

4.球的碰撞

这块可能是最难的部分,首先还是看最简单的碰撞。

4.1球与边的碰撞

仔细看上面那动态图,球碰到左右边的时候,其实它在Y轴上的速度方向是不变的,只是在X轴上的速度方向变负了。

void Ball::collisionWithSides(){

	if(_nextPosition.x < radius()){
_nextPosition.x = radius();
setVector(ccp(getVector().x * -0.8, getVector().y)) ;//when collision with left and right side,the x direction will change
//and every hits will slow down the ball, so x * -0.8
//SimpleAudioEngine::sharedEngine()->playEffect("hit.wav");
} if (_nextPosition.x > _screenSize.width - radius()) {
_nextPosition.x = _screenSize.width - radius();
setVector(ccp(getVector().x * -0.8, getVector().y)) ;
//SimpleAudioEngine::sharedEngine()->playEffect("hit.wav");
}
}

代码中的x * -0.8就是这样的效果。方向变反,速度变慢。

球与上下边的碰撞也是同样的道理,在Y轴上的速度方向变反,变慢。X轴上不变,当然还要考虑这是在不进球的情况下。

void Ball::collisionWithTop(){

	if (_nextPosition.y > _screenSize.height - radius()) {
if (getPosition().x < _screenSize.width * 0.5f - GOAL_WIDTH * 0.5f ||
getPosition().x > _screenSize.width * 0.5f + GOAL_WIDTH * 0.5f) {
_nextPosition.y = _screenSize.height - radius();
setVector(ccp(getVector().x , getVector().y * -0.8)) ;//when collision with top or bottom side,the y direction will change
//and every hits will slow down the ball, so y * -0.8
//SimpleAudioEngine::sharedEngine()->playEffect("hit.wav");
}
}
}

4.2球与玩家控制的白色物体碰撞

什么时候两个球会碰撞?

这还是简单的就是两个球之间的距离小于两个球的半径相加。


碰撞后红球的方向是什么?

两个球碰撞后,红球移动的方向其实就是红球和白球圆点之间的连线。

碰撞后红球移动的速度?

首先为了尽可能地跟真实情况相同,碰撞后红球移动的速度应该跟原来红球的速度和白球移动的速度都有关。

讲了这么多,下面的代码应该可以理解了,数学万岁!

void Ball::collisionWithPlayer(Player* player){
float squared_radii = pow(player->radius() + radius(), 2);
CCPoint playerNextPosition = player->getNextPosition();
CCPoint playerVector = player->getVector();
CCPoint ballVector = getVector(); float diffx = _nextPosition.x - player->getPositionX();
float diffy = _nextPosition.y - player->getPositionY(); float distance1 = pow(diffx, 2) + pow(diffy, 2);// (x1 - x2)2 + (y1 - y2)2 if (distance1 <= squared_radii) {// a collision happen float mag_ball = pow(ballVector.x, 2) + pow(ballVector.y, 2);
float mag_player = pow (playerVector.x, 2) + pow (playerVector.y, 2); float force = sqrt(mag_ball + mag_player);
float angle = atan2(diffy, diffx); setVector(ccp(force * cos(angle), force * sin(angle))); //SimpleAudioEngine::sharedEngine()->playEffect("hit.wav");
}
}

5.项目下载

注:这项目是基于cocos2d-x 2.1.3。

下载地址:http://www.waitingfy.com/?attachment_id=611

文章地址:http://www.waitingfy.com/?p=608

最新文章

  1. VS2010中项目发布遇到的应用程序池问题(无法识别的属性“targetFramework”)
  2. Servlet过滤器
  3. iOS开发--应用崩溃日志揭秘(二)
  4. 数学 - Whu 1603 - Minimum Sum
  5. MVPHelper
  6. Fling——K
  7. Jquery实现图片上下一张
  8. [转载]linux sed命令详解
  9. nyoj 60 谁获得了最高奖学金
  10. ASP.NET MVC Spring.NET 整合
  11. protocolbuffer数据交换格式说明
  12. matrix(dp)
  13. Python基础学习8---list列表的操作
  14. 梳理下Cordova的热更新
  15. Spring定时任务解决博客缓存数据更新问题
  16. Framework7首页隐藏navbar其他页面显示navbar
  17. 浅析Web缓存
  18. git 生成公钥、私钥方法与clone使用方法
  19. C语言预备作业
  20. spring学习总结——高级装配学习一(profile与@Conditional)

热门文章

  1. Android DatePicker和TimePicker
  2. Docker镜像与仓库(二)Dockerfile
  3. OSC本地库推送到远程库
  4. J2SE知识点摘记(九)
  5. ALOS卫星介绍
  6. Delphi在StatusBar上绘制ProgressBar
  7. Get Intellisense for .axml files in Visual Studio
  8. poj2070简单题
  9. [LeetCode][Python]15:3Sum
  10. libvirt python binding 变成了一个新项目了。