1.6 Noslēguma projekts: Pong
Stundas uzdevums: Pabeigt Pong punktu, serves, uzvaras un atkārtotas spēles ciklu un individualizēt dizainu un stāstu.
80 min plāns: Kritēriji (~10 min) · spēles cikls (~25 min) · savs noformējums un stāsts (~20 min) · pārbaude pārī (~20 min) · iesniegšana (~5 min).
Pirms sāc: turpini 1.5 Main.tscn. Abas raketes un bumba jau darbojas, Input Map ir arī serve un restart. Šodien pabeigsi partiju, kuru divi cilvēki var izspēlēt no sākuma līdz uzvarai un sākt vēlreiz.
Darba ritms: pēc katra uzdevuma saglabā un pārbaudi rezultātu. Kad projektam pievienots C# skripts, pirms palaišanas nospied Build. Kļūdu gadījumā sāc ar pirmo sarkano kļūdu, nevis nākamo uzdevumu.
Kas vēl vajadzīgs pilnai spēlei?
Pamatprasības: divu spēlētāju vadība, atlēkšana no raketēm un sienām, pareizi punkti, uzvara pie 5 punktiem, redzamas norādes un R jaunai partijai. Pirms pirmās un katras nākamās izspēles bumba gaida Space; serves virziens pēc katra punkta mainās.
Paddle.cs atbild par vienas raketes kustību. Ball.cs atbild par lidojumu, atlēkšanu un ExitSide. Game.cs nolasa iziešanas pusi, piešķir punktu, atjaunina tekstu un vada spēles sākumu un beigas. Ar vienu Main scēnu Autoload nav vajadzīgs.
| Bumbas iziešana | Kurš iegūst punktu? |
|---|---|
| Pa kreisi, ExitSide = -1 | Labais spēlētājs. |
| Pa labi, ExitSide = 1 | Kreisais spēlētājs. |
| ExitSide = 0 | Neviens; nav jaunas iziešanas. |
1. uzdevums -
Savieno punktus, servi, uzvaru un jaunu partiju
- Main.tscn saknei pievieno
CanvasLayerbērnu ar nosaukumuHUD. Tam pievieno trīsLabelbērnus ar precīziem nosaukumiemScore,Message,Instructions. Iestati to Position, Size un fontu pēc tabulas; Horizontal Alignment = Center, Autowrap Mode = Word Smart. - Main Node2D saknei pievieno
res://Scripts/Game.csar pilno kodu zemāk. Klase irGame : Node2D, lai gan mezgla nosaukums ir Main. Vienam mezglam piesaisti vienu skriptu; vecu Main.cs piemēru papildus nevajag. - Pārbaudi GetNode ceļus pēc koka. Tieši zem Main jābūt PaddleLeft, PaddleRight, Ball un HUD. Game _Ready pēc bērnu sagatavošanas aptur 1.5 bumbas automātisko startu un parāda sākuma norādes.
- Build un F5: sākumā redzams 0 : 0, bumba nekustas. Nospied Space; ļauj bumbai iziet pa labo malu — kreisajam 1 punkts. Pārbaudi arī pretējo malu. Pēc punkta raketes un bumba ir centrā, punkti saglabājas un bumba gaida nākamo Space.
- Īsai pārbaudei Main Inspector Target Score iestati 1. Pie pirmā punkta jāparādās uzvarētājam; bumba un raketes apstājas. Space vairs nesāk spēli, R atjauno 0 : 0. Atjauno Target Score = 5 un izspēlē pilnu partiju.
- Izmēģini R arī partijas vidū: atjaunojas abi punkti, sākuma pozīcijas, vadība un gaidīšana pirms serves. ResetBall nodzēš ExitSide, lai viena iziešana nedotu vairākus punktus.
| Label nosaukums | Position | Size | Font Size |
|---|---|---|---|
| Score | (480,35) | (320,60) | 40 |
| Message | (160,100) | (960,80) | 20 |
| Instructions | (160,650) | (960,45) | 18 |
Main (Node2D, Game.cs)
├── PaddleLeft (Paddle.tscn, Paddle.cs)
├── PaddleRight (Paddle.tscn, Paddle.cs)
├── Ball (Ball.tscn, Ball.cs)
├── WallTop, WallBottom (StaticBody2D)
├── CenterLine (Line2D)
└── HUD (CanvasLayer)
├── Score (Label)
├── Message (Label)
└── Instructions (Label)
1.6 Game.cs — pilns fails salīdzināšanai
Lejupielādēt Game.cs. Aizstāj tikai atbilstošā faila saturu; neveido otru tāda paša nosaukuma klasi.
using Godot;
public partial class Game : Node2D
{
[Export] public string GameTitle = "Zvaigžņu duelis";
[Export] public string LeftName = "Komēta";
[Export] public string RightName = "Meteors";
[Export] public string Mission = "Divas kosmosa komandas sacenšas par enerģijas kodolu.";
[Export] public string VictoryText = "Enerģijas kodols ir nogādāts mājās!";
[Export(PropertyHint.Range, "1,20,1")] public int TargetScore = 5;
public int ScoreLeft { get; private set; } = 0;
public int ScoreRight { get; private set; } = 0;
public bool GameOver { get; private set; } = false;
private Ball ball;
private Paddle left;
private Paddle right;
private Label score;
private Label message;
private int serveDirection = 1;
public override void _Ready()
{
ball = GetNode<Ball>("Ball");
left = GetNode<Paddle>("PaddleLeft");
right = GetNode<Paddle>("PaddleRight");
score = GetNode<Label>("HUD/Score");
message = GetNode<Label>("HUD/Message");
TargetScore = Mathf.Max(1, TargetScore);
GetNode<Label>("HUD/Instructions").Text =
$"{GameTitle} | W/S: {LeftName} | ↑/↓: {RightName} | Space: serve | R: jauna partija";
PrepareServe();
message.Text = $"{Mission} Uzvara pie {TargetScore} punktiem. Nospied Space!";
UpdateScore();
}
public override void _Process(double delta)
{
if (Input.IsActionJustPressed("restart"))
{
GetTree().ReloadCurrentScene();
return;
}
if (GameOver) return;
if (ball.ExitSide != 0)
{
AddPoint(ball.ExitSide > 0);
return;
}
if (!ball.IsMoving && Input.IsActionJustPressed("serve"))
{
ball.Serve(serveDirection);
message.Text = $"Pirmais līdz {TargetScore} punktiem uzvar!";
}
}
private void AddPoint(bool leftScored)
{
if (leftScored) ScoreLeft++;
else ScoreRight++;
UpdateScore();
if (ScoreLeft >= TargetScore || ScoreRight >= TargetScore)
{
GameOver = true;
ball.Stop();
left.IsActive = false;
right.IsActive = false;
left.Velocity = Vector2.Zero;
right.Velocity = Vector2.Zero;
string winner = ScoreLeft >= TargetScore ? LeftName : RightName;
message.Text = $"Uzvar {winner}! {VictoryText} Nospied R jaunai partijai.";
}
else
{
serveDirection = -serveDirection;
PrepareServe();
}
}
private void PrepareServe()
{
ball.ResetBall();
left.Position = new Vector2(60, 360);
right.Position = new Vector2(1220, 360);
left.Velocity = Vector2.Zero;
right.Velocity = Vector2.Zero;
message.Text = "Nākamā izspēle: nospied Space!";
}
private void UpdateScore()
{
score.Text = $"{ScoreLeft} : {ScoreRight}";
}
}
Gatavs, kad: var pabeigt partiju līdz 5 punktiem un atkārtot to ar R; uzvarētājs un vadība redzami spēlē.
Atbalsts: pilns Pong piemērs
Izpako atsevišķā mapē, atver Godot .NET Project Manager → Import → project.godot, nospied Build un F5. Piemērs sagatavots Godot 4.7.2 .NET un .NET 8 SDK. Ja klasē lieto citu Godot 4 .NET versiju, izveido tajā tukšu C# projektu un pārnes piemēra Scenes, Scripts un Input Map, saglabājot savas versijas ģenerēto .csproj un iestatot 1280 × 720 un Main.tscn kā galveno scēnu.
Salīdzini kļūdaino daļu ar savu projektu, izlabo un paskaidro atšķirību. Pilns piemērs palīdz atrast kļūdas; individuālās dizaina izvēles īsteno pats. Palaišana un piemēra pārbaudes.
2. uzdevums -
Piešķir spēlei savu dizainu un sacensības stāstu
- Izdomā spēles nosaukumu un trīs teikumos apraksti, kas sacenšas, ko simbolizē bumba un kāds ir sacensības mērķis. Tas var būt kosmosa duelis, zemūdeņu spēle vai paša izdomāts sporta veids.
- Pēc Build atlasi Main. Inspector laukos
Game Title,Left Name,Right Name,MissionunVictory Textievadi savu nosaukumu, abu komandu vārdus, stāsta ievadu un noslēgumu. Tie jāredz pašā spēlē, ne tikai README.md. - Izmaini vismaz trīs vizuālus elementus: rakešu noformējumu, bumbu, fonu, sienas, viduslīniju vai rezultāta uzrakstu. Maini Polygon2D krāsas/figūras vai izmanto paša zīmētus attēlus. Saglabā salasāmu rezultātu un labi saskatāmu bumbu.
- Ja lieto PNG: izveido Art mapi, importē attēlu un attiecīgajai objekta saknei pievieno Sprite2D ar šo Texture; paslēp veco Visual. Mēro attēlu, saglabājot fizikas saknes Scale (1,1) un sākotnējo sadursmes izmēru: rakete 24 × 120, bumba 20 × 20. Ārējiem resursiem norādi autoru un lietošanas atļauju.
- Pamato vismaz trīs dizaina izvēles README.md un pārbaudi spēli pēc izmaiņām. Ja maini spēles tempu, abām raketēm saglabā vienādus nosacījumus un pieraksti izmēģinātos ātrumus. Pamatpartija joprojām beidzas pie 5 punktiem.
Gatavs, kad: spēlei ir savs nosaukums, komandas, sākuma un uzvaras teksts, kā arī vismaz trīs pamatotas vizuālas izmaiņas.
3. uzdevums -
Izspēlē pilnu partiju un pārbaudi arī kļūdu situācijas
- Palūdz diviem klasesbiedriem sākt spēli bez mutiskām norādēm. Viņiem no ekrāna jāsaprot vadība, Space nozīme un uzvaras nosacījums. Pieraksti vienu ieteikumu.
- Veic visas zemāk norādītās pārbaudes un README.md atzīmē sagaidāmo un faktisko rezultātu. Pārbaudi gan kreisā, gan labā spēlētāja uzvaru.
- Īsteno vienu testētāja ieteikumu vai izlabo atrasto kļūdu. Ja mainīji ātrumu, formu vai tekstu, vēlreiz izspēlē attiecīgo situāciju.
- Atver projekta kopiju atsevišķā mapē bez .godot kešatmiņas: Import, Build, F5. Pārliecinies, ka visi attēli, scēnas un skripti tiešām ir iesniegtajā projektā.
- Ieraksti īsu video ar sava dizaina skatu, vadību, atlēkšanu, punktu iegūšanu, uzvaras tekstu un R. Saglabā visu ar Commit un Push un iesniedz GitHub krātuves saiti.
| Pārbaude | Sagaidāmais rezultāts |
|---|---|
| F5 | 0 : 0, bumba centrā un nekustas; mērķis un taustiņi redzami. |
| Vadība un robežas | W/S vada kreiso, ↑/↓ labo; atlaižot apstājas, sienas neļauj iziet no laukuma. |
| Space un atlēkšana | Space sāk vienu izspēli; bumba atlec no abām sienām un abām raketēm. |
| Bumba aiz labās/kreisās malas | Vienu punktu saņem attiecīgi kreisais/labais spēlētājs; nākamā serve gaida Space. |
| Gaidīšana pēc punkta | Punkti vairāk nepieaug, bumba pati neatsāk kustēties. |
| Uzvara abām pusēm | Pie 5 punktiem parādās pareizais uzvarētājs un stāsta noslēgums; bumba un raketes nekustas. |
| R spēles vidū un pēc uzvaras | Abi punkti 0, atjaunotas pozīcijas un vadība, bumba gaida Space; pārbaudi vismaz divas jaunas partijas. |
Gatavs, kad: abi spēlētāji saprot un var izspēlēt spēli, tabulas pārbaudes izdodas un pēc uzvaras iespējama jauna partija.
Papildu uzdevums — izveido treniņa variantu
Saglabā savu pamatversiju Git. Inspector samazini Ball Base Speed un abu rakešu Speed līdz iesācējam piemērotam tempam. Dod klasesbiedram salīdzināt abus variantus, pieraksti rezultātu un izvēlies savam projektam pamatotu tempu. Sarežģītāks pretinieks, skaņas vai izvēlnes var būt turpmāks paplašinājums.
6. stundas apkopojums: tavs Pong, tavs dizains un stāsts
Kopīga Pong mehānika ļauj radīt atšķirīgas spēles. Tu pats izvēlies pasauli, abu komandu identitāti, bumbas nozīmi, krāsu paleti, vizuālos simbolus un uzvaras stāstu. Raketes var attēlot kuģus, dzīvniekus vai izdomātus sportistus, kamēr to vadība paliek saprotama.
Parādi savu ideju pašā spēlē: nosaukumā un sākuma mērķī, objektu izskatā un uzvaras tekstā. Apkopojumā paskaidro vismaz trīs dizaina izvēles un to, kā tās palīdz spēlētājam uztvert spēli. Arī vienkāršas paša veidotas figūras var izteikt oriģinālu ieceri.
Pašvērtējums: vai abi spēlētāji saprot vadību un uzvaras nosacījumu? Vai var sākt jaunu partiju? Kas projektā atspoguļo manu ieceri? Ko uzlaboju pēc klasesbiedru pārbaudes?
Ko sagatavo
Stundas mērķis: ir pilnībā izspēlējama divu spēlētāju Pong spēle ar personisku noformējumu un stāstu.
GitHub krātuvē jābūt:
- Pilns projekts ar Main/Paddle/Ball scēnām, Paddle.cs, Ball.cs un Game.cs, C# projekta failiem un izmantotajiem resursiem.
- README.md: nosaukums, trīs stāsta teikumi, taustiņi, punktu un uzvaras nosacījumi, Godot .NET/SDK versijas un palaišana.
- Vismaz trīs pamatotas vizuālas izmaiņas, ārējo resursu avoti, pārbaudes tabula un klasesbiedru ieteikums ar veikto uzlabojumu.
- Demonstrācijas video vai saite ar spēles sākumu, punktiem, uzvaru un jaunu partiju.
Saglabā projekta iestatījumus, izveidotās scēnas un resursus; no 1.3 stundas arī C# skriptus un projekta failus (.csproj u.c.). .gitignore ieraksti .godot/, bin/ un obj/ katru savā rindā.
Kā iesniedz: veic 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īme | Ko pārbaudīt |
|---|---|
| Node not found | Salīdzini GetNode ceļus ar Main koku. HUD/Score nav tas pats, kas Score vai UI/Punkti. |
| Punkti pieaug nepārtraukti | Pēc punkta izsauc ResetBall, kas ExitSide atiestata uz 0; pēc uzvaras GameOver pārtrauc loģiku. |
| Spēle sākas bez Space | Pārbaudi, ka Game.cs piesaistīts Main saknei un _Ready izsauc PrepareServe. |
| Uzvarā raketes vēl kustas | Paddle _PhysicsProcess jāņem vērā IsActive; Game uzvaras zarā to izslēdz abām raketēm. |
| R nedarbojas vai saglabā vecos punktus | Pārbaudi restart darbību; izmanto ReloadCurrentScene, nevis tikai Ball.ResetBall. |
| Pēc dizaina maiņas teksts nav salasāms | Pārbaudi Label platumu, fontu, aplaušanu un kontrastu reālajā spēles logā. |