first commit
This commit is contained in:
commit
43433bb405
|
|
@ -0,0 +1,6 @@
|
|||
// See https://aka.ms/new-console-template for more information
|
||||
|
||||
var window = new Window("Hello World!", 800, 600);
|
||||
var renderer = new Renderer(window);
|
||||
var scene = new Scene(renderer);
|
||||
scene.Run();
|
||||
Binary file not shown.
Binary file not shown.
|
|
@ -0,0 +1,78 @@
|
|||
{
|
||||
"runtimeTarget": {
|
||||
"name": ".NETCoreApp,Version=v6.0",
|
||||
"signature": ""
|
||||
},
|
||||
"compilationOptions": {},
|
||||
"targets": {
|
||||
".NETCoreApp,Version=v6.0": {
|
||||
"dotnet-console/1.0.0": {
|
||||
"dependencies": {
|
||||
"ppy.SDL2-CS": "1.0.596-alpha"
|
||||
},
|
||||
"runtime": {
|
||||
"dotnet-console.dll": {}
|
||||
}
|
||||
},
|
||||
"ppy.SDL2-CS/1.0.596-alpha": {
|
||||
"runtime": {
|
||||
"lib/netstandard2.0/SDL2-CS.dll": {
|
||||
"assemblyVersion": "0.0.0.0",
|
||||
"fileVersion": "0.0.0.0"
|
||||
}
|
||||
},
|
||||
"runtimeTargets": {
|
||||
"runtimes/linux-x64/native/libSDL2.so": {
|
||||
"rid": "linux-x64",
|
||||
"assetType": "native",
|
||||
"fileVersion": "0.0.0.0"
|
||||
},
|
||||
"runtimes/linux-x86/native/libSDL2.so": {
|
||||
"rid": "linux-x86",
|
||||
"assetType": "native",
|
||||
"fileVersion": "0.0.0.0"
|
||||
},
|
||||
"runtimes/osx-arm64/native/libSDL2.dylib": {
|
||||
"rid": "osx-arm64",
|
||||
"assetType": "native",
|
||||
"fileVersion": "0.0.0.0"
|
||||
},
|
||||
"runtimes/osx-x64/native/libSDL2.dylib": {
|
||||
"rid": "osx-x64",
|
||||
"assetType": "native",
|
||||
"fileVersion": "0.0.0.0"
|
||||
},
|
||||
"runtimes/win-arm64/native/SDL2.dll": {
|
||||
"rid": "win-arm64",
|
||||
"assetType": "native",
|
||||
"fileVersion": "0.0.0.0"
|
||||
},
|
||||
"runtimes/win-x64/native/SDL2.dll": {
|
||||
"rid": "win-x64",
|
||||
"assetType": "native",
|
||||
"fileVersion": "0.0.0.0"
|
||||
},
|
||||
"runtimes/win-x86/native/SDL2.dll": {
|
||||
"rid": "win-x86",
|
||||
"assetType": "native",
|
||||
"fileVersion": "0.0.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"libraries": {
|
||||
"dotnet-console/1.0.0": {
|
||||
"type": "project",
|
||||
"serviceable": false,
|
||||
"sha512": ""
|
||||
},
|
||||
"ppy.SDL2-CS/1.0.596-alpha": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-yzIdTCjPp9le6J16WyG4py8frdwUTcsnqpGnuAk7Za2pvXGPmvVAiQBrdnFS58l2S6bS8AFNIG3uOSRQrMo1nQ==",
|
||||
"path": "ppy.sdl2-cs/1.0.596-alpha",
|
||||
"hashPath": "ppy.sdl2-cs.1.0.596-alpha.nupkg.sha512"
|
||||
}
|
||||
}
|
||||
}
|
||||
Binary file not shown.
|
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<dllmap dll="SDL2" os="windows" target="SDL2.dll"/>
|
||||
<dllmap dll="SDL2" os="osx" target="libSDL2.dylib"/>
|
||||
<dllmap dll="SDL2" os="linux" target="libSDL2-2.0.so.0"/>
|
||||
</configuration>
|
||||
Binary file not shown.
|
|
@ -0,0 +1,9 @@
|
|||
{
|
||||
"runtimeOptions": {
|
||||
"tfm": "net6.0",
|
||||
"framework": {
|
||||
"name": "Microsoft.NETCore.App",
|
||||
"version": "6.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -0,0 +1,15 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<RootNamespace>dotnet_console</RootNamespace>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="ppy.SDL2-CS" Version="1.0.596-alpha" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
// <autogenerated />
|
||||
using System;
|
||||
using System.Reflection;
|
||||
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")]
|
||||
Binary file not shown.
|
|
@ -0,0 +1,22 @@
|
|||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
using System;
|
||||
using System.Reflection;
|
||||
|
||||
[assembly: System.Reflection.AssemblyCompanyAttribute("dotnet-console")]
|
||||
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
|
||||
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
|
||||
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
|
||||
[assembly: System.Reflection.AssemblyProductAttribute("dotnet-console")]
|
||||
[assembly: System.Reflection.AssemblyTitleAttribute("dotnet-console")]
|
||||
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
||||
|
||||
// Generated by the MSBuild WriteCodeFragment class.
|
||||
|
||||
|
|
@ -0,0 +1 @@
|
|||
5a44bd4435b7014cf09d126ef56021bc8e8fc082
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
is_global = true
|
||||
build_property.TargetFramework = net6.0
|
||||
build_property.TargetPlatformMinVersion =
|
||||
build_property.UsingMicrosoftNETSdkWeb =
|
||||
build_property.ProjectTypeGuids =
|
||||
build_property.InvariantGlobalization =
|
||||
build_property.PlatformNeutralAssembly =
|
||||
build_property._SupportedPlatformList = Linux,macOS,Windows
|
||||
build_property.RootNamespace = dotnet_console
|
||||
build_property.ProjectDir = /home/gordon/git/dotnet-console/
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
// <auto-generated/>
|
||||
global using global::System;
|
||||
global using global::System.Collections.Generic;
|
||||
global using global::System.IO;
|
||||
global using global::System.Linq;
|
||||
global using global::System.Net.Http;
|
||||
global using global::System.Threading;
|
||||
global using global::System.Threading.Tasks;
|
||||
Binary file not shown.
Binary file not shown.
|
|
@ -0,0 +1 @@
|
|||
1430158ffd0195d00b80893ad9906b7cccc4512f
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
/home/gordon/git/dotnet-console/bin/Debug/net6.0/dotnet-console
|
||||
/home/gordon/git/dotnet-console/bin/Debug/net6.0/dotnet-console.deps.json
|
||||
/home/gordon/git/dotnet-console/bin/Debug/net6.0/dotnet-console.runtimeconfig.json
|
||||
/home/gordon/git/dotnet-console/bin/Debug/net6.0/dotnet-console.dll
|
||||
/home/gordon/git/dotnet-console/bin/Debug/net6.0/dotnet-console.pdb
|
||||
/home/gordon/git/dotnet-console/obj/Debug/net6.0/dotnet-console.csproj.AssemblyReference.cache
|
||||
/home/gordon/git/dotnet-console/obj/Debug/net6.0/dotnet-console.GeneratedMSBuildEditorConfig.editorconfig
|
||||
/home/gordon/git/dotnet-console/obj/Debug/net6.0/dotnet-console.AssemblyInfoInputs.cache
|
||||
/home/gordon/git/dotnet-console/obj/Debug/net6.0/dotnet-console.AssemblyInfo.cs
|
||||
/home/gordon/git/dotnet-console/obj/Debug/net6.0/dotnet-console.csproj.CoreCompileInputs.cache
|
||||
/home/gordon/git/dotnet-console/obj/Debug/net6.0/dotnet-console.dll
|
||||
/home/gordon/git/dotnet-console/obj/Debug/net6.0/refint/dotnet-console.dll
|
||||
/home/gordon/git/dotnet-console/obj/Debug/net6.0/dotnet-console.pdb
|
||||
/home/gordon/git/dotnet-console/obj/Debug/net6.0/dotnet-console.genruntimeconfig.cache
|
||||
/home/gordon/git/dotnet-console/obj/Debug/net6.0/ref/dotnet-console.dll
|
||||
/home/gordon/git/dotnet-console/bin/Debug/net6.0/dotnet-console.dll.config
|
||||
/home/gordon/git/dotnet-console/bin/Debug/net6.0/SDL2-CS.dll
|
||||
/home/gordon/git/dotnet-console/bin/Debug/net6.0/runtimes/linux-x64/native/libSDL2.so
|
||||
/home/gordon/git/dotnet-console/bin/Debug/net6.0/runtimes/linux-x86/native/libSDL2.so
|
||||
/home/gordon/git/dotnet-console/bin/Debug/net6.0/runtimes/osx-arm64/native/libSDL2.dylib
|
||||
/home/gordon/git/dotnet-console/bin/Debug/net6.0/runtimes/osx-x64/native/libSDL2.dylib
|
||||
/home/gordon/git/dotnet-console/bin/Debug/net6.0/runtimes/win-arm64/native/SDL2.dll
|
||||
/home/gordon/git/dotnet-console/bin/Debug/net6.0/runtimes/win-x64/native/SDL2.dll
|
||||
/home/gordon/git/dotnet-console/bin/Debug/net6.0/runtimes/win-x86/native/SDL2.dll
|
||||
/home/gordon/git/dotnet-console/obj/Debug/net6.0/dotnet-console.csproj.CopyComplete
|
||||
Binary file not shown.
|
|
@ -0,0 +1 @@
|
|||
6e47d573ce23f499195def0267a82bede4ac78dc
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -0,0 +1,73 @@
|
|||
{
|
||||
"format": 1,
|
||||
"restore": {
|
||||
"/home/gordon/git/dotnet-console/dotnet-console.csproj": {}
|
||||
},
|
||||
"projects": {
|
||||
"/home/gordon/git/dotnet-console/dotnet-console.csproj": {
|
||||
"version": "1.0.0",
|
||||
"restore": {
|
||||
"projectUniqueName": "/home/gordon/git/dotnet-console/dotnet-console.csproj",
|
||||
"projectName": "dotnet-console",
|
||||
"projectPath": "/home/gordon/git/dotnet-console/dotnet-console.csproj",
|
||||
"packagesPath": "/home/gordon/.nuget/packages/",
|
||||
"outputPath": "/home/gordon/git/dotnet-console/obj/",
|
||||
"projectStyle": "PackageReference",
|
||||
"configFilePaths": [
|
||||
"/home/gordon/.nuget/NuGet/NuGet.Config"
|
||||
],
|
||||
"originalTargetFrameworks": [
|
||||
"net6.0"
|
||||
],
|
||||
"sources": {
|
||||
"https://api.nuget.org/v3/index.json": {}
|
||||
},
|
||||
"frameworks": {
|
||||
"net6.0": {
|
||||
"targetAlias": "net6.0",
|
||||
"projectReferences": {}
|
||||
}
|
||||
},
|
||||
"warningProperties": {
|
||||
"warnAsError": [
|
||||
"NU1605"
|
||||
]
|
||||
}
|
||||
},
|
||||
"frameworks": {
|
||||
"net6.0": {
|
||||
"targetAlias": "net6.0",
|
||||
"dependencies": {
|
||||
"ppy.SDL2-CS": {
|
||||
"target": "Package",
|
||||
"version": "[1.0.596-alpha, )"
|
||||
}
|
||||
},
|
||||
"imports": [
|
||||
"net461",
|
||||
"net462",
|
||||
"net47",
|
||||
"net471",
|
||||
"net472",
|
||||
"net48",
|
||||
"net481"
|
||||
],
|
||||
"assetTargetFallback": true,
|
||||
"warn": true,
|
||||
"downloadDependencies": [
|
||||
{
|
||||
"name": "Microsoft.AspNetCore.App.Ref",
|
||||
"version": "[6.0.9, 6.0.9]"
|
||||
}
|
||||
],
|
||||
"frameworkReferences": {
|
||||
"Microsoft.NETCore.App": {
|
||||
"privateAssets": "all"
|
||||
}
|
||||
},
|
||||
"runtimeIdentifierGraphPath": "/usr/share/dotnet/sdk/6.0.401/RuntimeIdentifierGraph.json"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
|
||||
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
|
||||
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
|
||||
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">/home/gordon/.nuget/packages/</NuGetPackageRoot>
|
||||
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">/home/gordon/.nuget/packages/</NuGetPackageFolders>
|
||||
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
|
||||
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.3.0</NuGetToolVersion>
|
||||
</PropertyGroup>
|
||||
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||
<SourceRoot Include="/home/gordon/.nuget/packages/" />
|
||||
</ItemGroup>
|
||||
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||
<Content Include="$(NuGetPackageRoot)ppy.sdl2-cs/1.0.596-alpha/contentFiles/any/netstandard2.0/app.config" Condition="Exists('$(NuGetPackageRoot)ppy.sdl2-cs/1.0.596-alpha/contentFiles/any/netstandard2.0/app.config')">
|
||||
<NuGetPackageId>ppy.SDL2-CS</NuGetPackageId>
|
||||
<NuGetPackageVersion>1.0.596-alpha</NuGetPackageVersion>
|
||||
<NuGetItemType>Content</NuGetItemType>
|
||||
<Pack>false</Pack>
|
||||
<Private>False</Private>
|
||||
<Link>app.config</Link>
|
||||
</Content>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" />
|
||||
|
|
@ -0,0 +1,149 @@
|
|||
{
|
||||
"version": 3,
|
||||
"targets": {
|
||||
"net6.0": {
|
||||
"ppy.SDL2-CS/1.0.596-alpha": {
|
||||
"type": "package",
|
||||
"compile": {
|
||||
"lib/netstandard2.0/SDL2-CS.dll": {}
|
||||
},
|
||||
"runtime": {
|
||||
"lib/netstandard2.0/SDL2-CS.dll": {}
|
||||
},
|
||||
"contentFiles": {
|
||||
"contentFiles/any/netstandard2.0/app.config": {
|
||||
"buildAction": "Content",
|
||||
"codeLanguage": "any",
|
||||
"copyToOutput": false
|
||||
}
|
||||
},
|
||||
"runtimeTargets": {
|
||||
"runtimes/linux-x64/native/libSDL2.so": {
|
||||
"assetType": "native",
|
||||
"rid": "linux-x64"
|
||||
},
|
||||
"runtimes/linux-x86/native/libSDL2.so": {
|
||||
"assetType": "native",
|
||||
"rid": "linux-x86"
|
||||
},
|
||||
"runtimes/osx-arm64/native/libSDL2.dylib": {
|
||||
"assetType": "native",
|
||||
"rid": "osx-arm64"
|
||||
},
|
||||
"runtimes/osx-x64/native/libSDL2.dylib": {
|
||||
"assetType": "native",
|
||||
"rid": "osx-x64"
|
||||
},
|
||||
"runtimes/win-arm64/native/SDL2.dll": {
|
||||
"assetType": "native",
|
||||
"rid": "win-arm64"
|
||||
},
|
||||
"runtimes/win-x64/native/SDL2.dll": {
|
||||
"assetType": "native",
|
||||
"rid": "win-x64"
|
||||
},
|
||||
"runtimes/win-x86/native/SDL2.dll": {
|
||||
"assetType": "native",
|
||||
"rid": "win-x86"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"libraries": {
|
||||
"ppy.SDL2-CS/1.0.596-alpha": {
|
||||
"sha512": "yzIdTCjPp9le6J16WyG4py8frdwUTcsnqpGnuAk7Za2pvXGPmvVAiQBrdnFS58l2S6bS8AFNIG3uOSRQrMo1nQ==",
|
||||
"type": "package",
|
||||
"path": "ppy.sdl2-cs/1.0.596-alpha",
|
||||
"files": [
|
||||
".nupkg.metadata",
|
||||
".signature.p7s",
|
||||
"content/app.config",
|
||||
"contentFiles/any/netstandard2.0/app.config",
|
||||
"lib/netstandard2.0/SDL2-CS.dll",
|
||||
"ppy.sdl2-cs.1.0.596-alpha.nupkg.sha512",
|
||||
"ppy.sdl2-cs.nuspec",
|
||||
"runtimes/linux-x64/native/libSDL2.so",
|
||||
"runtimes/linux-x86/native/libSDL2.so",
|
||||
"runtimes/osx-arm64/native/libSDL2.dylib",
|
||||
"runtimes/osx-x64/native/libSDL2.dylib",
|
||||
"runtimes/win-arm64/native/SDL2.dll",
|
||||
"runtimes/win-x64/native/SDL2.dll",
|
||||
"runtimes/win-x86/native/SDL2.dll"
|
||||
]
|
||||
}
|
||||
},
|
||||
"projectFileDependencyGroups": {
|
||||
"net6.0": [
|
||||
"ppy.SDL2-CS >= 1.0.596-alpha"
|
||||
]
|
||||
},
|
||||
"packageFolders": {
|
||||
"/home/gordon/.nuget/packages/": {}
|
||||
},
|
||||
"project": {
|
||||
"version": "1.0.0",
|
||||
"restore": {
|
||||
"projectUniqueName": "/home/gordon/git/dotnet-console/dotnet-console.csproj",
|
||||
"projectName": "dotnet-console",
|
||||
"projectPath": "/home/gordon/git/dotnet-console/dotnet-console.csproj",
|
||||
"packagesPath": "/home/gordon/.nuget/packages/",
|
||||
"outputPath": "/home/gordon/git/dotnet-console/obj/",
|
||||
"projectStyle": "PackageReference",
|
||||
"configFilePaths": [
|
||||
"/home/gordon/.nuget/NuGet/NuGet.Config"
|
||||
],
|
||||
"originalTargetFrameworks": [
|
||||
"net6.0"
|
||||
],
|
||||
"sources": {
|
||||
"https://api.nuget.org/v3/index.json": {}
|
||||
},
|
||||
"frameworks": {
|
||||
"net6.0": {
|
||||
"targetAlias": "net6.0",
|
||||
"projectReferences": {}
|
||||
}
|
||||
},
|
||||
"warningProperties": {
|
||||
"warnAsError": [
|
||||
"NU1605"
|
||||
]
|
||||
}
|
||||
},
|
||||
"frameworks": {
|
||||
"net6.0": {
|
||||
"targetAlias": "net6.0",
|
||||
"dependencies": {
|
||||
"ppy.SDL2-CS": {
|
||||
"target": "Package",
|
||||
"version": "[1.0.596-alpha, )"
|
||||
}
|
||||
},
|
||||
"imports": [
|
||||
"net461",
|
||||
"net462",
|
||||
"net47",
|
||||
"net471",
|
||||
"net472",
|
||||
"net48",
|
||||
"net481"
|
||||
],
|
||||
"assetTargetFallback": true,
|
||||
"warn": true,
|
||||
"downloadDependencies": [
|
||||
{
|
||||
"name": "Microsoft.AspNetCore.App.Ref",
|
||||
"version": "[6.0.9, 6.0.9]"
|
||||
}
|
||||
],
|
||||
"frameworkReferences": {
|
||||
"Microsoft.NETCore.App": {
|
||||
"privateAssets": "all"
|
||||
}
|
||||
},
|
||||
"runtimeIdentifierGraphPath": "/usr/share/dotnet/sdk/6.0.401/RuntimeIdentifierGraph.json"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
"version": 2,
|
||||
"dgSpecHash": "Z+HnQHJqEH3pQORn3oK/9WhS17M4sshlWSQ2haefUhu7xmUXe4i6NFbFXNMZCMcHlSu1wQ2wELP7qH7RGQ0Smw==",
|
||||
"success": true,
|
||||
"projectFilePath": "/home/gordon/git/dotnet-console/dotnet-console.csproj",
|
||||
"expectedPackageFiles": [
|
||||
"/home/gordon/.nuget/packages/ppy.sdl2-cs/1.0.596-alpha/ppy.sdl2-cs.1.0.596-alpha.nupkg.sha512",
|
||||
"/home/gordon/.nuget/packages/microsoft.aspnetcore.app.ref/6.0.9/microsoft.aspnetcore.app.ref.6.0.9.nupkg.sha512"
|
||||
],
|
||||
"logs": []
|
||||
}
|
||||
|
|
@ -0,0 +1,139 @@
|
|||
using static SDL2.SDL;
|
||||
|
||||
class Scene
|
||||
{
|
||||
public const int SCREEN_WIDTH = 800;
|
||||
public const int SCREEN_HEIGHT = 600;
|
||||
private Ship ship;
|
||||
private Renderer renderer;
|
||||
private static Scene? instance;
|
||||
|
||||
public HashSet<Shot> Shots;
|
||||
public HashSet<Asteroid> Asteroids;
|
||||
public int Score = 0;
|
||||
public int Level = 1;
|
||||
|
||||
public Scene(Renderer renderer)
|
||||
{
|
||||
this.ship = new Ship(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2);
|
||||
this.Shots = new HashSet<Shot>();
|
||||
this.Asteroids = new HashSet<Asteroid>();
|
||||
this.renderer = renderer;
|
||||
instance = this;
|
||||
}
|
||||
|
||||
public int Run()
|
||||
{
|
||||
|
||||
double dx = 0;
|
||||
DateTime start = DateTime.Now;
|
||||
SpawnAsteroids(Level + 3);
|
||||
while (true)
|
||||
{
|
||||
start = DateTime.Now;
|
||||
pollEvents();
|
||||
|
||||
var entities = new List<Object>();
|
||||
entities.Add(ship);
|
||||
entities.AddRange(Shots);
|
||||
entities.AddRange(Asteroids);
|
||||
|
||||
var keyState = new KeyState();
|
||||
renderer.Clear();
|
||||
|
||||
foreach (var entity in entities)
|
||||
{
|
||||
if (entity is Logic)
|
||||
{
|
||||
((Logic)entity).Update(keyState, dx);
|
||||
}
|
||||
if (entity is Renderable)
|
||||
{
|
||||
((Renderable)entity).Render(renderer, dx);
|
||||
}
|
||||
}
|
||||
|
||||
if (Asteroids.Count == 0)
|
||||
{
|
||||
Level++;
|
||||
SpawnAsteroids(Level + 3);
|
||||
}
|
||||
|
||||
renderer.Present();
|
||||
DateTime end = DateTime.Now;
|
||||
dx = (end - start).TotalSeconds;
|
||||
}
|
||||
}
|
||||
|
||||
public void SpawnAsteroids(int count)
|
||||
{
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
SpawnAsteroid();
|
||||
}
|
||||
}
|
||||
|
||||
public void SpawnAsteroid()
|
||||
{
|
||||
var edge = new Random().Next(0, 4);
|
||||
var x = 0;
|
||||
var y = 0;
|
||||
switch (edge)
|
||||
{
|
||||
case 0:
|
||||
x = 0;
|
||||
y = new Random().Next(0, SCREEN_HEIGHT);
|
||||
break;
|
||||
case 1:
|
||||
x = SCREEN_WIDTH;
|
||||
y = new Random().Next(0, SCREEN_HEIGHT);
|
||||
break;
|
||||
case 2:
|
||||
x = new Random().Next(0, SCREEN_WIDTH);
|
||||
y = 0;
|
||||
break;
|
||||
case 3:
|
||||
x = new Random().Next(0, SCREEN_WIDTH);
|
||||
y = SCREEN_HEIGHT;
|
||||
break;
|
||||
}
|
||||
Asteroids.Add(new Asteroid(x, y, new Random().Next(0, 200) / 100.0 * Math.PI, Size.Large));
|
||||
}
|
||||
|
||||
public void Loose()
|
||||
{
|
||||
Console.WriteLine("You loose!");
|
||||
Environment.Exit(0);
|
||||
}
|
||||
|
||||
private void pollEvents()
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static Scene Instance
|
||||
{
|
||||
get
|
||||
{
|
||||
if (instance == null)
|
||||
{
|
||||
throw new Exception("Scene not initialized");
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
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, keys, 0, arraySize);
|
||||
}
|
||||
|
||||
public bool isPressed(SDL_Keycode keycode)
|
||||
{
|
||||
byte scanCode = (byte)SDL_GetScancodeFromKey(keycode);
|
||||
return (this.keys[scanCode] == 1);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,55 @@
|
|||
using static SDL2.SDL;
|
||||
|
||||
class Renderer
|
||||
{
|
||||
IntPtr renderer;
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
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);
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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,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,96 @@
|
|||
enum Size : int
|
||||
{
|
||||
Large = 60,
|
||||
Medium = 30,
|
||||
Small = 20
|
||||
}
|
||||
|
||||
class Asteroid : Renderable, Logic
|
||||
{
|
||||
const double SPEED = 100;
|
||||
private double dx, dy;
|
||||
public double X, Y;
|
||||
public Size Size;
|
||||
private double[][] shape;
|
||||
|
||||
public Asteroid(double x, double y, double rotation, Size size)
|
||||
{
|
||||
this.X = x;
|
||||
this.Y = y;
|
||||
this.Size = size;
|
||||
dx = Math.Cos(rotation) * SPEED;
|
||||
dy = Math.Sin(rotation) * SPEED;
|
||||
var random = new Random();
|
||||
shape = new double[16][];
|
||||
for (int i = 0; i < shape.Length; i++)
|
||||
{
|
||||
var rad = i * Math.PI * 2 / shape.Length;
|
||||
shape[i] = new double[2];
|
||||
shape[i][0] = Math.Cos(rad) * (0.5 + random.NextDouble() / 2) * (int)size / 2;
|
||||
shape[i][1] = Math.Sin(rad) * (0.5 + random.NextDouble() / 2) * (int)size / 2;
|
||||
}
|
||||
}
|
||||
|
||||
public void Render(Renderer renderer, double dx)
|
||||
{
|
||||
renderer.setColor(255, 255, 255);
|
||||
// renderer.DrawRect(X - (int)Size / 2, Y - (int)Size / 2, (int)Size, (int)Size);
|
||||
double[][] drawLines = new double[shape.Length + 1][];
|
||||
for (int i = 0; i < shape.Length; i++)
|
||||
{
|
||||
drawLines[i] = new double[2];
|
||||
drawLines[i][0] = shape[i][0] + X - (int)Size / 2;
|
||||
drawLines[i][1] = shape[i][1] + Y - (int)Size / 2;
|
||||
}
|
||||
drawLines[drawLines.Length - 1] = new double[2];
|
||||
drawLines[drawLines.Length - 1][0] = shape[0][0] + X - (int)Size / 2;
|
||||
drawLines[drawLines.Length - 1][1] = shape[0][1] + Y - (int)Size / 2;
|
||||
renderer.DrawLines(drawLines);
|
||||
}
|
||||
|
||||
public void Update(KeyState keyState, double dx)
|
||||
{
|
||||
X += dx * this.dx;
|
||||
Y += dx * this.dy;
|
||||
this.X = this.X % Scene.SCREEN_WIDTH;
|
||||
this.Y = this.Y % Scene.SCREEN_HEIGHT;
|
||||
if (this.X < 0)
|
||||
{
|
||||
this.X += Scene.SCREEN_WIDTH;
|
||||
}
|
||||
if (this.Y < 0)
|
||||
{
|
||||
this.Y += Scene.SCREEN_HEIGHT;
|
||||
}
|
||||
|
||||
foreach (var shot in Scene.Instance.Shots)
|
||||
{
|
||||
if (Point.Distance(shot.X, shot.Y, X, Y) < (int)Size / 2)
|
||||
{
|
||||
shot.Destroy();
|
||||
this.Destroy();
|
||||
var rotation = Math.Atan2(Y - shot.Y, X - shot.X);
|
||||
if (Size == Size.Large)
|
||||
{
|
||||
Scene.Instance.Asteroids.Add(new Asteroid(X, Y, rotation + Math.PI * 2, Size.Medium));
|
||||
Scene.Instance.Asteroids.Add(new Asteroid(X, Y, rotation + Math.PI * 2 * 0.3, Size.Medium));
|
||||
Scene.Instance.Asteroids.Add(new Asteroid(X, Y, rotation + Math.PI * 2 * 0.6, Size.Medium));
|
||||
}
|
||||
if (Size == Size.Medium)
|
||||
{
|
||||
Scene.Instance.Asteroids.Add(new Asteroid(X, Y, rotation + Math.PI * 2 * 0.3, Size.Small));
|
||||
Scene.Instance.Asteroids.Add(new Asteroid(X, Y, rotation + Math.PI * 2 * 0.6, Size.Small));
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void Destroy()
|
||||
{
|
||||
Scene.Instance.Score += (int)Size;
|
||||
Scene.Instance.Asteroids.Remove(this);
|
||||
Console.WriteLine("Asteroid destroyed");
|
||||
Console.WriteLine("Score: " + Scene.Instance.Score);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,94 @@
|
|||
using static SDL2.SDL;
|
||||
|
||||
|
||||
class Ship : Logic, Renderable
|
||||
{
|
||||
const double SPEED = 0.3;
|
||||
const double ROTATION_SPEED = 5;
|
||||
|
||||
double rotation = 0;
|
||||
bool thrust = false;
|
||||
private double dx, dy = 0;
|
||||
double x;
|
||||
double y;
|
||||
DateTime lastShot = DateTime.Now;
|
||||
|
||||
public Ship(double x, double y)
|
||||
{
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
}
|
||||
|
||||
public void Update(KeyState keyState, double dt)
|
||||
{
|
||||
thrust = false;
|
||||
if (keyState.isPressed(SDL_Keycode.SDLK_LEFT))
|
||||
{
|
||||
rotation -= ROTATION_SPEED * dt;
|
||||
}
|
||||
if (keyState.isPressed(SDL_Keycode.SDLK_RIGHT))
|
||||
{
|
||||
rotation += ROTATION_SPEED * dt;
|
||||
}
|
||||
if (keyState.isPressed(SDL_Keycode.SDLK_UP))
|
||||
{
|
||||
thrust = true;
|
||||
this.dx += Math.Cos(rotation) * SPEED * dt;
|
||||
this.dy += Math.Sin(rotation) * SPEED * dt;
|
||||
}
|
||||
if (keyState.isPressed(SDL_Keycode.SDLK_SPACE) && (DateTime.Now - lastShot).TotalMilliseconds > 200)
|
||||
{
|
||||
lastShot = DateTime.Now;
|
||||
var shot = new Shot(x, y, rotation);
|
||||
Scene.Instance.Shots.Add(shot);
|
||||
}
|
||||
rotation = rotation % (2 * Math.PI);
|
||||
if (rotation < 0)
|
||||
{
|
||||
rotation += 2 * Math.PI;
|
||||
}
|
||||
this.x += this.dx;
|
||||
this.y += this.dy;
|
||||
this.dx *= 0.9998;
|
||||
this.dy *= 0.9998;
|
||||
this.x = this.x % Scene.SCREEN_WIDTH;
|
||||
this.y = this.y % Scene.SCREEN_HEIGHT;
|
||||
if (this.x < 0)
|
||||
{
|
||||
this.x += Scene.SCREEN_WIDTH;
|
||||
}
|
||||
if (this.y < 0)
|
||||
{
|
||||
this.y += Scene.SCREEN_HEIGHT;
|
||||
}
|
||||
foreach (var asteroid in Scene.Instance.Asteroids)
|
||||
{
|
||||
if (Point.Distance(x, y, asteroid.X, asteroid.Y) < (int)asteroid.Size / 2)
|
||||
{
|
||||
Scene.Instance.Loose();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void Render(Renderer renderer, double dx)
|
||||
{
|
||||
renderer.setColor(255, 255, 255);
|
||||
renderer.DrawLines(new double[][] {
|
||||
new double[]{x + Math.Cos(rotation) * 10, y + Math.Sin(rotation) * 10},
|
||||
new double[]{x + Math.Cos(rotation + Math.PI * 2 / 3) * 10, y + Math.Sin(rotation + Math.PI * 2 / 3) * 10},
|
||||
new double[]{x + Math.Cos(rotation + Math.PI * 4 / 3) * 10, y + Math.Sin(rotation + Math.PI * 4 / 3) * 10},
|
||||
new double[]{x + Math.Cos(rotation) * 10, y + Math.Sin(rotation) * 10}
|
||||
});
|
||||
if (thrust)
|
||||
{
|
||||
renderer.setColor(255, 0, 0);
|
||||
// Draw flame behind ship
|
||||
renderer.DrawLines(new double[][] {
|
||||
new double[]{x + Math.Cos(rotation + Math.PI * 2 / 3) * 10, y + Math.Sin(rotation + Math.PI * 2 / 3) * 10},
|
||||
new double[]{x + Math.Cos(rotation + Math.PI * 2 / 3) * 10 + Math.Cos(rotation + Math.PI) * 10, y + Math.Sin(rotation + Math.PI * 2 / 3) * 10 + Math.Sin(rotation + Math.PI) * 10},
|
||||
new double[]{x + Math.Cos(rotation + Math.PI * 4 / 3) * 10, y + Math.Sin(rotation + Math.PI * 4 / 3) * 10},
|
||||
new double[]{x + Math.Cos(rotation + Math.PI * 2 / 3) * 10, y + Math.Sin(rotation + Math.PI * 2 / 3) * 10}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
class Shot : Renderable, Logic
|
||||
{
|
||||
const double SPEED = 300;
|
||||
private double dx, dy;
|
||||
public double X, Y;
|
||||
|
||||
public Shot(double x, double y, double rotation)
|
||||
{
|
||||
this.X = x;
|
||||
this.Y = y;
|
||||
dx = Math.Cos(rotation) * SPEED;
|
||||
dy = Math.Sin(rotation) * SPEED;
|
||||
}
|
||||
|
||||
public void Render(Renderer renderer, double dx)
|
||||
{
|
||||
renderer.setColor(255, 255, 255);
|
||||
renderer.DrawRect(X, Y, 2, 2);
|
||||
}
|
||||
|
||||
public void Update(KeyState keyState, double dx)
|
||||
{
|
||||
X += dx * this.dx;
|
||||
Y += dx * this.dy;
|
||||
if (X < 0 || X > Scene.SCREEN_WIDTH || Y < 0 || Y > Scene.SCREEN_HEIGHT)
|
||||
{
|
||||
Destroy();
|
||||
}
|
||||
}
|
||||
|
||||
public void Destroy()
|
||||
{
|
||||
Scene.Instance.Shots.Remove(this);
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue