Skip to content

Commit

Permalink
Episode 52.1: Intro to Map Collidable Abstraction
Browse files Browse the repository at this point in the history
woo
  • Loading branch information
golf1052 committed May 24, 2015
1 parent 83a0a0f commit 58734c0
Show file tree
Hide file tree
Showing 3 changed files with 77 additions and 54 deletions.
1 change: 1 addition & 0 deletions CaveStory/CaveStory.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@
<Compile Include="Input.cs" />
<Compile Include="IParticle.cs" />
<Compile Include="IProjectile.cs" />
<Compile Include="Kinematics.cs" />
<Compile Include="Map.cs" />
<Compile Include="MSUnit.cs" />
<Compile Include="NumberSprite.cs" />
Expand Down
25 changes: 25 additions & 0 deletions CaveStory/Kinematics.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;

namespace CaveStory
{
public class Kinematics
{
public GameUnit position;
public VelocityUnit velocity;

public Kinematics(GameUnit position, VelocityUnit velocity)
{
this.position = position;
this.velocity = velocity;
}

public GameUnit Delta(GameTime gameTime)
{
return velocity * (float)gameTime.ElapsedGameTime.TotalMilliseconds;
}
}
}
105 changes: 51 additions & 54 deletions CaveStory/Player.cs
Original file line number Diff line number Diff line change
Expand Up @@ -124,12 +124,11 @@ public void Update()

TimeSpan InvincibleTime { get { return TimeSpan.FromMilliseconds(3000); } }

GameUnit x;
public GameUnit CenterX { get { return x + Units.HalfTile; } }
public GameUnit CenterY { get { return y + Units.HalfTile; } }
GameUnit y;
VelocityUnit velocityX;
VelocityUnit velocityY;
public GameUnit CenterX { get { return kinematicsX.position + Units.HalfTile; } }
public GameUnit CenterY { get { return kinematicsY.position + Units.HalfTile; } }

Kinematics kinematicsX;
Kinematics kinematicsY;
int accelerationX;
SpriteState.HorizontalFacing horizontalFacing;
SpriteState.VerticalFacing intendedVerticalFacing;
Expand All @@ -149,7 +148,7 @@ public SpriteState.MotionType MotionType
}
else
{
motion = velocityY < 0.0f ? SpriteState.MotionType.Jumping : SpriteState.MotionType.Falling;
motion = kinematicsY.velocity < 0.0f ? SpriteState.MotionType.Jumping : SpriteState.MotionType.Falling;
}
return motion;
}
Expand Down Expand Up @@ -212,8 +211,8 @@ public Rectangle DamageRectangle
{
get
{
return new Rectangle((int)Math.Round(x) + CollisionX.Left,
(int)Math.Round(y + CollisionYTop),
return new Rectangle((int)Math.Round(kinematicsX.position) + CollisionX.Left,
(int)Math.Round(kinematicsY.position + CollisionYTop),
CollisionX.Width,
(int)Math.Round(CollisionYHeight));
}
Expand All @@ -231,10 +230,8 @@ public Player(ContentManager Content, GameUnit x, GameUnit y)
{
sprites = new Dictionary<SpriteState, Sprite>();
InitializeSprites(Content);
this.x = x;
this.y = y;
velocityX = 0;
velocityY = 0;
kinematicsX = new Kinematics(x, 0);
kinematicsY = new Kinematics(y, 0);
accelerationX = 0;
horizontalFacing = SpriteState.HorizontalFacing.Left;
intendedVerticalFacing = SpriteState.VerticalFacing.Horizontal;
Expand Down Expand Up @@ -346,32 +343,32 @@ public void InitializeSprite(ContentManager Content, SpriteState spriteState)

public Rectangle LeftCollision(GameUnit delta)
{
return new Rectangle((int)Math.Round(x) + CollisionX.Left + (int)Math.Round(delta),
(int)Math.Round(y) + CollisionX.Top,
return new Rectangle((int)Math.Round(kinematicsX.position) + CollisionX.Left + (int)Math.Round(delta),
(int)Math.Round(kinematicsY.position) + CollisionX.Top,
CollisionX.Width / 2 - (int)Math.Round(delta),
CollisionX.Height);
}

public Rectangle RightCollision(GameUnit delta)
{
return new Rectangle((int)Math.Round(x) + CollisionX.Left + CollisionX.Width / 2,
(int)Math.Round(y) + CollisionX.Top,
return new Rectangle((int)Math.Round(kinematicsX.position) + CollisionX.Left + CollisionX.Width / 2,
(int)Math.Round(kinematicsY.position) + CollisionX.Top,
CollisionX.Width / 2 + (int)Math.Round(delta),
CollisionX.Height);
}

public Rectangle TopCollision(GameUnit delta)
{
return new Rectangle((int)Math.Round(x + CollisionTopLeft),
(int)Math.Round(y + CollisionYTop + delta),
return new Rectangle((int)Math.Round(kinematicsX.position + CollisionTopLeft),
(int)Math.Round(kinematicsY.position + CollisionYTop + delta),
(int)Math.Round(CollisionTopWidth),
(int)Math.Round(CollisionYHeight / 2 - delta));
}

public Rectangle bottomCollision(GameUnit delta)
{
return new Rectangle((int)Math.Round(x + CollisionBottomLeft),
(int)Math.Round(y + CollisionYTop + CollisionYHeight / 2),
return new Rectangle((int)Math.Round(kinematicsX.position + CollisionBottomLeft),
(int)Math.Round(kinematicsY.position + CollisionYTop + CollisionYHeight / 2),
(int)Math.Round(CollisionBottomWidth),
(int)Math.Round(CollisionYHeight / 2 + delta));
}
Expand Down Expand Up @@ -401,43 +398,43 @@ public void UpdateX(GameTime gameTime, Map map)
{
accX = OnGround ? WalkingAcceleration : AirAcceleration;
}
velocityX += accX * (float)gameTime.ElapsedGameTime.TotalMilliseconds;
kinematicsX.velocity += accX * (float)gameTime.ElapsedGameTime.TotalMilliseconds;
if (accelerationX < 0)
{
velocityX = Math.Max(velocityX, -MaxSpeedX);
kinematicsX.velocity = Math.Max(kinematicsX.velocity, -MaxSpeedX);
}
else if (accelerationX > 0)
{
velocityX = Math.Min(velocityX, MaxSpeedX);
kinematicsX.velocity = Math.Min(kinematicsX.velocity, MaxSpeedX);
}
else if (OnGround)
{
velocityX = velocityX > 0.0f ?
(float)Math.Max(0.0f, velocityX - Friction * gameTime.ElapsedGameTime.TotalMilliseconds) :
(float)Math.Min(0.0f, velocityX + Friction * gameTime.ElapsedGameTime.TotalMilliseconds);
kinematicsX.velocity = kinematicsX.velocity > 0.0f ?
(float)Math.Max(0.0f, kinematicsX.velocity - Friction * gameTime.ElapsedGameTime.TotalMilliseconds) :
(float)Math.Min(0.0f, kinematicsX.velocity + Friction * gameTime.ElapsedGameTime.TotalMilliseconds);
}

GameUnit delta = velocityX * (float)gameTime.ElapsedGameTime.TotalMilliseconds;
GameUnit delta = kinematicsX.velocity * (float)gameTime.ElapsedGameTime.TotalMilliseconds;

if (delta > 0.0f)
{
CollisionInfo info = GetWallCollisionInfo(map, RightCollision(delta));

if (info.collided)
{
x = Units.TileToGame(info.col) - CollisionX.Right;
velocityX = 0;
kinematicsX.position = Units.TileToGame(info.col) - CollisionX.Right;
kinematicsX.velocity = 0;
}
else
{
x += delta;
kinematicsX.position += delta;
}

info = GetWallCollisionInfo(map, LeftCollision(0));

if (info.collided)
{
x = Units.TileToGame(info.col) + CollisionX.Right;
kinematicsX.position = Units.TileToGame(info.col) + CollisionX.Right;
}
}
else
Expand All @@ -446,53 +443,53 @@ public void UpdateX(GameTime gameTime, Map map)

if (info.collided)
{
x = Units.TileToGame(info.col) + CollisionX.Right;
velocityX = 0;
kinematicsX.position = Units.TileToGame(info.col) + CollisionX.Right;
kinematicsX.velocity = 0;
}
else
{
x += delta;
kinematicsX.position += delta;
}

info = GetWallCollisionInfo(map, RightCollision(0));

if (info.collided)
{
x = Units.TileToGame(info.col) - CollisionX.Right;
kinematicsX.position = Units.TileToGame(info.col) - CollisionX.Right;
}
}
}

public void UpdateY(GameTime gameTime, Map map, ParticleTools particleTools)
{
AccelerationUnit gravity = jumpActive && velocityY < 0 ?
AccelerationUnit gravity = jumpActive && kinematicsY.velocity < 0 ?
JumpGravity : Gravity;
velocityY = (float)Math.Min(velocityY + gravity * gameTime.ElapsedGameTime.TotalMilliseconds, MaxSpeedY);
kinematicsY.velocity = (float)Math.Min(kinematicsY.velocity + gravity * gameTime.ElapsedGameTime.TotalMilliseconds, MaxSpeedY);

GameUnit delta = velocityY * (float)gameTime.ElapsedGameTime.TotalMilliseconds;
GameUnit delta = kinematicsY.velocity * (float)gameTime.ElapsedGameTime.TotalMilliseconds;

if (delta > 0)
{
CollisionInfo info = GetWallCollisionInfo(map, bottomCollision(delta));

if (info.collided)
{
y = Units.TileToGame(info.row) - (CollisionYTop + CollisionYHeight);
velocityY = 0;
kinematicsY.position = Units.TileToGame(info.row) - (CollisionYTop + CollisionYHeight);
kinematicsY.velocity = 0;
OnGround = true;
}
else
{
y += delta;
kinematicsY.position += delta;
OnGround = false;
}

info = GetWallCollisionInfo(map, TopCollision(0));

if (info.collided)
{
y = Units.TileToGame(info.row) + CollisionYHeight;
particleTools.FrontSystem.AddNewParticle(new HeadBumpParticle(particleTools.Content, CenterX, y + CollisionYTop));
kinematicsY.position = Units.TileToGame(info.row) + CollisionYHeight;
particleTools.FrontSystem.AddNewParticle(new HeadBumpParticle(particleTools.Content, CenterX, kinematicsY.position + CollisionYTop));
}
}
else
Expand All @@ -501,21 +498,21 @@ public void UpdateY(GameTime gameTime, Map map, ParticleTools particleTools)

if (info.collided)
{
y = Units.TileToGame(info.row) + CollisionYHeight;
particleTools.FrontSystem.AddNewParticle(new HeadBumpParticle(particleTools.Content, CenterX, y + CollisionYTop));
velocityY = 0;
kinematicsY.position = Units.TileToGame(info.row) + CollisionYHeight;
particleTools.FrontSystem.AddNewParticle(new HeadBumpParticle(particleTools.Content, CenterX, kinematicsY.position + CollisionYTop));
kinematicsY.velocity = 0;
}
else
{
y += delta;
kinematicsY.position += delta;
OnGround = false;
}

info = GetWallCollisionInfo(map, bottomCollision(0));

if (info.collided)
{
y = Units.TileToGame(info.row) - (CollisionYTop + CollisionYHeight);
kinematicsY.position = Units.TileToGame(info.row) - (CollisionYTop + CollisionYHeight);
OnGround = true;
}
}
Expand Down Expand Up @@ -588,8 +585,8 @@ public void Draw(SpriteBatch spriteBatch)
{
if (SpriteIsVisible())
{
polarStar.Draw(spriteBatch, horizontalFacing, VerticalFacing, GunUp, x, y);
sprites[SpriteState].Draw(spriteBatch, x, y);
polarStar.Draw(spriteBatch, horizontalFacing, VerticalFacing, GunUp, kinematicsX.position, kinematicsY.position);
sprites[SpriteState].Draw(spriteBatch, kinematicsX.position, kinematicsY.position);
}
}

Expand All @@ -608,7 +605,7 @@ public void StartJump()
jumpActive = true;
if (OnGround)
{
velocityY = -JumpSpeed;
kinematicsY.velocity = -JumpSpeed;
}
}

Expand All @@ -619,7 +616,7 @@ public void StopJump()

public void StartFire(ParticleTools particleTools)
{
polarStar.StartFire(x, y, horizontalFacing, VerticalFacing, GunUp, particleTools);
polarStar.StartFire(kinematicsX.position, kinematicsY.position, horizontalFacing, VerticalFacing, GunUp, particleTools);
}

public void StopFire()
Expand All @@ -635,7 +632,7 @@ public void TakeDamage(HPUnit damage)
}
playerHealth.health.TakeDamage(damage);
damageText.Damage = damage;
velocityY = Math.Min(velocityY, -ShortJumpSpeed);
kinematicsY.velocity = Math.Min(kinematicsY.velocity, -ShortJumpSpeed);
invincibleTimer.Reset();
}

Expand Down

0 comments on commit 58734c0

Please sign in to comment.