Hello all,
I seem to be experiencing a bit of screen tearing – or, at least, that’s what I hope it is.
How does one go about mending this heinous deed?
Level.java:
package com.mizzath.sandbox.level;
import java.util.Random;
import com.mizzath.sandbox.screen.Screen;
import com.mizzath.sandbox.tile.Tile;
public class Level {
public int width, height;
public int xOffset, yOffset;
public int[] tiles;
public Screen screen;
Random random = new Random();
public Level(int width, int height, Screen screen) {
this.width = width;
this.height = height;
this.screen = screen;
tiles = new int[width * height];
for (int i = 0; i < tiles.length; i++) {
tiles[i] = random.nextInt(2);
}
}
public void render(int xOffset, int yOffset) {
int x0 = 0, x1 = 0, y0 = 0, y1 = 0;
int xPixelChange = 0, yPixelChange = 0;
if (yOffset > 0) {
if (yOffset <= 16) {
yPixelChange = -yOffset; // ypos + yPixelChange
y0 = 0;
} else if (yOffset > 16) {
yPixelChange = -(yOffset % 16); // ypos + yPixelChange
y0 = yOffset >> 4;
}
} else if (yOffset < 0) {
if (yOffset >= -16) {
yPixelChange = 16 + yOffset; // ypos - yPixelChange
y0 = -1;
} else if (yOffset < -16) {
yPixelChange = (16 + (yOffset % 16)); // ypos - yPixelChange
y0 = (yOffset - yPixelChange) >> 4;
}
}
int deltaY = yOffset + screen.height;
y1 = deltaY + (16 - (deltaY % 16)) >> 4;
if (xOffset > 0) {
if (xOffset <= 16) {
xPixelChange = 16 - xOffset; // xpos - xPixelChange
x0 = -1;
} else if (xOffset > 16) {
xPixelChange = 16 - (xOffset % 16); // xpos - xPixelChange
x0 = (-xOffset - xPixelChange) >> 4;
}
} else if (xOffset < 0) {
if (xOffset >= -16) {
xPixelChange = xOffset; // xpos + xPixelChange
x0 = 0;
} else if (xOffset < -16) {
xPixelChange = xOffset % 16; // xpos + xPixelChange
x0 = -xOffset >> 4;
}
}
int deltaX = -xOffset + screen.width;
x1 = deltaX + (16 - (deltaX % 16)) >> 4;
for (int y = y0, yTilePos = 0; y < y1; y++, yTilePos++) {
int yAbsPos = yTilePos << 4;
if (yOffset > 0) {
yAbsPos += yPixelChange;
} else if (yOffset < 0){
yAbsPos -= yPixelChange;
}
for (int x = x0, xTilePos = 0; x < x1; x++, xTilePos++) {
int xAbsPos = xTilePos << 4;
if (xOffset > 0) {
xAbsPos -= xPixelChange;
} else if (xOffset < 0) {
xAbsPos += xPixelChange;
}
getTile(x, y).render(xAbsPos, yAbsPos, screen);
}
}
}
public Tile getTile(int x, int y) {
if (x < 0 || y < 0 || x >= width || y >= height) return Tile.nil;
int tile = tiles[x + y * width];
if (tile == 0) {
return Tile.grass;
} else if (tile == 1) {
return Tile.water;
} else {
return Tile.nil;
}
}
}
Screen.java:
package com.mizzath.sandbox.screen;
import com.mizzath.sandbox.tile.Tile;
public class Screen {
public int width, height;
public int[] pixels;
public int xOffset, yOffset;
public Screen(int width, int height) {
this.width = width;
this.height = height;
pixels = new int[width * height];
}
public void wipe() {
for (int i = 0; i < pixels.length; i++) {
pixels[i] = 0xffffff;
}
}
/* Renders a tile.
*
* xp = the starting pixel's x position
* yp = the starting pixel's y position
* xa = the x position of the pixel being rendered
* ya = the y position of the pixel being rendered
* tile = the tile to be rendered
*/
public void renderTile(int xp, int yp, Tile tile) {
for (int y = 0; y < tile.size; y++) {
int ya = y + yp;
if (ya < 0 || ya >= height) continue;
for (int x = 0; x < tile.size; x++) {
int xa = x + xp;
if (xa < 0 || xa >= width) continue;
pixels[xa + ya * width] = tile.colour;
}
}
}
}
Sorry for dumping all of that upon you, and in no way are you required to meander through all of it. However, if you have some spare time, why not rummage though my predicament?
Thanks.
-Miles