Working surfacing function

This commit is contained in:
2025-09-22 10:55:45 +02:00
parent 8326f03086
commit bb3c91ec94
3 changed files with 104 additions and 5 deletions

View File

@@ -59,6 +59,9 @@ namespace Minigames.DivingForPictures
private const float TileSpawnZ = -1f;
private const float DefaultTileHeight = 5f;
// Direction state
private bool _isSurfacing = false;
private void Awake()
{
_mainCamera = Camera.main;
@@ -270,6 +273,26 @@ namespace Minigames.DivingForPictures
_screenTop = top.y;
}
/// <summary>
/// Reverses direction to start surfacing
/// </summary>
public void StartSurfacing()
{
if (_isSurfacing) return; // Already surfacing
// Reverse the movement direction
moveSpeed *= -1;
// Update velocity immediately
CalculateVelocity();
// Reverse the active tiles array to maintain consistent indexing logic
_activeTiles.Reverse();
// Set surfacing flag
_isSurfacing = true;
}
/// <summary>
/// Handles the movement of all active tiles based on the current velocity
/// </summary>
@@ -279,6 +302,7 @@ namespace Minigames.DivingForPictures
{
if (tile != null)
{
// Movement will automatically adapt to negative velocity when surfacing
tile.transform.position += Vector3.up * _currentVelocity;
}
}
@@ -299,7 +323,20 @@ namespace Minigames.DivingForPictures
}
float tileHeight = GetTileHeight(topTile);
if (topTile.transform.position.y - tileHeight / 2 > _screenTop + tileSpawnBuffer)
bool shouldDestroy;
if (_isSurfacing)
{
// When surfacing, destroy tiles at the bottom
shouldDestroy = topTile.transform.position.y + tileHeight / 2 < _screenBottom - tileSpawnBuffer;
}
else
{
// When descending, destroy tiles at the top
shouldDestroy = topTile.transform.position.y - tileHeight / 2 > _screenTop + tileSpawnBuffer;
}
if (shouldDestroy)
{
_activeTiles.RemoveAt(0);
onTileDestroyed?.Invoke(topTile);
@@ -339,14 +376,31 @@ namespace Minigames.DivingForPictures
}
float tileHeight = GetTileHeight(bottomTile);
float bottomEdge = bottomTile.transform.position.y - tileHeight / 2;
if (bottomEdge > _screenBottom - tileSpawnBuffer)
bool shouldSpawn;
float newY;
if (_isSurfacing)
{
// When surfacing, spawn new tiles at the top
float topEdge = bottomTile.transform.position.y + tileHeight / 2;
shouldSpawn = topEdge < _screenTop + tileSpawnBuffer;
newY = bottomTile.transform.position.y + tileHeight;
}
else
{
// When descending, spawn new tiles at the bottom
float bottomEdge = bottomTile.transform.position.y - tileHeight / 2;
shouldSpawn = bottomEdge > _screenBottom - tileSpawnBuffer;
newY = bottomTile.transform.position.y - tileHeight;
}
if (shouldSpawn)
{
float newY = bottomTile.transform.position.y - tileHeight;
SpawnTileAtY(newY);
}
}
/// <summary>
/// Handle increasing the movement speed over time
/// </summary>