cpptest之TouchesTest

本文探讨了在游戏开发中如何有效地处理触摸事件和管理资源,具体包括使用new生成对象时的引用计数管理,以及触摸事件的两种处理方式:由Layer统一接收并分发给精灵,或自定义Sprite接收触摸信息。通过分析实例代码,深入理解对象生命周期与触摸事件处理的实践。
这个例子中有几个值得学习的地方。
1:针对new生成的对象,怎么使用引用记数来管理。
a:
    Ball* pBall = new Ball();  // 1
    pBall->initWithTexture(aTexture);//1
    pBall->autorelease(); //1  不能使用release,后面要使用。
b:
    auto pongLayer = new PongLayer(); //1
    addChild(pongLayer);//2
    pongLayer->release(); //1   可以使用autorelease
在函数中,如果使用new来生成对象,在方法结束的地方必须调用 release是引用减一,或者调用autorelease在下一帧的时候引用减一。总的来说,如果后面要使用这个对象,调用方法后不能导致对象立即销毁就行。
2:触摸事件处理
在游戏中触摸事件分为单点触摸和多点触摸事件,对于触摸事件一般有两种处理方式,
一种是Layer统一接收触摸事件,然后由程序根据需要分发给不同位置的精灵,
一种是自定义一个可以接收触摸信息的Sprite。首先要继承Sprite或者其子类,以满足精灵的形状,位置等信息的要求,另外添加触摸时间处理函数。
本例使用了第二种方法。我们看看Paddle的定义。
    
  1. class Paddle : public Sprite, public Clonable
  2. {
  3.     PaddleState        _state;
  4. public:
  5.     Paddle(void);
  6.     virtual ~Paddle(void);
  7.     Rect getRect();
  8.     bool initWithTexture(Texture2D* aTexture);
  9.     virtual void onEnter() override;
  10.     virtual void onExit() override;
  11.     bool containsTouchLocation(Touch* touch);
  12.     bool onTouchBegan(Touch* touch, Event* event);
  13.     void onTouchMoved(Touch* touch, Event* event);
  14.     void onTouchEnded(Touch* touch, Event* event);
  15.     virtual Paddle* clone() const;
  16.     static Paddle* createWithTexture(Texture2D* aTexture);
  17. };  
该类的触摸检测方法为:
bool Paddle::containsTouchLocation(Touchtouch)
{
    return getRect().containsPoint(convertTouchToNodeSpaceAR(touch));
}
注意: convertTouchToNodeSpaceAR将触摸点转化为相对节点锚点的相对坐标,在节点的相对坐标系上,它的左下角为(-width/2,-height/2) ,开始一直没看懂这
containsPoint用来检测是否包含该点,调用该函数要求两个点的参考物相同,这里他们的参考物都是Paddle的锚点。

下面添加事件处理。
在onBegin()中,如果触摸位置在精灵上那么进行处理。如果不是就不处理。
在onMove()中,移动Sprite,y不变。
在onExit()中,清理状态。


TouchesTest里面就是调用定时器不停的移动小球,然后检测碰撞。





转载于:https://my.oschina.net/1987times/blog/312290

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值