Friday, July 31, 2015

GAME 2D XẾP HÌNH -TETRIS_P2

chào các bạn! hôm nay mình sẽ tiếp tục viết tiếp phần tiếp theo của loạt bài hướng dẫn lập trình Unity , với tựa game xếp hình huyền thoại Tetris.
Nội dung bài hôm nay:

  • Kiểm tra xem tất cả các khối nằm giữa hai đường biên giới
  • Kiểm tra xem tất cả các khối trên  y = 0
  • Kiểm tra nếu một nhóm có thể duy chuyển với 1 đơn vị
  • Kiểm tra nếu một hàng có đầy đủ các khối
  • Xóa một hàng
  • Giảm một của hàng y phối hợp
Cấu trúc dữ liệu:
Giải pháp là dùng một mảng hai chiều (ma trận). giờ mình tạo ra script mới với tên là matrix nhe
chuột phải->Create->C#script



using UnityEngine;
using System.Collections;
public class matrix : MonoBehaviour {
public static int w = 10;//chiều rong
public static int h = 20;//chieu cao
public static Transform[,] grid = new Transform[w, h];// ma tran
// Use this for initialization
void Start () { }
void Update () {}
}
như đã thấy ở trên, mãng hai chiều grid sẽ quản lý tọa độ của các ô vuông theo thông số w,h.
để các tọa đọ này không bị lẻ khi ta di chuyển sang trẽ viết thêm hàm làm tròn
public static Vector2 roundVec2(Vector2 v) {///hàm làm tròn
return new Vector2(Mathf.Round(v.x),
Mathf.Round(v.y));
}
hàm có thông số đàu vào là một vector hai D và trả về vector 2D với các tọa độ x,y đã làm xong.


Hàm tiếp theo để kiểm tra các Ô vuông vẫn nằm trong hai đường biên hai bên và đường biên dưới, trả về giá trị true khi tất cả các điều kiện đều đúng, ngược lại nếu có một cái sai, hàm trả về false
public static bool insideBorder(Vector2 pos) {//kiem tra trong return ((int)pos.x >= 0 && (int)pos.x < w && (int)pos.y >= 0); }
}
hàm xóa một hàng thứ Y nào đó. public static void deleteRow(int y) {///xóa hang thu y for (int x = 0; x < w; ++x) {///duyet qa tat cả x trong hang y Destroy(grid[x, y].gameObject);//xoa ô grid[x, y] = null;//gán nulll lai nó } Như chức năng hàm trên thì ta chỉ xóa các ô của một hàng, vậy khi xóa xong nó được gắn là Null, nghĩa là hàng đó sẽ trống, để lấp đầy khoảng trống đó ta tiếp tục tạo thêm hàm public static void decreaseRow(int y) {//hàm hạ các O trong hang Y xuông 1 đơn vị for (int x = 0; x < w; ++x) {// duyệt qa các ô trong hàn y if (grid[x, y] != null) {//neu khác null grid[x, y-1] = grid[x, y];// di chuyển vị tri y xuống 1 ô grid[x, y] = null;//khi xuông 1 ô thì thằng tren đó gán lại la Null grid[x, y-1].position += new Vector3(0, -1, 0);// cập nhạt lại tọa độ cho nó(x,y,z) } } } hàm trên chỉ có hạ xuống một đơn vị , vậy ta se lập lại hàm trên thì có thể đưa tất cả các hàng xuống 1 đơn vị rồi, public static void decreaseRowsAbove(int y) {//hàng thứ y for (int i = y; i < h; ++i)///duyet từ hàng y trở len tren decreaseRow(i); // gọi hàm duy chuyen xuong 1 ô } ok rồi đó, giờ ta vào vấn đề làm sao biết hàng Y nào là đủ các ô, giải pháp là đay public static bool isRowFull(int y) {//kiểm tra hang y có đủ các ô for (int x = 0; x < w; ++x)//dhuyet qa cac ô if (grid [x, y] == null)//nếu trông thì tra ve false return false; return true;// đúng het thì true; } Tìm được hàng đã xóa rồi thì ta sẽ duyệt hết các hàng, tìm hàng nào đủ điều kiện xóa ô thì gọi hàm xóa và cập nhật lại vt. // hàm tìm và xóa hàng nào đủ các ô public static void deleteFullRows() { for (int y = 0; y < h; ++y) {// duyet từ hàn 0 đến hàng h if (isRowFull(y)) {// nếu hàg y mà đủ các ô deleteRow(y);// xóa hàn y decreaseRowsAbove(y+1);// goi hàm hạ ô xuống từ hàng trên hàng đủ ô 1 đơn vi --y;// giảm y vì đã xóa 1 hàng rồi mà } } } Xong phàm dữ liệu rồi đó
 tiếp tục tạo ra class mới quản lý các khối ô của chúng ta sẽ có ở bài 3.

link tải project 




tài liêu tham khảo:noobtuts

3 comments:

  1. Trong trường hợp mình làm cho multiplayer chơi với nhau thì photon có phải là lựa chọn tốt không bạn?

    ReplyDelete