gimm-platformer-project/Assets/Scripts/tetromino.cs

88 lines
2.6 KiB
C#
Raw Normal View History

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;
public tetrominoUserControl TetrominoUserControl;
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()
{
TetrominoUserControl = FindObjectOfType<tetrominoUserControl>();
TetrominoUserControl.setActiveTetromino(gameObject);
2021-10-01 15:30:01 -06:00
}
// 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
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.
{
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.
//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);
2021-10-07 13:56:22 -06:00
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
}
return false;
2021-10-01 15:30:01 -06:00
}
void Fall()
{
transform.position += Vector3.down * 1.0f;
}
}