Opgaver til Scratch 2

På denne side arbejder vi videre med spillet fra Opgaver til Scratch 1. Du skal altså have løst opgaverne på den side, for at opgaverne på denne side giver mening.

I Opgaver til Scratch 1, kaldte vi vores to Sprites for den gamle og den nye Sprite. De navne giver ikke så meget mening mere, så lad os finde på nogle nye: Den Sprite, som spilleren styrer ved at flytte musen, kalder vi nu for spilleren. Den Sprite der følger efter spilleren, kalder vi nu for fjenden.

Nå… Igang med arbejdet…. 🙂

Stå pænt!

Vi har tidligere animeret fjenden. Den skifter altså hele tiden Kostume. Det gør den desværre også når den holder pausen efter at den har fanget spilleren. Det må vi have gjort noget ved.

Vi bliver nødt til at indføre, at fjenden kan have en Tilstand. Det kan vi gøre ved at lave en Variabel der skal hedde “tilstand”. Det skal være en lokal variabel. Det vil sige, at det skal være en Variabel som hører til  fjenden og ikke er delt med andre Sprites. Fremover, skal fjenden altså altid være i en kendt tilstand. Husk, at en Variabel både kan indeholde tal og bogstaver og ord.

Som det er nu, kender vi til to tilstande for fjenden:

  • Tilstanden skal være “løber” når  fjenden forfølger spilleren.
  • Tilstanden skal være “venter” når  fjenden holder en pause efter at den har fanget spilleren.

Du skal altså lavende følgende ændringer for fjenden:

  1. Når spillet starter skal tilstanden være “løber”.
  2. Når fjenden fanger spilleren, skal tilstanden skifte til “venter”.
  3. Når fjenden er færdig med at vente, skal tilstanden igen være “løber”.
  4. Kostumet for fjenden skal kun skifte når tilstanden er “løber”.

Ingen er perfekt

Det er imponerende, at fjenden altid ved præcist hvor spilleren er. Det er også ret urealistisk.

Lad os indføre en Variabel, der indeholder et tal der repræsenter hvor god fjenden lige nu er til at følge spilleren. Lad os kalde Variablen for “usikkerhed”. Tallet i Variablen, skal være et tilfældigt tal mellem -60 og 60. I Operatorer findes en klods der kan generere (lave) tilfældige tal.

Hvis tallet er 0, går fjenden præcist i retning af spilleren. Hvis tallet er mindre end 0, går fjenden forkert i den ene retning. Hvis tallet er højere end 0, går fjenden forkert i den anden retning. Jo mere tallet er forskelligt fra 0, jo mere forkert er retningen.

Når du har peget fjenden mod spilleren i dit Script, skal du lige bagefter, ændre retningen med det tal du har gemt i Variablen der hedder  “usikkerhed”. Du skal altså dreje fjenden “usikkerhed”-grader efter den har peget mod spilleren.

Fjendens usikkerhed skal ændres hvert 2. sekund. Lav en Tråd der opdaterer usikkerheden.

Selvforsvar

Der er lidt sørgeligt, at det altid er fjenden der ender med at vinde. Når den har fanget spilleren tre gange, er spillet jo slut. Lad os ændre spillet, så spilleren kan skyde noget efter fjenden.

Tilføj en ny Sprite  til spillet. Det skal være en lille ting der ligner noget der kan kastes eller skydes. Du kan tegne en nye Sprite selv (det er sjovest), eller vælge en fra Biblioteket. Fra nu af, kalder vi den nye Sprite for missilet.

Giv Spriten for missilet et nyt navn, og sørg for at den som udgangspunkt er usynlig ved at klikke fluebenet fra ud for feltet vis når du er inde og se på Spritens egenskaber. Tryk på det blå i i øverste venstre hjørne af Spriten når den er valgt i Sprite-området. Missilet skal være usynligt fordi det kun skal være synligt når det er blevet skudt af.

I Scratch, kan man lade et Script sende en besked. Andre Scriptskan laves, så de reagerer på en bestemt besked. Det skal vi bruge nu. I spilleren skal du opdatere Scriptet, så det sender en besked der hedder “skyd” når man trykker på tasten mellemrum. Du skal bruge klodsen “skyd til _ og vent”.

Det er fint at, vi sender en besked, men der er ikke nogen der lytter efter beskeden. Det skal vi nu have lavet om på.

Lav et Script for missilet. Det skal være et Script der starter når det modtager beskeden “skyd”. Scriptet skal gøre følgende:

  1. Fly missilet til spillerens position.
  2. Peg mod fjenden.
  3. Gør missilet synligt.
  4. Bliv ved med at gå frem indtil missilet rammer kanten af Scenen. Find en klods i Styring der bliver ved med at gøre noget indtil noget sker.
  5. Gør missilet usynligt igen.

Nu har vi altså et selvsøgende missil der altid skydes af i retning af fjenden.

Arghhh….

Spilleren er glad for sit missil. Problemet er bare, at fjenden er helt ligeglad med at blive ramt. Det kan ikke være rigtigt! Det må vi have gjort noget ved. Det viser sig at være en større opgave hvor vi kan lære meget nyt.

Når fjenden bliver ramt, skal den holde en pause og ændre tilstand ligesom når den har fanget spilleren. Vi skal altså genbruge den del af Scriptet der definerer pausen. I stedet for at kopiere Scriptet så vi har det samme, skal vi lave en Funktion. En Funktion er et Script vi kan bruge flere steder, men kun behøver at bruge et sted. Faktisk, er alle de klodser vi bruger, Funktioner som andre har lavet til os. Nu skal vi have lavet vores første egen klods.

  1. Lav en ny klods ved at vælge “Skab en brik” i kategorien Flere Brikker. Kald din nye klods for “hold pause”.
  2. Du får nu en ny start-klods i dit Script-område. Den hedder definer “hold pause”. Du skal flytte dit pause-Scripts op under den klods. Som programmør, kalder man dette at definere sin Funktion.

Så skal vi have brugt den nye klods “hold pause”. Den skal jo ihvertfald bruges der hvor vi før have det Script der nu er flyttet over i Funktion der hedder “hold pause“. Men den skal også bruges et andet sted. Faktisk var det jo derfor det var smart at lave en ny klods eller Funktion.

  1. Når fjenden rammes af missilet skal den holde pause.
  2. Når fjenden fanger spilleren skal den holde pause
  3. Fjenden skal sige “Arghhh….” i en taleboble når den bliver ramt.
  4. Vær opmærksom på, at fjenden kun skal animeres (ændre Kostumer) når tilstanden er “løber”.

Nu flyver missilet igennem  fjenden! Det ser ret underligt ud. Det skal vi have lavet om på.

  1. Hvis missilet rammer fjenden skal det skjule sig selv.

Ingen er perfekt 2

Spillerens missil flyver altid direkte mod fjenden. Det er uretfærdig og urealistisk. Det er samme type problem som vi løste tidligere hvor vi lavede fjenden om så den ikke altid går præcist i retning af spilleren. Brug samme teknik som før når du løser denne opgave. Er det nødvendigt at bruge en Variabel denne gang?

  1. Lav missilet om så det ikke altid flyver direkte mod fjenden.
  2. Eksperimenter med missilets usikkerhed. Hvor dårligt skal det være?

Clone wars

Nu er det helt galt! Spilleren kan blive ved med at løbe rund og skyde fjenden næsten uden nogen risiko for at blive fanget. Det er ikke et særligt velbalanceret spil. Lad os få nogle flere fjender på banen. Hvad med en hær af kloner!?

En Sprite kan have kloner, det vil sige kopier af sig selv. Lad os lave fjenden om til en klon. Så kan vi oprette en klon af fjenden hver gang en fjende bliver ramt. Så bliver det ikke let at være spilleren. Der kommer til at være flere og flere fjender indtil spilleren bliver overrumplet. Det bliver som en hær af zombier! (hvis spilleren er dum nok til at skyde på fjenden).

  1. Sørg for at fjendens Sprite er usynlig fra starten. Det skal den være, da det kun er klonerne der skal kunne ses.
  2. fjendens Script, skal alle de klodser der nu hedder “når du klikker på grønt flag” ændres til “når jeg starter som klon” fra klods-kategorien Styring. Så laver en fjende slet ikke noget før den oprettes som en klon.
  3. Tilføj nu en enkelt klods af typen “når du klikker på grønt flag”. Det der skal ske er, at fjenden skal oprette en klon af sig selv når spillet starter (Kig i kategorien Styring). Husk at gøre klonen synlig når den starter.
  4. Nu har vi en enkelt klon….. Men, det var da en hel hær af kloner vi skulle have ikke?!
  5. Jo, jo. Lav en opdatering af fjendens Script, så den opretter en klon af sig selv, hver gang den bliver ramt af et missil.

Precision

Når spilleren skyder et missil af, flyver det nu i retning af den usynlige fjendeSprite i stedet for efter klonerne! Lad os lige få det ordnet:

  1. Lav om på Scriptet for missilet, så det flyver mod musepilen når det bliver skudt af.

Nu skal spilleren altså sigte med musen når man skyder. Det kan godt være farligt, da spilleren jo hele tiden går i retning af musepilen.

Motivation

Hmmm…. Der er et problem: Spilleren har fundet ud af, at vores hær af kloner slet ikke opstår hvis man lader være med at skyde på fjenden. Det må vi have lavet om på!

I stedet for at spilleren for point ved at gå rundt så længe som muligt, skal spilleren i stedet have point hver gang en fjende-klon bliver ramt af et missil.

  1. Når en fjende-klon bliver ramt, skal den sende en besked.
  2. Spilleren skal have point når den modtager besked om at en fjende-klon er blevet ramt.
  3. Spilleren skal ikke længere have point fordi tiden går.

Overbefolkning

Hvis du har leget lidt med spillet, har du sikkert lagt mærke til, at spillet begynder at køre langsomt når der er mange kloner på Scenen. Vi bliver nødt til, at begrænse hvor mange kloner der må oprettes. Lad os sige, at der maksimalt må være 5 kloner.

  1. Lav en Variabelfjenden som holder styr på hvor mange kloner der er oprettet. Variblen skal være tilgængelig for alle Sprites.
  2. Tæl hvor mange fjende-kloner du opretter.
  3. Opret kun nye kloner hvis der er mindre en fem på Scenen.

Styr dig lige

Spillet har udviklet sig så meget, at det er bedre at spilleren bliver styret med tasterne i stedet for med musen. Vi kan sikkert stadig sigte med musen, så lad os starte med at ændre spillet så vi kan styre spilleren med piletasterne.

Brug ikke klodserne “når du trykker på ____”, men tag i stedet for udgangspunkt i klodsen “trykket på tasten ____” i kategorien Registrering.

Skyd lige

Det er for svært at styre den retning man vil skyde i med musen samtidigt med at man styrer spilleren med tasterne (Med mindre man er to personer der spiller spillet sammen. Prøv!).

Retningen er udtrykt i grader. Opad er 0 grader, nedad er 180 grader. Hvor mange grader er venstre og højre? Med med skråt ned til venstre?

Lav spillet om, så man skyder i den retning man peger. Det er nok smart at gemme retningen man vil skyde i i en Variabel.

De kommer fra alle sider!

Nye kloner af fjenden starter altid samme sted på Scenen. Der er ikke så spændende for spilleren, og gør at hæren af kloner er noget mindre skræmmende end den burde være. Lad os sige, at nye fjender altid starter i venstre side af Scenen. X-værdien for det Koordinat hvor de skal starte, skal så være -240 fordi det er den mindst mulige værdi for X. Hvad så med Y-værdien? I toppen af Scenen er Y 180, og i bunden er den -180. Så, Y-værdien i Koordinatet  for nye fjender skal altså være et tal mellem -180 og 180.

  1.  Opdater Scriptet i din fjende så nye kloner bliver født et tilfældigt sted på Scenens venstre kant.

Det er stadig ret forudsigeligt, når nye fjender altid dukker op i venstre side af skærmen. Lav ændringer i den fjende, der betyder at nye fjender dukker op med en tilfældig Y-position, men med en X-værdi der enten er -240 (venstre side af Scenen) eller 240 (højre side af Scenen).

  1. Lav ændringer af dit Script for fjender, der betyder at nye kloner bliver født et tilfældig sted på venstre eller højre Scene-kant.

Ekstra: Prøv at få nye fjende-kloner til at komme fra et tilfældigt sted på kanten af Scenen stedet for at det altid er venstre eller højre side.

Say what

Når en fjende bliver ramt, siger den noget i en taleboble. Det er lidt kedeligt at de altid siger det samme. Vores fjender  mangler….. personlighed! Opdater din fjende så den siger en af fire mulige ting når den bliver ramt.

  1. Brug et tilfældigt tal til at styre hvad fjenderne siger når de bliver ramt.