- Home /
noobtuts 2d tetris index out of range exception
Hi all,
I am working on noobtuts 2d tetris tutorial and at the end i see it has 16 cube tetris height and i change the spawner position from (5,14) to (5,18) and i changed main camera's position (4.5, 7,5) to (4.5, 9.5) and size from 8 to 10 . it works but gives me "index out of range exception: Array index is out of range" on line 136 Group.cs. script is below as red line gives exception and there is one more script as Grid.cs. it is too below. i see that even though the cubes has reached the height:20 and it must be game over, it continues to spawn the blocks. and then it starts to give "array index out of range exception". What can i do for that. Where did i make wrong? Thanks for your help.
public class Group : MonoBehaviour {
// Use this for initialization void Start() { // Default position not valid? Then it's game over if (!isValidGridPos()) { Debug.Log("GAME OVER"); Destroy(gameObject); } }
// Time since last gravity tick float lastFall = 0;
// Update is called once per frame 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); }
// Fall else if (Input.GetKeyDown(KeyCode.DownArrow)) { // 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().spawnNext();
// Disable script enabled = false; } }
// 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().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; } } }
using System.Collections; using System.Collections.Generic; using UnityEngine;
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; } } } }
Your answer
Follow this Question
Related Questions
HOW TO MAKE A SIMPLE GRID? 2 Answers
Inventory Management Puzzle/Inventory Tetris 1 Answer
How to make coloured tetris-like blocks during runtime 0 Answers
Tetris, Tetrominoes Clones Spawn Same Time 0 Answers
Visualize array in game 2 Answers