Add simple NPC.
GitOrigin-RevId: 47cd7abaf80d7ced14d0b4b92390c8c0edddae1c
This commit is contained in:
parent
d9e9fcf9a2
commit
02b1dd4874
@ -42,7 +42,7 @@ namespace SemiColinGames {
|
|||||||
keyboard.IsKeyDown(Keys.K);
|
keyboard.IsKeyDown(Keys.K);
|
||||||
|
|
||||||
Debug = gamePad.IsButtonDown(Buttons.Back) || keyboard.IsKeyDown(Keys.OemMinus);
|
Debug = gamePad.IsButtonDown(Buttons.Back) || keyboard.IsKeyDown(Keys.OemMinus);
|
||||||
Pause = gamePad.IsButtonDown(Buttons.Start) || keyboard.IsKeyDown(Keys.Pause);
|
Pause = gamePad.IsButtonDown(Buttons.Start) || keyboard.IsKeyDown(Keys.P);
|
||||||
|
|
||||||
// Then potential motion directions. If the player attempts to input opposite directions at
|
// Then potential motion directions. If the player attempts to input opposite directions at
|
||||||
// once (up & down or left & right), those inputs cancel out, resulting in no motion.
|
// once (up & down or left & right), those inputs cancel out, resulting in no motion.
|
||||||
|
46
Shared/NPC.cs
Normal file
46
Shared/NPC.cs
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
using Microsoft.Xna.Framework;
|
||||||
|
using Microsoft.Xna.Framework.Graphics;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace SemiColinGames {
|
||||||
|
class NPC {
|
||||||
|
private Point position;
|
||||||
|
|
||||||
|
private const int spriteWidth = 96;
|
||||||
|
private const int spriteHeight = 81;
|
||||||
|
private const int spriteCenterYOffset = 3;
|
||||||
|
|
||||||
|
public NPC(Point position) {
|
||||||
|
this.position = position;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int Facing { get; private set; } = 1;
|
||||||
|
|
||||||
|
public void Update(float modelTime) {
|
||||||
|
if (Facing == 1 && position.X > 16 * 39) {
|
||||||
|
Facing = -1;
|
||||||
|
}
|
||||||
|
if (Facing == -1 && position.X < 16 * 24) {
|
||||||
|
Facing = 1;
|
||||||
|
}
|
||||||
|
position.X += (int) (120 * Facing * modelTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
private int SpriteIndex() {
|
||||||
|
int frameNum = (int) Clock.ModelTime.TotalMilliseconds / 125 % 4;
|
||||||
|
return 35 + frameNum;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Draw(SpriteBatch spriteBatch) {
|
||||||
|
int index = SpriteIndex();
|
||||||
|
Rectangle textureSource = new Rectangle(index * spriteWidth, 0, spriteWidth, spriteHeight);
|
||||||
|
Vector2 spriteCenter = new Vector2(spriteWidth / 2, spriteHeight / 2 + spriteCenterYOffset);
|
||||||
|
SpriteEffects effect = Facing == 1 ?
|
||||||
|
SpriteEffects.None : SpriteEffects.FlipHorizontally;
|
||||||
|
Color color = Color.White;
|
||||||
|
spriteBatch.Draw(Textures.Executioner.Get, position.ToVector2(), textureSource, color, 0f,
|
||||||
|
spriteCenter, Vector2.One, effect, 0f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -263,7 +263,7 @@ namespace SemiColinGames {
|
|||||||
Rectangle textureSource = new Rectangle(index * spriteWidth, 0, spriteWidth, spriteHeight);
|
Rectangle textureSource = new Rectangle(index * spriteWidth, 0, spriteWidth, spriteHeight);
|
||||||
Vector2 spriteCenter = new Vector2(spriteWidth / 2, spriteHeight / 2 + spriteCenterYOffset);
|
Vector2 spriteCenter = new Vector2(spriteWidth / 2, spriteHeight / 2 + spriteCenterYOffset);
|
||||||
SpriteEffects effect = Facing == 1 ?
|
SpriteEffects effect = Facing == 1 ?
|
||||||
SpriteEffects.FlipHorizontally : SpriteEffects.None;
|
SpriteEffects.None : SpriteEffects.FlipHorizontally;
|
||||||
Color color = Color.White;
|
Color color = Color.White;
|
||||||
if (invincibilityTime > 0 && invincibilityTime % 0.2f > 0.1f) {
|
if (invincibilityTime > 0 && invincibilityTime % 0.2f > 0.1f) {
|
||||||
color = new Color(0.5f, 0.5f, 0.5f, 0.5f);
|
color = new Color(0.5f, 0.5f, 0.5f, 0.5f);
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="$(MSBuildThisFileDirectory)Camera.cs" />
|
<Compile Include="$(MSBuildThisFileDirectory)Camera.cs" />
|
||||||
<Compile Include="$(MSBuildThisFileDirectory)ExtensionMethods.cs" />
|
<Compile Include="$(MSBuildThisFileDirectory)ExtensionMethods.cs" />
|
||||||
|
<Compile Include="$(MSBuildThisFileDirectory)NPC.cs" />
|
||||||
<Compile Include="$(MSBuildThisFileDirectory)SoundEffects.cs" />
|
<Compile Include="$(MSBuildThisFileDirectory)SoundEffects.cs" />
|
||||||
<Compile Include="$(MSBuildThisFileDirectory)Text.cs" />
|
<Compile Include="$(MSBuildThisFileDirectory)Text.cs" />
|
||||||
<Compile Include="$(MSBuildThisFileDirectory)Textures.cs" />
|
<Compile Include="$(MSBuildThisFileDirectory)Textures.cs" />
|
||||||
|
@ -121,6 +121,7 @@ namespace SemiColinGames {
|
|||||||
float modelTime = (float) gameTime.ElapsedGameTime.TotalSeconds;
|
float modelTime = (float) gameTime.ElapsedGameTime.TotalSeconds;
|
||||||
Clock.AddModelTime(modelTime);
|
Clock.AddModelTime(modelTime);
|
||||||
player.Update(modelTime, input, world.CollisionTargets);
|
player.Update(modelTime, input, world.CollisionTargets);
|
||||||
|
world.Update(modelTime);
|
||||||
linesOfSight.Update(player, world.CollisionTargets);
|
linesOfSight.Update(player, world.CollisionTargets);
|
||||||
camera.Update(player.Position, world.Width);
|
camera.Update(player.Position, world.Width);
|
||||||
if (player.Health <= 0) {
|
if (player.Health <= 0) {
|
||||||
|
@ -34,6 +34,7 @@ namespace SemiColinGames {
|
|||||||
public static SpriteFont BannerFont;
|
public static SpriteFont BannerFont;
|
||||||
|
|
||||||
public static TextureRef Player = new TextureRef("sprites/ccg/ninja_female");
|
public static TextureRef Player = new TextureRef("sprites/ccg/ninja_female");
|
||||||
|
public static TextureRef Executioner = new TextureRef("sprites/ccg/executioner_female");
|
||||||
public static TextureRef Heart = new TextureRef("sprites/semicolin/heart");
|
public static TextureRef Heart = new TextureRef("sprites/semicolin/heart");
|
||||||
|
|
||||||
// Backgrounds are indexed by draw order; the first element should be drawn furthest back.
|
// Backgrounds are indexed by draw order; the first element should be drawn furthest back.
|
||||||
|
@ -91,6 +91,8 @@ namespace SemiColinGames {
|
|||||||
readonly Tile[] tiles;
|
readonly Tile[] tiles;
|
||||||
readonly Tile[] decorations;
|
readonly Tile[] decorations;
|
||||||
|
|
||||||
|
readonly NPC[] npcs = new NPC[1];
|
||||||
|
|
||||||
// Size of World in terms of tile grid.
|
// Size of World in terms of tile grid.
|
||||||
private readonly int tileWidth;
|
private readonly int tileWidth;
|
||||||
private readonly int tileHeight;
|
private readonly int tileHeight;
|
||||||
@ -105,6 +107,7 @@ namespace SemiColinGames {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public World(string levelSpecification) {
|
public World(string levelSpecification) {
|
||||||
|
npcs[0] = new NPC(new Point(16 * 38, 16 * 12));
|
||||||
var tilesList = new List<Tile>();
|
var tilesList = new List<Tile>();
|
||||||
var decorationsList = new List<Tile>();
|
var decorationsList = new List<Tile>();
|
||||||
string[] worldDesc = levelSpecification.Substring(1).Split('\n');
|
string[] worldDesc = levelSpecification.Substring(1).Split('\n');
|
||||||
@ -152,10 +155,19 @@ namespace SemiColinGames {
|
|||||||
new Vector2(Width + 1, 0), new Vector2(1, float.MaxValue));
|
new Vector2(Width + 1, 0), new Vector2(1, float.MaxValue));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void Update(float modelTime) {
|
||||||
|
foreach (NPC npc in npcs) {
|
||||||
|
npc.Update(modelTime);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void DrawBackground(SpriteBatch spriteBatch) {
|
public void DrawBackground(SpriteBatch spriteBatch) {
|
||||||
foreach (Tile t in decorations) {
|
foreach (Tile t in decorations) {
|
||||||
t.Draw(spriteBatch);
|
t.Draw(spriteBatch);
|
||||||
}
|
}
|
||||||
|
foreach (NPC npc in npcs) {
|
||||||
|
npc.Draw(spriteBatch);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void DrawForeground(SpriteBatch spriteBatch) {
|
public void DrawForeground(SpriteBatch spriteBatch) {
|
||||||
|
Loading…
Reference in New Issue
Block a user