前回はパワー餌を食べるとモンスターを食べることができるようにしましたが、パワー餌の効果には時間的限界があります。そこで効果がなくなる時間が迫るとユーザーにそれがわかるようにしたほうがいいですね。
今回はパワー餌の効果がなくなる3秒前になるとモンスターを点滅(正確には青と白で交互に表示)させます。
前回のコードはパワー餌を食べるとOnEatPowerFoodメソッドが呼び出されてモンスターをいじけ状態にさせ、その状態から復帰するためのタイマーをセットしていました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public partial class Form1 : Form { void OnEatPowerFood() { for(int i = 0; i < isMonsterIjike.Length; i++) { // モンスターをいじけ状態に } powerFoodTimer.Stop(); powerFoodTimer.Interval = 10 * 1000; // パワー餌の効果がなくなるまでの秒数 × 1000 powerFoodTimer.Start(); } } |
これを以下のように変えます。
パワー餌の効果がある時間をカウントダウンして残り3秒になったら青と白で交互に表示させることにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
public partial class Form1 : Form { int powerFoodTimeCount = 0; bool endPowerFoodSoon = false; // 白いいじけ状態のモンスター Icon ijikeMonsterWhiteIcon = Properties.Resources._13; // この値を利用してパワー餌の効果が切れる直前のモンスターを描画する // (青と白で交互に表示) int[] blueijikeColorCount = new int[4]; void OnEatPowerFood() { powerFoodTimeCount = 10; // パワー餌の効果はここでは10秒間とする for(int i = 0; i < isMonsterIjike.Length; i++) { isMonsterIjike[i] = true; blueijikeColorCount[i] = 0; Direct direct = MonstersDirect[i]; List<Direct> directs = GetMonstarMoveDirect(i); if(direct == Direct.North && directs.Any(x => x == Direct.South)) MonstersDirect[i] = Direct.South; if(direct == Direct.South && directs.Any(x => x == Direct.North)) MonstersDirect[i] = Direct.North; if(direct == Direct.East && directs.Any(x => x == Direct.West)) MonstersDirect[i] = Direct.West; if(direct == Direct.West && directs.Any(x => x == Direct.East)) MonstersDirect[i] = Direct.East; } powerFoodTimer.Interval = 1 * 1000; powerFoodTimer.Start(); } private void PowerFoodTimer_Tick(object sender, EventArgs e) { if(powerFoodTimeCount > 0) powerFoodTimeCount--; if(powerFoodTimeCount <= 3) { // パワー餌の効果がまもなくなくなります! endPowerFoodSoon = true; } if(powerFoodTimeCount <= 0) { endPowerFoodSoon = false; powerFoodTimer.Stop(); OnEndPowerFood(); } } } |
いじけ状態から復帰するモンスターの表示色はblueijikeColorCount[i]の値で決定します。いじけ状態から復帰する3秒前になったら、DrawMonsterメソッドがよばれるたびに各モンスターのblueijikeColorCountの値を加算していきます。7で割ったときの剰余をしらべて7未満であれば青で、そうでなければ白で表示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
public partial class Form1 : Form { void DrawMonster(int i, Graphics g) { Rectangle rect = new Rectangle(new Point(MonstersPosX[i], MonstersPosY[i]), new Size(CELL_WIDTH, CELL_HEIGHT)); if(!isMonsterIjike[i]) { if(i == 0) g.DrawIcon(redMonserIcon, rect); if(i == 1) g.DrawIcon(pinkMonserIcon, rect); if(i == 2) g.DrawIcon(blueMonserIcon, rect); if(i == 3) g.DrawIcon(orangeMonserIcon, rect); } else { if(!endPowerFoodSoon) { // 通常のいじけ状態 g.DrawIcon(ijikeMonsterIcon, rect); } else { // まもなくいじけ状態から復帰する blueijikeColorCount[i]++; if(blueijikeColorCount[i] % 14 < 7) { g.DrawIcon(ijikeMonsterIcon, rect); } else { g.DrawIcon(ijikeMonsterWhiteIcon, rect); } } } } } |
これで復帰直前のモンスターを青と白で交互に表示させることができます。