Cat is moving!
parent
15612f660a
commit
830891a71e
@ -0,0 +1,69 @@
|
|||||||
|
{
|
||||||
|
"name": "cat",
|
||||||
|
"image": "catsandghosts",
|
||||||
|
"width": 32,
|
||||||
|
"height": 32,
|
||||||
|
"animations": [
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"name": "Idle",
|
||||||
|
"frames": [
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"x": 0,
|
||||||
|
"y": 32,
|
||||||
|
"timer": 0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 2,
|
||||||
|
"name": "Walk X",
|
||||||
|
"frames": [
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"x": 64,
|
||||||
|
"y": 32,
|
||||||
|
"timer": 3
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 2,
|
||||||
|
"x": 32,
|
||||||
|
"y": 32,
|
||||||
|
"timer": 3
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 3,
|
||||||
|
"x": 0,
|
||||||
|
"y": 32,
|
||||||
|
"timer": 3
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 3,
|
||||||
|
"name": "Walk Y",
|
||||||
|
"frames": [
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"x": 32,
|
||||||
|
"y": 64,
|
||||||
|
"timer": 3
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 2,
|
||||||
|
"x": 64,
|
||||||
|
"y": 64,
|
||||||
|
"timer": 3
|
||||||
|
}
|
||||||
|
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 4,
|
||||||
|
"name": "Scared",
|
||||||
|
"frames": [
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,78 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
namespace SeeNoEvil.Character {
|
||||||
|
public class AnimationController {
|
||||||
|
public string Name {get; private set;}
|
||||||
|
public string Image {get; private set;}
|
||||||
|
public int Width {get; private set;}
|
||||||
|
public int Height {get; private set;}
|
||||||
|
public Dictionary<int, Animation> Animations {get; private set;}
|
||||||
|
private Animation CurrentAnimation;
|
||||||
|
public Frame CurrentFrame =>
|
||||||
|
CurrentAnimation.GetFrame();
|
||||||
|
|
||||||
|
public AnimationController(AnimationSetModel model) {
|
||||||
|
Name = model.Name;
|
||||||
|
Image = model.Image;
|
||||||
|
Width = model.Width;
|
||||||
|
Height = model.Height;
|
||||||
|
Animations = model.Animations.Aggregate(new Dictionary<int, Animation>(),
|
||||||
|
(animations, animation) => {
|
||||||
|
animations.Add(animation.Id, new Animation(animation));
|
||||||
|
return animations;
|
||||||
|
});
|
||||||
|
ChangeAnimation(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ChangeAnimation(int animationId) {
|
||||||
|
if(Animations.TryGetValue(animationId, out CurrentAnimation))
|
||||||
|
CurrentAnimation.Reset();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Animation {
|
||||||
|
public int Id {get; set;}
|
||||||
|
public string Name {get; set;}
|
||||||
|
public FrameCollection Frames {get; set;}
|
||||||
|
private int TotalFrames;
|
||||||
|
private Frame CurrentFrame;
|
||||||
|
private int CurrentFrameId;
|
||||||
|
|
||||||
|
public Animation(AnimationModel model) {
|
||||||
|
Id = model.Id;
|
||||||
|
Name = model.Name;
|
||||||
|
Frames = new FrameCollection(model.Frames);
|
||||||
|
TotalFrames = model.Frames.Count();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Reset() {
|
||||||
|
CurrentFrameId = 1;
|
||||||
|
CurrentFrame = Frames[CurrentFrameId];
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO Is this super fuckin ugly? Seems like it
|
||||||
|
public Frame GetFrame() {
|
||||||
|
Frame result = CurrentFrame;
|
||||||
|
if(CurrentFrame.Timer == 1) {
|
||||||
|
CurrentFrameId = CurrentFrameId == TotalFrames ? 1 : CurrentFrameId + 1;
|
||||||
|
CurrentFrame = Frames[CurrentFrameId];
|
||||||
|
} else if(CurrentFrame.Timer > 1) CurrentFrame.Timer--;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class FrameCollection {
|
||||||
|
private IEnumerable<Frame> Frames;
|
||||||
|
|
||||||
|
public Frame this[int i] {
|
||||||
|
get {
|
||||||
|
return Frames.Where(item => item.Id == i).First();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public FrameCollection(IEnumerable<Frame> frames) {
|
||||||
|
Frames = frames;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,24 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace SeeNoEvil.Character {
|
||||||
|
public struct AnimationSetModel {
|
||||||
|
public string Name {get; set;}
|
||||||
|
public string Image {get; set;}
|
||||||
|
public int Width {get; set;}
|
||||||
|
public int Height {get; set;}
|
||||||
|
public IEnumerable<AnimationModel> Animations {get; set;}
|
||||||
|
}
|
||||||
|
|
||||||
|
public struct AnimationModel {
|
||||||
|
public int Id {get; set;}
|
||||||
|
public string Name {get; set;}
|
||||||
|
public IEnumerable<Frame> Frames{get; set;}
|
||||||
|
}
|
||||||
|
|
||||||
|
public struct Frame {
|
||||||
|
public int Id {get; set;}
|
||||||
|
public int X {get; set;}
|
||||||
|
public int Y {get; set;}
|
||||||
|
public int Timer {get; set;}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,15 @@
|
|||||||
|
using System.IO;
|
||||||
|
using System.Text.Json;
|
||||||
|
|
||||||
|
namespace SeeNoEvil.Character {
|
||||||
|
public static class AnimationParser {
|
||||||
|
public static AnimationSetModel ReadAnimationJson(string fileName) {
|
||||||
|
StreamReader streamReader = File.OpenText(fileName);
|
||||||
|
string text = streamReader.ReadToEnd();
|
||||||
|
var options = new JsonSerializerOptions {
|
||||||
|
PropertyNameCaseInsensitive = true,
|
||||||
|
};
|
||||||
|
return JsonSerializer.Deserialize<AnimationSetModel>(text, options);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,39 @@
|
|||||||
|
using Microsoft.Xna.Framework;
|
||||||
|
|
||||||
|
namespace SeeNoEvil.Character {
|
||||||
|
public enum Direction {
|
||||||
|
Up,
|
||||||
|
Down,
|
||||||
|
Left,
|
||||||
|
Right
|
||||||
|
}
|
||||||
|
public class Cat : Character {
|
||||||
|
private Direction Facing;
|
||||||
|
public Cat(Vector2 position, Direction facing) : base(position) {
|
||||||
|
AnimationController = new AnimationController(AnimationParser.ReadAnimationJson("SeeNoEvil/Animation/cat.json"));
|
||||||
|
Width = AnimationController.Width;
|
||||||
|
Height = AnimationController.Height;
|
||||||
|
Facing = facing;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Move(Direction direction) {
|
||||||
|
int x = 0, y = 0;
|
||||||
|
switch(direction) {
|
||||||
|
case Direction.Up:
|
||||||
|
y = -1;
|
||||||
|
break;
|
||||||
|
case Direction.Down:
|
||||||
|
y = 1;
|
||||||
|
break;
|
||||||
|
case Direction.Left:
|
||||||
|
x = -1;
|
||||||
|
break;
|
||||||
|
case Direction.Right:
|
||||||
|
x = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Destination = Vector2.Add(Position, new Vector2(Width*x, Height*y));
|
||||||
|
Velocity = new Vector2(x, y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,46 @@
|
|||||||
|
using Microsoft.Xna.Framework;
|
||||||
|
using Microsoft.Xna.Framework.Content;
|
||||||
|
using Microsoft.Xna.Framework.Graphics;
|
||||||
|
|
||||||
|
namespace SeeNoEvil.Character {
|
||||||
|
public class Character {
|
||||||
|
protected Vector2 Destination {get; set;}
|
||||||
|
protected Vector2 Velocity {get; set;}
|
||||||
|
protected Vector2 Position {get; private set;}
|
||||||
|
protected bool Transform =>
|
||||||
|
!Destination.Equals(Vector2.Zero) &&
|
||||||
|
!Velocity.Equals(Vector2.Zero) &&
|
||||||
|
!Position.Equals(Destination);
|
||||||
|
|
||||||
|
protected AnimationController AnimationController;
|
||||||
|
protected Texture2D SpriteSheet;
|
||||||
|
protected int Width;
|
||||||
|
protected int Height;
|
||||||
|
|
||||||
|
public Character(Vector2 position) {
|
||||||
|
Position = position;
|
||||||
|
Destination = Vector2.Zero;
|
||||||
|
Velocity = Vector2.Zero;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Load(ContentManager content) {
|
||||||
|
SpriteSheet = content.Load<Texture2D>(AnimationController.Image);
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO Do I want to move every frame?
|
||||||
|
public void Update() {
|
||||||
|
if(Transform)
|
||||||
|
Position = Vector2.Add(Position, Velocity);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Draw(SpriteBatch spriteBatch) {
|
||||||
|
Frame currentFrame = AnimationController.CurrentFrame;
|
||||||
|
Rectangle srcRectangle = new Rectangle(currentFrame.X,
|
||||||
|
currentFrame.Y,
|
||||||
|
AnimationController.Width,
|
||||||
|
AnimationController.Height);
|
||||||
|
spriteBatch.Draw(SpriteSheet, Position, srcRectangle, Color.White);
|
||||||
|
// spriteBatch.Draw(SpriteSheet, Position, Color.White);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue