Я работаю над изометрической 2D-игрой на Java и заметил, что на экране есть сетка из линий, где рендеринг, кажется, повторяет пиксель по горизонтали и вертикали. Вот скриншот, чтобы показать, что я имею в виду:

Я проверил цикл в своем методе Render и сравнил значение цвета каждого пикселя с предыдущим значением в массиве, чтобы увидеть, есть ли в строке два черных пикселя, и таких случаев не обнаружено. Я в недоумении, что может быть причиной такого эффекта. Что я могу сделать, чтобы исправить это? Вот соответствующий код:
Переменные класса игры:
private BufferedImage m_imgImage = new BufferedImage( intCANVAS_WIDTH, intCANVAS_HEIGHT, BufferedImage.TYPE_INT_RGB );
private int[ ] m_aintPixels = ( ( DataBufferInt ) m_imgImage.getRaster( ).getDataBuffer( ) ).getData( );
Метод рендеринга игрового класса:
// Object to organize data on the canvas
BufferStrategy bfsBufferStrategy = getBufferStrategy( );
if( bfsBufferStrategy == null )
{
createBufferStrategy( 3 );
return;
}
for( int intY = 0; intY < intCANVAS_HEIGHT; intY += 1 )
{
for( int intX = 0; intX < intCANVAS_WIDTH; intX += 1 )
{
m_aintPixels[ intX + ( intY * intCANVAS_WIDTH ) ] = m_Screen.m_aintPixels[ intX + ( intY * m_Screen.m_intWidth ) ];
}
}
Graphics gfxGraphics = bfsBufferStrategy.getDrawGraphics( );
gfxGraphics.drawImage( m_imgImage, 0, 0, getWidth( ), getHeight( ), null );
gfxGraphics.dispose( );
bfsBufferStrategy.show( );
Метод Render класса экрана для заполнения массива пикселей:
// Render a tile with the specified tile ID
public void RenderTile( int intPositionX, int intPositionY, CSpriteSheet SpriteSheet, int intTileID )
{
int intPixelIndex = 0;
int intSheetX = 0;
int intSheetY = 0;
int intTileOffsetX = 0;
int intTileOffsetY = 0;
int intPixelColor = 0;
// Center the Tile
intPositionX -= m_intOffsetX;
intPositionY -= m_intOffsetY;
intSheetX = ( intTileID % SpriteSheet.m_intTileColumns ) * CTile.TILE_WIDTH;
intSheetY = ( intTileID / SpriteSheet.m_intTileRows ) * CTile.TILE_HEIGHT;
intPixelIndex = intPositionX + ( intPositionY * m_intWidth );
// Rows
for( int intTileRow = intSheetY; intTileRow != ( intSheetY + CTile.TILE_HEIGHT ); intTileRow += 1 )
{
// Columns
for( int intTileColumn = intSheetX; intTileColumn != ( intSheetX + CTile.TILE_WIDTH ); intTileColumn += 1 )
{
intPixelColor = SpriteSheet.m_aintPixels[ intTileColumn + ( intTileRow * m_SpriteSheet.m_intWidth ) ];
// Boundary checking
if( intPositionX + intTileOffsetX >= 0 && intPositionX + intTileOffsetX < m_intWidth &&
intPositionY + intTileOffsetY >= 0 && intPositionY + intTileOffsetY < m_intHeight &&
CColor.Transparent( intPixelColor ) == false )
{
m_aintPixels[ intPixelIndex ] = SpriteSheet.m_aintPixels[ intTileColumn + ( intTileRow * m_SpriteSheet.m_intWidth ) ];
}
// Increment
intTileOffsetX += 1;
intPixelIndex += 1;
}
// Increment
intTileOffsetY += 1;
intPixelIndex += m_intWidth - ( CTile.TILE_WIDTH );
intTileOffsetX = 0;
}
}