feat: Added Player Objects w/ Movement Behaviour

This commit is contained in:
Syntriax 2023-11-24 15:50:23 +03:00
parent 03bbababf8
commit 0ec68e6b1a
4 changed files with 95 additions and 2 deletions

2
Engine

@ -1 +1 @@
Subproject commit 5fcf63c5a70f031fb7a808723fb8a25adb19ab39 Subproject commit d60537f9406ae3615c7cdcd6f986cf368fa77cfb

View File

@ -0,0 +1,56 @@
using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Input;
using Syntriax.Engine.Core;
using Syntriax.Engine.Input;
namespace Pong.Behaviours;
public class MovementBehaviour(Keys Up, Keys Down, float Speed) : BehaviourOverride
{
private Keys Up { get; } = Up;
private Keys Down { get; } = Down;
public float Speed { get; set; } = Speed;
private bool isUpPressed = false;
private bool isDownPressed = false;
private IKeyboardInputs inputs = null!;
protected override void OnUpdate(GameTime time)
{
if (isUpPressed && isDownPressed)
return;
if (isUpPressed)
GameObject.Transform.Position = GameObject.Transform.Position + Vector2.UnitY * (float)time.ElapsedGameTime.TotalSeconds * Speed;
else if (isDownPressed)
GameObject.Transform.Position = GameObject.Transform.Position + -Vector2.UnitY * (float)time.ElapsedGameTime.TotalSeconds * Speed;
}
protected override void OnInitialize()
{
if (!BehaviourController.TryGetBehaviour(out inputs))
throw new Exception($"{nameof(IKeyboardInputs)} is missing on ${GameObject.Name}.");
inputs.RegisterOnPress(Up, OnUpPressed);
inputs.RegisterOnRelease(Up, OnUpReleased);
inputs.RegisterOnPress(Down, OnDownPressed);
inputs.RegisterOnRelease(Down, OnDownReleased);
}
protected override void OnFinalize()
{
inputs.UnregisterOnPress(Up, OnUpPressed);
inputs.UnregisterOnRelease(Up, OnUpReleased);
inputs.UnregisterOnPress(Down, OnDownPressed);
inputs.UnregisterOnRelease(Down, OnDownReleased);
}
private void OnUpPressed(IKeyboardInputs inputs, Keys keys) => isUpPressed = true;
private void OnUpReleased(IKeyboardInputs inputs, Keys keys) => isUpPressed = false;
private void OnDownPressed(IKeyboardInputs inputs, Keys keys) => isDownPressed = true;
private void OnDownReleased(IKeyboardInputs inputs, Keys keys) => isDownPressed = false;
}

View File

@ -24,6 +24,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\Engine\Engine.Core\Engine.Core.csproj" /> <ProjectReference Include="..\Engine\Engine.Core\Engine.Core.csproj" />
<ProjectReference Include="..\Engine\Engine.Input\Engine.Input.csproj" />
</ItemGroup> </ItemGroup>
<Target Name="RestoreDotnetTools" BeforeTargets="Restore"> <Target Name="RestoreDotnetTools" BeforeTargets="Restore">
<Message Text="Restoring dotnet tools" Importance="High" /> <Message Text="Restoring dotnet tools" Importance="High" />

View File

@ -1,7 +1,11 @@
using Microsoft.Xna.Framework; using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Input;
using Pong.Behaviours;
using Syntriax.Engine.Core; using Syntriax.Engine.Core;
using Syntriax.Engine.Core.Abstract;
using Syntriax.Engine.Core.Behaviours;
using Syntriax.Engine.Input;
namespace Pong; namespace Pong;
@ -21,7 +25,9 @@ public class Game1 : Game
protected override void Initialize() protected override void Initialize()
{ {
gameManager = new(); gameManager = new();
// TODO: Add your initialization logic here // TODO: Add your initialization logic here
gameManager.Initialize();
base.Initialize(); base.Initialize();
} }
@ -30,6 +36,25 @@ public class Game1 : Game
{ {
_spriteBatch = new SpriteBatch(GraphicsDevice); _spriteBatch = new SpriteBatch(GraphicsDevice);
Sprite sprite = new Sprite() { Texture2D = Content.Load<Texture2D>("Sprites/Pixel") };
{
IGameObject gameObject = gameManager.InstantiateGameObject<GameObject>();
gameObject.Name = "Left";
gameObject.Transform.Position = new Vector2(Window.ClientBounds.Width * .1f, Window.ClientBounds.Height * .5f);
gameObject.Transform.Scale = new Vector2(Window.ClientBounds.Width * .02f, Window.ClientBounds.Height * .15f);
gameObject.BehaviourController.AddBehaviour<KeyboardInputsBehaviour>();
gameObject.BehaviourController.AddBehaviour<MovementBehaviour>(Keys.S, Keys.W, 200f);
gameObject.BehaviourController.AddBehaviour<DrawableSpriteBehaviour>().Assign(sprite);
}
{
IGameObject gameObject = gameManager.InstantiateGameObject<GameObject>();
gameObject.Name = "Right";
gameObject.Transform.Position = new Vector2(Window.ClientBounds.Width * .9f, Window.ClientBounds.Height * .5f);
gameObject.Transform.Scale = new Vector2(Window.ClientBounds.Width * .02f, Window.ClientBounds.Height * .15f);
gameObject.BehaviourController.AddBehaviour<KeyboardInputsBehaviour>();
gameObject.BehaviourController.AddBehaviour<MovementBehaviour>(Keys.Down, Keys.Up, 200f);
gameObject.BehaviourController.AddBehaviour<DrawableSpriteBehaviour>().Assign(sprite);
}
// TODO: use this.Content to load your game content here // TODO: use this.Content to load your game content here
} }
@ -37,17 +62,28 @@ public class Game1 : Game
{ {
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape)) if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape))
Exit(); Exit();
if (Keyboard.GetState().IsKeyDown(Keys.F))
{
_graphics.PreferMultiSampling = false;
_graphics.PreferredBackBufferWidth = GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Width;
_graphics.PreferredBackBufferHeight = GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Height;
_graphics.IsFullScreen = true;
_graphics.ApplyChanges();
}
// TODO: Add your update logic here // TODO: Add your update logic here
gameManager.Update(gameTime);
base.Update(gameTime); base.Update(gameTime);
} }
protected override void Draw(GameTime gameTime) protected override void Draw(GameTime gameTime)
{ {
GraphicsDevice.Clear(Color.CornflowerBlue); GraphicsDevice.Clear(new Color() { R = 32, G = 32, B = 32 });
// TODO: Add your drawing code here // TODO: Add your drawing code here
gameManager.PreDraw(gameTime);
gameManager.Draw(_spriteBatch);
base.Draw(gameTime); base.Draw(gameTime);
} }