Numerics ToString overrides. Moving Solids work. Actor.Pushed

This commit is contained in:
Matt Thorson 2020-05-06 16:51:09 -07:00
parent adad88ee83
commit 55948541b6
6 changed files with 153 additions and 6 deletions

View File

@ -27,6 +27,23 @@ namespace Strawberry
Y = y;
}
public override void ToString(String strBuffer)
{
let s = scope String;
strBuffer.Set("[ ");
X.ToString(s);
strBuffer.Append(s);
strBuffer.Append(", ");
Y.ToString(s);
strBuffer.Append(s);
strBuffer.Append(" ]");
}
static public explicit operator Point(Vector a)
{
return Point((int)a.X, (int)a.Y);

View File

@ -111,6 +111,33 @@ namespace Strawberry
return point.X >= X && point.X < X + Width && point.Y >= Y && point.Y < Y + Height;
}
public override void ToString(String strBuffer)
{
let s = scope String;
strBuffer.Set("[ ");
X.ToString(s);
strBuffer.Append(s);
strBuffer.Append(", ");
Y.ToString(s);
strBuffer.Append(s);
strBuffer.Append(", ");
Width.ToString(s);
strBuffer.Append(s);
strBuffer.Append(", ");
Height.ToString(s);
strBuffer.Append(s);
strBuffer.Append(" ]");
}
static public bool operator==(Rect a, Rect b)
{
return a.X == b.X && a.Y == b.Y && a.Width == b.Width && a.Height == b.Height;

View File

@ -51,6 +51,23 @@ namespace Strawberry
return Point((int)Math.Round(X), (int)Math.Round(Y));
}
public override void ToString(String strBuffer)
{
let s = scope String;
strBuffer.Set("[ ");
X.ToString(s);
strBuffer.Append(s);
strBuffer.Append(", ");
Y.ToString(s);
strBuffer.Append(s);
strBuffer.Append(" ]");
}
static public operator Vector(Point a)
{
return Vector(a.X, a.Y);

View File

@ -7,6 +7,8 @@ namespace Strawberry
{
private Vector remainder;
public Point Pushed;
public this(Point position)
: base(position)
{
@ -28,11 +30,20 @@ namespace Strawberry
return CheckOutside(jumpThru, .(0, 1));
}
public virtual void Squish()
public virtual void Squish(Collision collision)
{
RemoveSelf();
}
public override void Update()
{
base.Update();
if (Pushed != Point.Zero)
Calc.Log(Pushed);
Pushed = Point.Zero;
}
public bool MoveX(float amount, Action<Collision> onCollide = null)
{
remainder.X += amount;

View File

@ -23,8 +23,11 @@ namespace Strawberry
let riders = GetRiders(scope List<Actor>);
X += amount;
for (var r in riders)
r.MoveExactX(amount);
for (var a in riders)
{
a.MoveExactX(amount);
a.Pushed += Point.UnitX * amount;
}
}
else
X += amount;
@ -39,8 +42,14 @@ namespace Strawberry
if (amount < 0)
{
for (var a in Scene.All<Actor>(scope List<Actor>))
{
if (riders.Contains(a) || CheckOutside(a, Point.UnitY * amount))
a.MoveExactY((Top + amount) - a.Bottom);
{
let move = (Top + amount) - a.Bottom;
a.MoveExactY(move);
a.Pushed += Point.UnitY * move;
}
}
Y += amount;
}
else
@ -48,7 +57,10 @@ namespace Strawberry
Collidable = false;
for (var a in riders)
{
a.MoveExactY(amount);
a.Pushed += Point.UnitY * amount;
}
Collidable = true;
Y += amount;

View File

@ -10,6 +10,13 @@ namespace Strawberry
Hitbox = hitbox;
}
public override void Update()
{
base.Update();
MoveY(0.1f);
}
public override List<Actor> GetRiders(List<Actor> into)
{
for (var a in Scene.All<Actor>(scope List<Actor>))
@ -20,18 +27,74 @@ namespace Strawberry
public override void MoveExactX(int amount)
{
if (amount != 0)
if (Collidable)
{
let riders = GetRiders(scope List<Actor>);
X += amount;
Collidable = false;
for (Actor a in Scene.All<Actor>(scope List<Actor>))
{
if (Check(a))
{
//Push
int move;
if (amount > 0)
move = Right - a.Left;
else
move = Left - a.Right;
a.MoveExactX(move, scope => a.Squish, this);
a.Pushed += Point.UnitX * move;
}
else if (riders.Contains(a))
{
//Carry
a.MoveExactX(amount);
a.Pushed += Point.UnitX * amount;
}
}
Collidable = true;
}
else
X += amount;
}
public override void MoveExactY(int amount)
{
if (amount != 0)
if (Collidable)
{
let riders = GetRiders(scope List<Actor>);
Y += amount;
Collidable = false;
for (Actor a in Scene.All<Actor>(scope List<Actor>))
{
if (Check(a))
{
//Push
int move;
if (amount > 0)
move = Bottom - a.Top;
else
move = Top - a.Bottom;
a.MoveExactY(move, scope => a.Squish, this);
a.Pushed += Point.UnitY * move;
}
else if (riders.Contains(a))
{
//Carry
a.MoveExactY(amount);
a.Pushed += Point.UnitY * amount;
}
}
Collidable = true;
}
else
Y += amount;
}
public override void Draw()