Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Group.cs
- using UnityEngine;
- using System.Collections;
- public class Group : MonoBehaviour {
- // Time since last gravity tick
- float lastFall = 0;
- void Start() {
- // Default position not valid? Then it's game over
- if (!isValidGridPos()) {
- Debug.Log("GAME OVER");
- Destroy(gameObject);
- }
- }
- void Update() {
- // Move Left
- if (Input.GetKeyDown(KeyCode.LeftArrow)) {
- // Modify position
- transform.position += new Vector3(-1, 0, 0);
- // See if valid
- if (isValidGridPos())
- // It's valid. Update grid.
- updateGrid();
- else
- // It's not valid. revert.
- transform.position += new Vector3(1, 0, 0);
- }
- // Move Right
- else if (Input.GetKeyDown(KeyCode.RightArrow)) {
- // Modify position
- transform.position += new Vector3(1, 0, 0);
- // See if valid
- if (isValidGridPos())
- // It's valid. Update grid.
- updateGrid();
- else
- // It's not valid. revert.
- transform.position += new Vector3(-1, 0, 0);
- }
- // Rotate
- else if (Input.GetKeyDown(KeyCode.UpArrow)) {
- transform.Rotate(0, 0, -90);
- // See if valid
- if (isValidGridPos())
- // It's valid. Update grid.
- updateGrid();
- else
- // It's not valid. revert.
- transform.Rotate(0, 0, 90);
- }
- // Move Downwards and Fall
- else if (Input.GetKeyDown(KeyCode.DownArrow) ||
- Time.time - lastFall >= 1) {
- // Modify position
- transform.position += new Vector3(0, -1, 0);
- // See if valid
- if (isValidGridPos()) {
- // It's valid. Update grid.
- updateGrid();
- } else {
- // It's not valid. revert.
- transform.position += new Vector3(0, 1, 0);
- // Clear filled horizontal lines
- Grid.deleteFullRows();
- // Spawn next Group
- FindObjectOfType<Spawner>().spawnNext();
- // Disable script
- enabled = false;
- }
- lastFall = Time.time;
- }
- }
- bool isValidGridPos() {
- foreach (Transform child in transform) {
- Vector2 v = Grid.roundVec2(child.position);
- // Not inside Border?
- if (!Grid.insideBorder(v))
- return false;
- // Block in grid cell (and not part of same group)?
- if (Grid.grid[(int)v.x, (int)v.y] != null &&
- Grid.grid[(int)v.x, (int)v.y].parent != transform)
- return false;
- }
- return true;
- }
- void updateGrid() {
- // Remove old children from grid
- for (int y = 0; y < Grid.h; ++y)
- for (int x = 0; x < Grid.w; ++x)
- if (Grid.grid[x, y] != null)
- if (Grid.grid[x, y].parent == transform)
- Grid.grid[x, y] = null;
- // Add new children to grid
- foreach (Transform child in transform) {
- Vector2 v = Grid.roundVec2(child.position);
- Grid.grid[(int)v.x, (int)v.y] = child;
- }
- }
- }
- grid.cs
- using UnityEngine;
- using System.Collections;
- public class Grid : MonoBehaviour {
- // The Grid itself
- public static int w = 10;
- public static int h = 20;
- public static Transform[,] grid = new Transform[w, h];
- public static Vector2 roundVec2(Vector2 v) {
- return new Vector2(Mathf.Round(v.x),
- Mathf.Round(v.y));
- }
- public static bool insideBorder(Vector2 pos) {
- return ((int)pos.x >= 0 &&
- (int)pos.x < w &&
- (int)pos.y >= 0);
- }
- public static void deleteRow(int y) {
- for (int x = 0; x < w; ++x) {
- Destroy(grid[x, y].gameObject);
- grid[x, y] = null;
- }
- }
- public static void decreaseRow(int y) {
- for (int x = 0; x < w; ++x) {
- if (grid[x, y] != null) {
- // Move one towards bottom
- grid[x, y - 1] = grid[x, y];
- grid[x, y] = null;
- // Update Block position
- grid[x, y - 1].position += new Vector3(0, -1, 0);
- }
- }
- }
- public static void decreaseRowsAbove(int y) {
- for (int i = y; i < h; ++i)
- decreaseRow(i);
- }
- public static bool isRowFull(int y) {
- for (int x = 0; x < w; ++x)
- if (grid[x, y] == null)
- return false;
- return true;
- }
- public static void deleteFullRows() {
- for (int y = 0; y < h; ++y) {
- if (isRowFull(y)) {
- deleteRow(y);
- decreaseRowsAbove(y + 1);
- --y;
- }
- }
- }
- }
- spawner.cs
- using UnityEngine;
- using System.Collections;
- public class Spawner : MonoBehaviour {
- // Groups
- public GameObject[] groups;
- public void spawnNext() {
- // Random Index
- int i = Random.Range(0, groups.Length);
- // Spawn Group at current Position
- Instantiate(groups[i],
- transform.position,
- Quaternion.identity);
- }
- void Start() {
- // Spawn initial Group
- spawnNext();
- }
- // Update is called once per frame
- void Update () {
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement