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

cocos2d-x Touch 事件应用的一个例子的更多相关文章

  1. 移动web开发之touch事件

    前面的话 iOS版Safari为了向开发人员传达一些特殊信息,新增了一些专有事件.因为iOS设备既没有鼠标也没有键盘,所以在为移动Safari开发交互性网页时,常规的鼠标和键盘事件根本不够用.随着An ...

  2. Andriod 从源码的角度详解View,ViewGroup的Touch事件的分发机制

    转自:xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/21696315) 今天这篇文章主要分析的是Android的事件分发机制, ...

  3. angularjs的touch事件

    angularJs没有touch事件.这里提供一个touch指令. ngTouch.js "use strict"; angular.module("ngTouch&qu ...

  4. Android Touch事件原理加实例分析

    Android中有各种各样的事件,以响应用户的操作.这些事件可以分为按键事件和触屏事件.而Touch事件是触屏事件的基础事件,在进行Android开发时经常会用到,所以非常有必要深入理解它的原理机制. ...

  5. View,ViewGroup的Touch事件的分发机制

    原帖地址:http://blog.csdn.net/xiaanming/article/details/21696315 ViewGroup的事件分发机制 我们用手指去触摸Android手机屏幕,就会 ...

  6. Touch事件详解及区别,触屏滑动距离计算

    移动端有四个关于触摸的事件,分别是touchstart.touchmove.touchend.touchcancel(比较少用), 它们的触发顺序是touchstart-->touchmove- ...

  7. React-Native系列Android——Touch事件原理及状态效果

    Native原生相比于Hybrid或H5最大长处是具有流畅和复杂的交互效果,触摸事件便是当中重要一项,包括点击(Click).长按(LongClick).手势(gesture)等. 以最简单常见的点击 ...

  8. C# 关于委托和事件的妙文:通过一个例子详细介绍委托和事件的作用;Observer模式简介

    委托和事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见 ...

  9. Android Touch事件传递机制 二:单纯的(伪生命周期)

    转载于:http://blog.csdn.net/yuanzeyao/article/details/38025165 在前一篇文章中,我主要讲解了Android源码中的Touch事件的传递过程,现在 ...

随机推荐

  1. meta的属性详解

    引言 您的个人网站即使做得再精彩,在“浩瀚如海”的网络空间中,也如一叶扁舟不易为人发现,如何推广个人网站,人们首先想到的方法无外乎以下几种: ● 在搜索引擎中登录自己的个人网站 ● 在知名网站加入你个 ...

  2. jQuery.attributes源码分析(attr/prop/val/class)

    回顾 有了之前的几篇对于jQuery.attributes相关的研究,是时候分析jQuery.attr的源码了 Javascript中的attribute和property分析 attribute和p ...

  3. < meta > 元素 概要

    < meta > 元素 概要 标签提供关于HTML文档的元数据.元数据不会显示在页面上,但是对于机器是可读的.它可用于浏览器(如何显示内容或重新加载页面),搜索引擎(关键词),或其他 we ...

  4. GDB调试方法(转)

    一:列文件清单 1. List (gdb) list line1,line2 ************************************************************* ...

  5. echarts 地图与时间轴混搭

    //常量定义public class Constant { public static Integer PM_YEAR_NO = 5; } //action public class ZhiBiaoP ...

  6. Scala单例对象、伴生对象实战详解

    1.Scala单例对象 Scala单例对象是十分重要的,没有像在Java一样,有静态类.静态成员.静态方法,但是Scala提供了object对象,这个object对象类似于Java的静态类,它的成员. ...

  7. [摘]ASP.Net标准控件(TextBox控件)

    TextBox控件 TextBox控件又称文本框控件,为用户提供输入文本的功能. 1.属性 TextBox控件的常用属性及说明如表1所示. 表1 TextBox控件常用属性及说明 属    性 说   ...

  8. SVN利用Hooks自动发布网站

    出于管理需要,也需要在公司内部实现自动发布流程.当开发机提交SVN代码之后,自动同步到测试服务器进行测试. 网络的拓扑简化为: 1台核心SVN服务器,使用的svn管理软件为Subversion Edg ...

  9. 简单实现计算Edit Distance算法

    最近因为工作需要,学习了NLP的相关知识,简单动手实现了一下计算Edit Distance的算法,就是计算一个字符串要变成另一个字符串需要的代价,这其中采用Levenshtein方式,即规定一个插入和 ...

  10. matlab改变GUI和figure左上角图标的方法,并生成exe文件

    1. GUI左上角图标的更改,假设GUI的Tag为figure1,在其OpeningFcn里添加h = handles.figure1; %返回其句柄newIcon = javax.swing.Ima ...