Skip to content
Snippets Groups Projects
Commit d0df0024 authored by Jonathan Berggren's avatar Jonathan Berggren
Browse files

Lisäsin harkkatyön gitiin

parent efb29651
No related branches found
No related tags found
No related merge requests found
Showing
with 511 additions and 0 deletions
# Default ignored files
/shelf/
/workspace.xml
# Rider ignored files
/projectSettingsUpdater.xml
/modules.xml
/contentModel.xml
/.idea.Tasohyppely.iml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="UserContentModel">
<attachedFolders />
<explicitIncludes />
<explicitExcludes />
</component>
</project>
\ No newline at end of file

Microsoft Visual Studio Solution File, Format Version 12.00
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tasohyppely", "Tasohyppely\Tasohyppely.csproj", "{96AD900F-2BE5-4541-94A5-0DD8258D6EE2}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{96AD900F-2BE5-4541-94A5-0DD8258D6EE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{96AD900F-2BE5-4541-94A5-0DD8258D6EE2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{96AD900F-2BE5-4541-94A5-0DD8258D6EE2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{96AD900F-2BE5-4541-94A5-0DD8258D6EE2}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal
# Default ignored files
/shelf/
/workspace.xml
# Rider ignored files
/contentModel.xml
/.idea.Tasohyppely.iml
/modules.xml
/projectSettingsUpdater.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
<component name="ProjectDictionaryState">
<dictionary name="jonat" />
</component>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="UserContentModel">
<attachedFolders />
<explicitIncludes />
<explicitExcludes />
</component>
</project>
\ No newline at end of file
Tasohyppely/Tasohyppely/Content/maali.png

153 KiB

Tasohyppely/Tasohyppely/Content/pelaaja.png

168 KiB

M
########
P
###########
L L
##### #####
P
###########
L L
######## ########
S
####################
Tasohyppely/Tasohyppely/Content/pohja.png

78 KiB

Tasohyppely/Tasohyppely/Content/vihu.png

141 KiB

#region Using Statements
using System;
using System.Collections.Generic;
using System.Linq;
using Silk.NET.Core.Loader;
#endregion
namespace Tasohyppely
{
/// <summary>
/// The main class.
/// </summary>
public static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
((DefaultPathResolver)PathResolver.Default).Resolvers = new()
{
DefaultPathResolver.NativePackageResolver,
DefaultPathResolver.RuntimesFolderResolver,
DefaultPathResolver.BaseDirectoryResolver,
DefaultPathResolver.MainModuleDirectoryResolver,
DefaultPathResolver.LinuxVersioningResolver,
DefaultPathResolver.MacVersioningResolver,
};
using var game = new Tasohyppely();
game.Run();
}
}
}
\ No newline at end of file
using System;
using System.Collections.Generic;
using Jypeli;
using Jypeli.Assets;
using Timer = Jypeli.Timer;
namespace Tasohyppely;
/// @author Jonathan Berggren
/// @version 11.09.2024
/// <summary>
/// Tasohyppelypeli jossa tavoitteena saada hahmo maaliin ja välttää matkalla olevat vihut.
/// Vihut saa tuhottua ampumalla niitä.
/// </summary>
public class Tasohyppely : PhysicsGame
{
private const double NOPEUS = 200;
private const double HYPPYNOPEUS = 750;
private const int RUUDUN_KOKO = 40;
private PlatformCharacter pelaaja;
private int elamapisteet;
private Label elamaLabel;
List<Label> valikonKohdat;
private bool suuntaOikelalle = true;
public override void Begin()
{
Menu();
}
void AloitaPeli()
{
ClearAll();
DoNextUpdate(() => { Level.Background.ScaleToLevelFull(); });
Gravity = new Vector(0, -1000);
TileMap kentta = TileMap.FromLevelAsset("pelikentta.txt");
kentta.SetTileMethod('#', LisaaTaso);
kentta.SetTileMethod('M', LisaaMaali);
kentta.SetTileMethod('P', LisaaVihu, 5, 3);
kentta.SetTileMethod('L', LisaaVihu, 3, 3);
kentta.SetTileMethod('S', LisaaPelaaja);
kentta.Execute(RUUDUN_KOKO, RUUDUN_KOKO);
Level.CreateBorders();
Camera.ZoomToLevel();
Level.Background.Color = Color.LightBlue;
LisaaNappaimet();
PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
}
/// <summary>
/// Pelin aloitusvalikon luonti
/// </summary>
private void Menu()
{
Label otsikko = new Label("Aloitusvalikko");
otsikko.Y = 100;
otsikko.Font = new Font(60, true);
otsikko.TextColor = Color.White;
Add(otsikko);
valikonKohdat = new List<Label>();
Label kohta1 = LuoLabel("Aloita peli", new Vector(0, 40));
Label kohta2 = LuoLabel("Lopeta", new Vector(0, 0));
foreach (Label valikonKohta in valikonKohdat)
{
Add(valikonKohta);
}
Mouse.ListenOn(kohta1, MouseButton.Left, ButtonState.Pressed, AloitaPeli, null);
Mouse.ListenOn(kohta2, MouseButton.Left, ButtonState.Pressed, Exit, null);
Mouse.ListenMovement(1.0, ValikossaLiikkuminen, null);
}
/// <summary>
/// Luodaan valikon eri kohteet
/// </summary>
/// <param name="nimi">Mitä valikon kohdassa lukee</param>
/// <param name="sijainti">mihin kohtaan kohde tulee valikossa</param>
/// <returns></returns>
private Label LuoLabel(string nimi, Vector sijainti)
{
Label kohta = new Label(nimi);
kohta.Position = sijainti;
kohta.Font = new Font(35, false);
valikonKohdat.Add(kohta);
return kohta;
}
/// <summary>
/// Aloitusvalikon hiiren sijainnin huomiointi
/// </summary>
private void ValikossaLiikkuminen()
{
foreach (Label kohta in valikonKohdat)
{
if (Mouse.IsCursorOn(kohta))
{
kohta.TextColor = Color.Blue;
}
else
{
kohta.TextColor = Color.Black;
}
}
}
/// <summary>
/// Luodaan pelikentän palikka yksi kerrallaan
/// </summary>
/// <param name="paikka">mihin kohtaan palikka tulee</param>
/// <param name="leveys">mikä on palikan leveys</param>
/// <param name="korkeus">mikä on palikan korkeus</param>
private void LisaaTaso(Vector paikka, double leveys, double korkeus)
{
PhysicsObject taso = PhysicsObject.CreateStaticObject(leveys, korkeus);
taso.Position = paikka;
taso.Image = LoadImage("pohja");
Add(taso);
}
/// <summary>
/// Luodaan ja lisätään pelaaja peliin, annetaan pelaajalle ominaisuuksia
/// </summary>
/// <param name="paikka">Mihin kohtaan pelaaja luodaan</param>
/// <param name="leveys">pelaajan leveys</param>
/// <param name="korkeus">pelaajan korkeus</param>
private void LisaaPelaaja(Vector paikka, double leveys, double korkeus)
{
pelaaja = new PlatformCharacter(leveys, korkeus * 0.8);
pelaaja.Position = paikka;
pelaaja.Mass = 4.0;
elamapisteet = 3;
pelaaja.Image = LoadImage("pelaaja");
elamaLabel = new Label();
elamaLabel.Color = Color.White;
elamaLabel.TextColor = Color.Black;
elamaLabel.Font = new Font(40, false);
elamaLabel.X = Screen.Right - 300;
elamaLabel.Y = Screen.Top - 50;
elamaLabel.Text = "Elämiä: " + elamapisteet;
Add(elamaLabel);
AddCollisionHandler(pelaaja, "vihunAmmus", TormaaAmmukseen);
Add(pelaaja);
AddCollisionHandler(pelaaja, "maali", TormaaMaaliin);
}
/// <summary>
/// Mitä tapahtuu kun mmukseen törmätään
/// </summary>
/// <param name="tormaaja">kuka törmäö</param>
/// <param name="kohde">mihin törmää</param>
private void TormaaAmmukseen(PhysicsObject tormaaja, PhysicsObject kohde)
{
elamapisteet--;
elamaLabel.Text = "Elämiä: " + elamapisteet;
if (elamapisteet<=0)
{
tormaaja.Destroy();
Pause();
ClearAll();
MultiSelectWindow maaliValikko = new MultiSelectWindow("PAHUS", "Aloita uusi peli", "Lopeta");
Add(maaliValikko);
maaliValikko.AddItemHandler(0, AloitaPeli);
maaliValikko.AddItemHandler(1, Exit);
Mouse.IsCursorVisible = true;
}
}
/// <summary>
/// Luodaan maalialue ja annetaan sille ominaisuuksia
/// </summary>
/// <param name="paikka">missä on maali</param>
/// <param name="leveys">maalin leveys</param>
/// <param name="korkeus">maalin korkeus</param>
private void LisaaMaali(Vector paikka, double leveys, double korkeus)
{
PhysicsObject maali = PhysicsObject.CreateStaticObject(leveys, korkeus);
maali.IgnoresCollisionResponse = true;
maali.Position = paikka;
maali.Image = LoadImage("maali");
maali.Tag = "maali";
Add(maali);
}
/// <summary>
/// Lisätään vihollinen pelikentälle ja anneetan sille ominaisuuksia
/// </summary>
/// <param name="paikka">mihin kohtaan vihollinen luodaan</param>
/// <param name="leveys">vihollisen leveys</param>
/// <param name="korkeus">vihollisen korkeus</param>
/// <param name="liikemaara">kuinka monta ruutua vihollinen liikkuu</param>
/// <param name="hp">montako elämäpistettä vihollisella on</param>
private void LisaaVihu(Vector paikka, double leveys, double korkeus, int liikemaara, int hp)
{
Vihu vihu = new Vihu(leveys, korkeus, hp);
vihu.Position = paikka;
vihu.Image = LoadImage("vihu");
vihu.CanRotate = false;
vihu.Tag = "vihu";
vihu.IgnoresGravity = true;
vihu.Mass = 0;
Add(vihu);
PathFollowerBrain pfb = new PathFollowerBrain();
List<Vector> reitti = new List<Vector>();
reitti.Add(vihu.Position);
Vector seuraavaPiste = vihu.Position + new Vector(liikemaara * 50, 0);
reitti.Add(seuraavaPiste);
pfb.Path = reitti;
pfb.Loop = true;
vihu.Brain = pfb;
Timer ampuu = new Timer();
ampuu.Interval = 1.5;
ampuu.Timeout += delegate { Ammu(vihu, "vihunAmmus"); };
ampuu.Start();
AddCollisionHandler(vihu, "pelaajanAmmus", CollisionHandler.DestroyTarget);
AddCollisionHandler(vihu, "pelaajanAmmus", CollisionHandler.AddMeterValue(vihu.HP, -1));
vihu.Destroyed += delegate { ampuu.Stop(); };
}
/// <summary>
/// Luodaan funktio, mitä tapahtuu kun pelaaja pääsee maaliin
/// </summary>
/// <param name="törmääjä"></param>
/// <param name="kohde"></param>
private void TormaaMaaliin(PhysicsObject törmääjä, PhysicsObject kohde)
{
ClearAll();
MultiSelectWindow maaliValikko = new MultiSelectWindow("HIENOA, PÄÄSIT MAALIIN", "Aloita uusi peli", "Lopeta");
Add(maaliValikko);
maaliValikko.AddItemHandler(0, AloitaPeli);
maaliValikko.AddItemHandler(1, Exit);
Mouse.IsCursorVisible = true;
}
/// <summary>
/// Lisätään näppäimet peliin jotta pelaajaa voi liikutella ja vastaavaa
/// </summary>
private void LisaaNappaimet()
{
Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "Näytä ohjeet");
Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
ControllerOne.Listen(Button.Back, ButtonState.Pressed, Exit, "Poistu pelistä");
ControllerOne.Listen(Button.DPadLeft, ButtonState.Down, Liikuta, "Pelaaja liikkuu vasemmalle", pelaaja, -NOPEUS);
ControllerOne.Listen(Button.DPadRight, ButtonState.Down, Liikuta, "Pelaaja liikkuu oikealle", pelaaja, NOPEUS);
ControllerOne.Listen(Button.A, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", pelaaja, HYPPYNOPEUS);
Keyboard.Listen(Key.Left, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja, -NOPEUS);
Keyboard.Listen(Key.Right, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja, NOPEUS);
Keyboard.Listen(Key.Up, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", pelaaja, HYPPYNOPEUS);
Keyboard.Listen(Key.Space, ButtonState.Pressed, Ammu, "Pelaaja ampuu", pelaaja, "pelaajanAmmus");
PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
}
/// <summary>
/// Luodaan funktio joka mahdollistaa pelaajan liikuttamisen
/// </summary>
/// <param name="peluri">mitä liikutetaan</param>
/// <param name="nopeus">millä nopeudella</param>
private void Liikuta(PlatformCharacter peluri, double nopeus)
{
peluri.Walk(nopeus);
if (nopeus > 0)
{
suuntaOikelalle = true;
}
else if (nopeus < 0)
{
suuntaOikelalle = false;
}
}
/// <summary>
/// Luodaan funktio joka mahdollistaa hyppäämisen pelissä
/// </summary>
/// <param name="peluri">mitä liikutetaan</param>
/// <param name="nopeus">millä nopeudella</param>
private void Hyppaa(PlatformCharacter peluri, double nopeus)
{
peluri.Jump(nopeus);
}
/// <summary>
/// Mahdollistaa ampumisen pelissä
/// </summary>
/// <param name="heittavaOlio">mikä olio ampuu</param>
/// <param name="tagi">kenen ammus on kyseessäö</param>
private void Ammu(PhysicsObject heittavaOlio, string tagi)
{
PhysicsObject heitettavaOlio = new PhysicsObject(width: 20, height: 20, Shape.Circle);
heitettavaOlio.Position = heittavaOlio.Position;
if (heittavaOlio == pelaaja)
{
if (suuntaOikelalle)
{
heitettavaOlio.Hit(new Vector(200, 0));
}
else
{
heitettavaOlio.Hit(new Vector(-200, 0));
}
}
else
{
heitettavaOlio.Hit(new Vector(200,0));
}
heitettavaOlio.Tag = tagi;
heitettavaOlio.MaximumLifetime = TimeSpan.FromSeconds(0.5);
Add(heitettavaOlio, 3);
}
}
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net8.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Jypeli.NET" Version="11.*"/>
<PackageReference Include="Jypeli.FarseerPhysics.NET" Version="2.*"/>
</ItemGroup>
<ItemGroup>
<None Update="Content\pelikentta.txt">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Content\maali.jpeg">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="Content\pelaaja.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="Content\vihu.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="Content\pohja.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="Content\maali.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>

using Jypeli;
public class Vihu : PhysicsObject
{
public IntMeter HP;
public Vihu(double leveys, double korkeus, int elamapisteet)
: base(40, 38)
{
HP = new IntMeter(elamapisteet, 0, elamapisteet);
HP.LowerLimit += delegate () { this.Destroy(); };
}
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment