mirror of
https://github.com/OpenDiablo2/OpenDiablo2
synced 2024-11-04 17:27:16 -05:00
127 lines
3.9 KiB
C#
127 lines
3.9 KiB
C#
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Drawing;
|
|||
|
using System.Linq;
|
|||
|
using System.Text;
|
|||
|
using System.Threading.Tasks;
|
|||
|
using OpenDiablo2.Common;
|
|||
|
using OpenDiablo2.Common.Interfaces;
|
|||
|
|
|||
|
namespace OpenDiablo2.Core.Map_Engine
|
|||
|
{
|
|||
|
public sealed class MapEngine : IMapEngine
|
|||
|
{
|
|||
|
private readonly IGameState gameState;
|
|||
|
private readonly IRenderWindow renderWindow;
|
|||
|
private readonly IResourceManager resourceManager;
|
|||
|
|
|||
|
private PointF cameraLocation = new PointF();
|
|||
|
public PointF CameraLocation
|
|||
|
{
|
|||
|
get => cameraLocation;
|
|||
|
set
|
|||
|
{
|
|||
|
if (cameraLocation == value)
|
|||
|
return;
|
|||
|
|
|||
|
cameraLocation = value;
|
|||
|
/*
|
|||
|
cellOffsetX = CameraLocation.X / cellSizeX;
|
|||
|
cellOffsetY = CameraLocation.Y / cellSizeY;
|
|||
|
pixelOffsetX = CameraLocation.X % cellSizeX;
|
|||
|
pixelOffsetY = CameraLocation.Y % cellSizeY;
|
|||
|
*/
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private ISprite loadingSprite;
|
|||
|
private ISprite[] tempMapCell;
|
|||
|
|
|||
|
private int cellOffsetX, cellOffsetY, pixelOffsetX, pixelOffsetY;
|
|||
|
|
|||
|
private const int
|
|||
|
cellSizeX = 160,
|
|||
|
cellSizeY = 80,
|
|||
|
renderCellsX = (800 / cellSizeX) + 1,
|
|||
|
renderCellsY = (600 / cellSizeY) + 1;
|
|||
|
|
|||
|
public MapEngine(
|
|||
|
IGameState gameState,
|
|||
|
IRenderWindow renderWindow,
|
|||
|
IResourceManager resourceManager
|
|||
|
)
|
|||
|
{
|
|||
|
this.gameState = gameState;
|
|||
|
this.renderWindow = renderWindow;
|
|||
|
this.resourceManager = resourceManager;
|
|||
|
|
|||
|
loadingSprite = renderWindow.LoadSprite(ResourcePaths.LoadingScreen, Palettes.Loading, new Point(300, 400));
|
|||
|
}
|
|||
|
|
|||
|
public void NotifyMapChanged()
|
|||
|
{
|
|||
|
PurgeAllMapData();
|
|||
|
LoadNewMapData();
|
|||
|
}
|
|||
|
|
|||
|
private void LoadNewMapData()
|
|||
|
{
|
|||
|
var cellsToLoad = gameState.MapData.Width * gameState.MapData.Height;
|
|||
|
tempMapCell = new ISprite[cellsToLoad];
|
|||
|
|
|||
|
for (var cell = 0; cell < cellsToLoad; cell++)
|
|||
|
{
|
|||
|
renderWindow.Clear();
|
|||
|
loadingSprite.Frame = (int)(loadingSprite.TotalFrames * ((float)cell / (float)cellsToLoad));
|
|||
|
renderWindow.Draw(loadingSprite);
|
|||
|
renderWindow.Sync();
|
|||
|
|
|||
|
tempMapCell[cell] = renderWindow.GenerateMapCell(
|
|||
|
gameState.MapData,
|
|||
|
cell % gameState.MapData.Width,
|
|||
|
cell / gameState.MapData.Width,
|
|||
|
Common.Enums.eRenderCellType.Floor,
|
|||
|
gameState.CurrentPalette
|
|||
|
);
|
|||
|
}
|
|||
|
|
|||
|
//CameraLocation = new Point(((gameState.MapData.Width * cellSizeX) / 2) - 400, ((gameState.MapData.Height * cellSizeY) / 2) - 300);
|
|||
|
}
|
|||
|
|
|||
|
public void Render()
|
|||
|
{
|
|||
|
var cOffX = (int)((cameraLocation.X - cameraLocation.Y) * (cellSizeX / 2));
|
|||
|
var cOffY = (int)((cameraLocation.X + cameraLocation.Y) * (cellSizeY / 2));
|
|||
|
|
|||
|
for (int y = 0; y < gameState.MapData.Width; y++)
|
|||
|
for (int x = 0; x < gameState.MapData.Height; x++)
|
|||
|
{
|
|||
|
RenderFloorCell(
|
|||
|
(x + cellOffsetX),
|
|||
|
(y + cellOffsetY),
|
|||
|
((x - y) * 80) - cOffX,
|
|||
|
((x + y) * 40) - cOffY
|
|||
|
);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public void RenderFloorCell(int x, int y, int xp, int yp)
|
|||
|
{
|
|||
|
if (x < 0 || y < 0 || x >= gameState.MapData.Width || y >= gameState.MapData.Height)
|
|||
|
return;
|
|||
|
|
|||
|
renderWindow.Draw(tempMapCell[x + (y * gameState.MapData.Width)], new Point(xp, yp));
|
|||
|
}
|
|||
|
|
|||
|
public void Update(long ms)
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
private void PurgeAllMapData()
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
}
|