⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 images.java

📁 BravePiglet.rar 勇敢的猪Java游戏 由本人原创
💻 JAVA
字号:
package com.lovo.pig.util;

import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Toolkit;
import java.awt.image.CropImageFilter;
import java.awt.image.FilteredImageSource;
import java.net.URL;

import javax.swing.JFrame;

public class Images extends JFrame {
	private static final long serialVersionUID = 1L;
	
	private Image imgLogo;//Logo图
	private Image imgBackground;//背景图
    private Image imgAward;//随机从上面往下掉的奖励物品
	private Image imgUmbrella;//承载奖励物品的伞
	private Image imgCord;//绳子
	private Image imgBullet;//子弹
    private Image[] imgPigs;//猪图片
	private Image[] imgWolves;//狼
	private Image[] imgGears;//轮子图片
	private Image[] imgCrow;//乌鸦图片
	private Image[] imgHitWolf;//子弹击中狼的图片
	private Image[] imgBalloons;//所有气球图片
	private Image imgMenuStage;//菜单界面背景图
	private Image[] imgMenu;//菜单组图
	private Image imgHelp;//帮助界面图形
	private Image imgTopScore;//排行榜背景
	private Image imgOptionBk;//设置窗口装饰图

	private MediaTracker mt;
	private Toolkit tk = this.getToolkit();
	
	/**
	 * 单例模式
	 */
	private static Images images = null;
	private Images() {
		mt = new MediaTracker(this);
	    loadImage();
	}
	public static synchronized Images getImages()
	{
		if(images == null)
		{
			images  = new Images();
		}
		return images;
	}
	
	/**
	 * 加载图片
	 */
	private void loadImage(){
		imgLogo = tk.getImage(getURL("logo.png"));//Logo
		imgBackground = tk.getImage(getURL("background.jpg"));//背景
		imgAward = tk.getImage(getURL("award.gif"));//奖励
		imgUmbrella = tk.getImage(getURL("umbrella.gif"));//伞
		imgCord = tk.getImage(getURL("cord.jpg"));//绳子
		imgBullet = tk.getImage(getURL("bullet.gif"));//子弹
		imgMenuStage = tk.getImage(getURL("menustage.jpg"));//菜单界面背景
		imgHelp = tk.getImage(getURL("helppig.jpg"));//帮助
		imgTopScore = tk.getImage(getURL("topscore.jpg"));//排行榜背景
		imgOptionBk = tk.getImage(getURL("optionbk.gif"));//设置窗口装饰图
		
		//未切割的猪图片
		Image imgPigRaw = tk.getImage(getURL("pig.gif"));
		//未切割的狼图片
		Image imgWolvesRaw =  tk.getImage(getURL("wolf.gif"));
		//未切割的轮子图片
		Image imgGearRaw = tk.getImage(getURL("gear.gif"));
		//未切割的乌鸦图片
		Image imgCrowRawRight  = tk.getImage(getURL("crowright.png"));
		Image imgCrowRawLeft = tk.getImage(getURL("crowleft.png"));
		Image imgCrowRawHitted = tk.getImage(getURL("crowhit.png"));
		//子弹击中狼未切割组图
		Image imgHitWolfRaw = tk.getImage(getURL("hitwolf.png"));
		//气球爆开的图片,未切割
		Image imgBrokenBalloonsRaw = tk.getImage(getURL("balloon.png"));
		Image[] imgBrokenBalloon;//气球爆开的图片数组
		//不断被吹大的气球,未切割
		Image imgBalloonBlowRaw =  tk.getImage(getURL("balloonblow.png"));
		Image[] imgBalloonBlow;//不断被吹大的气球图片数组
		//未切割的菜单图片
		Image imgMenuRaw = tk.getImage(getURL("menu.gif"));
		
		mt.addImage(imgLogo, 0);
		mt.addImage(imgBackground, 0);
		mt.addImage(imgAward, 0);
		mt.addImage(imgUmbrella, 0);
		mt.addImage(imgCord, 0);
		mt.addImage(imgBullet, 0);
		mt.addImage(imgPigRaw, 0);
		mt.addImage(imgWolvesRaw, 0);
		mt.addImage(imgGearRaw, 0);
		mt.addImage(imgCrowRawRight, 0);
		mt.addImage(imgCrowRawLeft, 0);
		mt.addImage(imgCrowRawHitted, 0);
		mt.addImage(imgHitWolfRaw, 0);
		mt.addImage(imgBrokenBalloonsRaw, 0);
		mt.addImage(imgBalloonBlowRaw, 0);
		mt.addImage(imgMenuStage, 0);
		mt.addImage(imgMenuRaw, 0);
		mt.addImage(imgHelp, 0);
		mt.addImage(imgTopScore, 0);
		mt.addImage(imgOptionBk, 0);
		
		
		/**
		 * 等待加载所有原始图片.
		 * 下面的try-catch必须有,否则报异常
		 * 因为,切割时图片还未加载完成,但不会报空指针(文件不存在时才报空指针),
		 * 这时取图片宽度getWidth(),因宽度未知,返回-1,
		 * -1除以整型数frameWidth,等于零,
		 * 用零去参与切割运算,就会出异常:ArithmeticException: / by zero
		 */
		try {
			mt.waitForAll();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		//cut猪
		imgPigs = this.cutImage(imgPigRaw, 10,100, 83);
		//cut狼
		imgWolves = cutImage(imgWolvesRaw, 14,125, 125);
		//cut轮子
		imgGears = this.cutImage(imgGearRaw, 2,103, 59);
		//cut乌鸦,然后将所有的乌鸦图片放到一个数组中
		Image[] crowRight = this.cutImage(imgCrowRawRight, 10,100, 89);
		Image[] crowLeft = this.cutImage(imgCrowRawLeft, 10,100, 89);
		Image[] crowHitted = this.cutImage(imgCrowRawHitted, 4,123, 89);
		imgCrow = new Image[24];
		int j = 0;
		for(int i = 0;i < crowRight.length;i++){
			imgCrow[j] = crowRight[i];
			j++;
		}
		for(int i = 0;i < crowHitted.length;i++){
			imgCrow[j] = crowHitted[i];
			j++;
		}
		for(int i = 0;i < crowLeft.length;i++){
			imgCrow[j] = crowLeft[i];
			j++;
		}
		//cut子弹击中狼图片
		imgHitWolf  = this.cutImage(imgHitWolfRaw, 3,44, 52);
		//cut爆开的气球
		imgBrokenBalloon = this.cutImage(imgBrokenBalloonsRaw, 5,116, 92);
		//cut不断被吹大的气球
		imgBalloonBlow = this.cutImage(imgBalloonBlowRaw, 5,58, 38);
		//将所有气球图片放到一个数组中
		int index;
		imgBalloons = new Image[imgBalloonBlow.length + imgBrokenBalloon.length ];
		for( index = 0;index < imgBalloonBlow.length;index++){
			imgBalloons[index] =  imgBalloonBlow[index];
		}
		for(int i = 0;i < imgBrokenBalloon.length;i++){
			imgBalloons[index] = imgBrokenBalloon[i];
			index ++;
		}
		//cut菜单
		imgMenu = this.cutImage(imgMenuRaw, 8,200, 100);
		
		//加载所有已切割的图片
		for (int i = 0; i < imgPigs.length; i++) {
			mt.addImage(imgPigs[i], 0);
		}
		for (int i = 0; i < imgGears.length; i++) {
			mt.addImage(imgGears[i], 0);
		}
		for (int i = 0; i < imgWolves.length; i++) {
			mt.addImage(imgWolves[i], 0);
		}
		for (int i = 0; i < imgBrokenBalloon.length; i++) {
			mt.addImage(imgBrokenBalloon[i], 0);
		}
		for(int i = 0; i < imgGears.length; i++){
			mt.addImage(imgGears[i], 0);
		}
		for(int i = 0;i < imgCrow.length;i++){
			mt.addImage(imgCrow[i], 0);
		}
		for(int i = 0;i < imgHitWolf.length;i++){
			mt.addImage(imgHitWolf[i], 0);
		}
		for(int i = 0;i < imgBalloons.length;i++){
			mt.addImage( imgBalloons[i], 0);
		}
		try {
			mt.waitForAll();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

    /**
     * 读取文件
     * @param fileName
     * @return
     */
	private URL getURL(String fileName){
		URL url = null;
		try{
			url = this.getClass().getResource("../image/"+fileName);
		}catch(Exception e){
			e.printStackTrace();
		}
		return url;
	}

	
	/**
	 * 切割图片
	 * 
	 * imgRaw:未切割的图片
	 * numOfFrame:图片帧数量
	 * frameWidth:帧宽度
	 * frameHeight:帧高度
	 * 
	 * frameX = (frameNumber % columns) * width;
	 * frameY = (frameNumber / columns) * height; 
	 */
	private Image[] cutImage(Image imgRaw, int numOfFrame, int frameWidth,
			int frameHeight) {
		//用来装已切割图片的数组
		Image[] imgCutted = new Image[numOfFrame];
		//图片帧列数
		int columns= imgRaw.getWidth(null) / frameWidth;
		//切割
		for (int i = 0; i < numOfFrame; i++) {
			int frameX = (i % columns)* frameWidth ;
			int frameY = (i / columns)*frameHeight;
			imgCutted[i] = this.createImage(
					new FilteredImageSource(
							imgRaw.getSource(),
							new CropImageFilter(frameX, frameY, frameWidth, frameHeight)
					)
		    );
		}
        //返回切割后的图片的数组
		return imgCutted;
	}

	
	public Image getImgBackground() {
		return imgBackground;
	}
	public Image getImgAward() {
		return imgAward;
	}
	public Image getImgBullet() {
		return imgBullet;
	}
	public Image getImgCord() {
		return imgCord;
	}
	public  Image getImgUmbrella() {
		return imgUmbrella;
	}
	public Image[] getImgWolves() {
		return imgWolves;
	}
	public Image[] getImgPigs() {
		return imgPigs;
	}
	public Image[] getImgGears() {
		return imgGears;
	}

	public Image[] getImgCrow() {
		return imgCrow;
	}

	public Image[] getImgHitWolf() {
		return imgHitWolf;
	}

	public Image[] getImgBalloons() {
		return imgBalloons;
	}

	public Image getImgLogo() {
		return imgLogo;
	}
	public Image[] getImgMenu() {
		return imgMenu;
	}
	public Image getImgMenuStage() {
		return imgMenuStage;
	}
	public Image getImgHelp() {
		return imgHelp;
	}
	public Image getImgTopScore() {
		return imgTopScore;
	}
	public Image getImgOptionBk() {
		return imgOptionBk;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -