我被光滑的图形卡住了

问题描述 投票:0回答:1

我想做一个游戏,用slick2d和lwjgl。我不明白为什么这段代码不能用?

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方法把图形传给其他类,要放一张图片,但它不工作.在render方法中,它工作了,但我不能把图片放在其他类中。

slick2d
1个回答
0
投票

它不工作的原因是你使用的是 Graphics 不正确的。当 Slick2d 绘制一些东西,它使用 render 方法。该方法通过一个 Graphics,你可以在上面画东西。当通话结束时 Graphics 对象对任何事情都不再有用。因此,没有理由将它传递给任何不立即使用它的东西。

你要做的是创建一个 render 方法中的Mob、Char和Bullet类。使上述类的实例 外面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版本: 图形对象只存在于一次渲染调用中.渲染一秒钟会被调用很多次,所以不建议在该方法中创建对象.面向对象的编程擅长建模对象. 游戏往往会对很多对象进行建模。利用它。

© www.soinside.com 2019 - 2024. All rights reserved.