Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Java: Välkkyvä pelimoottori

jonez [11.12.2004 14:57:30]

#

Minulla on engine joka piirtää kenttää palikoina(40x40) kaksiulotteisesta taulukosta, toimii muuten loistavasti mutta puut kentän(10palikkaa x 10 palikkaa) keskellä olevat puut välkkyvät. Puut ovat siis kakkosia, ruoho ykköstä.
Itse en ole keksinyt vikaa sittne millään.
pasteen tähän nyt piirto osan.

public void paint(Graphics g){

 int[][] kentta = {
 {1,1,1,1,1,1,1,2,1,1, 2,1,1,1,1,1,1,1,1,2, 2,1,1,1,1,1,1,2,1,2, 2,1,1,1,1,1,1,1,1,2,},
 {2,1,1,1,1,1,1,2,1,1, 1,2,1,1,1,1,1,1,2,1, 2,2,1,1,1,1,1,2,2,1, 2,1,1,1,1,1,1,1,1,2,},
 {2,1,1,1,1,1,1,2,1,1, 1,1,2,1,1,1,1,2,1,1, 2,1,2,1,1,1,1,2,1,1, 2,1,1,1,1,1,1,1,1,2,},
 {2,1,1,1,1,1,1,2,1,1, 1,1,1,2,1,1,2,1,1,1, 2,1,1,2,1,1,2,2,1,1, 2,1,1,1,1,1,1,1,1,2,},
 {2,1,1,1,1,1,1,2,1,1, 1,1,1,1,2,2,1,1,1,1, 2,1,1,1,2,2,1,2,1,1, 2,1,1,1,1,1,1,1,1,2,},
 {1,1,1,1,1,1,1,2,1,1, 1,1,2,1,2,2,1,1,1,1, 2,1,1,1,2,2,1,2,1,1, 2,1,1,1,1,2,1,1,1,2,},
 {2,1,1,1,1,1,1,2,1,1, 1,1,1,2,1,1,2,1,1,1, 2,1,1,2,1,1,2,2,1,1, 2,1,1,1,1,1,1,1,1,2,},
 {2,1,1,1,1,1,1,2,1,1, 1,1,2,1,1,1,1,2,1,1, 2,1,2,1,1,1,1,2,1,1, 2,1,1,1,1,1,1,1,1,2,},
 {2,1,1,1,1,1,1,2,1,1, 1,2,1,1,1,1,1,1,2,1, 2,2,1,1,1,1,1,2,2,1, 2,1,1,1,1,1,1,1,1,2,},
 {2,1,1,1,1,1,1,2,1,1, 2,1,1,1,1,1,1,1,1,2, 2,1,1,1,1,1,1,2,1,2, 2,1,1,1,1,1,1,1,1,2,},

 {1,1,1,1,1,1,1,2,1,1, 2,1,1,1,1,1,1,1,1,2, 1,1,1,1,1,1,1,2,1,1, 2,1,1,1,1,1,1,1,1,2,},
 {1,1,1,1,1,1,1,2,1,1, 2,1,1,1,1,1,1,1,1,2, 1,1,1,1,1,1,1,2,1,1, 2,1,1,1,1,1,1,1,1,2,},
 {1,1,1,1,1,1,1,2,1,1, 2,1,1,1,1,1,1,1,1,2, 1,1,1,1,1,1,1,2,1,1, 2,1,1,1,1,1,1,1,1,2,},
 {1,1,1,1,1,1,1,2,1,1, 2,1,1,1,1,1,1,1,1,2, 1,1,1,1,1,1,1,2,1,1, 2,1,1,1,1,1,1,1,1,2,},
 {1,1,1,1,1,1,1,2,1,1, 2,1,1,1,1,1,1,1,1,2, 1,1,1,1,1,1,1,2,1,1, 2,1,1,1,1,1,1,1,1,2,},
 {1,1,1,1,1,1,1,2,1,1, 2,1,1,1,1,1,1,1,1,2, 1,1,1,1,1,1,1,2,1,1, 2,1,1,1,1,1,1,1,1,2,},
 {1,1,1,1,1,1,1,2,1,1, 2,1,1,1,1,1,1,1,1,2, 1,1,1,1,1,1,1,2,1,1, 2,1,1,1,1,1,1,1,1,2,},
 {1,1,1,1,1,1,1,2,1,1, 2,1,1,1,1,1,1,1,1,2, 1,1,1,1,1,1,1,2,1,1, 2,1,1,1,1,1,1,1,1,2,},
 {1,1,1,1,1,1,1,2,1,1, 2,1,1,1,1,1,1,1,1,2, 1,1,1,1,1,1,1,2,1,1, 2,1,1,1,1,1,1,1,1,2,},
 {1,1,1,1,1,1,1,2,1,1, 2,1,1,1,1,1,1,1,1,2, 1,1,1,1,1,1,1,2,1,1, 2,1,1,1,1,1,1,1,1,2},
 };

int kenttapalikoina_x     = kentta[0].length;
int kenttapalikoina_y     = kentta.length;

kentanpiirto_x = 0;
kentanpiirto_y = 0;
kenttalooppi   = 0;
piirtopinta_x  = 0;
piirtopinta_y  = 0;

while(kenttalooppi < 100){
if(kentta  [kentanpiirto_y + kentanvaihto_y] [kentanpiirto_x + kentanvaihto_x] == 1){
g.drawImage(ruoho, piirtopinta_x, piirtopinta_y, this);
}
if(kentta  [kentanpiirto_y + kentanvaihto_y] [kentanpiirto_x + kentanvaihto_x] == 2){
g.drawImage(puu,   piirtopinta_x, piirtopinta_y, this);
}
if(kentta  [kentanpiirto_y + kentanvaihto_y] [kentanpiirto_x + kentanvaihto_x] == 3){
g.drawImage(vesi,  piirtopinta_x, piirtopinta_y, this);
}

if(piirtopinta_x == 360){
piirtopinta_x = 0;
piirtopinta_y += 40;
}else{
piirtopinta_x += 40;
}
if(kentanpiirto_y == 9){
piirtopinta_y = 0;
}

if(kentanpiirto_x == 9){
kentanpiirto_x = 0;
kentanpiirto_y += 1;
}else{
kentanpiirto_x += 1;
}
if(piirtopinta_y == 9){
piirtopinta_y = 0;
}

g.drawImage(pelaaja, pelaaja_x, pelaaja_y, this);

}

}

thefox [12.12.2004 13:54:19]

#

Javaa en osaa, mutta veikkaisin että tuplapuskuroinnilla välkkyminen poistuu. Piirrä siis tavarat ensin ruudun ulkopuoliseen puskuriin ja saatuasi kaiken piirretyksi kopioi em. puskuri näkyviin.

tsuriga [12.12.2004 17:06:38]

#

https://www.ohjelmointiputka.net/koodivinkit/24347-java-kaksoispuskurointi

jonez [12.12.2004 17:23:42]

#

(2),1,1,1,1,1,1,1,1,(2),
1,2,1,1,1,1,1,1,2,1
1,1,2,1,1,1,1,2,1,1,
1,1,1,2,1,1,2,1,1,1,
1,1,1,1,2,2,1,1,1,1,
1,1,2,1,2,2,1,1,1,1,
1,1,1,2,1,1,2,1,1,1,
1,1,2,1,1,1,1,2,1,1,
1,2,1,1,1,1,1,1,2,1,
(2),1,1,1,1,1,1,1,1,(2),
Ympyröidyt kakkoset eivät välky.
Siksipä epäilenkin että muiden puiden päälle piirretään vahingossa ruohoa, mutta en tiedä missä vaiheessa. Minulla on koodissa
tämä:

public void update(Graphics g) {
paint(g);
}

joka estääkin kaiken muun välkkeen ja vilkkunan sieltä. Vain keskemmällä olevat jutut kuten puu tai vesi välkkyy, ruoho ei. Taas herää epäilys että siihen piirretään ruoho päälle. Eli puut välähtävät kerran esiin kun appletti repaint() itsensä.

sqwiik [12.12.2004 17:35:14]

#

Koeta vaihtaa nuo if-lauseet kuvan määrittelyssä:

if(kentta  [kentanpiirto_y + kentanvaihto_y] [kentanpiirto_x + kentanvaihto_x] == 1){
g.drawImage(ruoho, piirtopinta_x, piirtopinta_y, this);
}
if(kentta  [kentanpiirto_y + kentanvaihto_y] [kentanpiirto_x + kentanvaihto_x] == 2){
g.drawImage(puu,   piirtopinta_x, piirtopinta_y, this);
}
if(kentta  [kentanpiirto_y + kentanvaihto_y] [kentanpiirto_x + kentanvaihto_x] == 3){
g.drawImage(vesi,  piirtopinta_x, piirtopinta_y, this);
}

else if-rakenteeksi. Saattaa olla, että jotkin näistä piirretään kahdesti. Suosittelen itse switch-rakennetta (on myös hieman selkeämpi):

switch(kentta  [kentanpiirto_y + kentanvaihto_y] [kentanpiirto_x + kentanvaihto_x]){
  case 1:
    g.drawImage(ruoho, piirtopinta_x, piirtopinta_y, this);
    break;
  case 2:
    g.drawImage(puu, piirtopinta_x, piirtopinta_y, this);
    break;
  case 3:
    g.drawImage(vesi, piirtopinta_x, piirtopinta_y, this);
    break;
};

tsuriga [12.12.2004 17:36:23]

#

Tuo update-metodin ylikirjoittaminen vain estää piirtopintaa tyhjentymästä ennen uutta piirtotapahtumaa. Katso tuo koodivinkki, missä selitän jotenkin kaksoispuskuroinnin käyttöä. Vaikka piirtäisitkin toisten kohteiden päälle kaksoispuskurointia käyttäessäsi, se ei näkyisi piirtopinnalla, koska vasta se lopputulos näytettäisiin pelaajalle.

jonez [12.12.2004 23:40:19]

#

Pahoittelen todella paljon, aivan nyyppämäinen virhe. Ensinnäkin ikuinen silmukka ja repaintin yhteydessä olisi pitänyt nollata kentänpiirtäjä muuttujat. Kiitos kuitenkin.
Ei vois nolompi fiilis olla mulla.

Vastaus

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

Tietoa sivustosta