예제 #1
0
파일: Piece.cs 프로젝트: sbvild/tetris
        //TODO :
        //animateするならblock単位に動かす必要あり
        public void Move(Direction direction, Stage parent, bool forceF = false)
        {
            if (!forceF && !CanMove(direction, parent))
                return;

            Point movedP = m_trans.LeftTop;
            switch (direction)
            {
                case Direction.Bottom:
                    Update();
                    ++movedP.Y;
                    break;

                case Direction.Left:
                    --movedP.X;
                    break;

                case Direction.Right:
                    ++movedP.X;
                    break;

                case Direction.Up:
                    --movedP.Y;
                    break;
            }

            m_trans.LeftTop = movedP;
        }
예제 #2
0
파일: Piece.cs 프로젝트: sbvild/tetris
        public bool CanMove(Direction direction, Stage parent)
        {
            //
            Piece copyedActivePiece = (Piece)this.Clone();
            copyedActivePiece.Move(direction, parent, forceF:true);

            //壁と衝突?
            if (copyedActivePiece.X < 0)
                return false;
            //123456789101
            //□□□□□□□□□■□
            //□□□□□□□□■■■
            if (copyedActivePiece.X + copyedActivePiece.Width > parent.Width)
                return false;

            if (copyedActivePiece.Y < 0)
                return false;
            if (copyedActivePiece.Y + copyedActivePiece.Height > parent.Height)
                return false;

            //他のピースと衝突?

            bool[,] lockedLayer = new bool[parent.Height, parent.Width];
            bool[,] activeLayer = new bool[parent.Height, parent.Width];
            Piece p;

            for (int y = 0; y < parent.Width; ++y)
            {
                for (int x = 0; x < parent.Width; ++x)
                {
                    lockedLayer[y, x] = false;
                    activeLayer[y, x] = false;
                }
            }
            for (int i = 0; i < parent.Pieces.Count ; ++i)
            {
                p = parent.Pieces[i];

                if (p.X == this.X && p.Y == this.Y)
                    continue;

                for (int y = p.Y; y < p.Y + p.Height; ++y)
                {
                    for (int x = p.X; x < p.X + p.Width; ++x)
                    {
                        lockedLayer[y, x] = p[y - p.Y, x - p.X];
                    }
                }

            }

            p = copyedActivePiece;
            for (int y = p.Y; y < p.Y + p.Height; ++y)
            {
                for (int x = p.X; x < p.X + p.Width; ++x)
                {
                    activeLayer[y, x] = p[y - p.Y, x - p.X];
                }
            }

            return !Util.HitTest(lockedLayer, activeLayer);
        }
예제 #3
0
파일: Tetris.cs 프로젝트: sbvild/tetris
 public Tetris(int stage_Width, int stage_Height)
 {
     m_stage = new Stage(stage_Width, stage_Height);
     m_status = TetrisStatus.NOTSTART;
 }
예제 #4
0
파일: Tetris.cs 프로젝트: sbvild/tetris
 public TetrisEventArgs(TetrisStatus status, Stage stage)
 {
     m_status = status;
     m_stage = stage;
 }
예제 #5
0
파일: Tetris.cs 프로젝트: sbvild/tetris
 public Tetris(int stage_Width, int stage_Height)
 {
     m_stage  = new Stage(stage_Width, stage_Height);
     m_status = TetrisStatus.NOTSTART;
 }
예제 #6
0
파일: Tetris.cs 프로젝트: sbvild/tetris
 public TetrisEventArgs(TetrisStatus status, Stage stage)
 {
     m_status = status;
     m_stage  = stage;
 }