ebSkola

2.6 Noslēguma projekts: Platformas spēle

Stundas uzdevums: Pievieno finišu un spēles tekstus. Izvēlies savu noformējumu un dod spēli izmēģināt klasesbiedram.

SR 2.4.1. Problēmas dekompozīcija SR 2.4.7. UI SR 2.4.14. Vadības struktūras SR 2.4.15. Modulāras programmas

80 min plāns: Spēles prasības (~10 min) · finišs un teksti (~25 min) · savs dizains un stāsts (~20 min) · spēles pārbaude pārī (~20 min) · iesniegšana (~5 min).

Pirms sāc: atver Level1.tscn no 2.5: Player lec, savāc punktus un atslēgu. Turpini šo pašu līmeni. Šīs stundas pamatdarbs ir viens pabeigts līmenis ar tavu dizainu un stāstu.

Pēc izmaiņām: saglabā failus. Ja mainīji C# kodu, Godot augšējā labajā stūrī nospied Build (āmura ikona). Tad palaid spēli. Pirms nākamā uzdevuma izlabo pirmo parādīto kļūdu.

Kas jāredz gatavajā spēlē

Spēles logā ir vadības taustiņi, mērķis un punktu skaits. Varonis var pārvarēt trīs platformas, savākt piecus punktu priekšmetus un atslēgu.

Finišs ar atslēgu rāda uzvaru. Saskare ar bīstamo zonu vai kritiens aiz grīdas malas rāda zaudējumu. Ar R visu līmeni sāk no jauna: punkti ir 0 un priekšmeti atkal savās vietās.

Šodien Scene panelī pievienosi Finish (finišu), Hazard (bīstamo zonu) un HUD (spēles tekstus). Tos vadīs dotais Level.cs fails.

1. uzdevums -

Pievieno finišu, bīstamo zonu un tekstus

  1. Atver Level1.tscn. Scene panelī atlasi Level1, spied + un pievieno Area2D. Nosauc to Finish. Inspector sadaļā Transform → Position ievadi (850,590).
  2. Atlasītajam Finish pievieno CollisionShape2D: Shape → New RectangleShape2D, klikšķis uz formas, Size = (48,100). Atkal atlasi Finish un pievieno Polygon2D ar nosaukumu Visual: Data → Polygon punkti (-24,-50), (24,-50), (24,50), (-24,50). Pie Color izvēlies zaļu krāsu.
  3. Atlasi Level1 un tāpat pievieno otru Area2D ar nosaukumu Hazard. Tā Position = (440,625). Pievieno CollisionShape2D ar taisnstūra Size = (80,30) un sarkanu Visual ar punktiem (-40,-15), (40,-15), (40,15), (-40,15).
  4. Pēc kārtas atlasi Finish un Hazard. Inspector sadaļā Collision ieslēdz tikai Layer 3 un Mask 2. Abiem pārbaudi ieslēgtu Monitoring.
  5. Atlasi Level1 un ar + pievieno CanvasLayer, nosauc to HUD. Atlasi HUD un pievieno Label ar nosaukumu Instructions. Atkārto, lai zem HUD būtu arī Status un Message. Tie rādīs tekstu spēles logā.
  6. Atlasi katru Label un Inspector sadaļā Layout → Transform ievadi zemāk tabulā doto Position un Size. Pie Autowrap Mode izvēlies Word Smart. Atver Theme Overrides → Font Sizes, ieslēdz Font Size un ieraksti 20. Laukā Text vari ierakstīt “Pārbaude”, lai tekstu uzreiz redzētu 2D skatā; palaižot spēli, kods to aizstās.
  7. Ar labo peles pogu uz Level1 → Attach Script. Izvēlies C# un ceļu res://Scripts/Level.cs. Ievieto pilno kodu zemāk. Scene saraksta nosaukumiem precīzi jāsakrīt ar parādīto paraugu.
  8. Saglabā un nospied Build, tad F5. Izmēģini finišu bez atslēgas un pēc tam ar atslēgu. Atsevišķos mēģinājumos pieskaries sarkanajai zonai un nokrīti aiz grīdas malas. Pēc katra iznākuma nospied R: jāatjaunojas gan varonim, gan priekšmetiem, gan punktiem.
Label nosaukumsPositionSize
Instructions(20,16)(1240,48)
Status(20,48)(1240,48)
Message(20,80)(1240,48)

Salīdzini ar Scene paneli: daļām ar atkāpi jāatrodas zem norādītā objekta. Ja kāda ir nepareizā vietā, pārvelc to uz vajadzīgo objektu.

Level1 (Node2D, Level.cs)
├── Player (no Player.tscn)
├── Ground, Platform1, Platform2, Platform3
├── Coin1, Coin2, Gem, Coin3, Coin4, Key (no Pickup.tscn)
├── Finish (Area2D + Visual + CollisionShape2D)
├── Hazard (Area2D + Visual + CollisionShape2D)
└── HUD (CanvasLayer)
    ├── Instructions (Label)
    ├── Status (Label)
    └── Message (Label)
2.6 Level.cs — pilns fails salīdzināšanai

Lejupielādēt Level.cs. Atver esošo tāda paša nosaukuma failu un aizstāj tā saturu ar šo kodu.

using Godot;

public partial class Level : Node2D
{
    [Export] public string GameTitle = "Bākas gaisma";
    [Export] public string Mission = "Atrodi dzelteno atslēgu un sasniedz zaļo bāku. Izvairies no sarkanās bedres!";
    [Export] public string WinText = "Bāka atkal spīd. Kuģi var atrast mājas!";
    [Export] public string LoseText = "Ceļojums pārtrūka. Mēģini vēlreiz!";
    [Export] public string LockedText = "Vispirms atrodi dzelteno atslēgu augšējā platformā.";

    private Player player;
    private Label status;
    private Label message;
    public bool GameEnded { get; private set; } = false;

    public override void _Ready()
    {
        player = GetNode<Player>("Player");
        status = GetNode<Label>("HUD/Status");
        message = GetNode<Label>("HUD/Message");
        GetNode<Label>("HUD/Instructions").Text =
            $"{GameTitle} | A/D vai ←/→: kustība | Space: lēciens | R: sākt no jauna";
        message.Text = Mission;
        GetNode<Area2D>("Finish").BodyEntered += OnFinishEntered;
        GetNode<Area2D>("Hazard").BodyEntered += OnHazardEntered;
        UpdateHud();
    }

    public override void _Process(double delta)
    {
        if (Input.IsActionJustPressed("restart"))
        {
            GetTree().ReloadCurrentScene();
            return;
        }

        if (!GameEnded && player.GlobalPosition.Y > 800)
            EndGame(false);

        UpdateHud();
    }

    private void UpdateHud()
    {
        string keyStatus = player.HasKey ? "ir" : "nav";
        status.Text = $"Punkti: {player.Score} | Atslēga: {keyStatus}";
    }

    private void OnFinishEntered(Node2D body)
    {
        if (body != player || GameEnded) return;

        if (player.HasKey)
            EndGame(true);
        else
            message.Text = LockedText;
    }

    private void OnHazardEntered(Node2D body)
    {
        if (body == player) EndGame(false);
    }

    private void EndGame(bool won)
    {
        if (GameEnded) return;
        GameEnded = true;
        player.IsActive = false;
        player.Velocity = Vector2.Zero;
        message.Text = (won ? WinText : LoseText) + " | Nospied R, lai spēlētu vēlreiz.";
        UpdateHud();
    }
}

Gatavs, kad: spēlei ir sākums, uzvara, divi zaudējuma veidi un atkārtota spēle. Pēc uzvaras vai zaudējuma varonis nekustas un jaunus punktus iegūt nevar.

Atbalsts: pilns piemēra projekts

Lejupielādēt piemēru (ZIP)

Ja esi iestrēdzis, izpako atsevišķā mapē, Godot .NET Project Manager izvēlies Import → project.godot, tad Build un F5. Piemēra .csproj ir sagatavots Godot 4.7.2 .NET un .NET 8. Ja skolā lieto citu Godot 4 .NET versiju, izveido tajā tukšu C# projektu un pārnes piemēra Scenes, Scripts un Input Map; saglabā savas versijas ģenerēto .csproj.

Salīdzini konkrēto nestrādājošo daļu ar savu projektu un izlabo to. Lejupielādētajā piemērā ir 2.5 pamatlēciens; savus ieviestos lēciena uzlabojumus saglabā. Piemēra gatavība neaizstāj tavas dizaina un stāsta izvēles. Piemēra palaišana un pārbaudes.

2. uzdevums -

Padari projektu par savu spēli

  1. Izvēlies nosaukumu un uzraksti trīs īsus teikumus: kas ir varonis, ko viņš vēlas un kāpēc. Piemēram: “Robots meklē enerģijas kodolu. Tam jāatjauno bāka. Bez gaismas kuģi nevar atrast mājas.” Izdomā savu stāstu.
  2. Scene panelī atlasi Level1. Inspector laukā Game Title ieraksti spēles nosaukumu, Mission — mērķi, Win Text — uzvaras tekstu, Lose Text — zaudējuma tekstu, Locked Text — norādi, ja atslēgas vēl nav. Palaid ar F5 un pārbaudi tekstus.
  3. Maini vismaz trīs spēles daļu izskatu. Piemēram, atver Player.tscn, atlasi Visual un nomaini Color. Level1 cilnē tāpat vari mainīt platformu un finiša Visual krāsu vai Data → Polygon punktus.
  4. Ja vēlies izmantot savu attēlu, projekta mapē izveido Art un iekopē tajā PNG failu. Godot tas parādīsies FileSystem panelī. Attiecīgajam objektam ar + pievieno Sprite2D un no FileSystem ievelc PNG tā Inspector laukā Texture. Pielāgo Sprite2D Transform → Scale; veco Visual paslēp ar acs ikonu Scene panelī. Paša Player, Ground vai Pickup laukā Scale atstāj (1,1). Atlasi CollisionShape2D un pielāgo tā Shape izmēru attēlam.
  5. Izvēlies, ko stāstā nozīmē punkti, atslēga un finišs. Ja atslēga tagad ir enerģijas kodols, failā Level.cs atrodi redzamo tekstu Atslēga: un nomaini to uz Kodols:. Pielāgo arī Mission un Locked Text. Nosaukumus HasKey un PickupType.Key kodā atstāj.
  6. Level1 cilnē atlasi vismaz vienu platformu vai priekšmetu un maini Transform → Position. Izspēlē visu ceļu vēlreiz. Pārbaudi, ka teksti ir salasāmi un finišu var atšķirt no bīstamās zonas. README.md īsi pamato trīs izskata izmaiņas; aizņemtiem attēliem norādi autoru un licenci.

Gatavs, kad: spēlē redzams tavs nosaukums, mērķis un trīs izskata izmaiņas. Esi pārvietojis vismaz vienu platformu vai priekšmetu un pārbaudījis, ka līmeni var iziet.

3. uzdevums -

Dod klasesbiedram izspēlēt un novērs atrastās kļūdas

  1. Dod klasesbiedram spēli bez mutiskiem norādījumiem. Viņam vadība un mērķis jāatrod spēles logā. Pieraksti vienu neskaidrību un vienu veiksmīgu dizaina izvēli.
  2. Veic visus zemāk norādītos testus. README.md pieraksti sagaidāmo un faktisko rezultātu, kā arī veikto labojumu, ja pārbaude neizdodas.
  3. Pēc dizaina izmaiņām pārbaudi sadursmju formas, atslēgas sasniedzamību, teksta salasāmību un finiša atpazīstamību. Salabo vismaz vienu atrasto problēmu vai īsteno testētāja ieteikumu.
  4. Saglabā visu projektu un pārbaudi to no atsevišķas kopijas bez .godot mapes: Import, Build, F5. Tas atklāj trūkstošus attēlus vai nepareizus ceļus.
  5. Ieraksti īsu demonstrāciju: mērķis un tavs dizains, priekšmeta savākšana, zaudējums un R, pēc tam atslēgas savākšana un uzvara. Saglabā Git un iesniedz krātuves saiti.
PārbaudeSagaidāmais rezultāts
F5 no jauna0 punktu, nav atslēgas, visi priekšmeti atrodas līmenī, vadība un mērķis redzami.
Kustība un lēciensA/D un bultiņas darbojas; varonis neiet cauri grīdai un nevar bezgalīgi lēkt gaisā.
SavākšanaCoin +1, Gem +5, Key maina atslēgas stāvokli; viens objekts pieskaita tikai vienreiz.
Finišs bez atslēgasUzvaras nav; spēlētājs saņem saprotamu norādi.
Finišs ar atslēguParādās tava stāsta uzvaras teksts; kustība un savākšana apstājas.
Hazard un kritiens ārpus laukumaKatrs atsevišķi rada zaudējumu ar redzamu atkārtotas spēles norādi.
R spēles laikā, pēc zaudējuma un pēc uzvarasSākuma pozīcija, 0 punktu, nav atslēgas, visi priekšmeti atjaunoti; atkārto vismaz divreiz.

Gatavs, kad: cits cilvēks saprot un pabeidz spēli; visas pamatpārbaudes izpildās arī pēc pārstartēšanas.

Papildu uzdevums — uzlabo spēles tekstu izskatu

Scene panelī zem HUD atlasi Instructions, Status vai Message. Inspector sadaļā Theme Overrides → Colors ieslēdz Font Color un izvēlies krāsu. Sadaļā Font Sizes → Font Size pielāgo burtu izmēru.

Palaid spēli un pārbaudi garāko mērķa, uzvaras un zaudējuma tekstu. Ja rindas pārklājas, pielāgo Label laukus Layout → Transform → Position un Size.

Parādi savu spēli

Parādi spēles nosaukumu, varoni, mērķi un uzvaras tekstu. Paskaidro trīs savas izskata izvēles un vienu izmaiņu platformu vai priekšmetu novietojumā.

Pastāsti, ko klasesbiedrs saprata uzreiz, kur viņš apstājās un ko tu pēc pārbaudes uzlaboji.

Ko sagatavo

Stundas mērķis: klasesbiedrs bez tavas palīdzības saprot spēles mērķi, var uzvarēt un sākt no jauna.

GitHub krātuvē jābūt:

  1. Pilns projekts ar scēnām, Player.cs, Pickup.cs, Level.cs un izmantotajiem attēliem.
  2. README.md: nosaukums, stāsta trīs teikumi, vadība, uzvaras/zaudējuma nosacījumi un palaišanas norādes ar Godot .NET versiju.
  3. Trīs pamatotas vizuālā dizaina izvēles, sava līmeņa izkārtojuma apraksts un izmantoto ārējo resursu avoti/licences.
  4. Aizpildītas pamatpārbaudes, klasesbiedra atsauksme, veiktais uzlabojums un demonstrācijas video vai saite uz to.

Saglabā visu projektu: project.godot, .csproj, scēnas, skriptus un izmantotos attēlus. .gitignore ieraksti .godot/, bin/ un obj/ katru savā rindā.

Kā iesniedz: saglabā izmaiņas Git un nosūti tās uz GitHub tāpat kā 1. tēmā (commit un push). Skolotāja norādītajā vietā iesniedz GitHub krātuves saiti; README.md un pārbaudes pierādījumiem jābūt krātuvē.

Ja kaut kas nestrādā

PazīmeKo pārbaudīt
Node not foundScene panelī salīdzini nosaukumus un atkāpes ar paraugu. Pārbaudi arī lielos burtus vārdos HUD, Status, Message, Instructions, Player, Finish un Hazard.
Finišs vai bīstamā zona nereaģēScene panelī atlasi Finish vai Hazard: Inspector pārbaudi Collision → Mask 2 un ieslēgtu Monitoring. Zem tiem jābūt CollisionShape2D ar Shape. Pie Level1 jābūt Level.cs skriptam.
R neatjauno visu spēliProject → Project Settings → Input Map pārbaudi restart → R. FileSystem ar labo pogu uz Level1.tscn → Set as Main Scene. Salīdzini Level.cs ar pilno failu.
Pēc uzvaras var turpināt vāktPlayer kustībā un Pickup savākšanā jāpārbauda IsActive; salīdzini pilnos failus.
Pēc attēla maiņas sadursme ir nepareizaAtlasi CollisionShape2D un pielāgo Shape izmēru un Transform → Position. Paša Player vai platformas Scale atstāj (1,1).