2014-02-18 2 views
0

Хорошо с этим кодом, у меня есть милая маленькая игра, брошенная вместе. В теории level.java должен инициировать Menu.java, и как только кнопка воспроизведения нажата на экране, вы должны перейти в состояние Playing.java. К сожалению, когда это происходит (нажатие кнопки воспроизведения, в данном случае монета), я получаю массу тарабарщины в моей консоли (по крайней мере для меня). Так что я спрашиваю вас, ребята, это. Почему это могло произойти? Каковы возможные решения? и есть ли какие-нибудь отладочные советы для расшифровки того, что появляется в моей консоли? Heres «уровень»:Использование slick2D, имеющего проблемы с перемещением состояний

import org.newdawn.slick.*; 
import org.newdawn.slick.state.*; 


public class level extends StateBasedGame{ 


public static final String gamename = "Flight 1.0 "; 
public static final int menu = 0; 
public static final int playing = 1; 


public level(String gamename){ 
super(gamename); 
    this.addState(new Menu(menu)); 
    this.addState(new Playing(playing)); 

} 

public void initStatesList(GameContainer gc)throws SlickException{ 

     this.getState(menu).init(gc, this); 
     this.getState(playing).init(gc, this); 
     this.enterState(menu); 

} 

public static void main(String args[]){ 

AppGameContainer appgc; 
try{ 
    appgc = new AppGameContainer(new level(gamename)); 
    appgc.setDisplayMode(800, 600, false); 
    appgc.start(); 

}catch(SlickException e){ 
    e.printStackTrace(); 
}}} 

А вот «Меню» с помощью кнопки воспроизведения:

import org.lwjgl.input.Mouse; 
import org.newdawn.slick.*; 
import org.newdawn.slick.state.*; 

public class Menu extends BasicGameState{ 
Image play; 
    int xpos = Mouse.getX(); 
    int ypos = Mouse.getY(); 
public Menu(int state){ 


} 

public void init(GameContainer gc, StateBasedGame sbg)throws SlickException{ 
    play = new Image("Resources\\coin.gif"); 

} 
public void render(GameContainer gc, StateBasedGame sbg, Graphics g)throws SlickException{ 
g.drawImage(play, 0, 0); 


} 

public void update(GameContainer gc, StateBasedGame sbg, int delta)throws SlickException{ 
    Input input = gc.getInput(); 

    if((xpos >= 0 && xpos <= 127) && (ypos>= 0 && ypos <= 33)){ 
    if(input.isMouseButtonDown(0)){ 
    sbg.enterState(1); 
    } 
    } 

} 
public int getID(){ 
return 0; 
} 
} 

И, наконец, «Игра», что я пытаюсь передать:

import org.newdawn.slick.*; 
import org.newdawn.slick.state.*; 
public class Playing extends BasicGameState{ 



    //game objects 
    Image guy; 
    Image coin1; 
    Image coin2; 

    //object coordinates 
    float x = 30, y = 50; 
    float coin1x = 1000, coin1y = 500; 
    float coin2x = 1100, coin2y = 400; 
    float rect1x = 1000, rect1y = 225; 
    //coin counter 
    int coincount = 0; 
//ignore 
public Playing(int state){} 
//declare items 
public void init(GameContainer gc, StateBasedGame sbg)throws SlickException{ 
     guy = new Image("Resources\\PlaneMovie1.gif"); 
     coin1 = new Image("Resources\\coin.gif"); 
     } 
//draw items 
public void render(GameContainer gc, StateBasedGame sbg, Graphics g)throws SlickException{ 
    g.drawImage(guy, x, y); 
    g.drawImage(coin1, coin1x, coin1y); 
    g.drawImage(coin2, coin2x, coin2y); 
    g.drawString("Coins: " + coincount, 100, 100); 
    g.drawRect(rect1x, rect1y, 50, 425); 
} 
//declare changes to items 
public void update(GameContainer gc, StateBasedGame sbg, int delta)throws SlickException{ 
    //plane movement/controls 
    Input input = gc.getInput(); 
    if(input.isKeyDown(Input.KEY_SPACE)){ y -= 1 ;} 
    if(input.isKeyDown(Input.KEY_SPACE) == false){ 
     y += .5; 

    } 
    //coin counter 
    if (x == coin2x && y == coin2y){ 
     coincount +=1 ; 
    } 
    if(x == coin1x && y == coin1y){ 
     coincount += 1; 

    } 
    //coin 1 
    coin1x --; 
    if(coin1x <= -100){ 
     coin1x = 1000; coin1y -= 100; 
    } 

    if (coin1y <= 100){ 
     coin1y = 500; 
    } 
    //coin 2 
    coin2x --; 
    if(coin2x <= -100){ 
     coin2x = 1100; coin2y -= 100; 
    } 

    if (coin2y <= 100){ 
     coin2y = 500; 
    } 
    //rect1 
    rect1x --; 

    if(rect1x <= -100){ 
     rect1x = 1000; rect1y -= 100; 
    } 

    if (coin1y <= 100){ 
     rect1y = 425; 
    } 



} 
//ignore 
public int getID(){ 
return 1; 
} 
} 

Любая помощь очень ценится, это мое первое сообщение для StackOverflow, поэтому конструктивная критика очень ценится.

ответ

0

Координаты мыши в Slick2d меняются на противоположные по сравнению с графическими координатами. Например:

Мышь Y будет равна вашей высоте экрана, когда вы находитесь (0,0). Надеюсь, это решит вашу проблему.

Редактировать

При дальнейшем взгляде, я обнаружил, что coin2 в классе Playing не имеет изображения, возложенное на него, так он был сбой из-за NullPointer исключения т.е. вам нужно присвоить изображение, как другие из них.

Вот отредактированный метод обновления, который обновляет координаты мыши (и устанавливает Y координаты в том же формате, как координаты изображения:

public void update(GameContainer gc, StateBasedGame sbg, int delta)throws SlickException{ 
    xpos = Mouse.getX(); 
    // 600 is the Screen height 
    ypos = Math.abs(600-Mouse.getY()); 

    if((xpos >= 0 && xpos <= 127) && (ypos>= 0 && ypos <= 33)){ 
    if(Mouse.isButtonDown(0)){ 
    sbg.enterState(1); 
    } 
    } 

} 
+0

конкретно в каком положении щелканье кнопку «Play», чтобы передать? Если я так думаю, что это решение. – user2867659

+0

Я обновил свой ответ, чтобы включить немного более подробную информацию о получении обновленных координат. Координаты Y по-прежнему инвертированы. – Hayden

+0

поцарапать, что, когда я добавил обновленную часть, все, что было сделано, это переместить координаты, чтобы соответствовать тому, как они должны быть с slick2D, как вы сказали (перевернуто направо?) ну, щелкнув в более новой области, где должна быть кнопка, я получаю такой же крах. – user2867659

Смежные вопросы