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
• [email protected]
"
Retina