Skip to content

Commit 25dd095

Browse files
committed
Replace the static boss sprite by an animated one using Spriter.
1 parent 67de4ea commit 25dd095

File tree

13 files changed

+238
-39
lines changed

13 files changed

+238
-39
lines changed

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -250,3 +250,5 @@ paket-files/
250250
# JetBrains Rider
251251
.idea/
252252
*.sln.iml
253+
254+
**.autosave.scml

Xmas-Hell/Xmas-Hell/Content/Content.mgcb

+18
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#-------------------------------- References --------------------------------#
1212

1313
/reference:..\..\MonoGame.Extended\Source\MonoGame.Extended.Content.Pipeline\bin\MonoGame.Extended.Content.Pipeline.dll
14+
/reference:..\..\SpriterDotNet\SpriterDotNet.MonoGame.Importer\bin\Release\SpriterDotNet.MonoGame.Importer.dll
1415

1516
#---------------------------------- Content ---------------------------------#
1617

@@ -103,3 +104,20 @@
103104
/processorParam:TextureFormat=Color
104105
/build:Graphics/Pictures/pixel.png
105106

107+
#begin Graphics/Sprites/Bosses/XmasBall/xmas-ball.png
108+
/importer:TextureImporter
109+
/processor:TextureProcessor
110+
/processorParam:ColorKeyColor=255,0,255,255
111+
/processorParam:ColorKeyEnabled=True
112+
/processorParam:GenerateMipmaps=False
113+
/processorParam:PremultiplyAlpha=True
114+
/processorParam:ResizeToPowerOfTwo=False
115+
/processorParam:MakeSquare=False
116+
/processorParam:TextureFormat=Color
117+
/build:Graphics/Sprites/Bosses/XmasBall/xmas-ball.png
118+
119+
#begin Graphics/Sprites/Bosses/XmasBall/spriter.scml
120+
/importer:SpriterImporter
121+
/processor:PassThroughProcessor
122+
/build:Graphics/Sprites/Bosses/XmasBall/spriter.scml
123+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<spriter_data scml_version="1.0" generator="BrashMonkey Spriter" generator_version="r9">
3+
<folder id="0">
4+
<file id="0" name="xmas-ball.png" width="258" height="258" pivot_x="0.5" pivot_y="0.4"/>
5+
</folder>
6+
<entity id="0" name="Xmas-Ball">
7+
<animation id="0" name="Idle" length="1000" interval="100">
8+
<mainline>
9+
<key id="0">
10+
<object_ref id="0" timeline="0" key="0" z_index="0"/>
11+
</key>
12+
<key id="1" time="124">
13+
<object_ref id="0" timeline="0" key="1" z_index="0"/>
14+
</key>
15+
<key id="2" time="250">
16+
<object_ref id="0" timeline="0" key="2" z_index="0"/>
17+
</key>
18+
<key id="3" time="383">
19+
<object_ref id="0" timeline="0" key="3" z_index="0"/>
20+
</key>
21+
<key id="4" time="500">
22+
<object_ref id="0" timeline="0" key="4" z_index="0"/>
23+
</key>
24+
<key id="5" time="634">
25+
<object_ref id="0" timeline="0" key="5" z_index="0"/>
26+
</key>
27+
<key id="6" time="750">
28+
<object_ref id="0" timeline="0" key="6" z_index="0"/>
29+
</key>
30+
<key id="7" time="886">
31+
<object_ref id="0" timeline="0" key="7" z_index="0"/>
32+
</key>
33+
</mainline>
34+
<timeline id="0" name="xmas-ball_000">
35+
<key id="0" spin="-1">
36+
<object folder="0" file="0" x="1" angle="0"/>
37+
</key>
38+
<key id="1" time="124">
39+
<object folder="0" file="0" x="1" y="4.96" angle="350"/>
40+
</key>
41+
<key id="2" time="250">
42+
<object folder="0" file="0" x="1" y="10" angle="0"/>
43+
</key>
44+
<key id="3" time="383" spin="-1">
45+
<object folder="0" file="0" x="1" y="4.68" angle="10"/>
46+
</key>
47+
<key id="4" time="500" spin="-1">
48+
<object folder="0" file="0" x="1" angle="0"/>
49+
</key>
50+
<key id="5" time="634">
51+
<object folder="0" file="0" x="1" y="-5.36" angle="350"/>
52+
</key>
53+
<key id="6" time="750">
54+
<object folder="0" file="0" x="1" y="-10" angle="0"/>
55+
</key>
56+
<key id="7" time="886" spin="-1">
57+
<object folder="0" file="0" x="1" y="-4.56" angle="10"/>
58+
</key>
59+
</timeline>
60+
</animation>
61+
</entity>
62+
</spriter_data>
Loading

Xmas-Hell/Xmas-Hell/Entities/Boss.cs

+53-15
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
1-
using System;
21
using System.Collections.Generic;
32
using System.Linq;
4-
using System.Text;
5-
6-
using Android.App;
7-
using Android.Content;
8-
using Android.OS;
9-
using Android.Runtime;
10-
using Android.Views;
11-
using Android.Widget;
123
using Microsoft.Xna.Framework;
4+
using Microsoft.Xna.Framework.Audio;
5+
using Microsoft.Xna.Framework.Graphics;
136
using MonoGame.Extended.Sprites;
7+
using SpriterDotNet;
8+
using SpriterDotNet.MonoGame;
9+
using SpriterDotNet.Providers;
10+
using Sprite = MonoGame.Extended.Sprites.Sprite;
11+
using SpriterSprite = SpriterDotNet.MonoGame.Sprite;
12+
using Xmas_Hell.Spriter;
1413

1514
namespace Xmas_Hell.Entities
1615
{
@@ -21,31 +20,70 @@ class Boss
2120
private float _initialLife;
2221
private float _life;
2322

23+
// Spriter
24+
25+
private static readonly Config config = new Config
26+
{
27+
MetadataEnabled = true,
28+
EventsEnabled = true,
29+
PoolingEnabled = true,
30+
TagsEnabled = true,
31+
VarsEnabled = true,
32+
SoundsEnabled = false
33+
};
34+
35+
private IList<MonoGameAnimator> animators = new List<MonoGameAnimator>();
36+
private MonoGameAnimator currentAnimator;
37+
2438
public Boss(XmasHell game, Vector2 position, float initialLife)
2539
{
2640
_game = game;
27-
_sprite = new Sprite(Assets.GetTexture2D("Graphics/Sprites/boss"))
28-
{
29-
Position = position
30-
};
3141

3242
_initialLife = initialLife;
3343
_life = initialLife;
44+
45+
//_sprite = new Sprite(Assets.GetTexture2D("Graphics/Sprites/boss"))
46+
//{
47+
// Position = position
48+
//};
49+
50+
// Spriter
51+
DefaultProviderFactory<SpriterSprite, SoundEffect> factory = new DefaultProviderFactory<SpriterSprite, SoundEffect>(config, true);
52+
53+
SpriterContentLoader loader = new SpriterContentLoader(_game.Content, "Graphics/Sprites/Bosses/XmasBall/spriter");
54+
loader.Fill(factory);
55+
56+
foreach (SpriterEntity entity in loader.Spriter.Entities)
57+
{
58+
var animator = new MonoGameDebugAnimator(entity, _game.GraphicsDevice, factory);
59+
animators.Add(animator);
60+
animator.Position = position;
61+
}
62+
63+
currentAnimator = animators.First();
64+
currentAnimator.EventTriggered += CurrentAnimator_EventTriggered;
65+
}
66+
67+
private void CurrentAnimator_EventTriggered(string obj)
68+
{
69+
System.Diagnostics.Debug.WriteLine(obj);
3470
}
3571

3672
public void Update(GameTime gameTime)
3773
{
3874
_life -= 0.01f;
75+
76+
currentAnimator.Update(gameTime.ElapsedGameTime.Milliseconds);
3977
}
4078

4179
public void Draw(GameTime gameTime)
4280
{
43-
_sprite.Draw(_game.SpriteBatch);
81+
currentAnimator.Draw(_game.SpriteBatch);
4482

4583
var percent = _life / _initialLife;
4684
_game.SpriteBatch.Draw(
4785
Assets.GetTexture2D("Graphics/Pictures/pixel"),
48-
new Rectangle(0, 0, (int)(percent * Config.VirtualResolution.X), 20),
86+
new Rectangle(0, 0, (int)(percent * GameConfig.VirtualResolution.X), 20),
4987
Color.Black
5088
);
5189
}

Xmas-Hell/Xmas-Hell/Entities/Player.cs

+9-9
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ public Player(XmasHell game)
2727
{
2828
Origin = new Vector2(playerTexture.Width / 2f, playerTexture.Height / 2f),
2929
Position = new Vector2(
30-
Config.VirtualResolution.X / 2f,
31-
Config.VirtualResolution.Y - 150
30+
GameConfig.VirtualResolution.X / 2f,
31+
GameConfig.VirtualResolution.Y - 150
3232
),
3333
Scale = Vector2.One
3434
};
@@ -56,7 +56,7 @@ private void UpdatePosition(GameTime gameTime)
5656
var currentTouchPosition = _game.ViewportAdapter.PointToScreen(currentTouchState[0].Position.ToPoint());
5757
var touchDelta = (currentTouchPosition - _initialTouchPosition).ToVector2();
5858

59-
_sprite.Position = _initialSpritePosition + (touchDelta * Config.PlayerMoveSensitivity);
59+
_sprite.Position = _initialSpritePosition + (touchDelta * GameConfig.PlayerMoveSensitivity);
6060
}
6161
else
6262
{
@@ -71,13 +71,13 @@ private void UpdateShoot(GameTime gameTime)
7171
_bulletFrequence -= gameTime.ElapsedGameTime;
7272
else
7373
{
74-
_bulletFrequence = TimeSpan.FromTicks(Config.PlayerShootFrequency.Ticks);
74+
_bulletFrequence = TimeSpan.FromTicks(GameConfig.PlayerShootFrequency.Ticks);
7575

76-
var bullet1 = new PlayerBullet(_game, _sprite.Position, -MathHelper.PiOver4 / 4f, Config.PlayerBulletSpeed);
77-
var bullet2 = new PlayerBullet(_game, _sprite.Position, -MathHelper.PiOver4 / 8f, Config.PlayerBulletSpeed);
78-
var bullet3 = new PlayerBullet(_game, _sprite.Position, 0f, Config.PlayerBulletSpeed);
79-
var bullet4 = new PlayerBullet(_game, _sprite.Position, MathHelper.PiOver4 / 8f, Config.PlayerBulletSpeed);
80-
var bullet5 = new PlayerBullet(_game, _sprite.Position, MathHelper.PiOver4 / 4f, Config.PlayerBulletSpeed);
76+
var bullet1 = new PlayerBullet(_game, _sprite.Position, -MathHelper.PiOver4 / 4f, GameConfig.PlayerBulletSpeed);
77+
var bullet2 = new PlayerBullet(_game, _sprite.Position, -MathHelper.PiOver4 / 8f, GameConfig.PlayerBulletSpeed);
78+
var bullet3 = new PlayerBullet(_game, _sprite.Position, 0f, GameConfig.PlayerBulletSpeed);
79+
var bullet4 = new PlayerBullet(_game, _sprite.Position, MathHelper.PiOver4 / 8f, GameConfig.PlayerBulletSpeed);
80+
var bullet5 = new PlayerBullet(_game, _sprite.Position, MathHelper.PiOver4 / 4f, GameConfig.PlayerBulletSpeed);
8181

8282
_game.GameManager.AddBullet(bullet1);
8383
_game.GameManager.AddBullet(bullet2);

Xmas-Hell/Xmas-Hell/Config.cs renamed to Xmas-Hell/Xmas-Hell/GameConfig.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
namespace Xmas_Hell
55
{
6-
public static class Config
6+
public static class GameConfig
77
{
88
public static Point VirtualResolution = new Point(720, 1280);
99
public static readonly TimeSpan PlayerShootFrequency = TimeSpan.FromMilliseconds(100);

Xmas-Hell/Xmas-Hell/GameManager.cs

+2-10
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,6 @@
1-
using System;
21
using System.Collections.Generic;
32
using System.Linq;
4-
using System.Text;
53

6-
using Android.App;
7-
using Android.Content;
8-
using Android.OS;
9-
using Android.Runtime;
10-
using Android.Views;
11-
using Android.Widget;
124
using Microsoft.Xna.Framework;
135
using Microsoft.Xna.Framework.Graphics;
146
using Xmas_Hell.Entities;
@@ -51,8 +43,8 @@ private void CheckCollision(Bullet bullet)
5143
{
5244
// TODO: Check collision
5345

54-
if (bullet.Position.X < 0 || bullet.Position.X > Config.VirtualResolution.X ||
55-
bullet.Position.Y < 0 || bullet.Position.Y > Config.VirtualResolution.Y)
46+
if (bullet.Position.X < 0 || bullet.Position.X > GameConfig.VirtualResolution.X ||
47+
bullet.Position.Y < 0 || bullet.Position.Y > GameConfig.VirtualResolution.Y)
5648
{
5749
RemoveBullet(bullet);
5850
}

Xmas-Hell/Xmas-Hell/Screens/GameScreen.cs

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1+
using System.Collections.Generic;
12
using Microsoft.Xna.Framework;
23
using Microsoft.Xna.Framework.Graphics;
34
using MonoGame.Extended.Screens;
4-
using MonoGame.Extended.Sprites;
5+
using SpriterDotNet.MonoGame;
56
using Xmas_Hell.Entities;
67

78
namespace Xmas_Hell.Screens
@@ -21,7 +22,7 @@ public override void Initialize()
2122
{
2223
_player = new Player(_game);
2324
var bossPosition = new Vector2(
24-
Config.VirtualResolution.X / 2f,
25+
GameConfig.VirtualResolution.X / 2f,
2526
150f
2627
);
2728
_boss = new Boss(_game, bossPosition, 100);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
using System.Collections.Generic;
2+
using Microsoft.Xna.Framework;
3+
using Microsoft.Xna.Framework.Audio;
4+
using Microsoft.Xna.Framework.Graphics;
5+
using SpriterDotNet;
6+
using SpriterDotNet.MonoGame;
7+
8+
namespace Xmas_Hell.Spriter
9+
{
10+
public class MonoGameDebugAnimator : MonoGameAnimator
11+
{
12+
private IDictionary<string, Sprite> boxTextures = new Dictionary<string, Sprite>();
13+
private Sprite pointTexture;
14+
15+
public MonoGameDebugAnimator(SpriterEntity entity, GraphicsDevice graphicsDevice, IProviderFactory<Sprite, SoundEffect> providerFactory = null) : base(entity, providerFactory)
16+
{
17+
pointTexture = new Sprite { Texture = TextureUtil.CreateCircle(graphicsDevice, 5, Color.Cyan) };
18+
19+
if (entity.ObjectInfos != null)
20+
{
21+
foreach (SpriterObjectInfo objInfo in entity.ObjectInfos)
22+
{
23+
if (objInfo.ObjectType != SpriterObjectType.Box) continue;
24+
boxTextures[objInfo.Name] = new Sprite { Texture = TextureUtil.CreateRectangle(graphicsDevice, (int)objInfo.Width, (int)objInfo.Height, Color.Cyan) };
25+
}
26+
}
27+
}
28+
29+
protected override void ApplyPointTransform(string name, SpriterObject info)
30+
{
31+
if (pointTexture == null) return;
32+
ApplySpriteTransform(pointTexture, info);
33+
}
34+
35+
protected override void ApplyBoxTransform(SpriterObjectInfo objInfo, SpriterObject info)
36+
{
37+
ApplySpriteTransform(boxTextures[objInfo.Name], info);
38+
}
39+
}
40+
}
+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
using System;
2+
using Microsoft.Xna.Framework;
3+
using Microsoft.Xna.Framework.Graphics;
4+
5+
namespace Xmas_Hell.Spriter
6+
{
7+
public static class TextureUtil
8+
{
9+
public static Texture2D CreateCircle(GraphicsDevice graphics, int radius, Color color)
10+
{
11+
int diameter = radius * 2;
12+
Vector2 center = new Vector2(radius, radius);
13+
14+
Texture2D circle = new Texture2D(graphics, diameter, diameter);
15+
Color[] colors = new Color[diameter * diameter];
16+
17+
for (int i = 0; i < colors.Length; i++)
18+
{
19+
int x = (i + 1) % diameter;
20+
int y = (i + 1) / diameter;
21+
Vector2 distance = new Vector2(Math.Abs(center.X - x), Math.Abs(center.Y - y));
22+
colors[i] = distance.Length() > radius ? Color.Transparent : color;
23+
}
24+
25+
circle.SetData<Color>(colors);
26+
return circle;
27+
}
28+
29+
public static Texture2D CreateRectangle(GraphicsDevice graphics, int width, int height, Color color)
30+
{
31+
Texture2D rect = new Texture2D(graphics, width, height);
32+
33+
Color[] data = new Color[width * height];
34+
for (int i = 0; i < data.Length; ++i) data[i] = color;
35+
rect.SetData(data);
36+
37+
return rect;
38+
}
39+
}
40+
}

0 commit comments

Comments
 (0)