This commit is contained in:
NikolajDanger
2021-11-02 00:05:00 +01:00
parent fe2572f9f2
commit d9e27910cf
12 changed files with 742 additions and 53 deletions

166
Solitaire.cs Normal file
View File

@ -0,0 +1,166 @@
using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Solitaire.Entities;
using Solitaire.Logic;
namespace Solitaire
{
public class SolitaireGame : Game
{
public const int gameWidth = 300;
public const int gameHeight = 300;
private GraphicsDeviceManager _graphics;
private SpriteBatch _spriteBatch;
private SpriteBatch _renderTargetBatch;
private RenderTarget2D renderTarget;
private Rectangle renderTargetRectangle;
private float renderRatio;
private MouseState mState;
public Vector2 mPosition;
public bool mClicked;
public bool mReleased;
public bool mHolding;
private Texture2D _spriteSheet;
public static GameLogic logic;
public static List<IGameEntity> entities;
private void setRenderRatio() {
float wRatio = Window.ClientBounds.Width / (float)gameWidth;
float hRatio = Window.ClientBounds.Height / (float)gameHeight;
if (wRatio > hRatio) {
renderRatio = hRatio;
} else {
renderRatio = wRatio;
}
}
private Rectangle renderRectangle() {
float drawnWidth = gameWidth * renderRatio;
float drawnHeight = gameHeight * renderRatio;
Rectangle rect = new Rectangle(
(int)((Window.ClientBounds.Width - drawnWidth)/2),
(int)((Window.ClientBounds.Height - drawnHeight)/2),
(int)drawnWidth,
(int)drawnHeight
);
return rect;
}
public SolitaireGame()
{
_graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
IsMouseVisible = true;
this.Window.AllowUserResizing = true;
this.Window.ClientSizeChanged += new EventHandler<EventArgs>(Window_ClientSizeChanged);
void Window_ClientSizeChanged(object sender, EventArgs e) {
setRenderRatio();
}
}
protected override void Initialize()
{
_graphics.PreferredBackBufferWidth = gameWidth * 2;
_graphics.PreferredBackBufferHeight = gameHeight * 2;
_graphics.ApplyChanges();
setRenderRatio();
base.Initialize();
}
protected override void LoadContent()
{
_spriteBatch = new SpriteBatch(GraphicsDevice);
_renderTargetBatch = new SpriteBatch(GraphicsDevice);
renderTarget = new RenderTarget2D(
GraphicsDevice, gameWidth, gameHeight
);
_spriteSheet = Content.Load<Texture2D>("playing cards");
entities = new List<IGameEntity>();
logic = new GameLogic(entities, _spriteSheet);
}
protected override void Update(GameTime gameTime)
{
renderTargetRectangle = renderRectangle();
mState = Mouse.GetState();
mPosition = mState.Position.ToVector2();
mPosition.X -= renderTargetRectangle.Left;
mPosition.Y -= renderTargetRectangle.Top;
mPosition /= renderRatio;
if (mReleased) {
mReleased = false;
}
if (mState.LeftButton == ButtonState.Pressed && !mClicked) {
mClicked = true;
} else if (mState.LeftButton == ButtonState.Released && mClicked) {
mClicked = false;
mReleased = true;
}
entities.Sort(delegate(IGameEntity a, IGameEntity b) {
return a.DrawOrder.CompareTo(b.DrawOrder);
});
mHolding = false;
foreach (IGameEntity entity in entities) {
if (entity is Card && entity.Following) {
mHolding = true;
}
}
foreach (IGameEntity entity in entities) {
entity.Update(gameTime, mPosition, mReleased, mHolding, entities);
}
base.Update(gameTime);
}
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.Black);
GraphicsDevice.SetRenderTarget(renderTarget);
GraphicsDevice.Clear(Color.Green);
_spriteBatch.Begin();
foreach (IGameEntity entity in entities) {
entity.Draw(_spriteBatch, gameTime);
}
_spriteBatch.End();
GraphicsDevice.SetRenderTarget(null);
_renderTargetBatch.Begin(SpriteSortMode.Deferred, BlendState.NonPremultiplied, SamplerState.PointClamp, DepthStencilState.Default, RasterizerState.CullNone);
_renderTargetBatch.Draw(
renderTarget,
renderTargetRectangle,
Color.White
);
_renderTargetBatch.End();
base.Draw(gameTime);
}
}
}