Initial commit.
This commit is contained in:
103
src/dk/itu/mario/engine/BgRenderer.java
Normal file
103
src/dk/itu/mario/engine/BgRenderer.java
Normal file
@@ -0,0 +1,103 @@
|
||||
package dk.itu.mario.engine;
|
||||
|
||||
import java.awt.*;
|
||||
import java.util.Random;
|
||||
|
||||
|
||||
import dk.itu.mario.level.Level;
|
||||
|
||||
|
||||
public class BgRenderer
|
||||
{
|
||||
private int xCam;
|
||||
private int yCam;
|
||||
private Image image;
|
||||
private Graphics2D g;
|
||||
private static final Color transparent = new Color(0, 0, 0, 0);
|
||||
private Level level;
|
||||
|
||||
private Random random = new Random();
|
||||
public boolean renderBehaviors = false;
|
||||
|
||||
private int width;
|
||||
private int height;
|
||||
private int distance;
|
||||
|
||||
public BgRenderer(Level level, GraphicsConfiguration graphicsConfiguration, int width, int height, int distance)
|
||||
{
|
||||
this.distance = distance;
|
||||
this.width = width;
|
||||
this.height = height;
|
||||
|
||||
this.level = level;
|
||||
image = graphicsConfiguration.createCompatibleImage(width, height, Transparency.BITMASK);
|
||||
g = (Graphics2D) image.getGraphics();
|
||||
g.setComposite(AlphaComposite.Src);
|
||||
|
||||
updateArea(0, 0, width, height);
|
||||
}
|
||||
|
||||
public void setCam(int xCam, int yCam)
|
||||
{
|
||||
xCam /= distance;
|
||||
yCam /= distance;
|
||||
int xCamD = this.xCam - xCam;
|
||||
int yCamD = this.yCam - yCam;
|
||||
this.xCam = xCam;
|
||||
this.yCam = yCam;
|
||||
|
||||
g.setComposite(AlphaComposite.Src);
|
||||
g.copyArea(0, 0, width, height, xCamD, yCamD);
|
||||
|
||||
if (xCamD < 0)
|
||||
{
|
||||
if (xCamD < -width) xCamD = -width;
|
||||
updateArea(width + xCamD, 0, -xCamD, height);
|
||||
}
|
||||
else if (xCamD > 0)
|
||||
{
|
||||
if (xCamD > width) xCamD = width;
|
||||
updateArea(0, 0, xCamD, height);
|
||||
}
|
||||
|
||||
if (yCamD < 0)
|
||||
{
|
||||
if (yCamD < -width) yCamD = -width;
|
||||
updateArea(0, height + yCamD, width, -yCamD);
|
||||
}
|
||||
else if (yCamD > 0)
|
||||
{
|
||||
if (yCamD > width) yCamD = width;
|
||||
updateArea(0, 0, width, yCamD);
|
||||
}
|
||||
}
|
||||
|
||||
private void updateArea(int x0, int y0, int w, int h)
|
||||
{
|
||||
g.setBackground(transparent);
|
||||
g.clearRect(x0, y0, w, h);
|
||||
int xTileStart = (x0 + xCam) / 32;
|
||||
int yTileStart = (y0 + yCam) / 32;
|
||||
int xTileEnd = (x0 + xCam + w) / 32;
|
||||
int yTileEnd = (y0 + yCam + h) / 32;
|
||||
for (int x = xTileStart; x <= xTileEnd; x++)
|
||||
{
|
||||
for (int y = yTileStart; y <= yTileEnd; y++)
|
||||
{
|
||||
int b = level.getBlock(x, y) & 0xff;
|
||||
g.drawImage(Art.bg[b % 8][b / 8], (x << 5) - xCam, (y << 5) - yCam-16, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void render(Graphics g, int tick, float alpha)
|
||||
{
|
||||
g.drawImage(image, 0, 0, null);
|
||||
}
|
||||
|
||||
public void setLevel(Level level)
|
||||
{
|
||||
this.level = level;
|
||||
updateArea(0, 0, width, height);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user