Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: JavaScript: JS: Tilet piirtyvät muun grafiikan päälle?

WKoA [23.03.2013 17:27:29]

#

Osaakos kukaan sanoa, miksi piirtämäni tilepohjainen grafiikka piirtyy pelihahmon ja tekstien päälle?
http://jsfiddle.net/sjvDK/3/

Koodin lopussa olevassa render funktiossa siis piirretään ensin tilet, jonka jälkeen pelihahmo ja lopuksi pelihahmon koordinaatit. Mutta tilet tulevat jostain syystä päällimmäiseksi? Jos nappaan tilen piirtämisen tekevän koodin pois, niin pelihahmo ja koordinaatit näkyvät normaalisti.

Ja tiedän, ettei tuo ole muutoinkaan välttämättä järkevin tapa toteuttaa tuon tilen piirtämiset, joten muutoinkin vinkkejä otetaan toki vastaan.

The Alchemist [23.03.2013 18:51:43]

#

Kannattaa unohtaa purkan kirjoittaminen ja opetella tässäkin asiassa käyttämään jotain valmista kirjastoa. Yksi ihan hyvä valinta on KineticJS. Opettele myös debuggaamaan koodiasi, jos aiot koodia kirjoittaa. Koko paska failaa siihen, että käsittelet kartan sisältävää taulukkoa aivan holtittomasti. Ensinnäkin iteroi taulukkoa sen koon mukaan, älä vain keksi että taulukkosi on 26x26 ruutua. Voin paljastaa tässä vaiheessa, ettei se todellakaan ole sen kokoinen.

Lisäksi koko laudan alustus on aika hataralla pohjalla, koska et varmista, että tarvitsemasi kuvat ovat latautuneet; alat vain renderöidä niitä ja loppu jää tuurin vastuulle. Et itse asiassa edes odota html-sivun latautumista: koko body-elementtiä ei välttämättä ole olemassa, kun jo yrität lisätä sen sisälle canvasin! Äläkä helvetti laita arpomisvaiheessa suorittamaan koodia tuhat kertaa sekunnissa, kun se tekee debuggaamisestakin aivan mahdotonta.

WKoA [23.03.2013 18:52:50]

#

Joo siis tuolla on taulukon koossa bugi. Taulukkohan on 25*15 ruutua, mutta ei se tuohon pelkästään kaadu tuo piirtäminen.

The Alchemist kirjoitti:

Lisäksi koko laudan alustus on aika hataralla pohjalla, koska et varmista, että tarvitsemasi kuvat ovat latautuneet; alat vain renderöidä niitä ja loppu jää tuurin vastuulle. Et itse asiassa edes odota html-sivun latautumista: koko body-elementtiä ei välttämättä ole olemassa, kun jo yrität lisätä sen sisälle canvasin! Äläkä helvetti laita arpomisvaiheessa suorittamaan koodia tuhat kertaa sekunnissa, kun se tekee debuggaamisestakin aivan mahdotonta.

Kiitokset vain "hyvistä" vinkeistä..... Eli pitääkin mennä tästä stackoverflowiin josta saa muutakin kuin kiroilua ja vittuilua vastaukseksi.

The Alchemist [23.03.2013 19:20:18]

#

Kerroin sinulle, mikä koodissasi on vikana. Sitähän sinä kysyit. Jos olisit debugannut koodiasi itse laisinkaan, niin se olisi ollut meille muille vähemmän vittumainen homma. Kukaan ei noin huonosti testattua koodia tule hymysuin sinulle korjaamaan. Ja koodi oli todellakin aivan helvetin huonosti testattua, kun konsoliin rupesi tulemaan kymmeniä tuhansia virheilmoituksia välittömästi koodin suorituksen alettua ja ne jatkuivat vielä ensimmäisten virheiden korjaamisen jälkeenkin.

Laitan tähän sinulle joka tapauksessa alustuksen KineticJS:n käyttöön.

var graphics = {
    'player': 'hero.png',
    'ground': 'ground.png',
    'wall': 'wall.png'
};

var canvas;

var map = [
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
    [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
    [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
    [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
    [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
    [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
    [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
    [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
    [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
    [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
    [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
    [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
    [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
];

var load_graphics = function(sources, callback) {
    var ready_count = 0;
    var images = {};

    for (var name in sources) {
        var src = sources[name];
        var image = $('<img/>').attr('src', src);
        images[name] = image[0];

        image.ready(function() {
            ready_count++;

            if (ready_count == Object.keys(sources).length) {
                callback(images);
            }
        });
    };
};

var init_game = function(container, images, map) {
    canvas = new Kinetic.Stage({
        container: container,
        width: 800,
        height: 480
    });

    var bg_layer = new Kinetic.Layer();
    var bg = new Kinetic.Rect({
        x: 0,
        y: 0,
        width: canvas.getWidth(),
        height: canvas.getHeight(),
        fillPatternImage: images['ground']
    });

    bg_layer.add(bg);
    canvas.add(bg_layer);
};

$(function() {
    load_graphics(graphics, function(images) {
        // Pitää vielä odottaa kuvien datan käsittely
        setTimeout(function() {
            init_game('container', images, map);
        }, 500);
    });
});

Edit: tämä esimerkki siis vaatii containeriksi elementin, jolla on id:nä 'container'.

Metabolix [23.03.2013 19:29:27]

#

En juuri nyt jaksa katsoa koodiasi kovin tarkasti, mutta jos (kun) The Alchemistin diagnoosi on oikea, syy koodin toimimattomuuteen on se, että render-funktio heittää poikkeuksen ja siis päättyy virheeseen ennen hahmon piirtoa. Hahmokin alkaa piirtyä, kun for-silmukoihin laittaa oikeat rajat (x < board.length ja y < board[x].length).

WKoA [23.03.2013 19:32:47]

#

No jos lähdetään perusteista, niin esim. hyvä debuggerisuosituskin voisi olla kiva. Koodia en pyytänyt kenenkään korjaamaan, vaan antamaan vinkkejä mikä mättää koska tiedä itsekkin, etten ole koodivelho. Yleensä kaikenmaailman linkit tutoriaaleihin yms. on kivoja.

Ja jos halutaan, että tällä saitilla kukaan viihtyy pidempään, niin on hyvä aloittaa siitä, ettei vastauksissa kukaan hauku, kirjoile ja vittuile, vaikka olisi kuinka paskaa koodia. Aina voi siis vastata asiallisesti eikä alkaa viljelemään paskaa.

Kiitos Metabolixille! :)

The Alchemist [23.03.2013 19:35:24]

#

Javascriptin debuggaamiseen riittää ihan selaimen vakiokonsoli. Chromessa se on integroitu element inspectorin yhteyteen, Firefoxissa aukeaa oikotiellä Ctrl+Shift+J.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta