1, xxx *a = [xxx new]等于xxx *a = [[xxx alloc]init],但是如果构造需要带参数构造的话,就没法使用new了。
2, instancetype 只能做返回值类型,个人感觉某些情况下比id更好用。
3, 关于飞机子弹发射的原理:这里采用的是Sprite-Kit引擎,不过方法和cocos2d-x十分相似
先定义以下全局变量: XBPlayerShip * _playerShip; // 创建飞船实体 XBBullet * _bullet; //创建子弹实体 float _bulletInterval; // 子弹发射时间间隔,这个主要用来调整发射子弹速度,很好的办法 CFTimeInterval _lastUpdateTime; // 上一帧更新的时间 NSTimeInterval _dt; // 当前帧与上一帧的时间间隔
- 在SpriteKit里,更新方法是-(void)update:(CFTimeInterval)currentTime, 在COCOS2D或者COCOS2D-X里是schedule的那个方法,用法大同小异,以下实现都在此方法中
,此方法大概是1/60秒回调一次。if (_lastUpdateTime) { _dt = currentTime - _lastUpdateTime; // 这个强烈建议养成习惯,这个时间间隔变量能用在很多地方 }else{ _dt = 0; }
首先先计算出每帧的具体时间间隔。
_lastUpdateTime = currentTime; // 把当前时间赋值给上一次更新时间,以备下次帧回调时使用 _bulletInterval = _bulletInterval + _dt; // 子弹发射时间间隔,每桢的时候会自动累加
if (_bulletInterval > 0.5) { // 这个if很重要,意思是如果子弹发射的累计时间间隔到0.5秒后,开始发射下一次子弹, // 这样可以通过0.5这个参数来调整发射子弹的时间间隔。 比如设置成0.5秒就比较慢,0.15就回很连贯 _bulletInterval = 0; // 当子弹发射后,将其设置为0,重新开始计算子弹发射时间间隔,当再次到0.5秒时,发射下一发子弹。 _bullet = [[XBBullet alloc] initWithPosition:_playerShip.position]; //之后没什么好说了,创建子弹,初始化位置 [self addChild:_bullet]; // 添加子弹到场景中 // 创建动画序列,向上发射子弹,出屏幕后移除,cocos2d-x方法类似 // 这还有点小瑕疵,子弹发射用 moveBy会更好,这样能保证发射速度是一致的,moveTo的话会随着子弹发射瞬间的位置变化而产生变化,比较失真 SKAction * moveUpAction = [SKAction moveTo:CGPointMake(_bullet.position.x, self.size.height + _bullet.frame.size.height / 2) duration:2.0f]; SKAction * removeAction = [SKAction removeFromParent]; SKAction * seqAction = [SKAction sequence:@[moveUpAction, removeAction]]; [_bullet runAction:seqAction]; }
4, 在Sprite Kit中,当粒子开始逐渐产生效果,但是需要一定时间来完成效果,可以用以下方法来让粒子先进行一段时间。
比如: 我们想做雪花从天而降,但是当游戏开始时,雪花才开始一片一片从天而降,所以一开始的时候屏幕大部分区域都是没有雪花的,要等到雪花逐渐落地后,才有了满屏幕雪花飘落的感觉。但是我们可以用下边这个方法,让雪花在游戏开始时候就已经降落了一段时间,时间长度是lifetime,也就是一个雪花从天而降到落地的时间,这样当我们打开游戏的时候,已经有满屏幕雪花在飘落了。
[emitterNode advanceSimulationTime:lifetime];
5, emitterNode.particleSpeedRange=16.0; 可以设置粒子效果的速度范围,为<speed - 8, spped + 8>之间
6, 在RETINA屏幕,1 point = 2 pixels , 以前的是 1 point = 1 pixel
• spaceship.png " Non-Retina
• spaceship@2x.png " Retina