2015-01-30 3 views
0

Итак, по мере того как заголовок читается, я пытаюсь добавить смещения в свою java-игру. Я получил отзыв от друга, что мне нужно минус смещение от того, где я рисую плитки на моем экране.Добавление смещений в мою Java-игру

Итак, я создал случайный генератор мира и сделал смещение, но у меня возникла проблема.

Мой код:

public void generateMap(Graphics g) { 

     block = seed.nextInt(2); 

     //Render Dirt 
     if(block == 0) { 
      g.drawImage(Assets.dirt, x - GameState.xOffset, y - GameState.yOffset, null); 

      x += 32; 
     } 

     //Render Grass 
     if(block == 1) { 
      g.drawImage(Assets.grass, x - GameState.xOffset, y - GameState.yOffset, null); 

      x += 32; 
     } 

     //Check Where the X is 
     if(x > xFinish) { 
      if(y < yFinish) { 
       x = xStart; 
       y += 32; 
      } 
     } 
    } 

выглядит достаточно просто правильно? после того, как я делаю это создать код, чтобы добавить один к смещению каждой петле времени I вокруг:

public void tick() { 
    xOffset += 1; 
    } 

Так после того, как это будет сделано, я бегу, но она делает это:

example of issue

есть любой простой способ я могу исправить это, чтобы показалось, что экран «прокручивает» влево?

+0

У вас есть информация (имя будет хорошим) об API, используемом вами для таких типов, как 'Assets',' GameState'?Кроме того, что именно вы пытаетесь достичь - эффект прокрутки независимо от того, что еще происходит? Что-то другое? – jdphenix

+0

Нет ничего, что можно сказать, Активы просто хранят изображения bufferedimage, поэтому мне не нужно их загружать каждый раз. И класс GameState имеет метод tick и вызывает метод generateMap около 60 раз в секунду. И я пытаюсь ориентироваться вокруг своей карты и все еще держать игрока в одном месте, надеюсь, что это имеет смысл. – FireRaven

+0

Не прокрутка или прокрутка, а создание эффекта на скриншоте? – jdphenix

ответ

0

Есть ли простой способ, которым я могу это исправить ...

Вероятно, нет. Игры сложны. Не позволяйте этому отговаривать вас.

Вы генерируете свой игровой мир и рисуете одни и те же методы - вы не хотите этого делать. Separation of responsibility очень важно - вы не хотите, чтобы целая куча кода в одном месте делала то же самое. В этом случае необходимо разделить функциональность генерации мира и код чертежа.

Для создания мира создайте игровой мир один раз и сохраните его в хранилище, используя любой формат, который вам нравится. Держите это подальше от кода чертежа - там не место.

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

class Block { 
    public BlockType getType() { 
     return type; 
    } 

    public int getxPosition() { 
     return xPosition; 
    } 

    public int getyPosition() { 
     return yPosition; 
    } 

    // hashCode(), equals(), etc omitted, they should be implemented 

    public static enum BlockType { 
     Dirt(Assets.dirt), 
     Grass(Assets.grass); 

     private final BufferedImage image; 

     BlockType(BufferedImage image) { 
      this.image = image; 
     } 

     public BufferedImage getImage() { 
      return image; 
     } 
    } 

    private final BlockType type; 
    private final int xPosition; 
    private final int yPosition; 

    private Block(BlockType type, int xPosition, int yPosition) { 
     this.type = type; 
     this.xPosition = xPosition; 
     this.yPosition = yPosition; 
    } 

    public static Block getInstance(BlockType type, int xPosition, int yPosition) { 
     return new Block(type, xPosition, yPosition); 
    } 
} 

Вы можете использовать Block.getInstance() для генерации карты раз, как это:

class GameState { 
    private final int WORLD_SIZE = 1024; 
    private Block[][] _world = new Block[WORLD_SIZE][WORLD_SIZE]; 
    private static Random seed = new Random(); 

    public void generateMap() { 
     int blockTypeLength = Block.BlockType.values().length; 
     for (int x = 0; x < WORLD_SIZE; x++) { 
      for (int y = 0; y < WORLD_SIZE; y++) { 
       int blockType = seed.nextInt(blockTypeLength); 
       _world[x][y] = Block.getInstance(Block.BlockType.values()[blockType], x, y); 
      } 
     } 
    } 

    public Block[][] getMap() { 
     return _world; // not thread safe, shares internal state, all the usual warnings 
    } 

Это, очевидно, ISN» t единственный способ создать мир - вы, вероятно, создадите мир и сохраните, а затем загрузите с диска в более поздние игры (если только это не была короткая игра - я не знаю, это ваш звонок).

Как только вы выяснили мир, вы перейдете к другому модулю, который будет обрабатывать чертеж. Предположим, GameState имеет два поля playerX и playerY, которые представляют координаты игрока в игровом мире (примечание: прямые поля, как это плохо практика, но используется для упрощения этого примера):

public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Block[][] screen = new Block[16][16]; // declare a screen buffer to draw 
    // Assumes player is in the center of the screen 
    int screenRadiusX = GameFrame.Assets.SCREENBOUNDS_X/2/blockSize; 
    int screenRadiusY = GameFrame.Assets.SCREENBOUNDS_Y/2/blockSize; 
    for (int x = state.playerX - 8, xS = 0; x < state.playerX + 8; x++, xS++) { 
     for (int y = state.playerY - 8, yS = 0; y < state.playerY + 8; y++, yS++) { 
      screen[xS][yS] = world[x][y]; 
     } 
    } 

    for (int x = 0; x < screen.length; x++) { 
     for (int y = 0; y < screen.length; y++) { 
      Block current = screen[x][y]; 
      g.drawImage(current.getType().getImage(), 
        x * blockSize, // blockSize is the pixel dimension of 
        y * blockSize, 
        null 
      ); 
     } 
    } 
} 

Если это помогает, то это здорово! Я рад, что смог помочь. Если нет, или если некоторые идеи до сих пор не ясны, я бы подумал, что, возможно, прохожу через учебник или книгу, в которой вы можете провести игру. Не забудьте изучить платформу, которую вы кодируете во время такого процесса.

+0

Это помогает. :) Спасибо – FireRaven

+0

У меня только одна последняя проблема, ЕСЛИ я хотел сделать infinate поколение мира (с кусками, как в игре minecraft), как бы я это сделал? Потому что в вашем коде он генерирует мир один раз, и это он. – FireRaven

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