package Sprites; import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; import java.awt.image.BufferedImage; import java.io.IOException; import java.net.URL; public abstract class Sprite { protected BufferedImage bImage; protected int imageWidth, imageHeight; // image dimensions protected URL imagePath; protected int locX, locY; protected int acceleration; protected int pWidth, pHeight; // panel's dimensions protected int sWidth, sHeight; protected double angle; public Sprite(int x, int y, int w, int h, int acc, String imgName, double angle, int sWidth, int sHeight) { this.imagePath = getClass().getResource("/Images/"+imgName); this.sWidth = sWidth; this.sHeight = sHeight; locX = x; locY = y; acceleration = acc; pWidth = w; pHeight = h; this.angle = angle; //load image from source files try { bImage = ImageIO.read(imagePath); }catch (IOException pin){ pin.printStackTrace(); bImage = null; } setImageDimensions(); } /* * resizes image to a set size */ protected void setImageDimensions() { Image tmp = bImage.getScaledInstance(sWidth, sHeight, Image.SCALE_SMOOTH); BufferedImage bi = new BufferedImage(sWidth, sHeight, BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = bi.createGraphics(); g2d.drawImage(tmp,0,0,null); g2d.dispose(); bImage = bi; } /** * Abstract method to update sprite. */ public abstract void update(); /** * returns sprite x position * @return * double */ public double getLocX() {return locX;} /** * returns sprite y position * @return * double */ public double getLocY() {return locY;} public int getSWidth() {return sWidth;} public int getsHeight() {return sHeight;} /** * returns sprite acceleration * @return * int */ public int getAcceleration() {return acceleration;} /** * returns sprite size * @return * int */ public BufferedImage getbImage() {return bImage;} /** * returns image width * @return * int */ public int getImageWidth() {return imageWidth;} /** * returns image height * @return * int */ public int getImageHeight() {return imageHeight;} /** * returns sprite angle * @return * double */ public double getAngle() {return angle;} /** * returns shape location and dimensions as a Rectangle. * @return * Rectangle */ public Rectangle getBounds() { return new Rectangle((int)locX, (int)locY, sWidth, sHeight); } /** * its not a bug it's a feature. actually it just moves a shape that goes beyond the screen to the other side. */ protected void outOfScreeFix(){ if(locX < 0 - sWidth) locX = pWidth; else if (locX > pWidth+sWidth) locX = 0-sWidth; if(locY < 0 - sHeight) locY = pHeight; else if(locY > pHeight+sHeight) locY = 0-sHeight ; } /** * abstract method for drawing sprite. * @param g * @param p */ public void drawSprite(Graphics g, JPanel p){ Graphics2D g2d = (Graphics2D)g; g2d.rotate(Math.toRadians(angle), locX + (bImage.getWidth()/2), locY + (bImage.getHeight()/2)); g.drawImage(bImage, locX, locY, p); g2d.rotate(-1*Math.toRadians(angle), locX + (bImage.getWidth()/2), locY + (bImage.getHeight()/2)); } }