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的定义。
class Paddle : public Sprite, public Clonable
{
PaddleState _state;
public:
Paddle(void);
virtual ~Paddle(void);
Rect getRect();
bool initWithTexture(Texture2D* aTexture);
virtual void onEnter() override;
virtual void onExit() override;
bool containsTouchLocation(Touch* touch);
bool onTouchBegan(Touch* touch, Event* event);
void onTouchMoved(Touch* touch, Event* event);
void onTouchEnded(Touch* touch, Event* event);
virtual Paddle* clone() const;
static Paddle* createWithTexture(Texture2D* aTexture);
};
该类的触摸检测方法为:
bool Paddle::containsTouchLocation(Touch* touch)
{
return getRect().containsPoint(convertTouchToNodeSpaceAR(touch));
}
注意:
convertTouchToNodeSpaceAR将触摸点转化为相对节点锚点的相对坐标,在节点的相对坐标系上,它的左下角为(-width/2,-height/2) ,开始一直没看懂这。
containsPoint用来检测是否包含该点,调用该函数要求两个点的参考物相同,这里他们的参考物都是Paddle的锚点。
下面添加事件处理。
在onBegin()中,如果触摸位置在精灵上那么进行处理。如果不是就不处理。
在onMove()中,移动Sprite,y不变。
在onExit()中,清理状态。
TouchesTest里面就是调用定时器不停的移动小球,然后检测碰撞。