細節技巧

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章