ebSkola

2.5 Krišana un lēkšana

Stundas uzdevums: Pievieno lēcienu ar Space. Inspector panelī pielāgo lēcienu, lai varētu sasniegt atslēgu.

SR 2.4.14. Vadības struktūras SR 2.4.13. Datu tipi

80 min plāns: Ievads (~10 min) · gravitācija (~20 min) · lēciens (~25 min) · maršruta pārbaude (~20 min) · saglabāšana (~5 min).

Pirms sāc: turpini 2.4 līmeni. Punktu un atslēgas kods paliek Player.cs failā. Ar virzienu taustiņiem tagad kustēsimies tikai pa kreisi un pa labi; W/S vairs nekustinās varoni.

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.

Trīs lauki, ar kuriem mainīsi kustību

Pēc koda papildināšanas un Build nospiešanas Level1 cilnē atlasi Player. Inspector redzēsi:

LauksSākuma vērtībaKo tas maina
Speed300Ātrumu pa kreisi un pa labi.
Gravity1200Cik strauji varonis sāk krist. Lielāks skaitlis velk lejup stiprāk.
Jump Velocity-550Lēciena spēku. Piemēram, -650 dod augstāku lēcienu nekā -550.

Godot virziens uz leju ir pozitīvs, uz augšu — negatīvs. Tāpēc lēciena skaitlim priekšā vajag mīnusu. IsOnFloor() pārbauda, vai varonis stāv uz grīdas vai platformas.

1. uzdevums -

Liec varonim nokrist uz grīdas

  1. FileSystem → Scripts atver Player.cs. Zem Speed rindas pievieno [Export] public float Gravity = 1200.0f; un jaunā rindā [Export] public float JumpVelocity = -550.0f;. [Export] ļauj šos skaitļus mainīt Inspector panelī.
  2. Esošo _PhysicsProcess daļu no tās pirmās rindas līdz aizverošajai } aizstāj ar kodu zemāk. Pārējo failu saglabā: tas joprojām skaita punktus un atceras atslēgu.
  3. Saglabā un nospied Build. Atver Level1, Scene panelī atlasi Player. Inspector pārbaudi Speed = 300, Gravity = 1200, Jump Velocity = -550. Sadaļā Transform → Position iestati (80,570).
  4. Saglabā un nospied F5. Varonim jānokrīt līdz grīdai un jāpaliek uz tās. A/D kustina pa kreisi un pa labi; W/S vairs nekustina augšup un lejup.
public override void _PhysicsProcess(double delta)
{
    if (!IsActive)
    {
        Velocity = Vector2.Zero;
        return;
    }

    Vector2 velocity = Velocity;
    if (!IsOnFloor())
        velocity.Y += Gravity * (float)delta;

    // Nākamajā uzdevumā šeit pievienosi lēcienu.
    velocity.X = Input.GetAxis("move_left", "move_right") * Speed;
    Velocity = velocity;
    MoveAndSlide();
}

Gatavs, kad: varonis nokrīt uz grīdas un kustas pa kreisi un pa labi.

2. uzdevums -

Pievieno vienu lēcienu no zemes

  1. Atver Player.cs. Rindas // Nākamajā uzdevumā šeit pievienosi lēcienu. vietā ievieto divas koda rindas zemāk.
  2. Saglabā, nospied Build un F5. Kad varonis stāv uz grīdas, nospied Space: tam jālec augšup un jāpiezemējas.
  3. Turi Space nospiestu: lēcienam nav jāatkārtojas. Nospied Space vēlreiz gaisā: otram lēcienam nav jānotiek.
  4. Apturi spēli. Level1 cilnē atlasi Player un Inspector laukā Jump Velocity izmēģini -400, tad -650. Pēc katras maiņas palaid spēli un salīdzini augstumu. Beigās atjauno -550. Inspector ievadītais skaitlis ir tas, ko spēle izmantos.
if (Input.IsActionJustPressed("jump") && IsOnFloor())
    velocity.Y = JumpVelocity;
2.5 Player.cs ar kustību, lēcienu un punktiem — pilns fails

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

using Godot;

public enum PickupType { Coin, Gem, Key }

public partial class Player : CharacterBody2D
{
    [Export] public float Speed = 300.0f;
    [Export] public float Gravity = 1200.0f;
    [Export] public float JumpVelocity = -550.0f;

    public int Score { get; private set; } = 0;
    public bool HasKey { get; private set; } = false;
    public bool IsActive { get; set; } = true;

    public override void _PhysicsProcess(double delta)
    {
        if (!IsActive)
        {
            Velocity = Vector2.Zero;
            return;
        }

        Vector2 velocity = Velocity;
        if (!IsOnFloor())
            velocity.Y += Gravity * (float)delta;

        if (Input.IsActionJustPressed("jump") && IsOnFloor())
            velocity.Y = JumpVelocity;

        velocity.X = Input.GetAxis("move_left", "move_right") * Speed;
        Velocity = velocity;
        MoveAndSlide();
    }

    public void OnPickup(PickupType type)
    {
        if (!IsActive) return;

        switch (type)
        {
            case PickupType.Coin:
                Score += 1;
                break;
            case PickupType.Gem:
                Score += 5;
                break;
            case PickupType.Key:
                HasKey = true;
                break;
        }

        GD.Print($"Punkti: {Score}; atslēga: {HasKey}");
    }
}

Gatavs, kad: varonis lec augšup, piezemējas un nevar atkārtoti lēkt gaisā.

3. uzdevums -

Izveido pārvaramu ceļu līdz atslēgai

  1. Nospied F5 un ar D un Space sasniedz Platform1, Platform2 un Platform3. Uz pēdējās savāc Key. Pirmajai platformai lec pretī jau no sākuma vietas: tieši zem tās varonis atsitīsies pret apakšu.
  2. Ja platformu nevar sasniegt, apturi spēli. Scene panelī atlasi šo platformu un Inspector sadaļā Transform → Position pārvieto to tuvāk vai zemāk. Lielāks y skaitlis pārvieto platformu uz leju. Maini vienu platformu reizē un uzreiz izmēģini lēcienu.
  3. Pārbaudi, ka vari savākt arī visas monētas un Gem. Tad izmēģini noiet aiz grīdas malas. Pagaidām atgriezies sākumā ar Stop (F8) un Run Project (F5); nākamajā stundā tam pievienosi R.
  4. Uzņem Inspector ekrānuzņēmumu ar Player laukiem Speed, Gravity un Jump Velocity. Saglabā īsu video, kurā sasniedz atslēgu. README.md pieraksti, kādu atšķirību redzēji starp -400 un -650.

Gatavs, kad: atslēga un visi punktu priekšmeti ir sasniedzami ar A/D un Space; projektā paliek strādājošas, pārbaudītas vērtības.

Papildu uzdevums — īss un garš lēciens

Vispirms saglabā strādājošo versiju Git. Zem JumpVelocity rindas pievieno private double coyote = 0.0;. Abas lēciena rindas no 2. uzdevuma aizstāj ar kodu zemāk. Tas ļaus lēkt zemāk, ja ātri atlaidīsi Space, un vēl 0,1 sekundi pēc platformas malas šķērsošanas. Pēc lēciena laiku atjauno uz 0, lai nevarētu lēkt vēlreiz gaisā.

if (IsOnFloor()) coyote = 0.1;
else coyote = System.Math.Max(0.0, coyote - delta);

if (Input.IsActionJustPressed("jump") && coyote > 0.0)
{
    velocity.Y = JumpVelocity;
    coyote = 0.0;
}
if (Input.IsActionJustReleased("jump") && velocity.Y < 0)
    velocity.Y *= 0.5f;

Pārbaudi īsu un ilgu Space piespiedienu, lēcienu uzreiz pēc malas un divus ātrus nospiedienus gaisā. Otrs lēciens nedrīkst izdoties. Vēlreiz pārbaudi, ka ceļš līdz atslēgai ir pārvarams.

Ko sagatavo

Stundas mērķis: varonis lec pa platformām un var savākt atslēgu.

GitHub krātuvē jābūt:

  1. Player.cs ar vienu _PhysicsProcess, gravitāciju, lēcienu un OnPickup.
  2. Inspector ekrānuzņēmums, video ar ceļu līdz atslēgai un README.md novērojums par lēciena augstumu.

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
Gravitācija nedarbojasLevel1 cilnē atlasi Player un pārbaudi, ka Gravity ir 1200. Ja W/S joprojām kustina varoni, Player.cs vēl ir vecais kustības kods.
Varonis nelec no grīdasAtlasi Player: Motion Mode jābūt Grounded, Up Direction (0,-1), Collision → Mask tikai 1. Input Map pārbaudi jump → Space. Zem Ground pārbaudi CollisionShape2D formu.
Lēciens pēkšņi mainījiesLevel1 cilnē atlasi Player. Inspector laukā Jump Velocity atjauno -550; pārbaudi arī Gravity = 1200.
Pēc jaunā koda nav punktuSalīdzini Player.cs ar pilno failu šajā stundā. Tajā jāpaliek arī OnPickup daļai, kas skaita punktus.