Compare commits

...

3 Commits

14 changed files with 57 additions and 49 deletions

View File

@ -4,7 +4,7 @@ using System;
// Good background reading, eventually: // Good background reading, eventually:
// https://gamasutra.com/blogs/ItayKeren/20150511/243083/Scroll_Back_The_Theory_and_Practice_of_Cameras_in_SideScrollers.php // https://gamasutra.com/blogs/ItayKeren/20150511/243083/Scroll_Back_The_Theory_and_Practice_of_Cameras_in_SideScrollers.php
namespace SemiColinGames { namespace SemiColinGames {
class Camera { public class Camera {
// Screen size in pixels is 1920x1080 divided by 4. // Screen size in pixels is 1920x1080 divided by 4.
private Rectangle bbox = new Rectangle(0, 0, 480, 270); private Rectangle bbox = new Rectangle(0, 0, 480, 270);
public int Width { get => bbox.Width; } public int Width { get => bbox.Width; }

View File

@ -1,7 +1,7 @@
using System; using System;
namespace SemiColinGames { namespace SemiColinGames {
class Clock { public class Clock {
public static void AddModelTime(double seconds) { public static void AddModelTime(double seconds) {
ModelTime += TimeSpan.FromSeconds(seconds); ModelTime += TimeSpan.FromSeconds(seconds);
} }

View File

@ -3,7 +3,7 @@ using Microsoft.Xna.Framework.Graphics;
using System.Collections.Generic; using System.Collections.Generic;
namespace SemiColinGames { namespace SemiColinGames {
static class Debug { public static class Debug {
struct DebugRect { struct DebugRect {
public Rectangle Rect; public Rectangle Rect;
public Color Color; public Color Color;

View File

@ -7,7 +7,7 @@ using System.IO;
// Methods are ordered alphabetically by type name. // Methods are ordered alphabetically by type name.
namespace SemiColinGames { namespace SemiColinGames {
static class ExtensionMethods { public static class ExtensionMethods {
// ContentManager // ContentManager
public static string LoadString(this ContentManager content, string path) { public static string LoadString(this ContentManager content, string path) {
string fullPath = Path.Combine(content.RootDirectory, path); string fullPath = Path.Combine(content.RootDirectory, path);

View File

@ -1,5 +1,4 @@
using System; using System.Collections.Generic;
using System.Collections.Generic;
namespace SemiColinGames { namespace SemiColinGames {
public interface IState<T> { public interface IState<T> {

View File

@ -1,7 +1,7 @@
using System; using System;
namespace SemiColinGames { namespace SemiColinGames {
class FpsCounter { public class FpsCounter {
private readonly int[] frameTimes = new int[60]; private readonly int[] frameTimes = new int[60];
private double fps = 0; private double fps = 0;
private int idx = 0; private int idx = 0;

View File

@ -2,7 +2,7 @@
using System; using System;
namespace SemiColinGames { namespace SemiColinGames {
class Line { public class Line {
public static Point[] Rasterize(Point p1, Point p2) { public static Point[] Rasterize(Point p1, Point p2) {
return Line.Rasterize(p1.X, p1.Y, p2.X, p2.Y); return Line.Rasterize(p1.X, p1.Y, p2.X, p2.Y);
} }

View File

@ -3,7 +3,7 @@ using Microsoft.Xna.Framework.Graphics;
using System; using System;
namespace SemiColinGames { namespace SemiColinGames {
class LinesOfSight : IDisposable { public sealed class LinesOfSight : IDisposable {
const int NUM_EDGE_VERTICES = 60; const int NUM_EDGE_VERTICES = 60;

View File

@ -4,7 +4,7 @@ using Microsoft.Xna.Framework.Graphics;
using System; using System;
namespace SemiColinGames { namespace SemiColinGames {
class Scene : IDisposable { public sealed class Scene : IDisposable {
const float DESIRED_ASPECT_RATIO = 1920.0f / 1080.0f; const float DESIRED_ASPECT_RATIO = 1920.0f / 1080.0f;
Color backgroundColor = Color.CornflowerBlue; Color backgroundColor = Color.CornflowerBlue;
@ -56,7 +56,7 @@ namespace SemiColinGames {
GC.SuppressFinalize(this); GC.SuppressFinalize(this);
} }
public void Draw(bool isRunningSlowly, World world, LinesOfSight linesOfSight, bool paused) { public void Draw(bool isRunningSlowly, World world, bool paused) {
graphics.SetRenderTarget(null); graphics.SetRenderTarget(null);
graphics.Clear(backgroundColor); graphics.Clear(backgroundColor);
@ -87,7 +87,7 @@ namespace SemiColinGames {
// Draw lines of sight. // Draw lines of sight.
basicEffect.Projection = camera.Projection; basicEffect.Projection = camera.Projection;
if (Debug.Enabled) { if (Debug.Enabled) {
linesOfSight.Draw(graphics, basicEffect); world.LinesOfSight.Draw(graphics, basicEffect);
} }
// Set up transformation matrix for drawing world objects. // Set up transformation matrix for drawing world objects.

View File

@ -23,7 +23,6 @@ namespace SemiColinGames {
Scene scene; Scene scene;
World world; World world;
LinesOfSight linesOfSight;
Camera camera = new Camera(); Camera camera = new Camera();
public SneakGame() { public SneakGame() {
@ -61,14 +60,13 @@ namespace SemiColinGames {
SoundEffects.Load(Content); SoundEffects.Load(Content);
Textures.Load(Content); Textures.Load(Content);
Sprites.Load(Content); Sprites.Load(Content);
// TODO: move this into World.
linesOfSight = new LinesOfSight(GraphicsDevice);
LoadLevel(); LoadLevel();
} }
private void LoadLevel() { private void LoadLevel() {
camera = new Camera(); camera = new Camera();
world = new World(Content.LoadString("levels/demo.json")); world?.Dispose();
world = new World(GraphicsDevice, Content.LoadString("levels/demo.json"));
scene?.Dispose(); scene?.Dispose();
scene = new Scene(GraphicsDevice, camera); scene = new Scene(GraphicsDevice, camera);
@ -114,7 +112,6 @@ namespace SemiColinGames {
float modelTime = (float) gameTime.ElapsedGameTime.TotalSeconds; float modelTime = (float) gameTime.ElapsedGameTime.TotalSeconds;
Clock.AddModelTime(modelTime); Clock.AddModelTime(modelTime);
world.Update(modelTime, input); world.Update(modelTime, input);
linesOfSight.Update(world.Player, world.CollisionTargets);
camera.Update(world.Player.Position, world.Width); camera.Update(world.Player.Position, world.Width);
} }
@ -137,7 +134,7 @@ namespace SemiColinGames {
Debug.SetFpsText(fpsText); Debug.SetFpsText(fpsText);
scene.Draw(gameTime.IsRunningSlowly, world, linesOfSight, paused); scene.Draw(gameTime.IsRunningSlowly, world, paused);
base.Draw(gameTime); base.Draw(gameTime);
drawTimer.Stop(); drawTimer.Stop();

View File

@ -4,7 +4,7 @@ using Newtonsoft.Json.Linq;
using System.Collections.Generic; using System.Collections.Generic;
namespace SemiColinGames { namespace SemiColinGames {
static class Sprites { public static class Sprites {
public static Sprite Executioner; public static Sprite Executioner;
public static Sprite Ninja; public static Sprite Ninja;
@ -45,7 +45,7 @@ namespace SemiColinGames {
} }
} }
class Sprite { public class Sprite {
public readonly TextureRef Texture; public readonly TextureRef Texture;
private readonly Dictionary<string, SpriteAnimation> animations; private readonly Dictionary<string, SpriteAnimation> animations;

View File

@ -2,7 +2,7 @@
using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Graphics;
namespace SemiColinGames { namespace SemiColinGames {
static class Text { public static class Text {
// Outlined text in black. // Outlined text in black.
public static void DrawOutlined( public static void DrawOutlined(
SpriteBatch spriteBatch, SpriteFont font, string text, Vector2 position, Color color) { SpriteBatch spriteBatch, SpriteFont font, string text, Vector2 position, Color color) {

View File

@ -2,7 +2,7 @@
using System.Diagnostics; using System.Diagnostics;
namespace SemiColinGames { namespace SemiColinGames {
class Timer { public class Timer {
private readonly Stopwatch stopwatch = new Stopwatch(); private readonly Stopwatch stopwatch = new Stopwatch();
private readonly double targetTime; private readonly double targetTime;

View File

@ -3,35 +3,10 @@ using Microsoft.Xna.Framework.Graphics;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
namespace SemiColinGames { namespace SemiColinGames {
public class Tile { public sealed class World : IDisposable {
public static int CompareByX(Tile t1, Tile t2) {
return t1.Position.X.CompareTo(t2.Position.X);
}
private TextureRef texture;
private Rectangle textureSource;
public Tile(TextureRef texture, Rectangle textureSource, Rectangle position, bool isHazard) {
Position = position;
this.texture = texture;
this.textureSource = textureSource;
IsHazard = isHazard;
}
public Rectangle Position { get; private set; }
public bool IsHazard = false;
public void Draw(SpriteBatch spriteBatch) {
spriteBatch.Draw(
texture.Get, Position.Location.ToVector2(), textureSource, Color.White);
}
}
public class World {
public const int TileSize = 16; public const int TileSize = 16;
@ -46,6 +21,7 @@ namespace SemiColinGames {
public Player Player { get; private set; } public Player Player { get; private set; }
public AABB[] CollisionTargets { get; } public AABB[] CollisionTargets { get; }
public LinesOfSight LinesOfSight { get; private set; }
// Size of World in pixels. // Size of World in pixels.
public int Width { public int Width {
@ -56,7 +32,9 @@ namespace SemiColinGames {
get { return gridHeight * TileSize; } get { return gridHeight * TileSize; }
} }
public World(string json) { public World(GraphicsDevice graphics, string json) {
LinesOfSight = new LinesOfSight(graphics);
JObject root = JObject.Parse(json); JObject root = JObject.Parse(json);
List<Tile> hazardTiles = new List<Tile>(); List<Tile> hazardTiles = new List<Tile>();
@ -111,6 +89,15 @@ namespace SemiColinGames {
new Vector2(Width + 1, 0), new Vector2(1, float.MaxValue)); new Vector2(Width + 1, 0), new Vector2(1, float.MaxValue));
} }
~World() {
Dispose();
}
public void Dispose() {
LinesOfSight.Dispose();
GC.SuppressFinalize(this);
}
private List<Tile> ParseLayer(JToken layer) { private List<Tile> ParseLayer(JToken layer) {
string layerName = layer.SelectToken("name").Value<string>(); string layerName = layer.SelectToken("name").Value<string>();
@ -174,6 +161,7 @@ namespace SemiColinGames {
if (Player.Health <= 0) { if (Player.Health <= 0) {
Reset(); Reset();
} }
LinesOfSight.Update(Player, CollisionTargets);
} }
// Draws everything that's behind the player, from back to front. // Draws everything that's behind the player, from back to front.
@ -193,4 +181,28 @@ namespace SemiColinGames {
} }
} }
} }
public class Tile {
public static int CompareByX(Tile t1, Tile t2) {
return t1.Position.X.CompareTo(t2.Position.X);
}
private readonly TextureRef texture;
private readonly Rectangle textureSource;
public Tile(TextureRef texture, Rectangle textureSource, Rectangle position, bool isHazard) {
Position = position;
this.texture = texture;
this.textureSource = textureSource;
IsHazard = isHazard;
}
public Rectangle Position { get; private set; }
public bool IsHazard = false;
public void Draw(SpriteBatch spriteBatch) {
spriteBatch.Draw(
texture.Get, Position.Location.ToVector2(), textureSource, Color.White);
}
}
} }