Kaamera: tegelasega kaasa liikumine; zoomimine

Kui tegelane liigub, siis kaamera liigub temaga kaasa

Kaamera mänguarenduses on oluline element, mis võimaldab mängijal keskenduda mängumaailma konkreetsele osale. Tavaliselt liigub kaamera mängija tegelase liikumisega kaasa, hoides tegelase ekraani keskosas. Lisaks saab kaamerat kasutada mängumaailma suurendamiseks või vähendamiseks (zoomimiseks), et pakkuda mängijale paremat ülevaadet.

Kaamera liikumise ja zoomimise teostamine

Alljärgnev koodinäide selgitab, kuidas kaamera liikumist ja zoomimist teostada. Samuti tagab kood, et kaamera ei liiguks mängumaailmast väljapoole.

public void updateGameCamZoom() { // Soovitud vaateala suuruse määramine
    float desiredViewportWidth = gamePort.getWorldWidth() / 2;
    float desiredViewportHeight = gamePort.getWorldHeight() / 2;

    // Kaamera vaateala suuruse ja positsiooni seadistamine
    gameCam.setToOrtho(false, desiredViewportWidth, desiredViewportHeight);

    // Kaamera positsioneerimine mängija asukoha järgi
    gameCam.position.set(player.getX(), player.getY(), 0);

    // Kaamera X-telje piiramine
    if (gameCam.position.x < gameCam.viewportWidth / 2) {
        gameCam.position.x = gameCam.viewportWidth / 2;
    } else if (gameCam.position.x > gamePort.getWorldWidth() - gameCam.viewportWidth / 2) {
        gameCam.position.x = gamePort.getWorldWidth() - gameCam.viewportWidth / 2;
    }

    // Kaamera Y-telje piiramine
    if (gameCam.position.y < gameCam.viewportHeight / 2) {
        gameCam.position.y = gameCam.viewportHeight / 2;
    } else if (gameCam.position.y > gamePort.getWorldHeight() - gameCam.viewportHeight / 2) {
        gameCam.position.y = gamePort.getWorldHeight() - gameCam.viewportHeight / 2;
    }

    // Kaamera uuendamine
        gameCam.update();
}

Koodis jagatakse maailma laius ja kõrgus kaheks, et määrata kaamera vaateala suurus. See võimaldab vaateala suurust kohandada vastavalt vajadusele. Kaamera paigutatakse mängija koordinaatide keskmesse, nii et tegelane püsib alati ekraani keskosas. Kaamera X- ja Y-teljel liikumist piiratakse, et see ei väljuks mängumaailma piiridest. Näiteks kui mängija on mängumaailma servas, hoiab see loogika kaamera mängumaailma sees. Pärast muudatuste tegemist kutsutakse välja gameCam.update(), mis rakendab kõik tehtud muudatused. Seda meetodid saab kutsuda meetodis render.

Zoomimine

Zoomimise põhimõte seisneb kaamera vaateala (viewport) suuruse muutmises. Kui vaateala suurust vähendatakse, tundub, et kaamera suumib sisse (objektid muutuvad suuremaks). Kui suurust suurendatakse, tundub, et kaamera suumib välja (objektid muutuvad väiksemaks). Alljärgnev koodinäide näitab, kuidas lisada zoomimise funktsioon koos parameetrite piirangutega:

public void handleCameraZoom(float zoomFactor) {
    // Uuenda zoom taset
    gameCam.zoom += zoomFactor;

    // Kehtesta miinimum- ja maksimumväärtused zoom tasemele
    if (gameCam.zoom < 0.5f) {
        gameCam.zoom = 0.5f; // Maksimaalne suumimine (lähemal)
    } else if (gameCam.zoom > 2.0f) {
        gameCam.zoom = 2.0f; // Minimaalne suumimine (kaugemal)
    }

    // Kaamera X-telje piiramine
    if (gameCam.position.x < gameCam.viewportWidth * gameCam.zoom / 2) {
        gameCam.position.x = gameCam.viewportWidth * gameCam.zoom / 2;
    } else if (gameCam.position.x > gamePort.getWorldWidth() - gameCam.viewportWidth * gameCam.zoom / 2) {
        gameCam.position.x = gamePort.getWorldWidth() - gameCam.viewportWidth * gameCam.zoom / 2;
    }

    // Kaamera Y-telje piiramine
    if (gameCam.position.y < gameCam.viewportHeight * gameCam.zoom / 2) {
        gameCam.position.y = gameCam.viewportHeight * gameCam.zoom / 2;
    } else if (gameCam.position.y > gamePort.getWorldHeight() - gameCam.viewportHeight * gameCam.zoom / 2) {
        gameCam.position.y = gamePort.getWorldHeight() - gameCam.viewportHeight * gameCam.zoom / 2;
    }

    // Uuenda kaamera muudatused
    gameCam.update();
}

Zoomi uuendamine:

gameCam.zoom += zoomFactor

zoomFactor määrab, kui palju kaamera suumib. Positiivne väärtus eemaldab kaamera, negatiivne toob lähemale. Zoom väärtusele seatakse piirangud, et vältida liiga suurt või väikest zoomi. Miinimumväärtus (0.5f) tähendab suuremat lähivaatlust, maksimumväärtus (2.0f) tähendab kaugemat vaadet.

Kaamera positsiooni piiramine: Kuna zoom muudab kaamera vaateala, tuleb uuesti arvutada, et kaamera ei väljuks mängumaailma piiridest. Selleks korrutatakse kaamera vaateala suurus zoom tasemega

gameCam.viewportWidth * gameCam.zoom / 2

Kaamera uuendamine: gameCam.update() rakendab kõik muudatused, sh uus zoomi tase ja positsiooni piirangud. Kasutamine mängus: Zoomi juhtimine saab toimuda näiteks klaviatuuri või hiire abil.

if (Gdx.input.isKeyPressed(Input.Keys.UP)) {
handleCameraZoom(-0.02f); // Zoom lähemale
}
if (Gdx.input.isKeyPressed(Input.Keys.DOWN)) {
    handleCameraZoom(0.02f); // Zoom kaugemale
}

Pärast seda koodi implementeerismist saab zoom'ida sisse ja välja nagu on näidatud piltides:

zoom_1 zoom_2

Lisainfo

https://libgdx.com/wiki/graphics/2d/orthographic-camera