| part of game; |
| |
| class PlayerState extends Node { |
| PlayerState(this._sheetUI, this._sheetGame) { |
| // Score display |
| _sprtBgScore = new Sprite(_sheetUI["scoreboard.png"]); |
| _sprtBgScore.pivot = new Point(1.0, 0.0); |
| _sprtBgScore.scale = 0.35; |
| _sprtBgScore.position = new Point(240.0, 10.0); |
| addChild(_sprtBgScore); |
| |
| _scoreDisplay = new ScoreDisplay(_sheetUI); |
| _scoreDisplay.position = new Point(-13.0, 49.0); |
| _sprtBgScore.addChild(_scoreDisplay); |
| |
| // Coin display |
| _sprtBgCoins = new Sprite(_sheetUI["coinboard.png"]); |
| _sprtBgCoins.pivot = new Point(1.0, 0.0); |
| _sprtBgCoins.scale = 0.35; |
| _sprtBgCoins.position = new Point(105.0, 10.0); |
| addChild(_sprtBgCoins); |
| |
| _coinDisplay = new ScoreDisplay(_sheetUI); |
| _coinDisplay.position = new Point(-13.0, 49.0); |
| _sprtBgCoins.addChild(_coinDisplay); |
| } |
| |
| final SpriteSheet _sheetUI; |
| final SpriteSheet _sheetGame; |
| |
| int laserLevel = 0; |
| |
| static const double normalScrollSpeed = 2.0; |
| |
| double scrollSpeed = normalScrollSpeed; |
| |
| double _scrollSpeedTarget = normalScrollSpeed; |
| |
| EnemyBoss boss; |
| |
| Sprite _sprtBgScore; |
| ScoreDisplay _scoreDisplay; |
| Sprite _sprtBgCoins; |
| ScoreDisplay _coinDisplay; |
| |
| int get score => _scoreDisplay.score; |
| |
| set score(int score) { |
| _scoreDisplay.score = score; |
| flashBgSprite(_sprtBgScore); |
| } |
| |
| int get coins => _coinDisplay.score; |
| |
| void addCoin(Coin c) { |
| // Animate coin to the top of the screen |
| Point startPos = convertPointFromNode(Point.origin, c); |
| Point finalPos = new Point(30.0, 30.0); |
| Point middlePos = new Point((startPos.x + finalPos.x) / 2.0 + 50.0, |
| (startPos.y + finalPos.y) / 2.0); |
| |
| List<Point> path = [startPos, middlePos, finalPos]; |
| |
| Sprite sprt = new Sprite(_sheetGame["coin.png"]); |
| sprt.scale = 0.7; |
| |
| ActionSpline spline = new ActionSpline((a) => sprt.position = a, path, 0.5); |
| spline.tension = 0.25; |
| ActionTween rotate = new ActionTween((a) => sprt.rotation = a, 0.0, 360.0, 0.5); |
| ActionTween scale = new ActionTween((a) => sprt.scale = a, 0.7, 1.2, 0.5); |
| ActionGroup group = new ActionGroup([spline, rotate, scale]); |
| sprt.actions.run(new ActionSequence([ |
| group, |
| new ActionRemoveNode(sprt), |
| new ActionCallFunction(() { |
| _coinDisplay.score += 1; |
| flashBgSprite(_sprtBgCoins); |
| }) |
| ])); |
| |
| addChild(sprt); |
| } |
| |
| void activatePowerUp(PowerUpType type) { |
| if (type == PowerUpType.shield) { |
| _shieldFrames += 300; |
| } else if (type == PowerUpType.sideLaser) { |
| _sideLaserFrames += 300; |
| } else if (type == PowerUpType.speedLaser) { |
| _speedLaserFrames += 300; |
| } else if (type == PowerUpType.speedBoost) { |
| _speedBoostFrames += 150; |
| } |
| } |
| |
| int _shieldFrames = 0; |
| bool get shieldActive => _shieldFrames > 0 || _speedBoostFrames > 0; |
| bool get shieldDeactivating => |
| math.max(_shieldFrames, _speedBoostFrames) > 0 && math.max(_shieldFrames, _speedBoostFrames) < 60; |
| |
| int _sideLaserFrames = 0; |
| bool get sideLaserActive => _sideLaserFrames > 0; |
| |
| int _speedLaserFrames = 0; |
| bool get speedLaserActive => _speedLaserFrames > 0; |
| |
| int _speedBoostFrames = 0; |
| bool get speedBoostActive => _speedBoostFrames > 0; |
| |
| void flashBgSprite(Sprite sprt) { |
| sprt.actions.stopAll(); |
| ActionTween flash = new ActionTween( |
| (a) => sprt.colorOverlay = a, |
| new Color(0x66ccfff0), |
| new Color(0x00ccfff0), |
| 0.3); |
| sprt.actions.run(flash); |
| } |
| |
| void update(double dt) { |
| if (_shieldFrames > 0) _shieldFrames--; |
| if (_sideLaserFrames > 0) _sideLaserFrames--; |
| if (_speedLaserFrames > 0) _speedLaserFrames--; |
| if (_speedBoostFrames > 0) _speedBoostFrames--; |
| |
| // Update speed |
| if (boss != null) { |
| Point globalBossPos = boss.convertPointToBoxSpace(Point.origin); |
| if (globalBossPos.y > (_gameSizeHeight - 400.0)) |
| _scrollSpeedTarget = 0.0; |
| else |
| _scrollSpeedTarget = normalScrollSpeed; |
| } else { |
| if (speedBoostActive) |
| _scrollSpeedTarget = normalScrollSpeed * 6.0; |
| else |
| _scrollSpeedTarget = normalScrollSpeed; |
| } |
| |
| scrollSpeed = GameMath.filter(scrollSpeed, _scrollSpeedTarget, 0.1); |
| } |
| } |
| |
| class ScoreDisplay extends Node { |
| ScoreDisplay(this._sheetUI); |
| |
| int _score = 0; |
| |
| int get score => _score; |
| |
| set score(int score) { |
| _score = score; |
| _dirtyScore = true; |
| } |
| |
| SpriteSheet _sheetUI; |
| |
| bool _dirtyScore = true; |
| |
| void update(double dt) { |
| if (_dirtyScore) { |
| removeAllChildren(); |
| |
| String scoreStr = _score.toString(); |
| double xPos = -37.0; |
| for (int i = scoreStr.length - 1; i >= 0; i--) { |
| String numStr = scoreStr.substring(i, i + 1); |
| Sprite numSprt = new Sprite(_sheetUI["number_$numStr.png"]); |
| numSprt.position = new Point(xPos, 0.0); |
| addChild(numSprt); |
| xPos -= 37.0; |
| } |
| _dirtyScore = false; |
| } |
| } |
| } |