Power-up

Power-up'ide ja perk'ide eesmärk

Power-up on termin, mis viitab mängijale ajutise eelise andmisele. Power-up'ide lisamine muudab mängu vähem etteaimatavaks ning nende otsimist saab kasutada mängija suunamiseks läbima kindlaid mänguetappe.

../_images/pacman.gif

Pacmanis “power pellet” annab Pacmanile võime vastaseid süüa.

Tavaliselt on power-up'idel ajapiiranguks:

  • konkreetne ajalimiit

  • mängija vigastada saamiseni

  • mängija surmani

kogu mängu või taseme lõpuni kestvat eelist nimetatakse perkideks. Perkidel on tihti hierarhia ehk kõrgema taseme perk'i saamiseks peab mängijal olema madalama taseme perk.

../_images/payday.png

Payday's on perkid ostetavad, kuid tingimuseks odavama perki olemasolu.

Mõnikord lisatakse power-up'e põhiloost eraldi "boonusvoorudesse" koos lisa punktidega. Samuti võib power-up anda võime pääseda boonusvooru – näiteks lendamisvõime või üleüldse võime ligipääseda kohta, kuhu ilma lisavõimeta ei pääseks.

../_images/metroid_series.gif

Metroid series’is Morph Ball annab läbipääsu tunnelitesse ja vahedesse, kus tavasuuruses ei mahuks.

Power-up'ide kujutamine

Levinum viis power-up'e kujutada: - konkreetse objektina (“söödana”), mida mängija saab korjata. - konkreetsete piirkondadega mängumaailmas. - preemiana vastase alistamise eest.

../_images/mario.gif

Super Marios power-upi kujutamine küsimärk-blokina, mis annab juurde üllatuse aspekti power-upi võimele.

Power-up'i mõju esiletõstmiseks on soovitatav kasutada visuaalseid või heliefekte, et nende toimimisele tähelepanu juhtida. Mida äratuntavam on power-up' võime selle avaldumise järgi, seda parem. Näiteks: - Mängija välimuse muutmine (näiteks sätendama/vilkuma panemine). - Tausta või mängukeskkonna muutmine (näiteks nähtavuse parandamine pimedas labürindis, kui varem oli nähtav vaid käidud rajad, siis power-up annab hetkeks täieliku vaate labürindist). - Spetsiifilised heliefektid (näiteks kiirendava power-up'i puhul muusika kiirendamine.

../_images/mario2.gif

Super Marios power-upi mõju näitamine mängija suuruse muutmisega.

Tihtipeale omistatakse power-upidel otsekohene mõju (näiteks leiad tiivad ja saad siis lennata), kuid osades mängudes saab leitud power-upi panna power-upide ladusse (“Inventory’i”), mis annab mängijale vabaduse valida, millal power-up käivitada. Kui mängus on mitu erivõimega power-upi, on vaja otsustada, kas need tohivad toimida samal ajal. Kui ei, siis mitte anda võimalus selliseks olukorraks.

../_images/inventory.png

Gradius III selection bar power-upideks ehk vabadus ise valida power-upi aktiviseerimine.

Power-up'ide tüübid ja mõjud

1. Ründevõime:

  • Mängija suuruse muutmine, millega kaasneb füüsiliste võimete mitmekordistumise (näiteks laiem haare ja seetõttu rohkemate kahjustuste tegemine ühe käehoobiga).

  • Mängija hävitusjõu suurendamine (näiteks rohkem haavavate kahjustuste tegemine ühe mõõgalöögiga).

  • Relvade ja eri gadget'ite lisamine (näiteks põrkekuulid, laskemoona mahutavuse suurendamine).

../_images/dragon.png ../_images/dragon2.png

Enne ja pärast power-upi, lisa gadget on lohe.

3. Kaitsevõime:

  • Kaitsekilbid (force field), mis ei lase mängijat kahjustada.

  • Mängija kloonimine segaduse tekitamiseks või NPC-de kaasamine samal eesmärgil.

../_images/sonic.png

Sonic the Hedgehog 2 kilp, mis tühistab vaenlasega kokkupõrkest tekkiva kahju.

../_images/geometry_dash.gif

Geometry Dash ogade kahjutuks tegemine.

4. Põiklemisvõime:

  • mängija kiiremaks tegemine või booster-plokid.

  • Nähtamatus või kamuflaaž (näitejst pappkastina maskeerumine). Soovitatav on mängijat mitte täiesti nähtamatuks teha, pigem vähendada läbipaistvust või jätta alles vaid mängija piirjooned.

  • Hüppevõime suurendamine või "matter surfing".

Näiteks Geometry Dashis on kiirenduse power-up booster-tsoonides. Geometry Dash video Youtubes

5. Tervise- ja eluvarud:

  • “Health bar”i pikkuse suurendamine.

  • Lisa elu "Extra life" või "1-up".

  • Ajalimiidi pikendamine mängudes, kus on ajapiirang.

../_images/aladdin.png ../_images/aladdin2.png

Disney's Aladdinis lisaelu kujutamine südamete arvu kasvamisega.

6. Ajaga manipuleerimise (nii ründe- kui ka kaitsevõime):

  • Vastaste aeglustamine.

  • Kõigi peale mängija liikumatuks muutmine.

Power-down

Power-down'ide eesmärk on mängimist raskendada. Power-downide hulka kuulub: - Vastastele power-up'i andmine või mängija power-up'ide eemaldajad. - mängija haavamine või tapmine. - Kontrolli keerukamaks muutmine (näiteks ainult ühes suunas liikumise lubamine või vasakule ja paremale liikumise loogika vahetamine).

Power-downi kujutamine

Power-down'e võib kujutada samal viisil nagu power-up'e (näiteks booster-bloki asemel on mürgine ala), mis lisab üllatusmomenti, kuid sellega kaasneb oht, et mängija ei pruugi power-up'ide olemasolu avastada.

../_images/mario3.gif

Super Mario mürgine seen, mis varastab mängijalt kas power-upi või tapab ta power-upi puudumisel.

Hüppe ja liikumise kahekordse kiirendamise power-upide loogika platformer-stiilis mängus

Box2D füüsikamootoris on kaks olulist meetodit keha liikumiskiiruse muutmiseks: applyForce ja applyLinearImpulse. Peamine erinevus nende vahel seisneb mõju avaldumise ajastuses: applyForce rakendab jõudu järk-järgult, luues loomulikuma kiirenduse. applyLinearImpulse rakendab impulssi koheselt, muutes liikumist viivitamatult.

  1. Kui mängus on power-upi objektid juba kujutatud ja kokkupõrke loogika loodud, siis järgmine samm on kokkupõrke korral käivitada vastava power-upi meetodi. Näiteks:

jumpPowerUpTimeLeft();
activateRunPowerUp();
  1. Järgmine tegevus on ajutisele power-upile lisada ajamuutuja, et määrata power-upi mõju peatumine. Ajamuutuja väärtuseks paneme nulli, liidame sellele muutujale kestvusaja power-upi aktiviseerudes ning vähendame muutuja väärtust update meetodis.

private float jumpPowerUpTimeLeft = 0;
private float runPowerUpTimeLeft = 0;

public void activateJumpPowerUp() {
    jumpPowerUpTimeLeft = 10;
}

public void activateRunPowerUp() {
    runPowerUpTimeLeft = 10;
}
public void update(float deltaTime) {
    if (jumpPowerUpTimeLeft > 0) {
        jumpPowerUpTimeLeft -= deltaTime;
    }
    if (runPowerUpTimeLeft > 0) {
        runPowerUpTimeLeft -= deltaTime;
    }
}
  1. Kasutame applyLinearImpulse meetodit, kus Vector2 esimene väärtus tähistab horisontaalset ja teine vertikaalset jõudu (impulssi). Power-upi aktiviseerudes muudame seda.

private void setCorrectJumpingHeight() {
    if (jumpPowerUpTimeLeft > 0) {
        player.getB2body().applyLinearImpulse(new Vector2(0, 7f), player.getB2body().getWorldCenter(), true);
    } else {
        player.getB2body().applyLinearImpulse(new Vector2(0, 4.5f), player.getB2body().getWorldCenter(), true);
    }
}
private void setCorrectSpeedRight() {
    if (rumpPowerUpTimeLeft > 0) {
        player.getB2body().applyLinearImpulse(new Vector2(1f, 0), player.getB2body().getWorldCenter(), true);
    } else {
        player.getB2body().applyLinearImpulse(new Vector2(0.1f, 0), player.getB2body().getWorldCenter(), true);
    }
}

private void setCorrectSpeedLeft() {
    if (rumpPowerUpTimeLeft > 0) {
        player.getB2body().applyLinearImpulse(new Vector2(-1f, 0), player.getB2body().getWorldCenter(), true);
    } else {
        player.getB2body().applyLinearImpulse(new Vector2(-0.1f, 0), player.getB2body().getWorldCenter(), true);
    }
}
  1. Eelnevalt looduid vertikaalset ja horisontaalset liikumist saame välja kutsuda meetodis, mis tegeleb klahvivajutuste jälgimisega.

public void handleInput() {
    float xVelocity = player.getB2body().getLinearVelocity().x;

    if (Gdx.input.isKeyJustPressed(Input.Keys.UP) && (player.getCurrentState().equals("run")
            || player.getCurrentState().equals("standing"))) {
        setCorrectJumpingHeight();
    }

    if (Gdx.input.isKeyPressed(Input.Keys.RIGHT) && xVelocity <= 2) {
        setCorrectSpeedRight();
    }

    if (Gdx.input.isKeyPressed(Input.Keys.LEFT) && xVelocity >= -2) {
        setCorrectSpeedLeft();
    }

    // Stop moving
    if (!Gdx.input.isKeyPressed(Input.Keys.RIGHT) && !Gdx.input.isKeyPressed(Input.Keys.LEFT)) {
        player.getB2body().setLinearVelocity(0, player.getB2body().getLinearVelocity().y);
    }
}
  1. Klahvivajutuste käsitlemise loogika peame ka lisama update() meetodisse.

public void update(float deltaTime) {
    if (jumpPowerUpTimeLeft > 0) {
        jumpPowerUpTimeLeft -= deltaTime;
    }
    if (rumpPowerUpTimeLeft > 0) {
        rumpPowerUpTimeLeft -= deltaTime;
    }

    handleInput();
}

Kahekordne kiiruse jaoks on Sound liideses meetod setPitch(), mis tahab kahte muutujat, esimene on siiani olnud muusika kiirus (float) ja teine on, mis kiiruseks on nüüd soov muusikat muuta (float).