2013-08-22 38 views
2

我目前正在从事长期的2D游戏项目。截至目前,我坚持与创造这一个非常恼人的错误,只要性格散步:http://www.youtube.com/watch?v=39SMSvqQSEc&feature=youtu.beJava 2D Walk Animation无法正常工作?

这里是我的spritesheet:

Sprite Sheet

这里是渲染方法的代码:

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; 
    } 
} 
+0

1)*“真正烦人的错误,无论何时角色走过时都会产生这个错误”*用文字描述它。我看了视频,但仍不确定你指的是什么。 2)为了更快地获得更好的帮助,请发布[SSCCE](http://sscce.org/)。 –

+0

这不是一个bug,那是一个gamefeature,fun看起来。 – arynaq

回答

0

首先,那个视频让我的一天。其次为什么不尝试使用整个角色身体为每个精灵,所以当试图动画时没有混淆。使用spritesheet中的2个图像创建一个行走动画。向右走时,角色面向右侧,左脚向前,右脚向右,然后向右走,重复此过程。

+0

感谢您的帮助,但我得到它的工作:) public static final byte BIT_MIRROR_Y = 0x01;应该是0x02。感谢您的帮助! –