2015-04-18 2 views
0

Je fais un jeu RTS en utilisant Slick 2D. J'ai une classe de construction et il contient un int appelé ressources. Je veux que la variable ressources devienne une chaîne et soit rendue au centre de mon bâtiment (qui est supposé être un rectangle).Java - Slick 2D - Placer du texte (ou n'importe quel graphique) sur un rectangle (ou n'importe quelle forme)

Voilà ma classe de construction:

package test; 

import org.newdawn.slick.Color; 
import org.newdawn.slick.Graphics; 
import org.newdawn.slick.geom.Rectangle; 

public class BaseBuilding extends Rectangle{ 

    private int resources; 
    private Graphics g; 

    public BaseBuilding(float x, float y, float width, float height) { 
     super(x, y, width, height); 
     resources = 0; 
     g = new Graphics(); 
    } // end constructor 

    public void render(){ 
     g.drawString("bro wat", resources, resources); 
     g.setColor(Color.gray); 
     g.fill(this); 
     g.drawString(Integer.toString(resources), this.width/2, this.height/2); 
    } // end update 

    public int getResources(){ 
     return resources; 
    } // end getResources 

    public void addResources(int mulla){ 
     resources += mulla; 
     if (resources < 0) 
      resources = 0; 
    } // end addResources 

    public void createBasicUnit(){ 
     // create a BasicUnit object in a randomly, valid position close to this object 
     // TODO 
    } // end createBasicUnit 

} // end class def 

Jusqu'à présent, tous mes états travaillent et je me suis le rectangle apparaisse de façon appropriée. Mon g.drawString (str, flotteur, flotteur) code avec des paramètres corrects fonctionnera sur ma classe GameState (non représenté) dans sa fonction de rendu, mais il me donne cette erreur dans ma classe BaseBuilding:

java.lang.NullPointerException 
at org.newdawn.slick.Graphics.drawString(Graphics.java:1366) 
at test.BaseBuilding.render(BaseBuilding.java:19) 
at test.GameState.render(GameState.java:34) 
at org.newdawn.slick.state.StateBasedGame.render(StateBasedGame.java:199) 
at org.newdawn.slick.GameContainer.updateAndRender(GameContainer.java:688) 
at org.newdawn.slick.AppGameContainer.gameLoop(AppGameContainer.java:411) 
at org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:321) 
at test.StateBaseGame.main(StateBaseGame.java:22) 
Sat Apr 18 03:18:55 EDT 2015 ERROR:Game.render() failure - check the game code. 
org.newdawn.slick.SlickException: Game.render() failure - check the game code. 
at org.newdawn.slick.GameContainer.updateAndRender(GameContainer.java:691) 
at org.newdawn.slick.AppGameContainer.gameLoop(AppGameContainer.java:411) 
at org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:321) 
at test.StateBaseGame.main(StateBaseGame.java:22) 

donc i creusé autour et a découvert c'est cette ligne qui me cause des problèmes:

g.drawString(Integer.toString(resources), this.width/2, this.height/2); 

Impossible de trouver sur Internet; aide si vous pouvez s'il vous plaît merci.

Répondre

2

Après avoir pris un coup d'oeil au code source Slick, votre problème vient de la variable de police dans la Graphics classe qui est nulle.

Vous instanciez des graphiques avec le constructeur par défaut qui ne fournit pas de valeur par défaut pour la variable de police. Et l'autre, comme l'indique le doc, seul le conteneur doit être instancié Graphics.

Ainsi, vous ne devriez jamais Graphics instancier, au lieu simplement récupérer de l'GameContainer (getGraphics) qui est everywhere, ou vous pouvez également obtenir g de la méthode render de votre classe de jeu (jeu , BasicGame, BasicGameState, StateBasedGame, en fonction de ce que vous utilisez ...).

Pour faire simple, il suffit de passer votre objet Graphics par votre méthode render:

public void render(Graphics g){ 
    g.drawString("bro wat", resources, resources); 
    g.setColor(Color.gray); 
    g.fill(this); 
    g.drawString(Integer.toString(resources), this.width/2, this.height/2); 
} // end update 

Et dans votre jeu:

render(GameContainer container, Graphics g) { 
    myBaseBuilding.render(g); 
} 
+0

Joliment dit; woks comme un charme! Je suppose que je peux faire la même chose si je voulais dire pour créer une forme ou une image? – Ibrahim

+0

Eh bien, Rectangle & Image sont deux choses différentes dans Sick.geom. Rectangle est une structure abstraite, il ne contient rien sauf quelques méthodes mathématiques et des variables de base. L'image a une logique openGL et peut se dessiner dans la méthode render de votre jeu (myImage.draw (0,0)). Mais il peut aussi être dessiné par ** g ** (g.drawImage (myImage)). Mais attention, vous devez faire chaque tirage dans la méthode render (boucle principale) de votre classe de jeu. – RSez