Mục lục:
- Quân nhu
- Bước 1: Thiết lập Biên giới của Trò chơi
- Bước 2: Thêm bo mạch và tạo bộ điều khiển
- Bước 3: Kết nối Arduino với cổng nối tiếp
- Bước 4: Kết nối Unity với cổng nối tiếp
- Bước 5: Thêm bóng
- Bước 6: Kết thúc trò chơi
Video: Cách tạo trò chơi nhiều người chơi với bộ điều khiển Arduino: 6 bước
2024 Tác giả: John Day | [email protected]. Sửa đổi lần cuối: 2024-01-30 13:30
Bạn đã bao giờ tự hỏi làm thế nào các nhà phát triển trò chơi tạo ra những trò chơi tuyệt vời mà mọi người trên toàn thế giới thích chơi? Hôm nay tôi sẽ cung cấp cho bạn một gợi ý nhỏ về nó bằng cách tạo một trò chơi nhiều người chơi nhỏ sẽ được điều khiển bởi một bộ điều khiển Arduino mà bạn cũng sẽ thực hiện. Vì vậy, chúng ta hãy bắt đầu.
Quân nhu
Bạn sẽ cần:
- Máy tính xách tay
- Công cụ Unity
- C # IDE hoạt động với Unity chẳng hạn như studio trực quan hoặc Atom. (Tôi sẽ sử dụng mã Visual Studio)
- 2X Arduino Nano
- Bảng bánh mì lớn gấp 2 lần
- Bảng bánh mì nhỏ 2X
- 4X Tack Switch (Nút nhấn)
- Điện trở 4X 200Ω
- 12X dây nhảy nam sang nam
- Arduino IDE
Sẽ rất hữu ích nếu bạn có hiểu biết cơ bản về cách sử dụng Unity, tuy nhiên nó sẽ không ảnh hưởng đến tiến trình của bạn vì bạn sẽ làm quen với nó trong quá trình làm game.
Liên kết tải xuống Unity Engine:
store.unity.com/download-nuo
Liên kết tải xuống Visual Studio Code IDE:
code.visualstudio.com/download
Link tải Arduino IDE:
www.arduino.cc/en/Main/Software
Bước 1: Thiết lập Biên giới của Trò chơi
Trước hết, bạn cần tải xuống thống nhất
Sau khi hoàn tất, bạn có thể bắt đầu thiết lập chế độ xem trò chơi của mình.
Mở một dự án Unity mới, đặt tên cho nó và chọn trò chơi 2D.
Khi dự án mở ra, hãy chú ý rằng có 3 phần chính được gọi là
- Hệ thống phân cấp (đây là nơi tất cả các đối tượng và chi tiết trò chơi của bạn sẽ được thêm vào).
- Cảnh (nơi bạn thiết lập chế độ xem của trò chơi).
- Trò chơi (nơi bạn có thể kiểm tra xem trò chơi thực sẽ diễn ra như thế nào).
Lưu ý rằng dưới phân cấp có cảnh của bạn và dưới cảnh có “Máy ảnh chính”. Khi bạn chọn máy ảnh từ hệ thống phân cấp, nó sẽ được chọn trong cảnh
(Bất cứ thứ gì bên trong đường viền của máy ảnh này sẽ hiển thị trong trò chơi thực).
Nhìn vào hình 1
Trò chơi của chúng tôi bao gồm hai bảng, một quả bóng di chuyển xung quanh và các đường viền giới hạn chuyển động của bảng và quả bóng.
Hãy bắt đầu bằng cách tạo các đường viền.
- Để tạo một đối tượng trò chơi mới, chọn Assets> Create> Sprites> square (đặt tên là “đường viền bên phải và bên trái”) Nhìn vào hình 2
- Kéo và thả các đường viền bên phải và bên trái vào hệ thống phân cấp và một hình vuông sẽ xuất hiện trong cảnh.
- Điều chỉnh vị trí trục x của nó thành (5) “đường viền bên phải và bên trái”> thanh tra> chuyển đổi> vị trí> X. Nhìn vào hình 3
- Sau đó, điều chỉnh tỷ lệ của nó sao cho đủ lớn để che đi đường viền của máy ảnh (kéo các cạnh trên và dưới của hình vuông để kéo giãn nó).
- Điều chỉnh màu sắc của nó “từ đường viền bên phải và bên trái”> thanh tra> kết xuất hình ảnh> màu sắc. Nhìn vào hình 3
- Cuộn xuống trong trình kiểm tra và chọn thêm thành phần, sau đó nhập Rigidbody2D và nhấn enter, về cơ bản điều này sẽ thêm vật lý vào đối tượng trò chơi của bạn vì nó cung cấp cho nó khối lượng, trọng lực và phát hiện va chạm. Tuy nhiên, chúng tôi không cần trọng lực trong trò chơi của mình, vì vậy hãy đặt trọng lực bằng 0 thay vì 1. Bạn cũng sẽ cần phải đóng băng vị trí và vòng quay để đường viền không di chuyển khi nó va chạm. Nhìn vào hình 4
- chọn thêm thành phần sau đó gõ Box Collider 2D và nhấn enter, thao tác này sẽ thêm một khu vực xung quanh đối tượng trò chơi nơi có thể phát hiện va chạm. Nhìn vào hình 4
- Bây giờ chọn đường viền bên phải và bên trái và nhấn (ctrl + d) để sao chép nó.
- Đổi tên nó "đường viền bên trái" và đổi tên đường viền đầu tiên ("đường viền bên phải").
- Chọn đường viền bên trái và điều chỉnh vị trí trục x của nó thành (-5) với cách tương tự trong bước 3. Bây giờ bạn có đường viền bên phải và bên trái.
Lặp lại 10 bước trước đó với các đường viền lên và xuống và thay đổi vị trí y của hình vuông thay vì vị trí x. Bản xem trước cuối cùng phải giống với bản trong hình.
Nhìn vào hình 5
Bước 2: Thêm bo mạch và tạo bộ điều khiển
Thêm bảng
Tạo một đối tượng trò chơi mới và đặt tên cho nó là người chơi 1.
Điều chỉnh:
- Thang điểm: X (1.2), Y (0.15), Z (1)
- Vị trí: X (0), Y (-3,6), z (0)
- Thêm BoxCollider2D
- Thêm Rigidbody 2D và đóng băng các trục y và z.
Nhân bản (ctrl + d) và đổi tên trình phát sao chép 2.
Điều chỉnh:
- Thang điểm: X (1.2), Y (0.15), Z (1)
- Vị trí: X (0), Y (3.6), z (0)
- Một BoxCollider sẽ ở đó.
- Một Rigidbody 2D sẽ ở đó và các trục y và z sẽ được đóng băng.
Nhìn vào hình 1
Tạo bộ điều khiển
Bạn sẽ cần:
- 2X Arduino Nano
- Bảng bánh mì lớn gấp 2 lần
- Bảng bánh mì nhỏ 2X
- 4X Tack Switch (Nút nhấn)
- Điện trở 4X
- 12X dây nhảy nam sang nam
Bây giờ hãy xem ảnh bảng mạch bánh mì và ánh xạ để lắp ráp các cần điều khiển.
- Gắn một chip Arduino Nano với một bảng mạch bánh mì nhỏ.
- Gắn 2 công tắc Tack trên bảng bánh mì lớn như trong hình. Cố gắng giữ cho bên phải của bảng bánh mì đối xứng với bên trái một cái vì điều này sẽ làm cho cần điều khiển trông đẹp hơn (Bạn có thể sử dụng cột thứ 30 làm đối xứng hàng)
- Kết nối chân trên cùng bên trái của nút bên trái với chân 5V trong Arduino trên bảng mạch bánh mì nhỏ (những thứ được kết nối với cùng một cột trong bảng mạch bánh mì được kết nối với nhau).
- Kết nối chân trên cùng bên phải của nút bên phải với chân 5V trong Arduino.
- Nối chốt dưới cùng bên phải của nút bên trái với một điểm trên cột thứ 31 bằng điện trở.
- Kết nối chân dưới bên trái của nút bên phải với một điểm trên cột thứ 29 bằng cách sử dụng một điện trở.
- Kết nối các điện trở với chân GND trong Arduino.
- Kết nối chân trên cùng bên phải của nút bên trái với chân D3 trong Arduino.
- Kết nối chân trên bên trái của nút bên phải với chân D9 trong Arduino.
- Bây giờ lặp lại các bước này và tạo bộ điều khiển thứ hai.
Bước 3: Kết nối Arduino với cổng nối tiếp
Trước tiên, bạn sẽ cần cài đặt Arduino IDE.
Sau khi chúng được cài đặt, bạn có thể bắt đầu bằng cách tạo một chương trình Arduino nhận đầu vào từ các nút và lưu trữ chúng trong một cổng Nối tiếp (cổng COM). Khi một bảng Arduino được kết nối với máy tính xách tay của bạn, hệ điều hành sẽ tự động nhận ra bảng là một cổng nối tiếp, có thể tải lên các chương trình đó. Các giá trị được lưu trữ trong cổng nối tiếp có thể được sử dụng trong bước tiếp theo khi chúng tôi kết nối Unity Engine với cổng nối tiếp.
Bây giờ hãy kết nối Arduino với cổng Serial.
Nhìn vào những bức tranh
- Kết nối Arduino với máy tính xách tay của bạn
- Công cụ> Bảng> Arduino Nano
- Nếu chip Arduino của bạn là mới (2018-2020) Công cụ> Bộ xử lý> ATmega328P (Bộ nạp khởi động cũ).
- Nếu chip Arduino của bạn không phải là mới (trước năm 2018). Công cụ> Bộ xử lý> ATmega328P
- Công cụ> Cổng> COM (bất kỳ số nào xuất hiện, trong trường hợp của tôi là 10). * Đây là cổng nối tiếp nơi các giá trị sẽ được lưu trữ.
- Sao chép mã và dán nó vào Arduino IDE và nhấn ctrl + u để tải chương trình lên.
- Lặp lại với Arduino thứ hai. (khi thực hiện bước 5, hãy đảm bảo chọn một cổng COM khác để cả hai bộ điều khiển sẽ không được kết nối với cùng một cổng nối tiếp).
Mã số:
void setup () {
Serial.begin (9600); pinMode (3, INPUT); // Báo cho Arduino nhận đầu vào từ chân D3 pinMode (9, INPUT); // Báo cho Arduino nhận đầu vào từ chân D9} void loop () {if (digitalRead (3) == 1) {/ * Nếu Arduino nhận đầu vào là 1 Serial.write (1); từ chân 3 Xuất giá trị 1 vào cổng nối tiếp Serial.flush (); * / trì hoãn (2); } if (digitalRead (9) == 1) {/ * Nếu Arduino nhận đầu vào là 1 Serial.write (2); từ chân 9 Xuất giá trị 2 vào cổng nối tiếp Serial.flush (); * / trì hoãn (2); }}
Giải thích của chương trình:
Mã này chỉ đơn giản là lấy đầu vào từ chân D3 và chân D9 trong Arduino, được kết nối với các nút. Các nút được nhấn hoặc không được nhấn có nghĩa là các số đọc được lấy từ chúng là 1 (nhấn) hoặc 0 (không nhấn). Nếu đầu vào từ nút bên phải (từ D9) là 1 (được nhấn), hãy lưu trữ giá trị 1 trong cổng Nối tiếp. Nếu đầu vào từ nút bên trái (từ D3) là 1 (được nhấn), hãy lưu trữ giá trị 2 trong cổng Nối tiếp.
Bước 4: Kết nối Unity với cổng nối tiếp
Đối với bước này, chúng ta sẽ xác định cổng nối tiếp trong Unity để nó có thể nhận đầu vào từ Arduino khi các nút được nhấn. Cài đặt Visual Studio Code trên máy tính xách tay của bạn. Sau đó vào Unity, chọn player 1 từ hệ thống phân cấp, cuộn xuống và chọn add component và gõ player1_motion rồi nhấn enter. Nhìn vào hình 1
Một tập lệnh C # sẽ được tạo trong trình kiểm tra, nhấp chuột phải vào nó và chọn tập lệnh chỉnh sửa, mã studio trực quan sẽ mở ra và sẽ hiển thị một mã mặc định giống như hình 2.
Sao chép đoạn mã sau rồi thay đổi "SerialPort sp = new SerialPort (" COM10 ", 9600);" with SerialPort sp = new SerialPort ("Cổng COM mà Arduino của bạn được kết nối với", 9600); bạn có thể tìm thấy nó bằng cách quay lại mã Arduino của bạn và truy cập Công cụ> Cổng> COM (bất kỳ số nào xuất hiện).
Mã số:
sử dụng System. Collections;
sử dụng System. Collections. Generic; sử dụng UnityEngine; sử dụng System. IO. Ports; public class player1_motion: MonoBehaviour {float speed = 8; số tiền float riêng tư; SerialPort sp = new SerialPort ("COM10", 9600); // Bắt đầu được gọi trước khi cập nhật khung đầu tiên void Start () {sp. Open (); sp. ReadTimeout = 1; } // Cập nhật được gọi một lần cho mỗi khung hình void Update () {quanttomove = speed * 0.01f; if (sp. IsOpen) {try {moveObject (sp. ReadByte ()); print (sp. ReadByte ()); } catch (System. Exception) {}}} void moveObject (int Direction) {if (Direction == 1) {biến đổi. Translate (Vector3.left * quanttomove, Space. World); } if (Direction == 2) {biến đổi. Translate (Vector3.right * quanttomove, Space. World); }}}
Giải thích mã:
Mã này cho biết sự thống nhất để nhận đầu vào từ cổng nối tiếp (COM 10). Khi nhấn nút bên trái, Arduino gửi giá trị 1 đến cổng nối tiếp, nếu sự thống nhất nhận 1 từ cổng nối tiếp, một vận tốc sẽ được thêm vào đối tượng trò chơi "người chơi 1" theo hướng bên trái. Khi nhấn nút bên phải, Arduino gửi giá trị 2 đến cổng nối tiếp, nếu sự thống nhất nhận 2 từ cổng nối tiếp, một vận tốc được thêm vào đối tượng trò chơi "người chơi 1" theo hướng bên phải. nếu cổng nối tiếp không nhận được giá trị từ cổng nối tiếp, thì không có vận tốc nào được thêm vào theo cả hai hướng, do đó, bảng sẽ đứng yên.
Sau khi bạn sao chép mã, nhấn F5 để xây dựng và chạy mã. Quay lại thống nhất và nhấn nút phát, người chơi 1 sẽ di chuyển sang phải khi bạn nhấn phải và trái khi bạn nhấn trái.
Bây giờ, thực hiện lại các bước tương tự nhưng với trình phát 2 và đảm bảo viết trong 'Thêm thành phần' player2_motion thay vì player1_motion và xác định cổng COM thứ hai mà bộ điều khiển thứ hai được kết nối, không phải cùng một cổng nối tiếp.
Bạn cũng sẽ cần thay đổi "public class player1_motion: MonoBehaviour" thành "public class player2_motion: MonoBehaviour" trong chính mã.
Bước 5: Thêm bóng
- Thêm một đối tượng trò chơi mới, nhưng lần này chọn hình tròn thay vì hình vuông.
- Đổi tên nó thành "ball".
- Kéo và thả trong hệ thống phân cấp.
- Điều chỉnh thang đo (X: 0,2 - Y: 0,2 - Z: 0,2).
- Thêm Rigidbody 2D và chỉ đóng băng trục Z.
- Thay đổi khối lượng thành 0,0001
- Thay đổi Thang đo trọng lực thành 0.
- Thêm Box Collider 2D.
- Vào Assets> Create> Vật lý 2D Nhìn vào hình 1
- đổi tên thành "bị trả lại"
- Thay đổi ma sát thành 0 từ thanh tra
- Thay đổi độ trả lại thành 1 từ trình kiểm tra
- Kéo và thả "bounce" vào Rigidbody 2D> Material Nhìn vào hình 2
- Chọn "ball" một lần nữa từ hệ thống phân cấp và đi đến thêm thành phần và nhập Ball_movement rồi nhấn enter.
- Nhấp chuột phải vào tập lệnh và chọn chỉnh sửa tập lệnh.
- Sao chép mã bên dưới và nhấn F5 để xây dựng và chạy nó.
Mã số:
sử dụng System. Collections;
sử dụng System. Collections. Generic; sử dụng UnityEngine; public class Ball_movement: MonoBehaviour {// Start được gọi trước khi cập nhật khung đầu tiên private float force = 2; void Start () {StartCoroutine (move ()); } IEnumerator move () {trả về WaitForSeconds mới (2); GetComponent (). AddForce (Vector2 mới (1f, 0.5f) * 0.02f * force); }}
Giải thích mã '
Mã này cung cấp cho quả bóng một vận tốc theo cả hai phương là phương X và phương Y có cùng độ lớn, làm cho quả bóng chuyển động một góc 45o. Trong bước 8, chúng tôi đã thêm một vật liệu vật lý vào quả bóng và thay đổi độ nảy của nó, điều này duy trì chuyển động của quả bóng trong suốt trận đấu.
Bước 6: Kết thúc trò chơi
Bây giờ chúng ta cần làm cho việc thua cuộc có thể xảy ra, nếu bạn điều hành trò chơi, bạn sẽ nhận thấy rằng khi quả bóng vượt qua người chơi 1 hoặc người chơi 2, nó sẽ bật ra khỏi đường biên và đó không phải là chính xác những gì chúng ta cần trong trò chơi của mình. Thay vào đó, chúng tôi muốn tạo một bộ đếm tỷ số để đếm số điểm mỗi khi bóng va chạm với đường biên lên hoặc biên xuống và để đặt lại vị trí của bóng.
- Kéo và thả quả bóng từ Hệ thống phân cấp sang Dự án, Bạn đã tạo một nhà lắp ghép của quả bóng để bạn có thể sử dụng nó sau này.
- Nhấp chuột phải vào Cấu trúc phân cấp và chọn Tạo trống. một Vật thể trống sẽ xuất hiện, đổi tên nó thành quả bóng hồi sinh và thay đổi vị trí của nó giống với vị trí của quả bóng.
- Nhấp chuột phải vào hệ thống phân cấp và chọn Giao diện người dùng >> Văn bản. Lưu ý rằng văn bản đi kèm với canvas, vị trí của văn bản trong trò chơi phụ thuộc vào vị trí của văn bản trong canvas, không phải trong đường viền của trò chơi của chúng ta. (Nhìn vào hình 1).
- Thay đổi vị trí của văn bản thành bất cứ nơi nào bạn muốn.
- Lặp lại các bước 3 và 4 một lần nữa cho số điểm của người chơi thứ hai.
- Nhập văn bản đầu tiên "Điểm của người chơi 1: 0" và nhập văn bản thứ hai "Điểm của người chơi 2: 0". (Nhìn vào hình 2).
- Tạo một tập lệnh ở đường viền phía trên có tên là p1wins và sao chép đoạn mã sau.
Mã số:
sử dụng System. Collections;
sử dụng System. Collections. Generic; sử dụng UnityEngine; sử dụng UnityEngine. SceneManagement; sử dụng UnityEngine. UI; public class p1wins: MonoBehaviour {public Text score; public Transform ball_respawn; bóng GameObject công cộng; int p1 = 0; // Bắt đầu được gọi trước khi cập nhật khung đầu tiên void Start () {} // Cập nhật được gọi một lần cho mỗi khung void Update () {score.text = "Điểm người chơi 1:" + p1; } void OnCollisionEnter2D (Collision2D other) {if (other.gameObject.tag == "Ball") {Hủy (other.gameObject); p1 ++; Instantiate (ball, ball_respawn.position, ball_respawn.rotation); }}}
8. Kéo và thả băng giá lắp ghép bóng ở bước 1 vào thông số Ball. (Nhìn vào hình 3)
9. Kéo và thả bóng hồi sinh từ thứ bậc đến tham số Bóng tái tạo. (Nhìn vào hình 3)
10. kéo và thả người chơi 1 điểm từ thứ bậc đến tham số Score. (Nhìn vào hình 3)
Giải thích mã:
Khi quả bóng va chạm với đường biên trên, nó sẽ phá hủy và hồi sinh lại tại vị trí ball_respawn mà chúng ta đã chỉ định ở bước 2. Mục đích của việc làm cho quả bóng trở thành nhà lắp ghép là có thể hồi sinh nó với tất cả các tính năng của nó, nếu không, nếu chúng ta sử dụng quả bóng từ hệ thống phân cấp, nó sẽ hồi sinh nhưng nó sẽ không di chuyển. Ngoài ra, khi quả bóng va chạm với đường viền trên, giá trị ban đầu bằng 0 được gọi là p1 tăng lên 1. Giá trị này được hiển thị dưới dạng văn bản nên khi quả bóng va chạm với đường viền trên, điểm số cho người chơi 1 tăng 1.
Bây giờ thực hiện các bước 7, 8, 9 và 10 cho đường viền dưới
đối với bước 7, hãy tạo một tập lệnh có tên là p2wins và thay vào đó sao chép mã sau.
đối với bước 10, kéo và thả điểm số của người chơi 2 từ thứ bậc đến thông số Điểm.
Mã số:
sử dụng System. Collections;
sử dụng System. Collections. Generic; sử dụng UnityEngine; sử dụng UnityEngine. SceneManagement; sử dụng UnityEngine. UI; public class p2wins: MonoBehaviour {public Text score; public Transform ball_respawn; bóng GameObject công cộng; int p2 = 0; // Bắt đầu được gọi trước khi cập nhật khung đầu tiên void Start () {} // Cập nhật được gọi một lần cho mỗi khung void Update () {score.text = "Điểm người chơi 2:" + p2; } void OnCollisionEnter2D (Collision2D other) {if (other.gameObject.tag == "Ball") {Hủy (other.gameObject); p2 ++; Instantiate (ball, ball_respawn.position, ball_respawn.rotation); }}}
Đề xuất:
Bộ điều khiển trò chơi nhịp điệu Arduino (dành cho trò chơi của riêng tôi): 6 bước
Bộ điều khiển trò chơi nhịp điệu Arduino (cho Trò chơi của riêng tôi): Trong phần hướng dẫn này, tôi sẽ chỉ cho bạn cách tôi tạo Bộ điều khiển trò chơi nhịp điệu này từ đầu. Nó liên quan đến các kỹ năng chế biến gỗ cơ bản, kỹ năng in 3d cơ bản và kỹ năng hàn cơ bản. Bạn có thể xây dựng dự án này thành công nếu bạn không có
Bộ điều khiển trò chơi tự làm dựa trên Arduino - Bộ điều khiển trò chơi Arduino PS2 - Chơi Tekken với tự làm trò chơi Arduino: 7 bước
Bộ điều khiển trò chơi tự làm dựa trên Arduino | Bộ điều khiển trò chơi Arduino PS2 | Chơi Tekken với Bàn điều khiển Arduino tự làm: Xin chào các bạn, chơi game luôn thú vị nhưng chơi với Bộ điều khiển trò chơi tùy chỉnh tự làm của riêng bạn sẽ thú vị hơn
ESP8266 RGB LED STRIP Điều khiển WIFI - NODEMCU làm điều khiển từ xa hồng ngoại cho dải đèn Led được điều khiển qua Wi-Fi - Điều khiển điện thoại thông minh RGB LED STRIP: 4 bước
ESP8266 RGB LED STRIP Điều khiển WIFI | NODEMCU làm điều khiển từ xa hồng ngoại cho dải đèn Led được điều khiển qua Wi-Fi | Điều khiển bằng điện thoại thông minh RGB LED STRIP: Xin chào các bạn trong hướng dẫn này, chúng ta sẽ học cách sử dụng gật đầu hoặc esp8266 làm điều khiển từ xa IR để điều khiển dải LED RGB và Nodemcu sẽ được điều khiển bằng điện thoại thông minh qua wifi. Vì vậy, về cơ bản bạn có thể điều khiển DÂY CHUYỀN LED RGB bằng điện thoại thông minh của mình
Bộ điều khiển trò chơi không dây với Arduino và NRF24L01 + (hỗ trợ một hoặc hai bộ điều khiển): 3 bước
Bộ điều khiển trò chơi không dây với Arduino và NRF24L01 + (hỗ trợ một hoặc hai bộ điều khiển): Bạn có thể tìm thấy dự án hoàn chỉnh từ trang web của tôi (bằng tiếng Phần Lan): https://teukka.webnode.com/l/langaton-ohjain-atmega-lla- ja-nrf24l01-radiomoduulilla / Đây là một bản tóm tắt thực sự ngắn về dự án. Tôi chỉ muốn chia sẻ nó nếu ai đó muốn
Trình mô phỏng trò chơi điện thoại thông minh- Chơi trò chơi Windows bằng IMU điều khiển bằng cử chỉ, Gia tốc kế, Con quay hồi chuyển, Từ kế: 5 bước
SmartPhone Game Simulator- Chơi Windows Games Sử dụng IMU Điều khiển bằng cử chỉ, Gia tốc kế, Con quay hồi chuyển, Từ kế: Hỗ trợ dự án này: https://www.paypal.me/vslcreations bằng cách quyên góp cho mã nguồn mở & hỗ trợ để phát triển hơn nữa