Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • tmruisma/ohj1ht
  • eljuarha/ohj1ht
  • alvejmsu/ohj1ht
  • tuvoo/ohj1ht
  • annelinu/ohj1ht
  • malonen/ohj1ht
  • jphkauxs/ohj1ht
  • rarouvin/vaiskin-kauppapeli
  • ansovalk/ohj1ht
  • tkleinon/ohj1ht
  • tmraassy/ohj1ht
  • fmksepps/ohj1ht
  • kosksaka/ohj1ht
  • aatjarvs/ohj1ht
  • segersls/ohj1ht
  • peropami/ohj1ht
  • jylhasmy/ohj1ht
  • suomiejs/ohj1ht
  • ojanpele/ohj1ht
  • oeppulkk/ohj1ht
  • pulliami/ohj1ht
  • lemakinn/ohj1ht
  • lappkvuu/ohjelmointi-1-ht-1
  • misutuom/ohj1ht
  • vivclaje/harkkatyo
  • kohelasa/ohj1ht
  • tulehtol/ohj-1-ht-2023
  • otoskinn/ohj1ht
  • karossi/ohj1ht
  • anttlaol/ohj1ht
  • autioans/ohj1ht
  • vjokine/ohjelmointi-1-kurssin-harkkapeli
  • viempaas/ohj1ht
  • jjikouyz/ohj1ht
  • pejuuso/ohj1ht
  • ideljako/ohj1ht
  • juutirls/ohj1ht
  • nivagadd/ohj1ht
  • elvivihe/ohj1ht
  • tie/ohj1/2023k/ohj1ht
  • aruokane/ohj1ht
  • nimirich/ohj1ht
  • alarnika/ohj1ht
  • viheijo/ohj1ht
  • esshelkr/ohj1ht
  • tttkanka/ohjelmointi-1-harjoitustyo
  • jmporras/ohj1ht
  • sernopet/ohj1ht
  • alnikupa/ohj1ht
  • kamarama/ohj1ht
  • pakakata/ohj1ht
  • sorjonmi/ohj1ht
  • silimapa/ohj1ht
  • jatirkko/ohj1ht
  • jsundelu/ohj1ht
  • maerlepo/ohj1ht
  • korhoovy/ohj1ht
  • partanji/ohj1ht
  • amheikkz/ohj1ht
  • koskinnm/ohj1ht
  • pehaline/ohj1ht
  • svhyvaos/ohj1ht
  • tetutaim/ohj1ht
  • alaluuop/ohj1ht
  • veijhrxz/ohj1ht
  • anmatala/ohjelmointi-1-harjoitustyo
  • anidmapo/ohj1ht
  • ttipoiko/ohj1ht
  • pyhalavh/ohj1ht
  • jemaijal/ohj1ht
  • joanurmi/ohj1ht
  • eemaelsa/ohj1ht
  • mijoutri/ohj1ht
  • ijsalmin/ohj1ht
  • saimaahu/ohj1ht
  • annkriau/ohj1ht
  • mkhirvon/ohj1ht
  • uttija/ohj1ht
  • mikkolto/ohj1ht
  • meakorho/ohj1ht
  • laaksoel/ohj1ht
  • mholammi/ohj1ht
  • krrekahk/ohj1ht
  • wistnest/ohj1ht
  • arhesant/arttu-s-ohj-1-peli
  • ihakalel/ohj1ht
  • ijaslaii/ohj1ht
  • veosvuol/ohj1ht
  • saarelee/ohj-1-ht-o
  • aevantti/ohj1ht
  • akruth/ohj1ht
  • idjupirh/ohj1ht
  • cgmlilja/ohj1ht
  • pojujoen/ohj1ht
  • ssfrom/ohj1ht
  • heinonpe/ohj1ht
  • viitanti/ohj1ht
  • lehtolts/ohj1ht
  • galetas/ohj1ht
  • dikogalu/ohj1ht
  • wahesale/ohj1ht
  • tepesimo/ohj1ht
  • ssapakys/ohj1ht
  • vestmine/ohj1ht
  • dooleyy/ohj1ht
  • vicdavfa/ohj1ht
  • kalloupe/ohj1ht
  • katajaam/ohj1ht
  • aransjos/ohj1ht
  • kaahyton/ohj1ht
  • jarvluee/ohj1ht
  • joaframi/ohj1ht
  • saiannka/ohj1ht
  • sasumyrs/ohj-1-ht-2023
  • jumavehi/ohj-1-ht-k-23
  • juhahuov/ohj1ht
  • immoneth/ohj-1-ht-thomas-immonen
  • rimijarv/ohj1ht
  • ponkayy/ohj1ht
  • tiainess/ohj1ht
  • setkinnu/ohj1ht
  • vvkeinan/ohj1ht
  • jelavonv/ohj1ht
  • haukjohe/ohj1ht
  • jumavais/ohj1ht
  • esmajoki/ohj1ht
  • minkjmzy/ohj1ht
  • jaahwiih/ohj1ht
  • maalvirt/ohj1ht
  • tttikkan/ohj1ht
  • kihedema/ohj1ht
  • nipeniem/ohj1ht
  • saaraijm/ohj1ht
  • roalsuvi/ohj1ht
  • sjkoskel/ohj1ht
  • hsjkulma/hannelen-harjoitustyo-ohj-1
  • mitaniem/ohj1ht
  • ahiekkan/ohj1ht
  • nmpuskzv/ohj-1-ht
  • wwwmolqo/ohj1ht
  • juntjuii/ohj1ht
  • santurun/ohj1ht
  • ettalaes/ohj-1-ht
  • hairjarv/ohj1ht
  • jjbergfo/ohj1ht
  • lehtikmi/ohj1ht
  • sianpapa/ohj1ht
  • aaperttu/tipitsi
  • tie/ohj1/2024k/ohj1ht
  • hesalmuu/ohj1ht
  • erkkaoxs/ohj1ht
  • temhints/ohj1ht
  • bekrnybe/ohj-1-ht-beata-otto
  • sawakorp/ohj1ht
  • saarinan/ohj1ht
  • kronjoma/ohj1ht
  • otjolyyt/ohj1ht-otjolyyt
  • tiantaha/ohj1ht
  • krislima/ohj1ht
  • rauhulil/suunnitelma
  • jutasier/ohj1ht
  • areeheki/ohj1ht
  • lausofla/ohj-1-ht
  • vemahaka/ohj1ht
  • suurnaat/ohj1ht
  • jakaraut/ohj1ht
  • jesupalo/ohj1ht
  • ferin/ohj1ht
  • annpauko/ohj1ht
  • npfriman/ohj1ht
  • kauppmsx/ohj1ht
  • vilaleka/ohj1ht
  • rohekokk/ohj1ht
  • roiirera/ohj1ht
  • jakinnun/ohj1ht
  • tormsu/titanic
  • saukkota/ohj1ht
  • iinpitka/ohj1ht
  • samalauk/ohj1ht
  • neemjaak/ohj1ht
  • mikkonhm/ohj1ht
  • hietmaem/ohj1ht
  • skytasuz/skytta-harjoitustyo-ohj-1-kevat
  • ylonmami/ohj1ht
  • rojunatu/ohj1ht
  • niemkeys/ohj1ht
  • korhoajx/ohj1ht
  • jjrsavol/ohj1ht
  • jowinoke/ohj1ht
  • hasemajo/ohj1ht
  • pinsofhe/ohj1ht
  • peltonla/ohj1ht
  • hamaot/ohj1ht
  • kettunko/ohj1ht
  • ansammal/ohj1ht
  • lxcevrhh/ohj1ht
  • niemhizz/ohj1ht
  • jumakemp/ohj1ht
  • vmahonen/ohj-1-ht-veeti-ahonen
  • mamahank/ohj1ht
  • ajehepol/ohj1ht
  • sisverve/ohj1ht
  • samapeke/ohj1ht
  • mejniemi/ohj-1-peli
  • janjuhni/ohj1ht
  • poyhontj/ohj1ht
  • valimasj/orginal-matopeli
  • adaoliro/ohj1ht
  • ejlahti/ohj1ht
  • iileskys/ohj1ht
  • juuariju/ohj-1-ht
  • eetuoril/ohj1ht
  • ebkaariv/ohj1ht
  • mnarhi/ohj1ht
  • peltsaxs/ohj1ht
  • tkoivisx/ohj1ht
  • eovvaris/ohj-1-ht-1
  • heilauma/ohj1ht
  • mmuhonen/ohj1ht
  • leevilha/ohj1ht
  • jurvidan/ohj1ht
  • iuteitti/ilonan-harjoitustyo
  • sinkkoja/ohj1ht
  • koivuaam/ohj1ht
  • jimsaixv/salimake
  • ihalaiv/ohj1ht
  • sellmmv/projekti
  • mimatasi/ohj1ht
  • sakapusa/harkkatyo
  • annkerki/ohj1ht
  • sabevaha/ohjelmointi-1-kurssin-peli
  • alnelima/ohj1ht
  • kijoperk/ohj1ht
  • tlelakan/ohj1ht
  • ojtorppa/ohj1ht
  • sutinele/ohj1ht
  • mhjlauyy/ohj1ht
  • tidentou/ohj-1-ht
  • akpameka/ohj1ht
  • nielraut/ohj1ht
  • jomimati/ohj1ht
  • alopaate/ohj1ht
  • niptunwu/ohj1ht
  • lihiauka/ohj1ht
  • kekuvaja/ohj1ht
  • salolase/bossikasi
  • venipiil/ohj1ht
  • rantalvo/ohj1ht
  • joveheko/raekuuro
  • vivakork/ohj1ht
  • nikoskhy/ohj1ht
  • jermatkr/suunnitelmamdks
  • jaempelt/ohj1ht
  • jjhonkuu/ohj1ht
  • rautpmxt/ohj1ht
  • mmoraru/escape-from-hell
  • espakolh/ohj1ht
  • kaotkurj/ohj1ht
  • niemeiws/ohj-1-ht
  • sisavart/ohj1ht
  • sivejukl/ohj1ht
  • panjuhle/ohj1ht
  • rtaalikk/ohj1ht
  • hesalone/ohj1ht
  • topeliku/ohj1ht
  • konttijm/ohj1ht
  • llaung/ohj1ht
  • jsnikkin/ohj1ht
  • spicjrxz/ohj1ht
  • kiikriha/ohj1ht
  • juhyytin/ohj1ht
  • jajuruti/jajuruti
  • vejovile/ohj1ht
  • jjoensyu/ohj1ht
  • hjnirhax/ohj1ht
  • nobekail/ohj1ht
  • wendjkvt/ohj1ht
  • aapotska/platformer
  • lamminm/ohj1ht
  • garammtu/platformerpeli
  • apeshhhh/ohj1ht
  • tototuru/ohj1ht
  • tejupasa/ohj1ht
  • amelhadd/ohj1ht
  • heminyrh/ohj1ht
  • rehirvel/ohj1ht
  • ilfrjohe/ohj1ht
  • vkarppaz/scrape-poster
  • rikantos/ohj1ht
  • jenjulha/ohj1ht
  • miimatpa/ohj1ht
  • julsadka/ohj1ht
  • gozavoro/ohj1ht
  • viljanta/ohj1ht
  • kostamol/ohj1ht
  • ylivezu/ohj1ht
  • pjsydanm/ohj1ht
  • suvleean/ohj1ht
  • diivysei/ohjelmointi-1-harjoitustyo
  • tapiopp/ohj1ht
  • kkpyykko/ohj1ht
  • summanwe/ohj1ht
  • lpuraney/ohj1ht
  • serimaai/ohj1ht
  • tarkkael/ohj1ht
  • eljoholt/ohj1ht
  • olenkail/ohj1ht
  • alkarant/harjoitustyo
  • sajovann/ohj1ht
  • vivestma/ohj1ht
  • sodenrzt/ohj1ht
  • sssuonyy/ohj1ht
  • salmiene/ohj1ht
  • vepsanew/ohj1ht
  • aslimma/ohj1ht
  • vvimmone/ohjelmointi-1-harjoitustyo
  • hejohyde/ohjelmointi-1-harjoitustyo-hh
  • phjhaapa/ohj1ht
  • makyolaa/ohj1ht
  • mipaflin/harjoitustyo
  • juutijos/ohj1ht
  • kalini/ohj1ht
  • jaaronur/harjoitustyo
  • tie/ohj1/2025k/ohj1ht
  • teamakin/ohj1ht
  • jylhali/ohj1ht
  • ollilaas/ohj1ht
  • jkasper/ohj1ht
  • kimakiiv/ohj1ht
  • hevianes/ohj-1-ht-1
  • xwusxjid/harjoitustyo-ohj-1
  • miiseppa/ohj1ht
  • miolnauk/ohj1ht
  • karjulto/ohj1ht
  • leeaable/ohj1ht
  • emraiha/ohj1ht
  • idriemla/ohj1ht
  • mkpsoini/ohj1ht
  • lewejoen/ohj1ht
  • blanilad/ohj1ht
  • matusora/ohj1ht
  • olsonasu/ohj1ht
  • puustipa/ohj-1-reaktiopeli
  • moishe/ohj1ht
  • keleppal/ohj1ht
  • aiesmati/ohj1ht
  • misajuha/ohj1ht
  • aaelriih/ohj1ht
  • misokopo/ohj1ht
  • iblagode/ohj1ht
  • kaaelmke/ohj1ht
  • iihuuton/ohj-1-ht
  • elmapurs/ohj-1-peli
  • hankssxs/ohj1ht
  • aisoantt/ohj1ht
  • jjsaukks/ohj1ht
  • emmidaka/ohj1ht
  • lohisajo/ohj1ht
  • jlahdeww/ohj1ht
  • tepekyla/ohj1ht
  • alaxgroe/ohj1ht
  • mkrajazz/ohj1ht
  • hihehuis/ohj1ht
  • sasisiti/ohj1ht
  • tshalme/ohj1ht
  • eskrelry/ohj1ht
  • haleriak/ohj1ht
  • kerakoju/ohj1ht
  • elainnas/peli
  • sinsushi/ohj1ht
  • otemhann/ohj1ht
  • eepetaka/ohj1ht
  • ieepirzy/ohj-1-ht
  • onmahela/ohj1ht
  • jupakraa/ohj1ht
  • rajatota/ohj1ht
  • sasaable/ohj1ht
  • jupakraa/harjoitustyo-1
  • jahalmtv/ohj1ht
  • joalvihe/ohj1ht
  • joeehimm/ohj1ht
  • anvasavi/ohj1ht
  • mhmniskx/ohj1ht
  • rintalsa/ohj1ht
  • veetoivo/ohj1ht
  • rtmatilt/Swatteri
  • maukotos/blackjack
  • karppir/ohj1ht
388 results
Show changes
Commits on Source (3)
# Default ignored files
/shelf/
/workspace.xml
# Rider ignored files
/projectSettingsUpdater.xml
/.idea.Pallo TK.iml
/contentModel.xml
/modules.xml
# 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
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
</component>
</project>
\ No newline at end of file

Microsoft Visual Studio Solution File, Format Version 12.00
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Pallo TK", "Pallo TK\Pallo TK.csproj", "{0BF2CD64-B103-4D55-A750-F7045C2BC89F}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{0BF2CD64-B103-4D55-A750-F7045C2BC89F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0BF2CD64-B103-4D55-A750-F7045C2BC89F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0BF2CD64-B103-4D55-A750-F7045C2BC89F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0BF2CD64-B103-4D55-A750-F7045C2BC89F}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal
#region Using Statements
using System;
using System.Collections.Generic;
using System.Linq;
#endregion
namespace Pallo_TK
{
/// <summary>
/// The main class.
/// </summary>
public static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
using var game = new Pallo_TK();
game.Run();
}
}
}
\ No newline at end of file
using System;
using System.Collections.Generic;
using Jypeli;
using Jypeli.Assets;
using Jypeli.Controls;
using Jypeli.Widgets;
namespace Pallo_TK;
/// @author antto
/// @version 17.02.2025
/// <summary>
///
/// </summary>
public class Pallo_TK : PhysicsGame
{
public override void Begin()
{
// Kirjoita ohjelmakoodisi tähän
PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
}
}
\ No newline at end of file
<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>
</Project>
using System;
using System.Globalization;
using Jypeli;
using Jypeli.Controls;
using Jypeli.Widgets;
public class Harjoitustyo : PhysicsGame
{
private const double KENTAN_LEVEYS = 800;
private const double KENTAN_KORKEUS = 500;
private const double MAALIN_LEVEYS = 100;
private const double MAALIN_KORKEUS = 150;
private const double KESKIYMPYRAN_SADE = 50;
private const double VIIVAN_PAKSUUS = 5;
private PhysicsObject pelaaja1;
private PhysicsObject pelaaja2;
private PhysicsObject pallo;
private PhysicsObject mv1;
private PhysicsObject mv2;
private Label pelikello;
private Label pisteetPelaaja1;
private Label pisteetPelaaja2;
private Timer ajastin;
private int pisteet1 = 0;
private int pisteet2 = 0;
private PhysicsObject vasenMaalilinja;
private PhysicsObject oikeaMaalilinja;
private PhysicsObject pallonHaltija = null;
public override void Begin()
{
MessageDisplay.Add("Peli alkaa!"); // Debug-viesti
LuoKentta();
LuoPelaajat();
mv1 = LuoMaalivahti(new Vector(-KENTAN_LEVEYS / 2 + 40, 0)); // Vasen mv
mv2 = LuoMaalivahti(new Vector(KENTAN_LEVEYS / 2 - 40, 0)); // Oikea mv
LuoPallo();
LuoUI();
AsetaNappaimet();
AloitaAjastin();
// **Varmistetaan, että nämä lisätään vasta kun kaikki on luotu**
if (pallo != null && pelaaja1 != null && pelaaja2 != null)
{
AddCollisionHandler(pallo, vasenMaalilinja, TarkistaMaali);
AddCollisionHandler(pallo, oikeaMaalilinja, TarkistaMaali);
AddCollisionHandler(pallo, pelaaja1, PelaajaSaiPallon);
AddCollisionHandler(pallo, pelaaja2, PelaajaSaiPallon);
}
}
protected override void Update(Time time)
{
base.Update(time);
PaivitaPallonSijainti();
}
// Seuraavassa osiossa luodaan kenttä.
#region Luokenttä
private void LuoKentta()
{
Level.Size = new Vector(KENTAN_LEVEYS, KENTAN_KORKEUS);
Level.CreateBorders();
Level.Background.Color = Color.LightGreen;
vasenMaalilinja = new PhysicsObject(10, MAALIN_KORKEUS);
vasenMaalilinja.Position = new Vector(-KENTAN_LEVEYS / 2, 0);
vasenMaalilinja.Mass = Double.PositiveInfinity;
vasenMaalilinja.Color = Color.Gray;
oikeaMaalilinja = new PhysicsObject(10, MAALIN_KORKEUS);
oikeaMaalilinja.Position = new Vector(KENTAN_LEVEYS / 2, 0);
oikeaMaalilinja.Mass = Double.PositiveInfinity;
oikeaMaalilinja.Color = Color.Gray;
Camera.ZoomToLevel();
LuoViiva(new Vector(0, 0), KENTAN_KORKEUS, true);
LuoKeskiympyra(Vector.Zero, KESKIYMPYRAN_SADE);
LuoRangaistusalueet();
Add(oikeaMaalilinja);
Add(vasenMaalilinja);
}
private PhysicsObject LuoViiva(Vector paikka, double pituus, bool pysty)
{
double leveys = pysty ? VIIVAN_PAKSUUS : pituus;
double korkeus = pysty ? pituus : VIIVAN_PAKSUUS;
PhysicsObject viiva = new PhysicsObject(leveys, korkeus);
viiva.Position = paikka;
viiva.Color = Color.White;
viiva.IgnoresCollisionResponse = true;
Add(viiva);
return viiva; // Nyt viiva palautetaan, jotta sitä voidaan muokata myöhemmin.
}
private void LuoKeskiympyra(Vector paikka, double sade)
{
int viivojenMaara = 30; // Tarkkuus
double kulmaVäli = 360.0 / viivojenMaara;
double viivanPituus = 2 * Math.PI * sade / viivojenMaara;
for (int i = 0; i < viivojenMaara; i++)
{
double kulmaAsteina = i * kulmaVäli;
Angle kulma = Angle.FromDegrees(kulmaAsteina);
Vector alku = new Vector(paikka.X + Math.Cos(kulma.Radians) * sade,
paikka.Y + Math.Sin(kulma.Radians) * sade);
// Luo viiva ja aseta sen kulma
PhysicsObject viiva = LuoViiva(alku, viivanPituus, false);
viiva.Angle = kulma + Angle.FromDegrees(90); // Käännetään 90 astetta, jotta se asettuu ympyrään
}
}
private void LuoRangaistusalueet()
{
double maalialueenLeveys = 80;
double maalialueenKorkeus = 200;
double rangaistusalueenLeveys = 200;
double rangaistusalueenKorkeus = 300;
// **Vasemman puolen alueet
LuoLaatikko(new Vector(-KENTAN_LEVEYS / 2 + maalialueenLeveys / 2, 0), maalialueenLeveys, maalialueenKorkeus);
LuoLaatikko(new Vector(-KENTAN_LEVEYS / 2 + rangaistusalueenLeveys / 2, 0), rangaistusalueenLeveys, rangaistusalueenKorkeus);
// **Oikean puolen alueet
LuoLaatikko(new Vector(KENTAN_LEVEYS / 2 - maalialueenLeveys / 2, 0), maalialueenLeveys, maalialueenKorkeus);
LuoLaatikko(new Vector(KENTAN_LEVEYS / 2 - rangaistusalueenLeveys / 2, 0), rangaistusalueenLeveys, rangaistusalueenKorkeus);
}
private void LuoLaatikko(Vector paikka, double leveys, double korkeus)
{
// Läpinäkyvä täyttöalue
PhysicsObject tausta = new PhysicsObject(leveys, korkeus);
tausta.Position = paikka;
tausta.Color = Color.LightGreen; // Kentän taustaväri
tausta.IgnoresCollisionResponse = true;
Add(tausta);
// Reunaviiva: ohut laatikko, jonka sisällä ei ole täyttöä
double reunapaksuus = 3; // Säädä tarvittaessa
LuoViiva(new Vector(paikka.X, paikka.Y + korkeus / 2), leveys, false); // Yläreuna
LuoViiva(new Vector(paikka.X, paikka.Y - korkeus / 2), leveys, false); // Alareuna
LuoViiva(new Vector(paikka.X - leveys / 2, paikka.Y), korkeus, true); // Vasen reuna
LuoViiva(new Vector(paikka.X + leveys / 2, paikka.Y), korkeus, true); // Oikea reuna
}
#endregion
// Seuraavassa osiossa luodaan oliot.
#region Oliot
private void LuoPelaajat()
{
pelaaja1 = LuoPelaaja(new Vector(-150, 0), Color.Blue);
pelaaja2 = LuoPelaaja(new Vector(150, 0), Color.Red);
}
private PhysicsObject LuoPelaaja(Vector paikka, Color vari)
{
PhysicsObject pelaaja = new PhysicsObject(30, 30);
pelaaja.Position = paikka;
pelaaja.Color = vari;
pelaaja.Shape = Shape.Circle;
pelaaja.Restitution = 0.5;
Add(pelaaja);
return pelaaja;
}
private PhysicsObject LuoMaalivahti(Vector paikka)
{
PhysicsObject mv = new PhysicsObject(40, 40);
mv.Position = paikka;
mv.Color = Color.Green;
mv.Shape = Shape.Circle;
mv.Restitution = 0.8; // Lisää palautus, jos pallo törmää siihen
mv.IgnoresCollisionResponse = false; // Tämä varmistaa, että maalivahti ei ohita törmäyksiä
mv.IgnoresGravity = true; // Maalivahti ei putoa alas
mv.CanRotate = false;
Add(mv);
Timer.CreateAndStart(1.0, () => LiikutaMaalivahtia(mv));
return mv;
}
private void LuoPallo()
{
pallo = new PhysicsObject(20, 20);
pallo.Color = Color.Black;
pallo.Shape = Shape.Circle;
pallo.Restitution = 0.8;
Add(pallo);
}
private void LuoUI()
{
pelikello = new Label();
pelikello.Position = new Vector(0, Level.Top - 30);
pelikello.TextColor = Color.White;
Add(pelikello);
pisteetPelaaja1 = new Label("Sininen: 0");
pisteetPelaaja1.Position = new Vector(-300, Level.Top - 30);
pisteetPelaaja1.TextColor = Color.Blue;
Add(pisteetPelaaja1);
pisteetPelaaja2 = new Label("Punainen: 0");
pisteetPelaaja2.Position = new Vector(300, Level.Top - 30);
pisteetPelaaja2.TextColor = Color.Red;
Add(pisteetPelaaja2);
}
#endregion
// Seuraavassa osiossa luodaan toimintoja.
#region Toiminnot
private void TarkistaMaali(PhysicsObject pallo, PhysicsObject maali)
{
if (maali == vasenMaalilinja)
{
pisteet2++;
pisteetPelaaja2.Text = $"Punainen: {pisteet2}";
}
else if (maali == oikeaMaalilinja)
{
pisteet1++;
pisteetPelaaja1.Text = $"Sininen: {pisteet1}";
}
ResetoiPeli();
}
private void ResetoiPeli()
{
pallo.Position = Vector.Zero;
pallo.Velocity = Vector.Zero;
pallo.AngularVelocity = 0;
pelaaja1.Position = new Vector(-150, 0);
pelaaja2.Position = new Vector(150, 0);
}
private void AloitaAjastin()
{
ajastin = new Timer();
ajastin.Interval = 0.1;
ajastin.Timeout += PaivitaKello;
ajastin.Start();
}
private int peliaikaSekunteina = 0;
private void PaivitaKello()
{
peliaikaSekunteina += 2;
int minuutit = peliaikaSekunteina / 60;
int sekunnit = peliaikaSekunteina % 60;
pelikello.Text = $"Aika: {minuutit:00}:{sekunnit:00}";
if (minuutit >= 90)
{
ajastin.Stop();
MessageDisplay.Add("Peli päättyi!");
}
}
private void Liikuta(PhysicsObject pelaaja, Vector suunta)
{
pelaaja.Push(suunta);
}
private void LiikutaMaalivahtia(PhysicsObject mv)
{
// Generoidaan satunnainen liike
double uusiY = mv.Position.Y + RandomGen.NextDouble(-50, 50);
double maxY = MAALIN_KORKEUS / 2; // Maalin yläraja
double minY = -MAALIN_KORKEUS / 2; // Maalin alaraja
// Varmistetaan, että maalivahti ei mene maalin rajojen yli
if (uusiY > maxY) uusiY = maxY;
if (uusiY < minY) uusiY = minY;
// Nopeutetaan liikettä kertoimella (esimerkiksi 3.0)
double liikenopeus = 2.0;
// Asetetaan maalivahdin nopeus liikkumiselle
mv.Velocity = new Vector(0, (uusiY - mv.Position.Y) * liikenopeus);
}
//private void TorjuPallo(PhysicsObject mv, PhysicsObject pallo)
//{
// Vector torjuntaSuunta = new Vector(RandomGen.NextDouble(-1, 1), RandomGen.NextDouble(-1, 1)).Normalize();
// pallo.Hit(torjuntaSuunta * 200); // Torjunta työntää palloa satunnaiseen suuntaan
//}
private void PelaajaSaiPallon(PhysicsObject pallo, PhysicsObject pelaaja)
{
if (pallonHaltija == null || pallonHaltija != pelaaja)
{
pallonHaltija = pelaaja;
pallo.Velocity = Vector.Zero;
pallo.IgnoresGravity = true;
pallo.IgnoresCollisionResponse = true;
// Tarkistetaan kumpi pelaaja sai pallon ja asetetaan se hyökkäyssuuntaan
Vector suunta = (pelaaja == pelaaja1) ? new Vector(30, 0) : new Vector(-30, 0);
pallo.Position = pelaaja.Position + suunta;
}
}
private double hidastumisaika = 0; // Aika, joka on kulunut, kun pelaaja on pysähtymässä
private const double MAKSI_HIDASTUMIS_AIKA = 1.0; // Aika, jonka kuluessa pelaaja pysähtyy
private void Pysayta(PhysicsObject pelaaja)
{
// Jos pelaaja on jo pysähtymässä, lisää aikaa
if (hidastumisaika < MAKSI_HIDASTUMIS_AIKA)
{
hidastumisaika += 0.1; // Aika kulkee joka päivityksessä (voi säätää arvoa)
// Vähennetään pelaajan nopeutta hitaasti
pelaaja.Velocity = new Vector(pelaaja.Velocity.X * (0.25), pelaaja.Velocity.Y * (0.25));
}
else
{
// Kun aika on kulunut, pysäytämme pelaajan
pelaaja.Velocity = Vector.Zero;
}
}
private void LaukaiseTaiTaklaa(PhysicsObject pelaaja)
{
if (pallonHaltija == pelaaja)
{
// Pelaaja laukoo pallon hyökkäyssuuntaan
pallo.IgnoresGravity = false;
pallo.IgnoresCollisionResponse = false;
Vector hyokkayssuunta = (pelaaja == pelaaja1) ? new Vector(1, 0) : new Vector(-1, 0);
Vector palloSijainti = pallo.Position - pelaaja.Position;
Vector laukaisusuunta = palloSijainti.Normalize() + hyokkayssuunta;
pallo.Hit(laukaisusuunta.Normalize() * 300);
pallonHaltija = null; // Pelaaja menettää pallon hallinnan
}
else if (pallonHaltija != null && pallonHaltija != pelaaja)
{
// Pelaaja yrittää taklata pallollisen pelaajan
Vector taklausSuunta = (pallonHaltija.Position - pelaaja.Position).Normalize();
pallonHaltija.Push(taklausSuunta * 1000); // Taklausvoima kasvaa
pallo.Hit(taklausSuunta * 300); // Pallo lentää pois hallinnasta
pallonHaltija = null; // Pallollinen menettää pallon
pallo.IgnoresGravity = false;
pallo.IgnoresCollisionResponse = false;
}
}
private void PaivitaPallonSijainti()
{
if (pallo != null && pallonHaltija != null)
{
// Asetetaan pallo hyökkäyssuuntaan pelaajan mukaan
Vector suunta = (pallonHaltija == pelaaja1) ? new Vector(30, 0) : new Vector(-30, 0);
pallo.Position = pallonHaltija.Position + suunta;
pallo.Velocity = Vector.Zero;
}
}
#endregion
// Painikkeet
#region Painikkeet
private void AsetaNappaimet()
{
Keyboard.Listen(Key.W, ButtonState.Down, Liikuta, "Pelaaja 1 ylös", pelaaja1, new Vector(0, 100));
Keyboard.Listen(Key.S, ButtonState.Down, Liikuta, "Pelaaja 1 alas", pelaaja1, new Vector(0, -100));
Keyboard.Listen(Key.A, ButtonState.Down, Liikuta, "Pelaaja 1 vasemmalle", pelaaja1, new Vector(-100, 0));
Keyboard.Listen(Key.D, ButtonState.Down, Liikuta, "Pelaaja 1 oikealle", pelaaja1, new Vector(100, 0));
Keyboard.Listen(Key.Space, ButtonState.Pressed, LaukaiseTaiTaklaa, "Pelaaja 1 laukoo/taklaa", pelaaja1);
Keyboard.Listen(Key.Up, ButtonState.Down, Liikuta, "Pelaaja 2 ylös", pelaaja2, new Vector(0, 100));
Keyboard.Listen(Key.Down, ButtonState.Down, Liikuta, "Pelaaja 2 alas", pelaaja2, new Vector(0, -100));
Keyboard.Listen(Key.Left, ButtonState.Down, Liikuta, "Pelaaja 2 vasemmalle", pelaaja2, new Vector(-100, 0));
Keyboard.Listen(Key.Right, ButtonState.Down, Liikuta, "Pelaaja 2 oikealle", pelaaja2, new Vector(100, 0));
Keyboard.Listen(Key.Enter, ButtonState.Pressed, LaukaiseTaiTaklaa, "Pelaaja 2 laukoo/taklaa", pelaaja2);
Keyboard.Listen(Key.W, ButtonState.Released, Pysayta, "Pysäyttää pelaajan", pelaaja1);
Keyboard.Listen(Key.S, ButtonState.Released, Pysayta, "Pysäyttää pelaajan", pelaaja1);
Keyboard.Listen(Key.A, ButtonState.Released, Pysayta, "Pysäyttää pelaajan", pelaaja1);
Keyboard.Listen(Key.D, ButtonState.Released, Pysayta, "Pysäyttää pelaajan", pelaaja1);
Keyboard.Listen(Key.Up, ButtonState.Released, Pysayta, "Pysäyttää pelaajan", pelaaja2);
Keyboard.Listen(Key.Down, ButtonState.Released, Pysayta, "Pysäyttää pelaajan", pelaaja2);
Keyboard.Listen(Key.Left, ButtonState.Released, Pysayta, "Pysäyttää pelaajan", pelaaja2);
Keyboard.Listen(Key.Right, ButtonState.Released, Pysayta, "Pysäyttää pelaajan", pelaaja2);
Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
}
#endregion
}
...@@ -6,46 +6,55 @@ Poista sitten *kaikki* suluilla merkityt ohjetekstit.) ...@@ -6,46 +6,55 @@ Poista sitten *kaikki* suluilla merkityt ohjetekstit.)
## Tietoja ## Tietoja
Tekijä: (Etunimi Sukunimi) Tekijät: Antto Savinainen, Atte Ahola
Työ git-varaston osoite: <https://gitlab.jyu.fi/anlakane/ohj1ht> (*Korvaa* tämä osoite oman git-varastosi osoitteella) Työ git-varaston osoite: <https://gitlab.jyu.fi/anvasavi/ohj1ht>
Pelin nimi: (Nimi) Pelin nimi: Pallo TK
Pelialusta: Windows/macOS/Linux (Valitse alusta) Pelialusta: Windows
Pelaajien lukumäärä: 1/2/3/4 (Valitse pelaajien lukumäärä) Pelaajien lukumäärä: 1
## Pelin tarina ## Pelin tarina
(Pelin tarina.) Peli on jalkapallo -peli. Tee tarpeeksi monta maalia voittaaksesi pelin!
## Pelin idea ja tavoitteet ## Pelin idea ja tavoitteet
(Pelin idea ja tavoitteet.) Peliä pelataan yksin koneen ohjaamaa joukkuetta vastaan. Ensimmäisenä viisi maalia saanut voittaa!
## Hahmotelma pelistä ## Hahmotelma pelistä
Pelissä kenttä kuvataan ylhäältäpäin.
Olioita on:
- Maalivahdit 2 kpl, jotka liikkuvat omalla maalivahdin alueellaan random gen mukaisesti.
- Vastustajajoukkueen hahmot, jotka liikkuvat kentällä pallon perässä.
- Oman joukkueen hahmot, jotka liikkuvat myös kentällä pallon perässä.
- Pelaaja (käyttäjä), jokainen pelin jalkapalloilija on liikkumisvauhdiltaan ja muodoiltaan yhtäläinen. Joukkueet erottavat toisistaan ainoastaan paidan väri sekä tavoitesuunta (maali).
- Pelaajien osuessa toisiinsa syntyy törmäys (taklaus).
- Pallo. Pallon osuessa pelaajaan, törmäyksestä syntyy potku.
(Kun olet lisännyt suunnitelmakuvan tähän hakemistoon, linkitä se tähän alle. Alla on esimerkkikuvan linkitys.)
![Esimerkkikuva](esimerkkikuva.png "Esimerkkikuva") Kenttä muodostetaan kuvan mukaiseksi.
![Jalkapallokenttä](tarrat-jalkapallo-tai-jalkapallokentan-ylhaalta-1.png)
## Toteutuksen suunnitelma ## Toteutuksen suunnitelma
Helmikuu Helmikuu
- (Tavoite 1) - Tavoitteena aloittaa työ.
- (Tavoite 2) - Kentän luominen kuvan mukaiseksi.
- (Tavoite 3) - Luoda oliot
Maaliskuu Maaliskuu
- (Tavoite 1) - Tavoitteena saada pelaajat kättelemään omaa ajatusta pelistä.
- (Tavoite 2) - Alkeellisen tekoälyn luominen vastustajalle sekä omille joukkuelaisille
- (Tavoite 3) - Pelin Debuggaus ja testaaminen.
Jos aikaa jää Jos aikaa jää
- (Tavoite 1) - Luoda kolme erilaista vaikeustasoa, jonka mukaan tekoäly haastaa pelaajaa pelissä.
- (Tavoite 2) - Luoda tehosteita peliin kuten; yleisö, maalin tuulettaminen, taklausvoiman lisääminen
- (Tavoite 3) - Luoda erilaisia kenttiä
suunnitelma/tarrat-jalkapallo-tai-jalkapallokentan-ylhaalta-1.png

788 KiB

suunnitelma/tarrat-jalkapallo-tai-jalkapallokentan-ylhaalta.png

788 KiB

tarrat-jalkapallo-tai-jalkapallokentan-ylhaalta.png

788 KiB