Showing posts with label GAME XẾP HÌNH. Show all posts
Showing posts with label GAME XẾP HÌNH. Show all posts

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

Wednesday, July 29, 2015

GAME 2D XẾP HÌNH -TETRIS

GIỚI THIỆU


Trong Tutorial hôm nay chúng ta sẽ tạo một trong những trò chơi hay nhất mọi thời đại:. phát hành vào tháng sáu năm 1984, nó đã trở thành phổ biến do đơn giản, nhưng vẫn rất nghiện trò chơi-chơi của mình.
Tetris nhân bản của chúng tôi sẽ được chỉ là đơn giản, chỉ với khoảng 130 dòng mã và hai tài sản. Trong khi các game có vẻ khá đơn giản, nó vẫn còn đi kèm với một vài thách thức và sẽ là một bài tập tuyệt vời cho người mới bắt đầu.
Như thường lệ, tất cả mọi thứ sẽ được giải thích dễ dàng như có thể để mọi người có thể hiểu được nó.


Yêu cầu

Kiến thức

Hướng dẫn  tôi không yêu cầu bất kỳ kỹ năng đặc biệt. Nếu bạn biết cơ bản Unity về GameObjects ,Prefabs và Transforms. đừng lo lắng về nó quá nhiều.

Unity Version

Tetris Tutorial chúng tôi sẽ sử dụng Unity 4.6. Các phiên bản mới hơn nếu làm việc tốt là tốt, các phiên bản cũ hơn có thể hoặc không thể làm việc. Điều quan trọng là phài lớn hơn 4.3 vì chỉ lớn hơn mới hổ trợ 2d
Không cần bất kỳ tác dụng nâng cao, do các phiên bản miễn phí của Unity sẽ làm làm tốt.

Thiết lập dự án

tải bộ asset (tài nguyên để làm game ).
Được rồi, chúng ta hãy làm một trò chơi  xếp hình huyền thoại nào. Mình sẽ tạo ra một dự án mới Unity và sau đó lưu nó như bất kỳ thư mục ở máy mình  D: ...\ Tetris và chọn  2D Create tao.
chọn vào main camera  chỉnh background sang màu đen (cho giống mình hihi) hoặc màu nào bạn thích.. Bạn nên chọn các thông số postion(vị trí tọa đó trong không gian Oxy), Rotation (xoay), và Scale theo như mình . 
Chú ý trong phần Projection chọn chế độ Orthographic (chế độ góc nhìn đi song song).

Tạo Art game

Các hình ảnh sẻ được tạo từ các ô vuông đơn. ghép các ô ta được hình ảnh mong muốn.
Như đã thấy trong các hình ảnh trên, mình sẽ giữ phong cách nghệ thuật đơn giản. Mỗi nhóm có thể được tạo ra với chỉ một loại khối với một, làm tròn chữ nhật

chọn ảnh nhìn vào phần inspector thiết lập các thông số như hình bên dưới.
tiếp theo là hai cạnh viền hai bên của trò chơi.
chỉnh thông số cho nó, củng như ô vuông bạn chỉ cần click chuột vào nó, nhìn qua Inspector điền thông số như hình dưới.

Tạo borders (hai cạnh hai bênh)

các bạn kéo cái hình boder từ asset bỏ vào phần hieyerachy như hình dưới.

Game mình tạo ra sẽ có chiều rộng 10 ô và cao 20 ô, vì vây các ô sẽ luôn nằm ở tọa đô (0,0) đên (9,19).
Vậy hai cái border sẽ nằm ở vị trí x =0 và x= 9, nhưng thế thì nó tuyệt đối quá, các hình có thể chồng lên nhau, nên có trừ hao một chút, mình chọn x=-0.5 và x=9.5

Scale y=40 để hình dài ra, nhấn play để xem 


Tạo các nhóm

Đầu tiên bạn tạo một gameobject rổng bằng cách nhấn vào Create->Create Empty
kéo các ô vông thả vào GameObject mới tạo

chữ o gồm 4 ô vuông:

với tọa độ 4 ô như sau:
x=0,y=0
x=0,y=1
x=1,y=0
x=1,y=1
chú ý: ở đay tọa độ phải được làm tròn, như thế thì khi di chuyển 1 đơn vị sẽ thuận lợi cho việc tính toán tọa đo sau này
Giờ hãy đăt tên(chọn Object nhấn F2) và lưu giữ Object này thành một Prefab.
giờ thì có thể xóa Group O ơ phần hierarchy. Nó đã lưu trữ ở asset nên bạn iên tâm.
Tiếp tục tạo các khối hình còn lại (làm tương tự, nhơ là tọa độ là số tròn nhé)

kéo thả hết vào asset đê lưu trữ nhe!

Bước tiếp theo bạn tạo một GameObject trống đặt tên là Spawner. với thông số như trong hình
Nó sẽ năm ở trên cùng có chúc năng tạo ngẫu nhiên các Group (O,L,J,T..) cho game. hãy tao Script để xử lý quá trình nào.(nhìn hình trên có cái button Add Component bạn chọn vào nó->New Script->đặt tên Spawner và cuối cùng là Create and Add)

khởi tạo một mãng các GameObject nó sẽ là các khối  trong game.
hàm ạo random một khối spawnNext() và gọi nó trong hàm Start(), để khi vừ mới vào là nó được gọi.

using UnityEngine;
using System.Collections;

public class Spawner : MonoBehaviour {
// Groups
public GameObject[] groups;

void Start () {
spawnNext ();
}

public void spawnNext() {
//vị trí Random
int i = Random.Range(0, groups.Length);

//random cái Group thứ i, tại vitri Postion và quay mặc đinh identity.
Instantiate(groups[i], transform.position, Quaternion.identity);
}
}



kéo thả các Group đã lưu ở asset vào Script như hình

chạy thử coi nào