2013-10-06 17 views
0

我试图做一个游戏,使用slick2d和LWJGL。我不明白为什么这个代码不工作我被困在光滑的图形

firstStage.java

package net.CharlesDickenson; 

import org.newdawn.slick.GameContainer; 
import org.newdawn.slick.Graphics; 
import org.newdawn.slick.Image; 
import org.newdawn.slick.SlickException; 
import org.newdawn.slick.state.BasicGameState; 
import org.newdawn.slick.state.StateBasedGame; 

public class firstStage extends BasicGameState { 

    public bossVar bossChecker() { 
     if(isBeforeMiddleBoss) return bossVar.beforeBoss; 

     if(isMiddleBoss) return bossVar.Middle; 

     if(isBeforeBoss) return bossVar.beforeBoss; 

     if(isBoss) return bossVar.Boss; 

     return null; 
    } 

    @SuppressWarnings("static-access") 
    public firstStage(int state) { 
     this.state = state; 
    } 

    @Override 
    public void init(GameContainer _arg0, StateBasedGame _arg1) 
      throws SlickException { 
     scoreBoard = new Image("res/scoreBoard.png"); 
     backs = new Image("res/1stageBack.gif"); 
     isBeforeMiddleBoss = true; 
     isMiddleBoss = false; 
     isBeforeBoss = false; 
     isBoss = false; 
     _arg0.setShowFPS(false); 
    } 

    @Override 
    public void render(GameContainer arg0, StateBasedGame _arg1, Graphics _g) 
      throws SlickException { 
     this._g = _g; 

     new Mob().getGraphics(_g);//i passed graphics 
     new Char().getGraphics(_g);//i passed graphics 
     new Bullet().getGraphics(_g);//i passed graphics 

     _g.drawImage(scoreBoard, 550, 5); 
     _g.drawImage(backs, 10, 10); 
     _g.drawString(fps, 580, 570); 
     _g.drawString("High Score-> Not avaiable", 560, 60); 
     _g.drawString("Score-> " + currScore, 595, 80); 
    } 

    @Override 
    public void update(GameContainer _arg0, StateBasedGame _arg1, int arg2) 
      throws SlickException { 
     fps = "Frame Per Second-> " + _arg0.getFPS(); 

     bossVar b = bossChecker(); 

     switch(b) { 
     case beforeMiddle : 
      break; 
     case Boss : 
      break; 
     default: 
      break; 
     } 
    } 

    @SuppressWarnings("static-access") 
    @Override 
    public int getID() { 
     return this.state; 
    } 

    private static int state; 
    private static int currScore = 0; 
    private static final int originX = 270; 
    private static final int originY = 490; 
    public static int X = originX; 
    public static int Y = originY; 
    private static String fps; 
    private Image scoreBoard; 
    private Image backs; 
    private Graphics _g; 
    public boolean isBeforeMiddleBoss; 
    public boolean isMiddleBoss; 
    public boolean isBeforeBoss; 
    public boolean isBoss; 

} 

Char.java

package net.CharlesDickenson; 

import org.lwjgl.input.Keyboard; 
import org.newdawn.slick.Graphics; 
import org.newdawn.slick.Image; 
import org.newdawn.slick.SlickException; 

public class Char extends Bullet implements Entity { 

    @Override 
    public void getGraphics(Graphics _g) { 
     this._g = _g;//so i got graphics, but 
     if(!isInit) return; 
     _g.drawImage(Char, getCharX(), getCharY());//this codes doesn't works. 
    } 

    @Override 
    public int getCharX() { 
     switch(VarTracker.stage) { 
     case 1: 
      return firstStage.X; 
     } 
     return 0; 
    } 

    @Override 
    public int getCharY() { 
     switch(VarTracker.stage) { 
     case 1: 
      return firstStage.Y; 
     } 
     return 0; 
    } 

    public void setCharX(int i) { 
     System.out.println("asdgagsd"); 
     switch(VarTracker.stage) { 
     case 1: 
      firstStage.X += i; 
     } 
    } 

    public void setCharY(int i) { 
     System.out.println("asdgagsd"); 
     switch(VarTracker.stage) { 
     case 1: 
      firstStage.Y += i; 
     } 
    } 

    @Override 
    public void update() { 
     if(!isInit) return; 

     _g.drawImage(Char, getCharX(), getCharY());//this code doesn't work, too. 

     up = Keyboard.isKeyDown(Keyboard.KEY_UP); 
     down = Keyboard.isKeyDown(Keyboard.KEY_DOWN); 
     left = Keyboard.isKeyDown(Keyboard.KEY_LEFT); 
     right = Keyboard.isKeyDown(Keyboard.KEY_RIGHT); 
     shift = Keyboard.isKeyDown(Keyboard.KEY_LSHIFT); 
     z = Keyboard.isKeyDown(Keyboard.KEY_Z); 

     if(up && !shift) { 
      setCharY(6); 
     } 

     if(down && !shift) { 
      setCharY(-6); 
     } 

     if(left && !shift) { 
      setCharX(-6); 
     } 

     if(right && !shift) { 
      setCharX(6); 
     } 

     if(up && shift) { 
      setCharY(2); 
     } 

     if(down && shift) { 
      setCharY(-2); 
     } 

     if(left && shift) { 
      setCharX(-2); 
     } 

     if(right && shift) { 
      setCharX(2); 
     } 

     if(z) { 
      new Bullet().isFiring = true; 
     } 

     if(!z) { 
      new Bullet().isFiring = false; 
     } 
    } 

    @Override 
    public void init() { 
     System.out.println("<Char> Initializing..."); 

     isInit = false; 

     try { 
      Char = new Image("res/char.png"); 
     } catch (SlickException e) { 
      e.printStackTrace(); 
     } 

     isInit = true; 

     System.out.println("<Char> Done with init()"); 
    } 

    private boolean up; 
    private boolean down; 
    private boolean left; 
    private boolean right; 
    private boolean shift; 
    private boolean z; 
    private boolean isInit; 
    private Image Char; 
    private Graphics _g; 
} 

我通过使用方法的getGraphics,把一个形象的图形到其他类,但它不起作用。在渲染方法中,它工作,但我不能把图像放在其他类中。

回答

0

的原因,这是行不通的是,你正在使用Graphics不正确。当Slick2d画东西时,它使用render方法。这个方法通过了一个Graphics的实例,你可以在其中画东西。当通话结束时,Graphics对象不再适用于任何事情。因此没有理由将它传递给任何不立即使用它的东西。

你想要做的是建立在你的暴徒,Char和子弹班render方法。使render方法的实例之外的说类,例如在init和他们存储在一些数据结构实例的List。在render方法,您简单遍历list,并呼吁renderdraw每个元素。一个简单的例子:

// Give the Entity interface two methods if they don't exist already: 
public interface Entity { 
    void render(Graphics g); 
    void update(int delta); 
} 

// In firststage.java 
List<Entity> list; 

// In the init() method 
public void init(GameContainer container, StateBasedGame game) 
     throws SlickException { 
    ... 
    list = new ArrayList<Entity>(); 
    list.add(new Mob()); 
    list.add(new Char()); 
    list.add(new Bullet()); 
} 

// In the render method 
public void render(GameContainer container, StateBasedGame game, Graphics g) 
     throws SlickException { 
    ... 
    for (Entity e : list) { 
     e.draw(g); 
    } 
} 

// In the update method 
public void update(GameContainer container, StateBasedGame game, int delta) 
     throws SlickException { 
    ... 
    for (Entity e : list) { 
     e.update(delta); 
    } 
} 

TL; DR版本:图形对象只存在于一个渲染调用中。 Render每秒被调用多次,因此不建议在该方法中创建对象。面向对象编程擅长建模对象。游戏倾向于模拟很多对象。利用它。

+0

它没有工作,表示赞赏。 – user2821630