Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Java: java: Globaalit muuttujat

Sivun loppuun

Taikaviitta [06.10.2008 13:14:29]

#

Minulla on pääohjelma Rogue. Lisäksi on luokka Map, jossa hoidetaan esimerkiksi piirto.

Ongelmana on, että tarvitsen muuttujat camerax ja cameray, joihin sekä luokat Rogue ja Map pääsevät käsiksi ja voivat muuttaa.

Miten moisen toteutan?

-T

_Pete_ [06.10.2008 13:28:40]

#

Teet siihen luokkaan jossa cameraX ja cameraY muuttujat ovat metodit joilla
niiden arvoa voi kysyä ja asettaa aka:

public void setCameraX(int value) {
  this.cameraX = value;
}

public void getCameraX() {
  return this.cameraX;
}

Sami [06.10.2008 13:49:03]

#

Jos välttämättä tarvitset globaaleja muuttujia, niin niitäkin pystyy käyttämään. Globaalien muuttujien käyttö on yleensä huonoa ohjelmointityyliä ja usein, ellei aina, on parempi käyttää edellä mainittuja jonkin olion jäsenfunktioita.

public class Luokka {
  public static int globaalimuuttuja;
  public static long[] globaalitaulukko = {4, 5, 6};
}

Ja viittaus noihin onnistuu kirjoittamalla Luokka.globaalimuuttuja.

Taikaviitta [06.10.2008 13:49:18]

#

Et nyt tainnut pete tajuta ongelmaani.

Jos määritän camerax:n esim näin:

class Cam {
  private static int x = 0;

  public static void addx(){
    x++;
  }

  public static int getx(){
    return x;
  }
}

...niin addx metodi ei toimi. this.x ei käänny.

Sami [06.10.2008 13:51:55]

#

Ei tietenkään this.x käänny, jos x on staattinen muuttuja, koska this. viittaa *tähän* olioon ja x ei ole tämän olion jäsenmuuttuja, vaan se on luokan Cam globaali muuttuja (jota siis on kaikille Cam-olioille yhteinen).

_Pete_ [06.10.2008 13:59:34]

#

Sami kirjoitti:

public class Luokka {
  public static int globaalimuuttuja;
  public static long[] globaalitaulukko = {4, 5, 6};
}

Ja viittaus noihin onnistuu kirjoittamalla Luokka.globaalimuuttuja.

Tuo on vähän harhaanjohtavaa koska Javassa ei oikeasti ole mitään globaalejamuuttujia:

http://www.javafaq.nu/java-article909.html

Taikaviitta [06.10.2008 14:02:39]

#

Et Sami vastannut ongelmaani.

Toinen tapa, mitä yritin, oli luoda camera-olio Rogue-luokan sisään. Kuitenkaan en pääse Map-luokasta käsiksi Roguen camera-olioon.

Onko tähän tapoja?

Sami [06.10.2008 14:56:35]

#

public Camera {
  private int x;
  private int y;

  public Camera(int x, int y) {
    this.x = x;
    this.y = y;
  }

  public int getX() {
     return x;
  }
  // ...
}

public Rogue {
  private Map map;

  public Rogue() {
    map = new Map();
    System.out.println("Kameran x-koordinaatti: " + map.getCamera().getX());
  }
}

public Map {
  private Camera camera;

  public Map() {
    camera = new Camera(120, 0);
  }

  public Camera getCamera() {
    return camera;
  }
}

_Pete_ [06.10.2008 14:57:43]

#

Taikaviitta kirjoitti:

Et Sami vastannut ongelmaani.

Toinen tapa, mitä yritin, oli luoda camera-olio Rogue-luokan sisään. Kuitenkaan en pääse Map-luokasta käsiksi Roguen camera-olioon.

Onko tähän tapoja?

Muutat koodiasi niin että koordinaatti muuttujat ei ole luokkamuuttujia(static) vaan instanssimuuttujia(ei static).

Taikaviitta [06.10.2008 16:22:17]

#

Ah, kiitos kaikille vastanneille. Opin taas paljon uutta, ja löysin jopa mistä vika johtui.

Luokka Map (extends JPanel) siis jää uudelleenpiirtämättä muuttujien muuntelun jälkeen.

metodissa paintComponent(Graphics g) on siis piirto. Miten saan piirrettyä uudelleen Map-luokan? rePaint?

Edit. Siis repaint() löytyi.
Problem == NULL.


Sivun alkuun

Vastaus

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

Tietoa sivustosta