You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
152 lines
4.4 KiB
C#
152 lines
4.4 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
|
|
using Duality;
|
|
using Duality.Input;
|
|
using Duality.Components.Physics;
|
|
using Duality.Components;
|
|
using Duality.Resources;
|
|
using Duality.Components.Renderers;
|
|
using FlapOrDie.Components;
|
|
|
|
namespace FlapOrDie.Controllers
|
|
{
|
|
[RequiredComponent(typeof(Camera))]
|
|
public class GameController : Component, ICmpUpdatable
|
|
{
|
|
[DontSerialize]
|
|
private Vector2 deltaPos;
|
|
|
|
private PlayerController player;
|
|
|
|
public PlayerController Player
|
|
{
|
|
get { return this.player; }
|
|
set { this.player = value; }
|
|
}
|
|
|
|
private float baseSpeed;
|
|
private float pointsMultiplier;
|
|
private float pointsGapVariance;
|
|
private ushort lastFramePoints;
|
|
|
|
private ContentRef<Prefab> obstaclePrefab;
|
|
private GameObject gameOverOverlay;
|
|
private BackgroundScroller bgScroller;
|
|
|
|
public float BaseSpeed
|
|
{
|
|
get { return this.baseSpeed; }
|
|
set { this.baseSpeed = value; }
|
|
}
|
|
|
|
public float PointsMultiplier
|
|
{
|
|
get { return this.pointsMultiplier; }
|
|
set { this.pointsMultiplier = value; }
|
|
}
|
|
|
|
public float PointsGapVariance
|
|
{
|
|
get { return this.pointsGapVariance; }
|
|
set { this.pointsGapVariance = value; }
|
|
}
|
|
|
|
public ContentRef<Prefab> ObstaclePrefab
|
|
{
|
|
get { return this.obstaclePrefab; }
|
|
set { this.obstaclePrefab = value; }
|
|
}
|
|
|
|
public GameObject GameOverOverlay
|
|
{
|
|
get { return this.gameOverOverlay; }
|
|
set { this.gameOverOverlay = value; }
|
|
}
|
|
|
|
public BackgroundScroller BackgroundScroller
|
|
{
|
|
get { return this.bgScroller; }
|
|
set { this.bgScroller = value; }
|
|
}
|
|
|
|
private TextRenderer scoreText;
|
|
|
|
public TextRenderer ScoreTextRenderer
|
|
{
|
|
get { return this.scoreText; }
|
|
set { this.scoreText = value; }
|
|
}
|
|
|
|
public void Reset()
|
|
{
|
|
// reset all the game data
|
|
GameOverOverlay.Active = false;
|
|
|
|
this.lastFramePoints = 0;
|
|
this.player.Reset();
|
|
|
|
foreach (GameObject obstacle in this.GameObj.ParentScene.FindGameObjects<Tags.Obstacle>())
|
|
{
|
|
obstacle.DisposeLater();
|
|
}
|
|
}
|
|
|
|
void ICmpUpdatable.OnUpdate()
|
|
{
|
|
string highschore = player.Points > FlapOrDieCorePlugin.CurrentHighScore ? " New Highscore" : String.Empty;
|
|
this.scoreText.Text.SourceText = String.Format("Score: {0} {1}", player.Points, highschore);
|
|
|
|
deltaPos.X = this.baseSpeed + (player.Points * this.pointsMultiplier);
|
|
deltaPos.X *= Time.MsPFMult * Time.TimeMult / 1000;
|
|
|
|
this.bgScroller.Update(deltaPos.X);
|
|
|
|
IEnumerable<GameObject> obstacles = this.GameObj.ParentScene.FindGameObjects<Tags.Obstacle>();
|
|
foreach(GameObject obstacle in obstacles)
|
|
{
|
|
obstacle.Transform.MoveBy(-this.deltaPos);
|
|
if (obstacle.Transform.Pos.X < -FlapOrDieCorePlugin.HalfWidth - 50)
|
|
{
|
|
obstacle.DisposeLater();
|
|
}
|
|
}
|
|
if (!player.IsDead)
|
|
{
|
|
if (obstacles.Count() == 0)
|
|
{
|
|
AddObstacle(0);
|
|
}
|
|
if (player.Points > this.lastFramePoints)
|
|
{
|
|
AddObstacle(player.Points * this.pointsGapVariance);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
GameOverOverlay.Active = true;
|
|
FlapOrDieCorePlugin.CurrentHighScore = player.Points;
|
|
}
|
|
|
|
this.lastFramePoints = player.Points;
|
|
}
|
|
|
|
|
|
private void AddObstacle(float variance)
|
|
{
|
|
variance = Math.Min(variance, 200);
|
|
|
|
Vector3 startPosition = new Vector3(FlapOrDieCorePlugin.HalfWidth + 50, MathF.Rnd.NextFloat(-variance, variance), 0);
|
|
GameObject newObstacle = this.obstaclePrefab.Res.Instantiate();
|
|
newObstacle.Transform.Pos = startPosition;
|
|
foreach(AnimSpriteRenderer asr in newObstacle.GetComponentsInChildren<AnimSpriteRenderer>())
|
|
{
|
|
asr.AnimFirstFrame = MathF.Rnd.Next(asr.SharedMaterial.Res.MainTexture.Res.BasePixmap.Res.AnimFrames) + 1;
|
|
}
|
|
|
|
this.GameObj.ParentScene.AddObject(newObstacle);
|
|
}
|
|
}
|
|
}
|