我目前正在從事長期的2D遊戲項目。截至目前,我堅持與創造這一個非常惱人的錯誤,只要性格散步:http://www.youtube.com/watch?v=39SMSvqQSEc&feature=youtu.beJava 2D Walk Animation無法正常工作?
這裏是我的spritesheet:
這裏是渲染方法的代碼:
public void render(Screen screen) {
int xTile = 0;
int yTile = 28;
int walkingSpeed = 3;
int flipTop = (numSteps >> walkingSpeed) & 1;
int flipBottom = (numSteps >> walkingSpeed) & 1;
if (movingDir == 1) {
xTile += 2;
}
if (movingDir > 1) {
flipTop = 0;
flipBottom = ((numSteps >> 4) & 1);
if (movingDir == 2) {
flipTop = 1;
}
xTile += 4 + ((numSteps >> 3) & 1) * 2;
}
int modifier = scale;
int xOffset = x - 8;
int yOffset = y - 11;
if(isSwimming){
int waterColor = 0;
yOffset += 4;
if(tickCount % 60 < 15){
yOffset -= 1;
waterColor = Colors.get(-1, -1, 225, -1);
}else if(15 <= tickCount % 60 && tickCount % 60 < 30){
yOffset -= 1;
waterColor = Colors.get(-1, 225, 115, -1);
}else if(30 <= tickCount % 60 && tickCount % 60 < 45){
waterColor = Colors.get(-1, 115, -1, 225);
}else{
yOffset -= 1;
waterColor = Colors.get(-1, 225, 115, -1);
}
screen.render(xOffset, yOffset + 3, 0 + 27 * 32, waterColor, 0x00, 1); // Render right half of player/water ripple
screen.render(xOffset + 8, yOffset + 3, 0 + 27 * 32, waterColor, 0x01, 1); // Render left half of player/water ripple
}
screen.render(xOffset + 8 * flipTop, yOffset + 0, xTile + yTile * 32, color, flipTop, scale);
screen.render(xOffset + 8 - 8 * flipTop, yOffset + 0, xTile + 1 + yTile * 32, color, flipTop, scale);
if (!isSwimming) {
screen.render(xOffset + 8 * flipBottom, yOffset + 8, xTile + (yTile + 1) * 32, color, flipBottom, scale);
screen.render(xOffset + 8 - 8 * flipBottom, yOffset + 8, xTile + 1 + (yTile + 1) * 32, color, flipBottom, scale);
}
}
而且屏幕類:
package ca.fightnight.game.gfx;
public class Screen {
public static final int MAP_WIDTH = 64;
public static final int MAP_WIDTH_MASK = MAP_WIDTH - 1;
public static final byte BIT_MIRROR_X = 0x01;
public static final byte BIT_MIRROR_Y = 0x01;
public int[] pixels;
public int xOffset = 0;
public int yOffset = 0;
public int width;
public int height;
public SpriteSheet sheet;
public Screen(int width, int height, SpriteSheet sheet) {
this.width = width;
this.height = height;
this.sheet = sheet;
pixels = new int[width * height];
}
public void render(int xPos, int yPos, int tile, int color, int mirrorDir, int scale) {
xPos -= xOffset;
yPos -= yOffset;
boolean mirrorX = (mirrorDir & BIT_MIRROR_X) > 0;
boolean mirrorY = (mirrorDir & BIT_MIRROR_Y) > 0;
int scaleMap = scale - 1;
int xTile = tile % 32;
int yTile = tile/32;
int tileOffset = (xTile << 3) + (yTile << 3) * sheet.width;
for (int y = 0; y < 8; y++) {
int ySheet = y;
if (mirrorY)
ySheet = 7 - y;
int yPixel = y + yPos + (y * scaleMap) - ((scaleMap << 3)/2);
for (int x = 0; x < 8; x++) {
int xSheet = x;
if (mirrorX)
xSheet = 7 - x;
int xPixel = x + xPos + (x * scaleMap) - ((scaleMap << 3) /2);
int col = (color >> (sheet.pixels[xSheet + ySheet * sheet.width + tileOffset] * 8)) & 255;
if (col < 255){
for(int yScale = 0; yScale < scale; yScale++){
if (yPixel + yScale < 0 || yPixel + yScale >= height)
continue;
for(int xScale = 0; xScale < scale; xScale++){
if (xPixel + xScale < 0 || xPixel + xScale >= width)
continue;
pixels[(xPixel + xScale) + (yPixel + yScale) * width] = col;
}
}
}
}
}
}
public void setOffset(int xOffset, int yOffset) {
this.xOffset = xOffset;
this.yOffset = yOffset;
}
}
1)*「真正煩人的錯誤,無論何時角色走過時都會產生這個錯誤」*用文字描述它。我看了視頻,但仍不確定你指的是什麼。 2)爲了更快地獲得更好的幫助,請發佈[SSCCE](http://sscce.org/)。 –
這不是一個bug,那是一個gamefeature,fun看起來。 – arynaq