From d79d73fc9ee80fa011e17f5168a5d42f94dcaaa3 Mon Sep 17 00:00:00 2001 From: jancoow Date: Sun, 7 Jun 2015 23:46:43 +0200 Subject: [PATCH] A lot of improvements for the RPI. Uses images cached on the gpu. --- image/Images.java | 23 +++++++++++++++++++++++ model/gameState/GameState.java | 2 +- model/gameState/MenuState.java | 8 +++++--- model/gameState/TitleState.java | 13 +++++++++---- model/objects/InfoPanel.java | 11 ++++++----- model/objects/MenuButton.java | 23 +++++++++++++++-------- model/objects/PlayArea.java | 10 +++++++--- 7 files changed, 66 insertions(+), 24 deletions(-) diff --git a/image/Images.java b/image/Images.java index c6e872d..f906f70 100644 --- a/image/Images.java +++ b/image/Images.java @@ -2,8 +2,11 @@ package image; import java.awt.Graphics2D; import java.awt.GraphicsConfiguration; +import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; +import java.awt.Transparency; import java.awt.image.BufferedImage; +import java.awt.image.VolatileImage; import java.io.File; import java.io.IOException; import java.util.ArrayList; @@ -78,6 +81,26 @@ public class Images { g2d.dispose(); // return the new optimized image + new_image.setAccelerationPriority(1); + new_image.flush(); return new_image; } + + public static BufferedImage initBufferedImage(int width, int height){ + GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment(); + GraphicsDevice device = env.getDefaultScreenDevice(); + GraphicsConfiguration config = device.getDefaultConfiguration(); + return config.createCompatibleImage(width, height, Transparency.TRANSLUCENT); + } + + public static VolatileImage initVolatileImage(int width, int height, int opc){ + GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); + GraphicsConfiguration gc = ge.getDefaultScreenDevice().getDefaultConfiguration(); + VolatileImage image = null; + image = gc.createCompatibleVolatileImage(width, height, opc); + int valid = image.validate(gc); + if (valid == VolatileImage.IMAGE_INCOMPATIBLE) + image = initVolatileImage(width, height, opc); + return image; + } } diff --git a/model/gameState/GameState.java b/model/gameState/GameState.java index ab201b6..75e9e2c 100644 --- a/model/gameState/GameState.java +++ b/model/gameState/GameState.java @@ -19,7 +19,7 @@ public abstract class GameState { public abstract void init(); public abstract void update(float factor); - public abstract void draw(Graphics2D g2); + public abstract void draw(Graphics2D g2); public abstract void buttonPressed(ButtonEvent e); public abstract void buttonReleased(ButtonEvent e); public abstract void onJoystickMoved(JoystickEvent e); diff --git a/model/gameState/MenuState.java b/model/gameState/MenuState.java index 1b32cb9..cb1beae 100644 --- a/model/gameState/MenuState.java +++ b/model/gameState/MenuState.java @@ -9,7 +9,9 @@ import java.awt.GradientPaint; import java.awt.Graphics2D; import java.awt.Polygon; import java.awt.RenderingHints; +import java.awt.Transparency; import java.awt.image.BufferedImage; +import java.awt.image.VolatileImage; import java.util.ArrayList; import java.util.List; @@ -34,7 +36,7 @@ public class MenuState extends GameState { private int animationcounter; private boolean subscreen, startanimation; - private BufferedImage mainScreenBackground; + private VolatileImage mainScreenBackground; int yPosDiffButton = 900; private int difSelect=0; @@ -195,7 +197,7 @@ public class MenuState extends GameState { } public void generateMainScreenBackground(){ - mainScreenBackground = new BufferedImage(1280, 1024, BufferedImage.TYPE_4BYTE_ABGR); + mainScreenBackground = Images.initVolatileImage(1280, 1024, Transparency.OPAQUE); Graphics2D g2 = mainScreenBackground.createGraphics(); RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setRenderingHints(rh); @@ -220,8 +222,8 @@ public class MenuState extends GameState { g2.setColor(Color.BLACK); g2.drawString("Main Menu", 30, 60); + g2.dispose(); mainScreenBackground.createGraphics(); - mainScreenBackground = Images.toCompatibleImage(mainScreenBackground); } public void buttonInAnimation(int button){ diff --git a/model/gameState/TitleState.java b/model/gameState/TitleState.java index 134a9fc..3f07865 100644 --- a/model/gameState/TitleState.java +++ b/model/gameState/TitleState.java @@ -7,8 +7,13 @@ import java.awt.Color; import java.awt.Font; import java.awt.GradientPaint; import java.awt.Graphics2D; +import java.awt.GraphicsConfiguration; +import java.awt.GraphicsDevice; +import java.awt.GraphicsEnvironment; import java.awt.RenderingHints; +import java.awt.Transparency; import java.awt.image.BufferedImage; +import java.awt.image.VolatileImage; import model.SongHandler; import control.GameStateManager; @@ -20,7 +25,7 @@ public class TitleState extends GameState { BufferedImage pressStart = Images.getImage(ImageType.pressstart); BufferedImage colorStrike = Images.getImage(ImageType.colorstrike); - BufferedImage background; + VolatileImage background; Font textFont = new Font("OCR A Extended", Font.BOLD, 15); Font textFont2 = new Font("OCR A Extended", Font.BOLD, 130); GradientPaint gp = new GradientPaint(300, 0, new Color(0,0,1, 0.6f),980,1024 ,new Color(0,0,1, 0.2f)); @@ -48,7 +53,7 @@ public class TitleState extends GameState { public void draw(Graphics2D g2) { g2.drawImage(background, 0, 0, 1280, 1024, null); int image_x = ((frame / 6) % 6) * 49; - g2.drawImage(pressStart.getSubimage(image_x, 0, 49, 26), 640-122, 512, 245, 130, null); + g2.drawImage(pressStart.getSubimage(image_x, 0, 49, 26), 640-122, 512, 245, 130, null); } @Override @@ -71,7 +76,7 @@ public class TitleState extends GameState { } public void createBackground(){ - background = new BufferedImage(1280, 1024, BufferedImage.TYPE_4BYTE_ABGR); + background = Images.initVolatileImage(1280, 1024, Transparency.OPAQUE); Graphics2D g2 = background.createGraphics(); RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setRenderingHints(rh); @@ -101,8 +106,8 @@ public class TitleState extends GameState { g2.setFont(textFont2); g2.drawString("Color", 385, 212); g2.drawString("Strike", 390, 342); + g2.dispose(); background.createGraphics(); - background = Images.toCompatibleImage(background); } } diff --git a/model/objects/InfoPanel.java b/model/objects/InfoPanel.java index a8a7329..86310fd 100644 --- a/model/objects/InfoPanel.java +++ b/model/objects/InfoPanel.java @@ -6,7 +6,8 @@ import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.RenderingHints; -import java.awt.image.BufferedImage; +import java.awt.Transparency; +import java.awt.image.VolatileImage; import model.gameState.PlayState; @@ -16,7 +17,7 @@ public class InfoPanel { private int lifePercent; private int upgradeScore = 0; private int x, y; - private BufferedImage infoPanel; + private VolatileImage infoPanel; public InfoPanel(int x, int y){ this.x = x; @@ -40,7 +41,7 @@ public class InfoPanel { } private void generateInfoPanel(){ - infoPanel = new BufferedImage(1280, 1024, BufferedImage.TYPE_INT_ARGB); + infoPanel = Images.initVolatileImage(256, 1024, Transparency.OPAQUE); Graphics2D g2 = infoPanel.createGraphics(); RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setRenderingHints(rh); @@ -57,11 +58,11 @@ public class InfoPanel { g2.setColor(Color.YELLOW); g2.fillRect(25, 1000 - 7 * upgradeScore, 200, 0 + 7 * upgradeScore); + g2.dispose(); infoPanel.createGraphics(); - infoPanel = Images.toCompatibleImage(infoPanel); } public void draw(Graphics2D g2){ - g2.drawImage(infoPanel, 0, 0, 1280,1024,null); + g2.drawImage(infoPanel, 0, 0, 256,1024,null); } } diff --git a/model/objects/MenuButton.java b/model/objects/MenuButton.java index 3852eb0..77e7af0 100644 --- a/model/objects/MenuButton.java +++ b/model/objects/MenuButton.java @@ -1,16 +1,20 @@ package model.objects; +import image.Images; + +import java.awt.AlphaComposite; import java.awt.BasicStroke; import java.awt.Color; +import java.awt.Composite; import java.awt.Font; import java.awt.Graphics2D; import java.awt.LinearGradientPaint; import java.awt.Paint; import java.awt.RenderingHints; +import java.awt.Transparency; import java.awt.geom.GeneralPath; import java.awt.geom.Point2D; -import java.awt.image.BufferedImage; -import java.util.ArrayList; +import java.awt.image.VolatileImage; import audio.Song; @@ -21,7 +25,7 @@ public class MenuButton { private Color buttoncolor; private boolean selected; - private BufferedImage background; + private VolatileImage background; private Song song; @@ -32,7 +36,6 @@ public class MenuButton { this.rounding = rounding; this.buttoncolor = c0; setSong(song); - calculateButton(); } public void calculateButton(){ @@ -52,10 +55,13 @@ public class MenuButton { new float[]{0.0f, 1.0f}, new Color[]{new Color(c1.getRed(), c1.getGreen(), c1.getBlue(), 10), buttoncolor}); //Draw the generated button to the buffered image - background = new BufferedImage(1280, 1024, BufferedImage.TYPE_4BYTE_ABGR); + background = Images.initVolatileImage(1280, 500, Transparency.TRANSLUCENT); Graphics2D g2d = background.createGraphics(); RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setRenderingHints(rh); + g2d.setComposite(AlphaComposite.DstOut); + g2d.fillRect(0, 0, background.getWidth(), background.getHeight()); + g2d.setComposite(AlphaComposite.SrcOver); g2d.setColor(c2); g2d.fill(arrayToGeneralpath(new int[][]{{449, 1}, {449, 68},{113, 103}, {106, 35}})); @@ -84,8 +90,8 @@ public class MenuButton { g2d.translate((160+358)*scalefactor, (74)*scalefactor); g2d.rotate(-0.1); g2d.drawString(song.getTitle(), 0, 0); - - background.createGraphics(); + g2d.dispose(); + background.createGraphics(); } public GeneralPath arrayToGeneralpath(int block[][]){ @@ -99,7 +105,7 @@ public class MenuButton { } public void draw(Graphics2D g2d){ - g2d.drawImage(background, (int)((x-320)*scalefactor), (int) ((y)*scalefactor), 1280, 1024, null); + g2d.drawImage(background, (int)((x-320)*scalefactor), (int) ((y)*scalefactor), 1280, 500, null); } public void update(){ @@ -130,5 +136,6 @@ public class MenuButton { public void setSong(Song song) { this.song = song; + calculateButton(); } } diff --git a/model/objects/PlayArea.java b/model/objects/PlayArea.java index 2ace225..810c97e 100644 --- a/model/objects/PlayArea.java +++ b/model/objects/PlayArea.java @@ -6,10 +6,12 @@ import java.awt.Color; import java.awt.Graphics2D; import java.awt.Polygon; import java.awt.RenderingHints; +import java.awt.Transparency; import java.awt.geom.Line2D; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; +import java.awt.image.VolatileImage; import java.util.ArrayList; import java.util.List; @@ -21,7 +23,7 @@ public class PlayArea { public List paths; private Polygon octagon,hitArea; public Rectangle2D[] hitAreas; //de area voor elk path die de enemy moet raken - private BufferedImage background; + private VolatileImage background; public PlayArea(double xToRight,double heightOfGameScreen,double widthOfGameScreen, int sizeOctagon) { super(); @@ -96,7 +98,9 @@ public class PlayArea { paths.add(new Path(hitArea.xpoints[4] - Enemy.distanceToOctagon,hitArea.ypoints[4] ,hitArea.xpoints[4],hitArea.ypoints[4]));//left paths.add(new Path(hitArea.xpoints[5] - angleX,hitArea.ypoints[5] - angleY ,hitArea.xpoints[5],hitArea.ypoints[5]));//left -top - background = new BufferedImage(1280, 1024, BufferedImage.TYPE_INT_ARGB); + + //drawing into buffer + background = Images.initVolatileImage(1280,1024, Transparency.BITMASK); Graphics2D g2 = background.createGraphics(); RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setRenderingHints(rh); @@ -110,8 +114,8 @@ public class PlayArea { } g2.draw(octagon); g2.draw(hitArea); + g2.dispose(); background.createGraphics(); - background = Images.toCompatibleImage(background); } public void draw(Graphics2D g2){