Skip to content
Snippets Groups Projects
Commit 139708da authored by Salovaara Kosti Juhani's avatar Salovaara Kosti Juhani
Browse files

Versio 1.0, lisatty grafiikat ja koodi kommentoitu

parent 3c3ff1a4
No related branches found
No related tags found
No related merge requests found
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="VcsDirectoryMappings"> <component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
<mapping directory="$PROJECT_DIR$" vcs="Git" /> <mapping directory="$PROJECT_DIR$" vcs="Git" />
</component> </component>
</project> </project>
\ No newline at end of file
...@@ -14,11 +14,11 @@ ...@@ -14,11 +14,11 @@
<option name="LAST_RESOLUTION" value="IGNORE" /> <option name="LAST_RESOLUTION" value="IGNORE" />
</component> </component>
<component name="Git.Settings"> <component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" /> <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$/.." />
</component> </component>
<component name="ProjectColorInfo"><![CDATA[{ <component name="ProjectColorInfo">{
"associatedIndex": 4 &quot;associatedIndex&quot;: 4
}]]></component> }</component>
<component name="ProjectId" id="2ul5Xh6t4LXvV8I0yFwY1wP6QLU" /> <component name="ProjectId" id="2ul5Xh6t4LXvV8I0yFwY1wP6QLU" />
<component name="ProjectViewState"> <component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" /> <option name="hideEmptyMiddlePackages" value="true" />
...@@ -28,7 +28,8 @@ ...@@ -28,7 +28,8 @@
"keyToString": { "keyToString": {
".NET Project.TippuKivet.executor": "Run", ".NET Project.TippuKivet.executor": "Run",
"RunOnceActivity.ShowReadmeOnStart": "true", "RunOnceActivity.ShowReadmeOnStart": "true",
"git-widget-placeholder": "master", "XThreadsFramesViewSplitterKey": "0.88839287",
"git-widget-placeholder": "main",
"node.js.detected.package.eslint": "true", "node.js.detected.package.eslint": "true",
"node.js.detected.package.tslint": "true", "node.js.detected.package.tslint": "true",
"node.js.selected.package.eslint": "(autodetect)", "node.js.selected.package.eslint": "(autodetect)",
...@@ -67,6 +68,7 @@ ...@@ -67,6 +68,7 @@
<option name="presentableId" value="Default" /> <option name="presentableId" value="Default" />
<updated>1742810361526</updated> <updated>1742810361526</updated>
<workItem from="1742810362569" duration="8643000" /> <workItem from="1742810362569" duration="8643000" />
<workItem from="1742821846343" duration="7405000" />
</task> </task>
<servers /> <servers />
</component> </component>
......
TippuKivet/TippuKivet/Content/kivi.png

27.7 KiB

TippuKivet/TippuKivet/Content/pelaaja.png

58.3 KiB

TippuKivet/TippuKivet/Content/taustakuva.png

1.49 MiB

TippuKivet/TippuKivet/Content/timantti.png

12.6 KiB

...@@ -4,87 +4,111 @@ namespace TippuKivet ...@@ -4,87 +4,111 @@ namespace TippuKivet
{ {
public class TippuKivet : PhysicsGame public class TippuKivet : PhysicsGame
{ {
// Pelaajan liikkumisnopeudet oikealle ja vasemmalle
private readonly Vector nopeusOikea = new Vector(800, 0); private readonly Vector nopeusOikea = new Vector(800, 0);
private readonly Vector nopeusVasen = new Vector(-800, 0); private readonly Vector nopeusVasen = new Vector(-800, 0);
// Pelin keskeiset muuttujat
private PhysicsObject pelaaja; private PhysicsObject pelaaja;
private IntMeter pistelaskuri; private IntMeter pistelaskuri; // Pisteiden laskuri
private Timer ajastinTimantit; private Timer ajastinTimantit; // Ajastin timanttien luomiselle
private Timer ajastinKivet; private Timer ajastinKivet; // Ajastin kivien luomiselle
private int ohimenneetTimantit; private int ohimenneetTimantit; // Laskuri, montako timanttia pelaaja on missannut
public override void Begin() public override void Begin()
{ {
SetWindowSize(1024, 768, false); // Asetetaan pelin ikkunan koko
SetWindowSize(800, 600, false);
// Aloitetaan timanttien ja kivien generointi
ajastinTimantit = Timer.CreateAndStart(1.5, LuoTimantti); ajastinTimantit = Timer.CreateAndStart(1.5, LuoTimantti);
ajastinKivet = Timer.CreateAndStart(3.0, LuoKivi); ajastinKivet = Timer.CreateAndStart(3.0, LuoKivi);
// Alustetaan pistelaskuri
pistelaskuri = new IntMeter(0); pistelaskuri = new IntMeter(0);
LuoPisteNaytto(); LuoPisteNaytto();
// Asetetaan painovoima
Gravity = new Vector(0, -700); Gravity = new Vector(0, -700);
// Luodaan pelaaja ja pelin kenttä
pelaaja = LuoPelaaja(0); pelaaja = LuoPelaaja(0);
LuoKenttä(); LuoKenttä();
// Asetetaan ohjaimet
AsetaOhjaimet(); AsetaOhjaimet();
} }
private void LuoKenttä() private void LuoKenttä()
{ {
// Luodaan näkymätön alalaatta, johon kivet ja timantit voivat osua
PhysicsObject alalaatta = Level.CreateBottomBorder(); PhysicsObject alalaatta = Level.CreateBottomBorder();
alalaatta.IsVisible = false; alalaatta.IsVisible = false;
AddCollisionHandler(alalaatta, "Kivi", KiviAlalaattaCollide); AddCollisionHandler(alalaatta, "Kivi", KiviAlalaattaCollide);
AddCollisionHandler(alalaatta, "Timantti", TimanttiAlalaattaCollide); AddCollisionHandler(alalaatta, "Timantti", TimanttiAlalaattaCollide);
// Asetetaan taustakuva ja taustan väri
Level.Background.Image = LoadImage("taustakuva");
Level.Background.Color = Color.Black; Level.Background.Color = Color.Black;
// Zoomataan kamera kenttään sopivaksi
Camera.ZoomToLevel(); Camera.ZoomToLevel();
} }
// Luodaan pelaaja-objekti
private PhysicsObject LuoPelaaja(double x) private PhysicsObject LuoPelaaja(double x)
{ {
PhysicsObject pelaaja = LuoObjekti(350, 100, x, -400, Color.Red, "Pelaaja"); PhysicsObject pelaaja = LuoObjekti(150, 200, x, -300, Color.Red, "Pelaaja");
pelaaja.IgnoresCollisionResponse = true; pelaaja.IgnoresCollisionResponse = true; // Törmäykset Pelaajaan ei vaikuta.
pelaaja.IgnoresGravity = true; pelaaja.IgnoresGravity = true; // Painovoima ei vaikuta Pelaajaan
pelaaja.Image = LoadImage("pelaaja");
// Lisätään törmäyskäsittelijät pelaajalle
AddCollisionHandler(pelaaja, "Kivi", PelaajaKiviCollide); AddCollisionHandler(pelaaja, "Kivi", PelaajaKiviCollide);
AddCollisionHandler(pelaaja, "Timantti", PelaajaTimanttiCollide); AddCollisionHandler(pelaaja, "Timantti", PelaajaTimanttiCollide);
Add(pelaaja); Add(pelaaja);
return pelaaja; return pelaaja;
} }
// Luodaan pistelaskuri-näyttö
private void LuoPisteNaytto() private void LuoPisteNaytto()
{ {
Label pisteNaytto = new Label Label pisteNaytto = new Label
{ {
Position = new Vector(-400, 200), Position = new Vector(340, 250),
TextColor = Color.Red, TextColor = Color.Red,
Color = Color.White, Color = Color.White,
Size = new Vector(5000, 5000) Size = new Vector(5000, 5000),
Title = "Pisteet: ",
}; };
pisteNaytto.BindTo(pistelaskuri); pisteNaytto.BindTo(pistelaskuri);
Add(pisteNaytto); Add(pisteNaytto);
} }
// Luodaan satunnaiseen paikkaan ilmestyvä timantti
private void LuoTimantti() private void LuoTimantti()
{ {
double x = RandomGen.NextDouble(Level.Left + 50, Level.Right - 50); double x = RandomGen.NextDouble(Level.Left + 50, Level.Right - 50);
PhysicsObject timantti = LuoObjekti(60, 60, x, Level.Top + 50, Color.Yellow, "Timantti"); PhysicsObject timantti = LuoObjekti(60, 60, x, Level.Top + 50, Color.Yellow, "Timantti");
timantti.AngularVelocity = RandomGen.NextDouble(-5.0, 5.0); timantti.AngularVelocity = RandomGen.NextDouble(-5.0, 5.0);
AddCollisionHandler(timantti, "Pelaaja", PelaajaTimanttiCollide); timantti.Image = LoadImage("timantti.png");
Add(timantti); Add(timantti);
} }
private void LuoKivi() private void LuoKivi()
{ {
// Luodaan satunnaiseen paikkaan ilmestyvä kivi
double x = RandomGen.NextDouble(Level.Left + 20, Level.Right - 20); double x = RandomGen.NextDouble(Level.Left + 20, Level.Right - 20);
double randomSize = RandomGen.NextDouble(30.0, 120.0); double randomSize = RandomGen.NextDouble(30.0, 120.0);
PhysicsObject kivi = LuoObjekti(randomSize, randomSize, x, Level.Top + 50, Color.White, "Kivi"); PhysicsObject kivi = LuoObjekti(randomSize, randomSize, x, Level.Top + 50, Color.White, "Kivi");
kivi.Velocity = new Vector(0, -400); kivi.Velocity = new Vector(0, -400);
AddCollisionHandler(kivi, "Pelaaja", PelaajaKiviCollide); kivi.Image = LoadImage("kivi.png");
Add(kivi); Add(kivi);
} }
// Aliohjelma objektien luomiseen
private PhysicsObject LuoObjekti(double width, double height, double x, double y, Color color, string tag) private PhysicsObject LuoObjekti(double width, double height, double x, double y, Color color, string tag)
{ {
return new PhysicsObject(width, height, Shape.Rectangle) return new PhysicsObject(width, height, Shape.Rectangle)
...@@ -107,18 +131,21 @@ namespace TippuKivet ...@@ -107,18 +131,21 @@ namespace TippuKivet
VoitaPeli(); VoitaPeli();
} }
} }
// Pelaajan ja kiven törmäyskäsittelijä
private void PelaajaKiviCollide(PhysicsObject pelaaja, PhysicsObject kivi) private void PelaajaKiviCollide(PhysicsObject pelaaja, PhysicsObject kivi)
{ {
kivi.Destroy(); kivi.Destroy();
LopetaPeli("Kivi osui sinua päähän, Peli ohi!"); LopetaPeli("Kivi osui sinua päähän, Peli ohi!");
} }
// Kiven ja alalaatan törmäyskäsittelijä
private void KiviAlalaattaCollide(PhysicsObject alalaatta, PhysicsObject kivi) private void KiviAlalaattaCollide(PhysicsObject alalaatta, PhysicsObject kivi)
{ {
kivi.Destroy(); kivi.Destroy();
} }
// Timantin ja alalaatan törmäyskäsittelijä
private void TimanttiAlalaattaCollide(PhysicsObject alalaatta, PhysicsObject timantti) private void TimanttiAlalaattaCollide(PhysicsObject alalaatta, PhysicsObject timantti)
{ {
timantti.Destroy(); timantti.Destroy();
...@@ -129,9 +156,11 @@ namespace TippuKivet ...@@ -129,9 +156,11 @@ namespace TippuKivet
LopetaPeli("Et ollut tarpeeksi tehokas!"); LopetaPeli("Et ollut tarpeeksi tehokas!");
} }
} }
// Pelaajan koko pienenee timantin keräämisen jälkeen
private void KutistaPelaaja() private void KutistaPelaaja()
{ {
const double shrinkFactor = 0.9; const double shrinkFactor = 0.9;
const double minSize = 10.0; const double minSize = 10.0;
...@@ -142,37 +171,41 @@ namespace TippuKivet ...@@ -142,37 +171,41 @@ namespace TippuKivet
} }
} }
// Peli päättyy voittoon, jos pelaaja kerää tarpeeksi pisteitä
private void VoitaPeli() private void VoitaPeli()
{ {
MessageDisplay.Add("Olet TippuKiviLuolan suvereeni Päällikkö!"); MessageDisplay.Add("Olet TippuKiviLuolan suvereeni Päällikkö!");
ajastinTimantit.Stop(); ajastinTimantit.Stop();
ajastinKivet.Stop(); ajastinKivet.Stop();
Timer.SingleShot(6, Exit); Timer.SingleShot(6, Exit);
Pause();
} }
// Peli päättyy häviöön, jos pelaaja osuu kiveen tai missaa liikaa timantteja
private void LopetaPeli(string viesti) private void LopetaPeli(string viesti)
{ {
MessageDisplay.Add(viesti); MessageDisplay.Add(viesti);
ajastinTimantit.Stop(); ajastinTimantit.Stop();
ajastinKivet.Stop(); ajastinKivet.Stop();
Timer.SingleShot(7, Exit); Timer.SingleShot(7, Exit);
Pause();
} }
// Määritellään pelin näppäimet, pelaajan liike, pause ja ESC.
private void AsetaOhjaimet() private void AsetaOhjaimet()
{ {
Keyboard.Listen(Key.A, ButtonState.Down, AsetaNopeus, "Liikuta pelaajaa vasemmalle", pelaaja, nopeusVasen);
Keyboard.Listen(Key.A, ButtonState.Released, AsetaNopeus, null, pelaaja, Vector.Zero); Keyboard.Listen(Key.Left, ButtonState.Down, AsetaNopeus, "Liikuta pelaajaa vasemmalle", pelaaja, nopeusVasen);
Keyboard.Listen(Key.D, ButtonState.Down, AsetaNopeus, "Liikuta pelaajaa oikealle", pelaaja, nopeusOikea);
Keyboard.Listen(Key.D, ButtonState.Released, AsetaNopeus, null, pelaaja, Vector.Zero);
Keyboard.Listen(Key.Left, ButtonState.Down, AsetaNopeus, "Liikuta pelaajaa vasemmalle nuolinäppäimellä", pelaaja, nopeusVasen);
Keyboard.Listen(Key.Left, ButtonState.Released, AsetaNopeus, null, pelaaja, Vector.Zero); Keyboard.Listen(Key.Left, ButtonState.Released, AsetaNopeus, null, pelaaja, Vector.Zero);
Keyboard.Listen(Key.Right, ButtonState.Down, AsetaNopeus, "Liikuta pelaajaa oikealle nuolinäppäimellä", pelaaja, nopeusOikea); Keyboard.Listen(Key.Right, ButtonState.Down, AsetaNopeus, "Liikuta pelaajaa oikealle", pelaaja, nopeusOikea);
Keyboard.Listen(Key.Right, ButtonState.Released, AsetaNopeus, null, pelaaja, Vector.Zero); Keyboard.Listen(Key.Right, ButtonState.Released, AsetaNopeus, null, pelaaja, Vector.Zero);
Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli"); Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
Keyboard.Listen(Key.P, ButtonState.Pressed, Pause, "Pysäyttää pelin");
} }
private void AsetaNopeus(PhysicsObject pelaaja, Vector nopeus) private void AsetaNopeus(PhysicsObject pelaaja, Vector nopeus)
{ {
// Estetään pelaajaa menemästä kentän ulkopuolelle
if ((pelaaja.X + pelaaja.Width / 2 >= Level.Right && nopeus.X > 0) || if ((pelaaja.X + pelaaja.Width / 2 >= Level.Right && nopeus.X > 0) ||
(pelaaja.X - pelaaja.Width / 2 <= Level.Left && nopeus.X < 0)) (pelaaja.X - pelaaja.Width / 2 <= Level.Left && nopeus.X < 0))
{ {
...@@ -183,7 +216,5 @@ namespace TippuKivet ...@@ -183,7 +216,5 @@ namespace TippuKivet
pelaaja.Velocity = nopeus; pelaaja.Velocity = nopeus;
} }
} }
} }
} }
...@@ -10,4 +10,19 @@ ...@@ -10,4 +10,19 @@
<PackageReference Include="Jypeli.FarseerPhysics.NET" Version="2.*"/> <PackageReference Include="Jypeli.FarseerPhysics.NET" Version="2.*"/>
</ItemGroup> </ItemGroup>
<ItemGroup>
<None Update="Content\kivi.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="Content\taustakuva.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="Content\timantti.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="Content\pelaaja.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project> </Project>
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