2013-03-02 3 views
1

Итак, у меня есть автомобиль, в котором вы можете ездить в моей игре. Это в основном изображение, которое движется вокруг на фоне, а и поворачивает его, w и s движется вперед и назад. Но я хочу сделать некоторые границы на краях экрана, поэтому он просто не загорается в никуда, но для этого я думаю, что мне нужно получить местоположение x и y изображения. Кто-нибудь знает, как получить этот/знать другой способ сделать границы в Slick2D?Slick2D получить изображение x и y

Спасибо, Марко.

Это код GameplayState:

package myprojects.main; 

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

public class GameplayState extends BasicGameState { 

    int stateID = -1; 
    Image imgBG = null; 
    Image player = null; 
    float scale = 1.0f; 
    Sound ding = null; 
    Sound gamemusic = null; 
    int height; 
    int width; 
    private static int rightSide = 1200; 
    private static int topSide = 800; 
    float startGameScale = 1; 
    float scaleStep = 0.001f; 
    int[] duration = { 200, 200 }; 
    public Car car; 
    // Animation car, driveUp, driveDown, driveRight, driveLeft; 

    boolean hasWon; 

    GameplayState(int stateID) { 
     this.stateID = stateID; 
    } 

    @Override 
    public int getID() { 
     return stateID; 
    } 

    public void init(GameContainer gc, StateBasedGame sbg) 
      throws SlickException { 
     imgBG = new Image("myprojects/main/resources/land.png"); 
     player = new Image("myprojects/main/resources/playercar.png"); 
     ding = new Sound("myprojects/main/resources/ding.wav"); 
     gamemusic = new Sound("myprojects/main/resources/gamemusic.wav"); 
     car = new Car(300,300); 

     /** 
     * Image[] carUp = {new Image("myprojects/main/resources/carUp.png"), 
     * new Image("myprojects/main/resources/carUp.png")}; Image[] carDown = 
     * {new Image("myprojects/main/resources/carDown.png"), new 
     * Image("myprojects/main/resources/carDown.png")}; Image[] carRight = 
     * {new Image("myprojects/main/resources/carRight.png"), new 
     * Image("myprojects/main/resources/carRight.png")}; Image[] carLeft = 
     * {new Image("myprojects/main/resources/carLeft.png"), new 
     * Image("myprojects/main/resources/carLeft.png")}; 
     * 
     * driveUp = new Animation(carUp, duration, false); driveDown = new 
     * Animation(carDown, duration, false); driveRight = new 
     * Animation(carRight, duration, false); driveLeft = new 
     * Animation(carLeft, duration, false); player = driveDown; 
     **/ 

    } 

    public void render(GameContainer gc, StateBasedGame sbg, Graphics g) 
      throws SlickException { 
     imgBG.draw(0, 0); 
     gc.setSoundVolume(0.05f); 
     gamemusic.loop(); 
     g.drawString("Pause Game", 1100, 775); 
     g.drawImage(car.getImage(), car.getX(), car.getY()); 

    } 

    public void update(GameContainer gc, StateBasedGame sbg, int delta) 
      throws SlickException { 
     Input input = gc.getInput(); 
     // Check if outside left border 
     if(car.x < 0) { 
      car.setX(0); 
     } 
     // Check if outside top border 
     if(car.y < 0) { 
      car.setY(0); 
     } 
     // Check if outside right border 
     if(car.x >= gc.getWidth() - car.getWidth()) { 
      car.setX(gc.getWidth() - car.getWidth()); 
     } 
     // Check if outside bottom border 
     if(car.y >= gc.getHeight() - car.getHeight()) { 
      car.setY(gc.getHeight() - car.getHeight()); 
     } 

     int mouseX = input.getMouseX(); 
     int mouseY = input.getMouseY(); 
     boolean hasWon = false; 

     if ((mouseX <= rightSide && mouseX >= rightSide - 100) 
       && (mouseY <= topSide && mouseY >= topSide - 50)) { 
      hasWon = true; 
     } 
     if (hasWon) { 
      if (input.isMouseButtonDown(Input.MOUSE_LEFT_BUTTON)) { 
       sbg.enterState(StarRacingGame.MAINMENUSTATE); 
      } else { 

      } 
     } 

     if (input.isKeyDown(Input.KEY_ESCAPE)) { 
      ding.play(); 
      sbg.enterState(StarRacingGame.MAINMENUSTATE); 
     } 

     if (input.isKeyDown(Input.KEY_A)) { 
      car.rotate(-0.2f * delta); 
     } 

     if (input.isKeyDown(Input.KEY_D)) { 
      car.rotate(0.2f * delta); 
     } 

     if (input.isKeyDown(Input.KEY_S)) { 
      float hip = 0.4f * delta; 

      float rotation = car.getRotation(); 

      car.x -= hip * Math.sin(Math.toRadians(rotation)); 
      car.y += hip * Math.cos(Math.toRadians(rotation)); 

     } 

     if (input.isKeyDown(Input.KEY_W)) { 
      if (input.isKeyDown(Input.KEY_LSHIFT)) { 
       float hip = 1.4f * delta; 
       float rotation = car.getRotation(); 

       car.x += hip * Math.sin(Math.toRadians(rotation)); 
       car.y -= hip * Math.cos(Math.toRadians(rotation)); 
      } else { 
       float hip = 0.4f * delta; 
       float rotation = car.getRotation(); 

       car.x += hip * Math.sin(Math.toRadians(rotation)); 
       car.y -= hip * Math.cos(Math.toRadians(rotation)); 
      } 
     } 

    } 

} 

код автомобиля:

package myprojects.main; 

import org.newdawn.slick.Image; 
import org.newdawn.slick.SlickException; 

public class Car { 
public int x; 
public int y; 
public Image image; 

public Car(int x, int y) throws SlickException{ 
    this.x = x; 
    this.y = y; 
    image = new Image("myprojects/main/resources/playercar.png"); 

} 

public org.newdawn.slick.Image getImage() { 
    return image; 
} 

public int getX() { 
    return x; 
} 

public void setX(int x) { 
    this.x = x; 
} 

public void setY(int y) { 
    this.y = y; 
} 

public int getWidth() { 
    return 100; 
} 

public int getHeight() { 
    return 100; 
} 

public int getY() { 
    return y; 

} 

public void rotate(float f) { 
    image.rotate(f); 
} 

public float getRotation() { 
    return image.getRotation(); 
}} 

ответ

1

Что я хотел бы сделать, это создать класс автомобилей, который имеет изображение. С помощью этого класса вы можете иметь ints, которые содержат значения x и y, представляющие местоположение автомобиля, а также изображение автомобиля. Затем вы просто устанавливаете значения или x и y и поворачиваете изображение так же, как в своем примере, за исключением объекта Car. Вы можете сделать это уже, я не уверен, хотя без кода больше, чем только обработчик ввода. Чтобы сделать это, сделать что-то подобное в рендеринге:

drawImage(car.getImage(), car.getX(), car.getY()); 

Что касается границ, если вы просто не хотите, чтобы ваш автомобиль, чтобы перейти от экрана, вы можете сделать что-то вроде этого:

// Check if outside left border 
if(car.getX() < 0) { 
    car.setX(0); 
} 
// Check if outside top border 
if(car.getY() < 0) { 
    car.setY(0); 
} 
// Check if outside right border 
if(car.getX() >= SCREEN_WIDTH - car.getWidth()) { 
    car.setX(SCREEN_WIDTH - car.getWidth()); 
} 
// Check if outside bottom border 
if(car.getY() >= SCREEN_HEIGHT - car.getHeight()) { 
    car.setY(SCREEN_HEIGHT - car.getHeight()); 
} 

В этом контексте ширина и высота получают ширину и высоту изображения, которое вы используете для автомобиля, а SCREEN_HEIGHT и SCREEN_WIDTH - это константы, которые удерживают ширину и высоту экрана. Возможно, вам придется немного настроить мелодию в зависимости от того, как работает ваша игра.

public Class Car { 
private int x; 
private int y; 
private Image image; 

public Car(int x, int y) { 
    this.x = x; 
    this.y = y; 
    image = new Image("location/car.png"); 
} 

public int getX() { 
    return x; 
} 

public void setX(int x) { 
    this.x = x; 
} 

public int getY() { 
    return y; 
} 

public void setY(int y) { 
    this.y = y; 
} 
+0

Итак, какой класс автомобиля будет выглядеть ... Я довольно новичок в кодировании, поэтому я действительно не понимаю, как его реализовать. Должен ли я отображать его в GameplayState или в самом классе Car? Ill опубликуйте мой полный источник GameplayState в верхней записи. – Masy

+0

Я думаю, что я знаю, что вы имеете в виду сейчас ... Но getX и getY нельзя использовать для пятнистых изображений. – Masy

+0

Я отредактировал мой комментарий с примера Car class (Мой пример не имеет методов, но я предполагаю базовые getter/seters). В основном вы создаете объект автомобиля в методе init и в своем методе обновления, который вы задаете, и переменные x и y на основе ввода, который вы получаете. Например, когда вы нажимаете A, вы делаете что-то вроде этого: car.rotate (-0.2f * delta), где rotate - это метод в классе Car, который просто вызывает image.rotate(). Вы также устанавливаете x и y таким же образом, когда вы нажимаете W и S. Затем в методе визуализации вы должны вызвать g.drawImage (car.getImage(), car.getX(), car.getY()); Надеюсь, это поможет. – Mitch

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