完成品はこんな感じになります。
ぷよを回転させる
スペースキーを押したらぷよが回転(時計回り)させます。ぷよの回転角度はフィールド変数 PuyoAngleに保存されています。これを変化させればよいですね。
CanMoveメソッド
実際に回転処理をおこなう前に本当に回転させることが可能なのかを知る必要があります。これを調べるのがCanMoveメソッドです。回転や左右の移動させた結果、壁にめり込んでしまったり床を突き抜けてしまう場合は移動することはできないということになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public partial class Form1 : Form { bool CanMove(Position newPos) { if( newPos.Colum < 0 || newPos.Colum > FIELD_WIDTH - 1 || newPos.Row < 0 || newPos.Row > FIELD_HEIGHT - 1 || Cells[newPos.Row, newPos.Colum].IsFixed || Cells[newPos.Row, newPos.Colum].Puyo == Puyo.Wall ) return false; else return true; } } |
PuyoRotateIfCanメソッド
PuyoRotateIfCanメソッドは回転させることが可能であるなら回転させます。回転軸ではないほうのぷよの位置を取得して、CanMoveメソッドをつかって回転させることが可能かどうか調べます。回転可能であれば回転させます。
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 |
public partial class Form1 : Form { void PuyoRotateIfCan() { Position oldSubPos = GetSubPuyoPosition(puyoPositionX, puyoPositionY, PuyoAngle); Angle angle = Angle.Angle0; if(PuyoAngle == Angle.Angle0) angle = Angle.Angle90; else if(PuyoAngle == Angle.Angle90) angle = Angle.Angle180; else if(PuyoAngle == Angle.Angle180) angle = Angle.Angle270; else if(PuyoAngle == Angle.Angle270) angle = Angle.Angle0; Position newSubPos = GetSubPuyoPosition(puyoPositionX, puyoPositionY, angle); if(CanMove(newSubPos)) { // 回転角度をフィールド変数にセット PuyoAngle = angle; // もとの位置のセルは「ぷよなし」の状態にして、新しい位置にぷよをセットする SetPuyo(oldSubPos.Colum, oldSubPos.Row, Puyo.None); SetPuyo(newSubPos.Colum, newSubPos.Row, SubDropingPuyo); } } } |
左右の移動もやってみる
それでは左右の移動もやってみましょう。回転軸のぷよがある位置はフィールド変数puyoPositionXとpuyoPositionYからわかります。もうひとつのぷよの位置はGetSubPuyoPositionメソッドで求めます。そしてそれぞれを左右に移動させることができるかどうか調べて、両方とも移動可能であれば移動させます。
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 57 58 59 60 61 62 63 |
public partial class Form1 : Form { void PuyoMoveLeftIfCan() { int oldX = puyoPositionX; int oldY = puyoPositionY; Position subPosition = GetSubPuyoPosition(puyoPositionX, puyoPositionY, PuyoAngle); int oldSubX = subPosition.Colum; int oldSubY = subPosition.Row; // 移動できるのか? int newX = puyoPositionX -1; int newY = puyoPositionY; int newSubX = oldSubX -1; int newSubY = subPosition.Row; bool ret1 = CanMove(new Position(newX, newY)); bool ret2 = CanMove(new Position(newSubX, newSubY)); if(ret1 && ret2) { SetPuyo(oldX, oldY, Puyo.None); SetPuyo(oldSubX, oldSubY, Puyo.None); puyoPositionX = newX; puyoPositionY = newY; SetPuyo(puyoPositionX, puyoPositionY, DropingPuyo); SetPuyo(newSubX, newSubY, SubDropingPuyo); } } void PuyoMoveRightIfCan() { int oldX = puyoPositionX; int oldY = puyoPositionY; Position subPosition = GetSubPuyoPosition(puyoPositionX, puyoPositionY, PuyoAngle); int oldSubX = subPosition.Colum; int oldSubY = subPosition.Row; // 移動できるのか? int newX = puyoPositionX + 1; int newY = puyoPositionY; int newSubX = oldSubX + 1; int newSubY = subPosition.Row; bool ret1 = CanMove(new Position(newX, newY)); bool ret2 = CanMove(new Position(newSubX, newSubY)); if(ret1 && ret2) { SetPuyo(oldX, oldY, Puyo.None); if(oldSubY > -1) SetPuyo(oldSubX, oldSubY, Puyo.None); puyoPositionX = newX; puyoPositionY = newY; SetPuyo(puyoPositionX, puyoPositionY, DropingPuyo); SetPuyo(newSubX, newSubY, SubDropingPuyo); } } } |