init
This commit is contained in:
commit
dbbe203db8
|
|
@ -0,0 +1,32 @@
|
||||||
|
name: .NET
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ "main" ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ "main" ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- name: Setup .NET
|
||||||
|
uses: actions/setup-dotnet@v3
|
||||||
|
with:
|
||||||
|
dotnet-version: 6.0.x
|
||||||
|
- name: Restore dependencies
|
||||||
|
run: dotnet restore
|
||||||
|
- name: Build
|
||||||
|
run: dotnet build --no-restore
|
||||||
|
- name: Publish
|
||||||
|
run: dotnet publish -r linux-x64
|
||||||
|
- name: Upload a Build Artifact
|
||||||
|
uses: actions/upload-artifact@v3.1.0
|
||||||
|
with:
|
||||||
|
# Artifact name
|
||||||
|
name: Linux build
|
||||||
|
# A file, directory or wildcard pattern that describes what to upload
|
||||||
|
path: bin/Debug/net6.0/linux-x64/publish/asdlteroids
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
bin/
|
||||||
|
obj/
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
var boulderDash = new BoulderDash();
|
||||||
|
boulderDash.Run();
|
||||||
Binary file not shown.
Binary file not shown.
|
|
@ -0,0 +1,18 @@
|
||||||
|
[
|
||||||
|
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
|
||||||
|
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
|
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
|
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
|
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
|
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
|
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
|
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
|
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
|
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
|
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
|
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
|
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
|
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
|
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
|
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
||||||
|
]
|
||||||
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 7.0 KiB |
|
|
@ -0,0 +1,22 @@
|
||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net6.0</TargetFramework>
|
||||||
|
<RootNamespace>boulder-dash</RootNamespace>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<PublishTrimmed>true</PublishTrimmed>
|
||||||
|
<PublishReadyToRun>true</PublishReadyToRun>
|
||||||
|
<PublishSingleFile>true</PublishSingleFile>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
|
||||||
|
<PackageReference Include="ppy.SDL2-CS" Version="1.0.596-alpha" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<EmbeddedResource Include="assets/*" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
|
|
@ -0,0 +1,60 @@
|
||||||
|
using static SDL2.SDL;
|
||||||
|
|
||||||
|
class BoulderDash : Game
|
||||||
|
{
|
||||||
|
private Context context;
|
||||||
|
private TileSet tileSet;
|
||||||
|
|
||||||
|
public BoulderDash()
|
||||||
|
{
|
||||||
|
var window = new Window("Boulder Dash", 800, 600);
|
||||||
|
var renderer = new Renderer(window);
|
||||||
|
this.registerScenes();
|
||||||
|
this.context = new Context(window, renderer);
|
||||||
|
GameState.sceneManager.ChangeScene("main", context);
|
||||||
|
this.tileSet = new TileSet(context, "assets.sprites.png", 32);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void registerScenes()
|
||||||
|
{
|
||||||
|
GameState.sceneManager.AddScene("main", new MainMenu());
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void update(double dt)
|
||||||
|
{
|
||||||
|
SDL_Event e;
|
||||||
|
while (SDL_PollEvent(out e) != 0)
|
||||||
|
{
|
||||||
|
if (e.type == SDL_EventType.SDL_QUIT)
|
||||||
|
{
|
||||||
|
System.Environment.Exit(0);
|
||||||
|
}
|
||||||
|
if (e.type == SDL_EventType.SDL_KEYDOWN)
|
||||||
|
{
|
||||||
|
if (e.key.keysym.sym == SDL_Keycode.SDLK_ESCAPE)
|
||||||
|
{
|
||||||
|
System.Environment.Exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
GameState.keyState = new KeyState();
|
||||||
|
GameState.sceneManager.GetCurrentScene()?.Update(dt, context);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void draw()
|
||||||
|
{
|
||||||
|
#if (DEBUG)
|
||||||
|
SDL_SetWindowTitle(this.context.window.GetWindow(), "Boulder Dash - " + GameState.fps + "FPS");
|
||||||
|
#endif
|
||||||
|
this.context.renderer.Clear();
|
||||||
|
GameState.sceneManager.GetCurrentScene()?.Draw(this.context);
|
||||||
|
this.context.renderer.DrawTileSet(this.tileSet, 0, 0, 1, 6);
|
||||||
|
this.context.renderer.DrawTileSet(this.tileSet, 32, 0, 1, 6);
|
||||||
|
this.context.renderer.DrawTileSet(this.tileSet, 64, 0, 1, 6);
|
||||||
|
this.context.renderer.DrawTileSet(this.tileSet, 96, 0, 1, 6);
|
||||||
|
this.context.renderer.DrawTileSet(this.tileSet, 128, 0, 1, 6);
|
||||||
|
this.context.renderer.DrawTileSet(this.tileSet, 160, 0, 1, 6);
|
||||||
|
this.context.renderer.Present();
|
||||||
|
SDL_Delay(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,32 @@
|
||||||
|
using static SDL2.SDL;
|
||||||
|
|
||||||
|
enum Control
|
||||||
|
{
|
||||||
|
UP,
|
||||||
|
DOWN,
|
||||||
|
LEFT,
|
||||||
|
RIGHT,
|
||||||
|
STAY,
|
||||||
|
}
|
||||||
|
|
||||||
|
static class ControlKeyExtension
|
||||||
|
{
|
||||||
|
public static SDL_Keycode Key(this Control c)
|
||||||
|
{
|
||||||
|
switch (c)
|
||||||
|
{
|
||||||
|
case Control.UP:
|
||||||
|
return SDL_Keycode.SDLK_w;
|
||||||
|
case Control.DOWN:
|
||||||
|
return SDL_Keycode.SDLK_s;
|
||||||
|
case Control.LEFT:
|
||||||
|
return SDL_Keycode.SDLK_a;
|
||||||
|
case Control.RIGHT:
|
||||||
|
return SDL_Keycode.SDLK_d;
|
||||||
|
case Control.STAY:
|
||||||
|
return SDL_Keycode.SDLK_LCTRL;
|
||||||
|
default:
|
||||||
|
throw new ArgumentException("Invalid control");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
|
class Map : Actor
|
||||||
|
{
|
||||||
|
private int[][] map;
|
||||||
|
|
||||||
|
public Map(uint width, uint height)
|
||||||
|
{
|
||||||
|
this.map = new int[height][];
|
||||||
|
for (uint i = 0; i < height; i++)
|
||||||
|
{
|
||||||
|
this.map[i] = new int[width];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map(string json)
|
||||||
|
{
|
||||||
|
var map = JsonConvert.DeserializeObject<int[][]>(json);
|
||||||
|
if (map == null)
|
||||||
|
{
|
||||||
|
throw new Exception("Invalid map");
|
||||||
|
}
|
||||||
|
this.map = map;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
abstract class Actor
|
||||||
|
{
|
||||||
|
public virtual void Update(double dt, Context context)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual void Draw(Context context)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,27 @@
|
||||||
|
enum Sound
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
class AudioPlayer
|
||||||
|
{
|
||||||
|
private Dictionary<Sound, byte[]> audioFiles = new();
|
||||||
|
private ResourceLoader resourceLoader = new();
|
||||||
|
|
||||||
|
public AudioPlayer()
|
||||||
|
{
|
||||||
|
SDL2.SDL_mixer.Mix_OpenAudio(44100, SDL2.SDL_mixer.MIX_DEFAULT_FORMAT, 2, 2048);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Register(Sound name, string path)
|
||||||
|
{
|
||||||
|
var buffer = resourceLoader.LoadBytes(path);
|
||||||
|
this.audioFiles.Add(name, buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Play(Sound name)
|
||||||
|
{
|
||||||
|
var buffer = this.audioFiles[name];
|
||||||
|
var sound = SDL2.SDL_mixer.Mix_QuickLoad_WAV(buffer);
|
||||||
|
SDL2.SDL_mixer.Mix_PlayChannel((int)name, sound, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
struct Context
|
||||||
|
{
|
||||||
|
public Context(Window window, Renderer renderer)
|
||||||
|
{
|
||||||
|
this.window = window;
|
||||||
|
this.renderer = renderer;
|
||||||
|
this.resourceLoader = new ResourceLoader();
|
||||||
|
this.fontManager = new FontManager(resourceLoader);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Window window { get; }
|
||||||
|
public Renderer renderer { get; }
|
||||||
|
public ResourceLoader resourceLoader { get; }
|
||||||
|
public FontManager fontManager { get; }
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,35 @@
|
||||||
|
using static SDL2.SDL_ttf;
|
||||||
|
using static SDL2.SDL;
|
||||||
|
|
||||||
|
class FontManager
|
||||||
|
{
|
||||||
|
private Dictionary<string, IntPtr> fonts = new();
|
||||||
|
private ResourceLoader resourceLoader;
|
||||||
|
|
||||||
|
public FontManager(ResourceLoader resourceLoader)
|
||||||
|
{
|
||||||
|
this.resourceLoader = resourceLoader;
|
||||||
|
if (TTF_Init() != 0)
|
||||||
|
{
|
||||||
|
throw new Exception("TTF_Init failed");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RegisterFont(string name, string path, int fontSize)
|
||||||
|
{
|
||||||
|
if (fonts.ContainsKey(name)) return;
|
||||||
|
var res = resourceLoader.LoadToIntPtr(path);
|
||||||
|
var sdlBuffer = SDL_RWFromConstMem(res.ptr, res.size);
|
||||||
|
var font = TTF_OpenFontRW(sdlBuffer, 1, fontSize);
|
||||||
|
if (font == IntPtr.Zero)
|
||||||
|
{
|
||||||
|
throw new Exception("TTF_OpenFont failed");
|
||||||
|
}
|
||||||
|
fonts.Add(name, font);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IntPtr GetFont(string name)
|
||||||
|
{
|
||||||
|
return fonts[name];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,31 @@
|
||||||
|
abstract class Game
|
||||||
|
{
|
||||||
|
public const int TPS = 64;
|
||||||
|
private Queue<int> fpsQueue = new Queue<int>();
|
||||||
|
protected abstract void update(double dt);
|
||||||
|
protected abstract void draw();
|
||||||
|
|
||||||
|
public void Run()
|
||||||
|
{
|
||||||
|
var tLast = DateTime.Now;
|
||||||
|
var tAcc = TimeSpan.Zero;
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
var dt = DateTime.Now - tLast;
|
||||||
|
tLast = DateTime.Now;
|
||||||
|
tAcc += dt;
|
||||||
|
var fps = (int)(1 / dt.TotalSeconds);
|
||||||
|
fpsQueue.Enqueue(fps);
|
||||||
|
while (fpsQueue.Count > fps)
|
||||||
|
fpsQueue.Dequeue();
|
||||||
|
GameState.fps = (int)fpsQueue.Average();
|
||||||
|
while (tAcc >= TimeSpan.FromSeconds(1.0 / TPS))
|
||||||
|
{
|
||||||
|
update(dt.TotalSeconds);
|
||||||
|
tAcc -= TimeSpan.FromSeconds(1.0 / TPS);
|
||||||
|
}
|
||||||
|
|
||||||
|
draw();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
static class GameState
|
||||||
|
{
|
||||||
|
public static KeyState keyState = new KeyState();
|
||||||
|
public static SceneManager sceneManager = new SceneManager();
|
||||||
|
public static int fps = 0;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using static SDL2.SDL;
|
||||||
|
|
||||||
|
class KeyState
|
||||||
|
{
|
||||||
|
private byte[] keys;
|
||||||
|
|
||||||
|
public KeyState()
|
||||||
|
{
|
||||||
|
var origArray = SDL_GetKeyboardState(out var arraySize);
|
||||||
|
this.keys = new byte[arraySize];
|
||||||
|
Marshal.Copy(origArray, this.keys, 0, arraySize);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool isPressed(SDL_Keycode keycode)
|
||||||
|
{
|
||||||
|
byte scanCode = (byte)SDL_GetScancodeFromKey(keycode);
|
||||||
|
return (this.keys[scanCode] == 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool isPressed(Control c)
|
||||||
|
{
|
||||||
|
return this.isPressed(c.Key());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,107 @@
|
||||||
|
using static SDL2.SDL;
|
||||||
|
using static SDL2.SDL_ttf;
|
||||||
|
|
||||||
|
class Renderer
|
||||||
|
{
|
||||||
|
private IntPtr renderer;
|
||||||
|
private IntPtr font;
|
||||||
|
private SDL_Color color;
|
||||||
|
|
||||||
|
public Renderer(Window window)
|
||||||
|
{
|
||||||
|
this.renderer = SDL_CreateRenderer(window.GetWindow(), -1, SDL_RendererFlags.SDL_RENDERER_ACCELERATED);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Clear()
|
||||||
|
{
|
||||||
|
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
|
||||||
|
SDL_RenderClear(renderer);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Present()
|
||||||
|
{
|
||||||
|
SDL_RenderPresent(renderer);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void DrawRect(double x, double y, int w, int h)
|
||||||
|
{
|
||||||
|
this.DrawRect((int)x, (int)y, w, h);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void DrawRect(int x, int y, int w, int h)
|
||||||
|
{
|
||||||
|
SDL_Rect rect = new SDL_Rect();
|
||||||
|
rect.x = x;
|
||||||
|
rect.y = y;
|
||||||
|
rect.w = w;
|
||||||
|
rect.h = h;
|
||||||
|
|
||||||
|
SDL_RenderFillRect(renderer, ref rect);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void DrawLines(double[][] points)
|
||||||
|
{
|
||||||
|
SDL_Point[] sdlPoints = new SDL_Point[points.Length];
|
||||||
|
for (int i = 0; i < points.Length; i++)
|
||||||
|
{
|
||||||
|
sdlPoints[i].x = (int)points[i][0];
|
||||||
|
sdlPoints[i].y = (int)points[i][1];
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_RenderDrawLines(renderer, sdlPoints, points.Length);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetColor(int r, int g, int b, int a = 255)
|
||||||
|
{
|
||||||
|
SDL_SetRenderDrawColor(renderer, (byte)r, (byte)g, (byte)b, (byte)a);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetFont(IntPtr font, SDL_Color color)
|
||||||
|
{
|
||||||
|
this.font = font;
|
||||||
|
this.color = color;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetFont(IntPtr font, Color color)
|
||||||
|
{
|
||||||
|
this.font = font;
|
||||||
|
this.color = color.toSDLColor();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void DrawText(string text, int x, int y, bool center = false)
|
||||||
|
{
|
||||||
|
var surfaceMessage = TTF_RenderText_Solid(this.font, text, this.color);
|
||||||
|
|
||||||
|
var texture = SDL_CreateTextureFromSurface(this.renderer, surfaceMessage);
|
||||||
|
int width;
|
||||||
|
int height;
|
||||||
|
|
||||||
|
SDL_QueryTexture(texture, out _, out _, out width, out height);
|
||||||
|
|
||||||
|
SDL_Rect rect = new SDL_Rect();
|
||||||
|
rect.x = x;
|
||||||
|
rect.y = y;
|
||||||
|
rect.w = width;
|
||||||
|
rect.h = height;
|
||||||
|
|
||||||
|
if (center)
|
||||||
|
{
|
||||||
|
rect.x -= width / 2;
|
||||||
|
rect.y -= height / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_RenderCopy(this.renderer, texture, IntPtr.Zero, ref rect);
|
||||||
|
SDL_DestroyTexture(texture);
|
||||||
|
SDL_FreeSurface(surfaceMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IntPtr GetRaw()
|
||||||
|
{
|
||||||
|
return renderer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IntPtr CreateTextureFromSurface(IntPtr surface)
|
||||||
|
{
|
||||||
|
return SDL_CreateTextureFromSurface(renderer, surface);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,34 @@
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
class ResourceLoader
|
||||||
|
{
|
||||||
|
private string assemblyName;
|
||||||
|
|
||||||
|
public ResourceLoader()
|
||||||
|
{
|
||||||
|
this.assemblyName = this.GetType().Assembly.GetName().Name!;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string LoadString(string resourceName)
|
||||||
|
{
|
||||||
|
using var stream = this.GetType().Assembly.GetManifestResourceStream($"{this.assemblyName}.{resourceName}");
|
||||||
|
using var reader = new StreamReader(stream!);
|
||||||
|
return reader.ReadToEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] LoadBytes(string resourceName)
|
||||||
|
{
|
||||||
|
using var stream = this.GetType().Assembly.GetManifestResourceStream($"{this.assemblyName}.{resourceName}");
|
||||||
|
using var memoryStream = new MemoryStream();
|
||||||
|
stream!.CopyTo(memoryStream);
|
||||||
|
return memoryStream.ToArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
public (IntPtr ptr, int size) LoadToIntPtr(string resourceName)
|
||||||
|
{
|
||||||
|
var bytes = this.LoadBytes(resourceName);
|
||||||
|
var handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
|
||||||
|
var ptr = handle.AddrOfPinnedObject();
|
||||||
|
return (ptr, bytes.Length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
abstract class Scene : Actor
|
||||||
|
{
|
||||||
|
public virtual void Create(Context context)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual void Destroy(Context context)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,26 @@
|
||||||
|
class SceneManager
|
||||||
|
{
|
||||||
|
private Dictionary<string, Scene> scenes = new Dictionary<string, Scene>();
|
||||||
|
private Scene? currentScene;
|
||||||
|
|
||||||
|
public void AddScene(string name, Scene scene)
|
||||||
|
{
|
||||||
|
scenes.Add(name, scene);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ChangeScene(string name, Context context)
|
||||||
|
{
|
||||||
|
if (currentScene != null)
|
||||||
|
{
|
||||||
|
currentScene.Destroy(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
currentScene = scenes[name];
|
||||||
|
currentScene.Create(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Scene? GetCurrentScene()
|
||||||
|
{
|
||||||
|
return currentScene;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,46 @@
|
||||||
|
using static SDL2.SDL_image;
|
||||||
|
using static SDL2.SDL;
|
||||||
|
|
||||||
|
class TileSet
|
||||||
|
{
|
||||||
|
public readonly IntPtr Texture;
|
||||||
|
public readonly int Width, Height, Resolution;
|
||||||
|
|
||||||
|
public TileSet(Context context, String tileSetPath, int resolution)
|
||||||
|
{
|
||||||
|
var res = context.resourceLoader.LoadToIntPtr(tileSetPath);
|
||||||
|
var sdlBuffer = SDL_RWFromMem(res.ptr, res.size);
|
||||||
|
var surface = IMG_Load_RW(sdlBuffer, 1);
|
||||||
|
this.Texture = context.renderer.CreateTextureFromSurface(surface);
|
||||||
|
SDL_QueryTexture(Texture, out _, out _, out Width, out Height);
|
||||||
|
SDL_FreeSurface(surface);
|
||||||
|
this.Resolution = resolution;
|
||||||
|
}
|
||||||
|
|
||||||
|
~TileSet()
|
||||||
|
{
|
||||||
|
SDL_DestroyTexture(Texture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static class TileSetRendererExtension
|
||||||
|
{
|
||||||
|
public static void DrawTileSet(this Renderer renderer, TileSet tileSet, int x, int y, int tileX, int tileY)
|
||||||
|
{
|
||||||
|
var src = new SDL_Rect
|
||||||
|
{
|
||||||
|
x = tileX * tileSet.Resolution,
|
||||||
|
y = tileY * tileSet.Resolution,
|
||||||
|
w = tileSet.Resolution,
|
||||||
|
h = tileSet.Resolution
|
||||||
|
};
|
||||||
|
var dst = new SDL_Rect
|
||||||
|
{
|
||||||
|
x = x,
|
||||||
|
y = y,
|
||||||
|
w = tileSet.Resolution,
|
||||||
|
h = tileSet.Resolution
|
||||||
|
};
|
||||||
|
SDL_RenderCopy(renderer.GetRaw(), tileSet.Texture, ref src, ref dst);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,33 @@
|
||||||
|
using static SDL2.SDL;
|
||||||
|
|
||||||
|
class Window
|
||||||
|
{
|
||||||
|
IntPtr window;
|
||||||
|
|
||||||
|
public Window(string title, int w, int h)
|
||||||
|
{
|
||||||
|
window = SDL_CreateWindow(title, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, w, h, SDL_WindowFlags.SDL_WINDOW_VULKAN | SDL_WindowFlags.SDL_WINDOW_RESIZABLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Window(string title, int x, int y, int w, int h, SDL_WindowFlags flags)
|
||||||
|
{
|
||||||
|
this.window = SDL_CreateWindow(title, x, y, w, h, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
SDL_DestroyWindow(this.window);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IntPtr GetWindow()
|
||||||
|
{
|
||||||
|
return this.window;
|
||||||
|
}
|
||||||
|
|
||||||
|
public (int width, int height) GetSize()
|
||||||
|
{
|
||||||
|
int w, h;
|
||||||
|
SDL_GetWindowSize(this.window, out w, out h);
|
||||||
|
return (w, h);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
interface Logic
|
||||||
|
{
|
||||||
|
public void Update(KeyState keyState, double dx);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
interface Renderable
|
||||||
|
{
|
||||||
|
public void Render(Renderer renderer, double dx);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,32 @@
|
||||||
|
using static SDL2.SDL;
|
||||||
|
|
||||||
|
class Color
|
||||||
|
{
|
||||||
|
int r, g, b, a;
|
||||||
|
|
||||||
|
public Color(int r, int g, int b, int a)
|
||||||
|
{
|
||||||
|
this.r = r;
|
||||||
|
this.g = g;
|
||||||
|
this.b = b;
|
||||||
|
this.a = a;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Color(int r, int g, int b)
|
||||||
|
{
|
||||||
|
this.r = r;
|
||||||
|
this.g = g;
|
||||||
|
this.b = b;
|
||||||
|
this.a = 255;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SDL_Color toSDLColor()
|
||||||
|
{
|
||||||
|
SDL_Color color = new SDL_Color();
|
||||||
|
color.r = (byte)r;
|
||||||
|
color.g = (byte)g;
|
||||||
|
color.b = (byte)b;
|
||||||
|
color.a = (byte)a;
|
||||||
|
return color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
class Point
|
||||||
|
{
|
||||||
|
public static double Distance(double x1, double y1, double x2, double y2)
|
||||||
|
{
|
||||||
|
return Math.Sqrt(Math.Pow(x2 - x1, 2) + Math.Pow(y2 - y1, 2));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,33 @@
|
||||||
|
class MainMenu : Scene
|
||||||
|
{
|
||||||
|
double x = 0;
|
||||||
|
bool dir = true;
|
||||||
|
public override void Create(Context context)
|
||||||
|
{
|
||||||
|
context.fontManager.RegisterFont("MainMenu", "assets.font.ttf", 24);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Update(double dt, Context context)
|
||||||
|
{
|
||||||
|
x += dir ? 10 : -10;
|
||||||
|
var windowSize = context.window.GetSize();
|
||||||
|
if (x + 30 > windowSize.width)
|
||||||
|
{
|
||||||
|
dir = false;
|
||||||
|
}
|
||||||
|
if (x < 0)
|
||||||
|
{
|
||||||
|
dir = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Draw(Context context)
|
||||||
|
{
|
||||||
|
var windowSize = context.window.GetSize();
|
||||||
|
var font = context.fontManager.GetFont("MainMenu");
|
||||||
|
context.renderer.SetFont(font, new Color(255, 255, 255));
|
||||||
|
context.renderer.DrawText("Main Menu", windowSize.width / 2, windowSize.height / 2, true);
|
||||||
|
context.renderer.SetColor(255, 255, 255);
|
||||||
|
context.renderer.DrawRect(x, 0, 30, 30);
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue