2013-08-22 65 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。感謝您的幫助! –