Invatare Atomica

Mecanica Jocului - Reguli si Sistem

Progres lectie:
0%
🎯

Obiectivul lectiei

Jocul tau nu are reguli clare... Personajele se misca haotic... Nu stii cum sa faci sistem de punctaj... Jocul nu are niciun scop sau provocare... Este plictisitor si neinteresant.

Dupa aceasta lectie vei putea:

  • Sa programezi mecanica principala a jocului (miscare, coliziuni, punctaj)
  • Sa implementezi reguli de joc folosind conditii si variabile
  • Sa creezi un sistem de scor care se actualizeaza la evenimente specifice
  • Sa adaugi niveluri de dificultate sau provocari suplimentare
  • Sa testezi si sa corectezi bug-uri in mecanica jocului

Incearca singur!

🎯 Incearca tu!

Provocare: Creeaza un Mini-Joc de Prindere

Inainte sa invatam teoria, sa experimentam! Deschide Scratch si creeaza un joc simplu:

  1. Creeaza un sprite "Jucator" (un personaj sau o bila) care se misca cu sagetile
  2. Creeaza un sprite "Obiect" (o stea, fruct, etc.) care apare in pozitii random
  3. Adauga o variabila "Scor" si seteaz-o la 0 la start
  4. Cand Jucatorul atinge Obiectul:
    • Mareste scorul cu 1
    • Muta Obiectul intr-o pozitie random noua
    • Reda un sunet de "catch"
  5. Adauga o variabila "Timp" care scade de la 30 la 0
  6. Cand timpul ajunge la 0, opreste jocul si afiseaza scorul final
BLOCURI NECESARE (Jucator):
when green flag clicked
set [Scor] to [0]
set [Timp] to [30]
forever
  if <key [arrow right] pressed?> then
    change x by (5)
  end
  if <key [arrow left] pressed?> then
    change x by (-5)
  end
  if <touching [Obiect]?> then
    change [Scor] by (1)
    play sound [pop]
  end
end

when green flag clicked
repeat until <[Timp] = [0]>
  wait (1) seconds
  change [Timp] by (-1)
end
say [Game Over!] for (2) seconds
Acest mini-joc foloseste concepte esentiale: detectare coliziuni, variabile, timp, si conditii. Daca reusesti, ai inteles deja baza mecanicii jocurilor!
💡 Indiciu #1: Cum fac obiectul sa apara in pozitii random?
Foloseste blocul "go to x: (pick random -200 to 200) y: (pick random -150 to 150)". Acesta muta obiectul intr-o pozitie aleatoare pe scena.
💡 Indiciu #2: Cum fac numarul pentru Timp sa scada?
Foloseste o bucla "repeat until [Timp] = 0" cu "wait 1 seconds" si "change [Timp] by -1" inauntru. La fiecare secunda, timpul scade cu 1.
💡 Indiciu #3: Cum detectez daca sprite-ul atinge obiectul?
Foloseste blocul "touching [nume sprite]?" din categoria Sensing (albastru deschis). Pune-l intr-un bloc "if...then" pentru a actiona cand coliziunea are loc.

🌟 Provocare Bonus (optional)

Adauga un sprite "Inamic" care se misca random si, daca il atingi, pierzi 2 puncte! Sau fa timpul sa creasca cu 5 secunde cand prinzi un obiect special.

1

1. Continut

💥
Detectarea Coliziunilor
Definitie: Detectarea coliziunilor este mecanismul prin care jocul recunoaste cand doua sau mai multe obiecte se ating. Este fundamentala pentru majoritatea jocurilor - de la platformere la shootere.
Analogie din viata ta: Coliziunea este ca atunci cand atingi o usa - stii ca ai ajuns pentru ca simti contactul. In joc, calculatorul "simte" contactul verificand daca pixelii a doua sprite-uri se suprapun.

Tipuri de coliziuni in Scratch:

Bloc Ce detecteaza Cand se foloseste
touching [sprite]? Contact cu alt sprite Jucator atinge inamic sau obiect
touching color [ ]? Contact cu o culoare Platformer - detectare pamant/pereti
touching edge? Contact cu marginea scenei Bounce sau game over la limita
distance to [sprite] Distanta pana la obiect Detectare inainte de contact

🎮 Exemplu: Platformer - Detectare Pamant

when green flag clicked
forever
if <not <touching color [maro]?>> then
change y by (-5) // Gravitatie
end

Explicatie: Personajul cade constant (gravitatie) DOAR daca nu atinge culoarea maro (pamantul). Cand atinge, se opreste din cadere.

Pentru coliziuni mai precise, ajusteaza centrul sprite-ului (Edit costume → Set costume center) si foloseste costume simple, fara transparenta excesiva.
Nu verifica coliziunea prea repede! Daca sprite-ul se misca cu 50 pasi pe frame, poate "sari peste" un obstacol subtire fara sa-l detecteze. Foloseste viteze mai mici sau verifica de mai multe ori.
2

2. Continut

🏆
Sistemul de Punctaj (Scoring)
Definitie: Sistemul de punctaj masoara progresul jucatorului prin acordarea de puncte pentru actiuni pozitive (eliminare inamici, colectare obiecte) si scaderea lor pentru greseli.
Analogie din viata ta: Scorul este ca notele de la scoala - primesti puncte pentru raspunsuri corecte si pierzi pentru greseli. La final, punctajul reflecta cat de bine ai jucat.

Implementarea scorului:

Pasul 1: Creeaza variabila

Variables → Make a Variable → numeste-o "Scor" → bifează "For all sprites"

Pasul 2: Initializeaza la start

La inceputul jocului: set [Scor] to [0]

Pasul 3: Modifica in timpul jocului

Pentru a adauga: change [Scor] by [10]
Pentru a scadea: change [Scor] by [-5]

🌟 Exemplu: Sistem de punctaj diferentiat

when I receive [obiect-prins]
if <[TipObiect] = [aur]> then
change [Scor] by (50)
end
if <[TipObiect] = [argint]> then
change [Scor] by (20)
end

Explicatie: Diferite obiecte dau puncte diferite. Obiectele rare (aur) dau mai multe puncte decat cele comune (argint).

Foloseste multiplicatori sau combo-uri! De exemplu: "change [Scor] by [10 * ComboMultiplicator]" - daca jucatorul prinde 3 obiecte rapid, multiplicatorul creste.
Pentru scoruri mari (peste 10,000), poti folosi formatare text: "join [Scor: ] [Scor]" si afisare cu "say" sau un sprite text personalizat.
3

3. Continut

❤️
Sistemul de Vieti si Game Over
Definitie: Sistemul de vieti limiteaza numarul de greseli pe care jucatorul le poate face. Game Over apare cand vietile ajung la 0, terminand jocul si afisand rezultatul final.
Analogie din viata ta: Vietile sunt ca incercarile la un test: ai 3 incercari sa treci. Fiecare greseala consuma o incercare. Daca epuizezi toate incercarile, testul se termina.

Implementare sistem complet vieti:

// LA START - Initializare
when green flag clicked
set [Vieti] to [3]
set [GameOver] to [0]

// IN JOC - Pierdere viata
when I receive [lovit-de-inamic]
change [Vieti] by (-1)
play sound [hurt]
broadcast [flash-red]  // Efect vizual

// IN JOC - Verificare Game Over
when green flag clicked
forever
  if <[Vieti] < [1]> then
    set [GameOver] to [1]
    broadcast [game-over]
    stop [all]
  end
end

// ECRAN GAME OVER (sprite separat)
when I receive [game-over]
show
say (join [GAME OVER! Scor: ] [Scor]) for (5) seconds

💔 Exemplu: Afisare vizuala a vietilor cu inimi

In loc de numar, poti afisa inimi care dispar:

when green flag clicked (sprite "Inimi")
forever
if <[Vieti] = [3]> then
switch costume to [3-hearts]
end
if <[Vieti] = [2]> then
switch costume to [2-hearts]
end
if <[Vieti] = [1]> then
switch costume to [1-heart]
end

Creeaza 3 costume pentru sprite-ul "Inimi": unul cu 3 inimi, unul cu 2, unul cu 1. Fiecare costume reflecta vietile ramase.

Nu lasa vietile sa devina negative! Verifica mereu "< 1" sau "= 0", nu doar "= 0", pentru ca in cazuri rare vietile pot sari direct la -1.
Adauga "invincibility frames" (cadre de invincibilitate) dupa ce jucatorul pierde o viata! Foloseste un timer de 2-3 secunde in care nu poate fi lovit din nou, pentru a evita morti instant multiple.
4

4. Continut

🏁
Conditii de Victorie si Infrangere
Definitie: Conditiile de victorie definesc cand jucatorul a castigat jocul. Pot fi: atinge un anumit scor, termina un nivel, elimina toti inamicii, ajunge la destinatie, sau rezolva un puzzle.
Analogie din viata ta: Este ca linia de finish la o cursa. Stii exact ce trebuie sa faci pentru a castiga - nu e ambiguitate. Daca nu exista conditie de victorie, jocul nu are scop!

Tipuri de conditii de victorie:

Tip Conditie Exemplu
Scor target [Scor] > [100] Colecteaza 100 puncte
Locatie touching [Finish]? Ajunge la linia de finish
Eliminare completa [InamiciRamasi] = [0] Elimina toti inamicii
Timp [Timp] > [0] and [Nivel] = [final] Termina inainte sa expire timpul
Colectie [Obiecte] = [10] Colecteaza toate cele 10 piese

🎯 Exemplu: Sistem multi-conditie (win/lose)

when green flag clicked
forever
// Conditie VICTORIE
if <<[Scor] > [50]> and <[Vieti] > [0]>> then
play sound [victory]
say [AI CASTIGAT!] for (3) seconds
stop [all]
end
// Conditie INFRANGERE
if <[Vieti] < [1]> then
play sound [game-over]
say [AI PIERDUT!] for (3) seconds
stop [all]
end
Combina multiple conditii cu operatorii logici "and" si "or"! Exemplu: "if <<[Scor] > 100> or <[Timp] < 10>>" - castigi daca ai mult scor SAU daca reusesti inainte de expirarea timpului.
5

5. Continut

🌍
Simularea Gravitatiei
Definitie: Gravitatia in jocuri este forta care trage obiectele in jos constant. Este esentiala pentru platformere si orice joc care simuleaza fizica reala.
Analogie din viata ta: Cand sari, gravitatia te trage inapoi jos. In joc, functioneaza la fel - daca nu esti pe o platforma, cazi automat in jos.

🏃 Exemplu complet: Platformer cu gravitatie si saritura

when green flag clicked
set [VelocitateY] to [0]
set [OnGround] to [0]
forever
// GRAVITATIE
change [VelocitateY] by (-1) // Accelerare in jos
change y by (VelocitateY)
// COLIZIUNE CU PAMANTUL
if <touching color [verde]?> then
set [VelocitateY] to [0]
set [OnGround] to [1]
change y by (5) // Corecteaza pozitia
else
set [OnGround] to [0]
end
// SARITURA (doar daca e pe pamant)
if <<key [space] pressed?> and <[OnGround] = [1]>> then
set [VelocitateY] to [15] // Impuls in sus
end

Explicatie: VelocitateY scade constant (gravitatie). Cand sprite-ul atinge pamantul verde, viteza devine 0. Spatiu da impuls in sus, dar doar daca esti pe pamant (evita double-jump).

Ajusteaza viteza gravitatiei! -1 este pentru sarituri lente/realiste. -2 sau -3 pentru actiune rapida. Testeaza sa gasesti sweet spot-ul pentru jocul tau.
6

6. Continut

🤖
AI Simplu pentru Inamici
Definitie: AI (Artificial Intelligence) pentru inamici inseamna programarea comportamentului lor - cum se misca, cand ataca, cum reactioneaza la jucator. Chiar si AI simplu face jocul mult mai interesant.
Analogie din viata ta: AI-ul este ca regulile pe care le urmeaza un gardian: patruleaza zona, daca te vede te urmareste, daca esti prea departe se intoarce la paza. Comportamente simple creeaza provocari interesante!

Tipuri de AI simplu:

🔁 AI #1: Patrulare (Back-and-Forth)

when green flag clicked
point in direction (90) // Dreapta
forever
move (3) steps
if <touching edge?> then
turn (180) degrees // Intoarce-te
end

Inamicul merge intr-o directie pana loveste marginea, apoi se intoarce si continua. Simplu si eficient pentru platformere!

🎯 AI #2: Urmarire Jucator (Chase)

when green flag clicked
forever
if <(distance to [Jucator]) < [150]> then
point towards [Jucator]
move (4) steps
else
move (2) steps // Patrulea mai incet
end

Daca jucatorul e aproape (< 150 pixeli), inamicul se intoarce si urmareste rapid. Daca jucatorul e departe, patruleaza normal. Creeaza tensiune!

🎲 AI #3: Miscare Random (Wandering)

when green flag clicked
forever
move (3) steps
if <(pick random 1 to 30) = [1]> then
turn (pick random -90 to 90) degrees
end
wait (0.1) seconds

Inamicul merge inainte si random schimba directia. Imprevizibil si natural pentru creaturi/inamici pasnici.

Combina AI-uri! Exemplu: inamicul patruleaza random, DAR daca jucatorul e aproape, trece in modul "chase". Cand jucatorul scapa, revine la patrulare. Comportament stratificat!
Pentru AI mai avansat: foloseste variabile de "stare" (idle, patrol, chase, attack). Fiecare stare are comportament diferit. Switch intre ele cu mesaje (broadcast).

Exercitii practice

Exercitiul 1 (Nivel minim) -

Proiect Scratch
Creeaza un Platformer Complet

Construieste un mini-platformer cu toate mecanicile invatate:

  • Jucator: Controlat cu sageti (stanga/dreapta), saritura cu spatiu
  • Gravitatie: Jucatorul cade daca nu e pe platforma
  • Platforme: Desenate cu culoare verde (foloseste backdrop)
  • Monede: 10 monede random pe nivelul; +10 puncte fiecare
  • Inamic: 1 sprite inamic care patruleaza; -1 viata daca te atinge
  • Vieti: 3 vieti la start; game over la 0
  • Victorie: Colecteaza toate cele 10 monede
  • Sunete: Sunet la saritura, colectare moneda, pierdere viata, game over, victorie

Exercitiul 2 (Nivel standard) -

Exercitiu de Design
Balansare Dificultate

Joaca 5 jocuri Scratch din comunitate si analizeaza:

  1. Jocul e prea usor, prea greu, sau perfect balansat? De ce?
  2. Ce mecanici face jocul provocator? (viteza inamici, numar vieti, timp limitat, etc.)
  3. Ce ai schimba pentru a imbunatati balansarea?
  4. Noteaza 3 lectii de design pe care le poti aplica in jocul tau

Scrie raspunsurile intr-un document Word sau pe o foaie.

Exercitiul 3 (Nivel performanta) -

Provocare Avansata
Implementeaza Power-Ups

Adauga un sistem de power-ups la jocul tau:

  • Scut: Jucatorul devine invincibil pentru 5 secunde (variabila "Invincibil")
  • Speed Boost: Viteza de miscare creste (mareste "change x" de la 5 la 10)
  • Double Points: Scorul se dubleaza temporar (inmulteste cu 2 inainte de "change Scor")
  • Extra Life: +1 viata (pana la maxim 5 vieti)

Power-up-urile apar random pe scena si dispar dupa 10 secunde daca nu sunt colectate.

Ce ai invatat astazi

  • Detectarea coliziunilor:touching [sprite]?, touching color, touching edge, distance to
  • Sistem de punctaj:Variabile pentru scor, adaugare/scadere puncte, afisare pe scena
  • Sistem de vieti:Variabila vieti, scadere la damage, game over la 0, afisare vizuala
  • Conditii de victorie:Scor target, locatie, eliminare completa, colectie obiecte
  • Simulare gravitatie:VelocitateY, accelerare in jos, coliziune cu pamantul, saritura
  • AI pentru inamici:Patrulare, urmarire jucator, miscare random, combinatii

Urmatoarea lectie

Continua cu lectia urmatoare pentru a aprofunda cunostintele.

Continua →