2021-10-07 13:56:22 -06:00
|
|
|
using System;
|
2021-10-01 15:30:01 -06:00
|
|
|
using System.Collections;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
using UnityEngine;
|
2021-10-07 13:56:22 -06:00
|
|
|
using UnityEngine.EventSystems;
|
2021-10-01 15:30:01 -06:00
|
|
|
|
|
|
|
public class tetromino : MonoBehaviour
|
|
|
|
{
|
2021-10-07 13:56:22 -06:00
|
|
|
public float timeBetweenSteps;
|
2021-10-01 15:30:01 -06:00
|
|
|
public bool active = true;
|
2021-10-07 13:56:22 -06:00
|
|
|
|
|
|
|
private float stepTimer = 0.0f;
|
|
|
|
private bool wouldCollide = false;
|
2021-10-01 15:30:01 -06:00
|
|
|
|
|
|
|
// Start is called before the first frame update
|
|
|
|
void Start()
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// Update is called once per frame
|
|
|
|
void Update()
|
|
|
|
{
|
2021-10-07 13:56:22 -06:00
|
|
|
stepTimer += Time.deltaTime;
|
2021-10-01 15:30:01 -06:00
|
|
|
|
2021-10-07 13:56:22 -06:00
|
|
|
if (stepTimer >= timeBetweenSteps && active)
|
2021-10-01 15:30:01 -06:00
|
|
|
{
|
2021-10-07 13:56:22 -06:00
|
|
|
stepTimer = stepTimer - timeBetweenSteps;
|
2021-10-01 15:30:01 -06:00
|
|
|
nextStep();
|
|
|
|
}
|
2021-10-07 13:56:22 -06:00
|
|
|
|
|
|
|
if (Input.GetButtonDown("tetrisMoveLeft") && active)
|
|
|
|
{
|
|
|
|
transform.position += Vector3.left * 1.0f;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (Input.GetButtonDown("tetrisMoveRight") && active)
|
|
|
|
{
|
|
|
|
transform.position += Vector3.right * 1.0f;
|
|
|
|
}
|
2021-10-01 15:30:01 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
void nextStep()
|
|
|
|
{
|
2021-10-07 13:56:22 -06:00
|
|
|
//I want to run this for each piece of the tetromino.
|
|
|
|
foreach (Transform child in transform)
|
|
|
|
{
|
|
|
|
//Only do this if it's a piece at the bottom, so we don't detect ourself as a collision.
|
|
|
|
if (Math.Abs(child.localPosition.y - (0.5)) < 0.001) //my IDE suggested I do this to fix floating-point comparison issues, and I see the logic at work here.
|
|
|
|
{
|
|
|
|
Debug.Log("Checking position: " + child.position);
|
|
|
|
if (validateFall(child))
|
|
|
|
{
|
|
|
|
wouldCollide = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (wouldCollide == false)
|
2021-10-01 15:30:01 -06:00
|
|
|
{
|
|
|
|
Fall();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
active = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-10-07 13:56:22 -06:00
|
|
|
private bool validateFall(Transform pieceToCheck) //returns true if the next step collides with something
|
2021-10-01 15:30:01 -06:00
|
|
|
{
|
2021-10-07 13:56:22 -06:00
|
|
|
//Cast a ray to the next position of the tetromino.
|
2021-10-08 20:58:19 -06:00
|
|
|
//NOTE: disabled "Queries Start in Colliders" in Project Settings>Physics 2D (thank you again, Tavi).
|
2021-10-07 13:56:22 -06:00
|
|
|
RaycastHit2D collision = Physics2D.Raycast(pieceToCheck.position, Vector2.down, 1.0f);
|
|
|
|
Debug.DrawRay(pieceToCheck.position,Vector3.down,Color.red,1000.0f);
|
|
|
|
if (collision.collider != null && collision.collider.name != pieceToCheck.name)
|
2021-10-01 15:30:01 -06:00
|
|
|
{
|
2021-10-07 13:56:22 -06:00
|
|
|
Debug.Log("Collided with object: " + collision.collider.name);
|
2021-10-01 15:30:01 -06:00
|
|
|
//We hit something, but what?
|
|
|
|
if (collision.collider.CompareTag("Ground") || collision.collider.CompareTag("Tetromino"))
|
|
|
|
{
|
2021-10-07 13:56:22 -06:00
|
|
|
ScoreCounter.scoreAmount += 100;
|
|
|
|
return true;
|
2021-10-01 15:30:01 -06:00
|
|
|
}
|
2021-10-07 13:56:22 -06:00
|
|
|
return true;
|
2021-10-01 15:30:01 -06:00
|
|
|
}
|
2021-10-08 20:58:19 -06:00
|
|
|
|
|
|
|
return false;
|
2021-10-01 15:30:01 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
void Fall()
|
|
|
|
{
|
|
|
|
transform.position += Vector3.down * 1.0f;
|
|
|
|
}
|
|
|
|
}
|