event controls WIP

This commit is contained in:
2020-02-01 14:39:17 -05:00
parent 588df6407f
commit a3e6a4e304
5 changed files with 378 additions and 495 deletions

View File

@@ -8,6 +8,7 @@ public class BugMovement : MonoBehaviour
[SerializeField] private float secondsGoingRight = 1;
[SerializeField] private float movementSpeed = 10;
[SerializeField] BoxCollider2D playerCollider;
[SerializeField] EventControls eventControls;
private int leftAccumalator = 0;
private int rightAccumalator = 0;
@@ -17,13 +18,15 @@ public class BugMovement : MonoBehaviour
private void Start()
{
Physics2D.IgnoreCollision(GetComponent<BoxCollider2D>(), playerCollider);
rigidBody = GetComponent<Rigidbody2D>();
}
// Update is called once per frame
private void Update()
{
if (HasEncounteredPlayer())
eventControls.TriggerEvent(playerCollider, GetComponent<BoxCollider2D>());
var totalFramesGoingLeft = framesPerSecond * secondsGoingLeft;
var totalFramesGoingRight = framesPerSecond * secondsGoingRight;
@@ -56,4 +59,9 @@ public class BugMovement : MonoBehaviour
var actualSpeed = movementSpeed;
rigidBody.velocity = new Vector2(actualSpeed, rigidBody.velocity.y);
}
private bool HasEncounteredPlayer()
{
return rigidBody.IsTouchingLayers(LayerMask.GetMask(LayerNames.Player));
}
}

View File

@@ -10,8 +10,8 @@ public class EventControls : MonoBehaviour
[SerializeField] private Tile tile;
[SerializeField] private Tile successTile;
[SerializeField] private float framesPerControlTile = 15;
[SerializeField] private float nextControlYOffset = 0;
[SerializeField] private float nextControlXOffset = 0;
[SerializeField] private int nextControlYOffset = 0;
[SerializeField] private int nextControlXOffset = 0;
[SerializeField] private float tileMapClearDelayInSeconds = 0.5f;
private Tilemap tilemap;
@@ -24,20 +24,38 @@ public class EventControls : MonoBehaviour
private bool eventDrawn = false;
private bool eventTriggered = false;
private int eventCycleInSeconds = 4;
private int eventCycleInSeconds = 2;
private int eventCycleAccumalator = 0;
private int tileMapClearDelayAccumalator = 0;
private EventControlTile currentEventControl;
private Collider2D currentPlayerCollider;
private Collider2D currentEnemyCollider;
private Queue<EventControlTile> eventControlTilesInCycle;
private int framesPerSecond => 60;
private Vector3Int nextControlOffSetAsVector => new Vector3Int(nextControlXOffset, nextControlYOffset, 0);
public void TriggerEvent(Collider2D playerCollider, Collider2D enemyCollider)
{
currentPlayerCollider = playerCollider;
currentEnemyCollider = enemyCollider;
Physics2D.IgnoreCollision(playerCollider, enemyCollider, true);
eventTriggered = true;
}
public bool IsEventTriggered()
{
return eventTriggered;
}
private void Start()
{
tilemap = GetComponent<Tilemap>();
eventControlTilesInCycle = new Queue<EventControlTile>();
eventTriggered = true; // TODO: TEST
}
private void Update()
@@ -45,42 +63,17 @@ public class EventControls : MonoBehaviour
if (eventTriggered)
{
SetTile();
SetTileMapPosition();
}
else
{
nextControlAccumalator = 0;
//SetTileMapPosition();
}
if (eventDrawn && eventTriggered)
{
if (currentEventControl == null)
currentEventControl = eventControlTilesInCycle.Dequeue();
if (Input.GetKeyDown(currentEventControl.keyCode))
{
tilemap.SetTile(currentEventControl.position, currentEventControl.successTile);
currentEventControl = null;
if (eventControlTilesInCycle.Count == 0)
{
eventTriggered = false;
}
}
PerformControlEvent();
}
if (eventDrawn && !eventTriggered)
{
if (tileMapClearDelayAccumalator >= tileMapClearDelayInSeconds * framesPerSecond)
{
tilemap.ClearAllTiles();
tileMapClearDelayAccumalator = 0;
eventDrawn = false;
}
else
{
tileMapClearDelayAccumalator++;
}
Reset();
}
}
@@ -92,7 +85,7 @@ public class EventControls : MonoBehaviour
initialCameraPosition = GetCameraPosition();
// Store tiles for event cycle
var eventControlTile = new EventControlTile(KeyCode.W, tile, successTile, GetNextTilePosition()); /* TODO: Hard code */
var eventControlTile = new EventControlTile(KeyCode.W, tile, successTile, GetNextTilePosition() + nextControlOffSetAsVector); /* TODO: Hard code */
eventControlTilesInCycle.Enqueue(eventControlTile);
tilemap.SetTile(eventControlTile.position, tile);
@@ -105,8 +98,10 @@ public class EventControls : MonoBehaviour
initialCameraPosition = null;
eventDrawn = true;
}
nextControlAccumalator++;
else
{
nextControlAccumalator++;
}
}
private Vector3Int GetCameraPosition()
@@ -122,9 +117,56 @@ public class EventControls : MonoBehaviour
.GetValueOrDefault();
}
private void PerformControlEvent()
{
nextControlAccumalator = 0;
if (currentEventControl == null)
currentEventControl = eventControlTilesInCycle.Dequeue();
if (Input.GetKeyDown(currentEventControl.keyCode))
{
tilemap.SetTile(currentEventControl.position, currentEventControl.successTile);
currentEventControl = null;
if (eventControlTilesInCycle.Count == 0)
{
eventTriggered = false;
eventCycleAccumalator = 0;
}
}
else if (eventCycleAccumalator >= eventCycleInSeconds * framesPerSecond)
{
}
else
{
eventCycleAccumalator++;
}
}
private void Reset()
{
if (tileMapClearDelayAccumalator >= tileMapClearDelayInSeconds * framesPerSecond)
{
tilemap.ClearAllTiles();
tileMapClearDelayAccumalator = 0;
eventDrawn = false;
numberOfControlTilesSet = 0;
Physics2D.IgnoreCollision(currentPlayerCollider, currentEnemyCollider, false);
currentPlayerCollider = null;
currentEnemyCollider = null;
}
else
{
tileMapClearDelayAccumalator++;
}
}
private void SetTileMapPosition()
{
transform.position = camera.transform.position +
new Vector3(nextControlXOffset, nextControlYOffset, 0); // offset
new Vector3Int(nextControlXOffset, nextControlYOffset, 0); // offset
}
}

View File

@@ -1,4 +1,5 @@
using System.Collections;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
@@ -10,9 +11,8 @@ public class Player : MonoBehaviour
[SerializeField] private float groundErrorThreshold = 0.01f;
private Rigidbody2D rigidBody;
private BoxCollider2D collider;
new private BoxCollider2D collider;
private Animator animator;
private bool isInEncounter = false;
private void Start()
{
@@ -23,8 +23,6 @@ public class Player : MonoBehaviour
private void Update()
{
//isInEncounter = HasEncounteredEnemy();
//if (isInEncounter)
MovePlayer();
}