Есть ли простой способ, которым я могу это исправить ...
Вероятно, нет. Игры сложны. Не позволяйте этому отговаривать вас.
Вы генерируете свой игровой мир и рисуете одни и те же методы - вы не хотите этого делать. 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
);
}
}
}
Если это помогает, то это здорово! Я рад, что смог помочь. Если нет, или если некоторые идеи до сих пор не ясны, я бы подумал, что, возможно, прохожу через учебник или книгу, в которой вы можете провести игру. Не забудьте изучить платформу, которую вы кодируете во время такого процесса.
У вас есть информация (имя будет хорошим) об API, используемом вами для таких типов, как 'Assets',' GameState'?Кроме того, что именно вы пытаетесь достичь - эффект прокрутки независимо от того, что еще происходит? Что-то другое? – jdphenix
Нет ничего, что можно сказать, Активы просто хранят изображения bufferedimage, поэтому мне не нужно их загружать каждый раз. И класс GameState имеет метод tick и вызывает метод generateMap около 60 раз в секунду. И я пытаюсь ориентироваться вокруг своей карты и все еще держать игрока в одном месте, надеюсь, что это имеет смысл. – FireRaven
Не прокрутка или прокрутка, а создание эффекта на скриншоте? – jdphenix