java游戏问题

java游戏问题

  • java成员调用

  1. static修饰

public class Eg{
	static void eg1(){
	System.out.println("hello world!");
	}
	public static void main(String[] args) {
		eg1();
	}
}
  1. public修饰

public class Eg{
	static void eg2(){
	System.out.println("hello world!");
	}
	public static void main(String[] args) {
		new Eg().eg2();
	}
}
  1. 方法间调用

public class Eg{
	void eg(){
	System.out.println("hello world!");
	}
	 Eg(){
	 eg();
	 }
	
}
  • eclipse中图标含义

    java游戏问题_第1张图片
  • 让组件背景不显示

需要先设置组件背景不透明(Opaque)
可借此实现透明窗体

label.setOpaque(false);
jPanel.setOpaque(false);	//jPanel等组件使用setBackground(new Color(0,0,0,0)); 也可以实现,不过会出现重影
//jFrame.setBackground(new Color(0,0,0,0));这种设置可以使用到jFrame上
  • 删除组件

jFrame.remove(组件);
  • 框架窗口的背景色无法显示

JFrame分好几层Pane(窗格),setBackground只能设置最底层的颜色,被上层的Pane盖住,所以看不到效果。
先用getContentPane()获取ContentPane,再设置背景色即可。

jFrame.getContentPane().setBackground(Color.YELLOW); 
  • 组件位置大小不可移动

取消布局管理器

jFrame.setLayout(null);		
//null可替换为new GridLayout(int rows, int Columns), GridLayout(网格式布局)按行列最大化组件
//取消布局管理后可添加jPanel等组件的位置,不过设置取消后一定要设置组件的位置和大小,要不然不会显示出来
  • 抑制警告

@SuppressWarnings(“unused”)
对空的对象不做出警告
(SuppressWarnings: 抑制警告 , unused: 无用的)

public class Eg {
    @SuppressWarnings("unused")
	public static void main(String[] args) {
		JFrame jFrame = new JFrames(“抑制警告”);
	}
}

  • 得到加载图片的大小

new ImageIcon("eg.png").getIconWidth()		//宽
new ImageIcon("eg.png").getIconHeight()	//高
  • 窗口最大化

jFrame.setExtendedState(MAXIMIZED_BOTH);
  • 窗体无边框

jFrame.setUndecorated(true);
  • 窗体最顶层显示

jFrame.setAlwaysOnTop(true);
  • 窗口居于屏幕中央

使用setLocationRelativeTo(null);
  • 随机数的生成

  1. Math.random()返回的是:返回带正号的 double 值,该值大于等于 0.0 且小于 1.0
(int)(Math.random()*m)+n	//强制转换为int, 返回(n,m+n-1)之间的随机数。

2.new Random().nextInt();返回的是int型的范围的随机数

new Random().nextInt(n)+m;	//返回(n,m+n-1)之间的随机数。
  • 监听

推荐理解

  • KeyListener,MouseLisenter,WindowListener(键盘监听、鼠标监听、窗口监听)
  • actionPerformed“发生操作时调用”
  1. 按钮监听

//按钮jButton
jButton.addActionListener(new ActionListener() {
					public void actionPerformed(ActionEvent e) {
						System.exit(0);
					}
				});
  1. 鼠标监听

jFrame.addMouseListener(new MouseAdapter() {
					public void mousePressed(MouseEvent e) { //鼠标按下事件
						pressedPoint = e.getPoint(); //记录鼠标坐标
						System.exit(0);
					}
				});
  1. 窗口监听

转载

jFrame.addComponentListener(new ComponentAdapter() {
					public void componentResized(ComponentEvent e) {
						System.out.println(jFrame.getSize());	//得到窗口大小
						super.componentResized(e);
					}
				});
  • 无边框窗体移动

鼠标左右均可拖动

Point point;		//Initial_coordinates初始坐标(全局变量)
jFrame.addMouseListener(new MouseAdapter() {		//鼠标适配
			public void mousePressed(MouseEvent e) { 
				point = e.getPoint(); //记录鼠标坐标
			}
		});
		jFrame.addMouseMotionListener(new MouseMotionAdapter() {		//鼠标移动适配
			public void mouseDragged(MouseEvent e) {
				jFrame.setLocation( jFrame.getLocation().x + e.getPoint().x - point.x, 
									jFrame.getLocation().y + e.getPoint().y - point.y);
			}
		});

鼠标右键拖动

music.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e){
				if(e.getButton()==1){//检测鼠标左键单击(左键e.Button1=1,右键e.Button3=3)
					new Thread(new Musics()).start();
					 
				}}});
				

				music.addMouseListener(new MouseAdapter() {
					public void mousePressed(MouseEvent e) { 
						if(e.getButton() == 3){//检测鼠标右键单击
							point = e.getPoint();
							
						}
						 }});

				music.addMouseMotionListener(new MouseMotionAdapter() {
					public void mouseDragged(MouseEvent e) {
						if(e.isMetaDown()){//检测鼠标右键拖动
							music.setLocation(music.getLocation().x + e.getPoint().x - point.x,
									music.getLocation().y + e.getPoint().y - point.y);
							}
						}});

Java实现鼠标拖拽移动界面组件

  • 光标类型

DEFAULT_CURSOR =0
默认光标。
CROSSHAIR_CURSOR
十字光标。
E_RESIZE_CURSOR = 11
调整窗口右边框大小的光标。
HAND_CURSOR = 12
手状光标。
MOVE_CURSOR = 13
移动光标。
N_RESIZE_CURSOR = 8
调整窗口上边框大小的光标。
NE_RESIZE_CURSOR = 7
调整窗口右上角大小的光标。
NW_RESIZE_CURSOR = 6
调整窗口左上角大小的光标。
S_RESIZE_CURSOR = 9
调整窗口下边框大小的光标。
SE_RESIZE_CURSOR = 5
调整窗口右下角大小的光标。
SW_RESIZE_CURSOR = 4
调整窗口左下角大小的光标。
TEXT_CURSOR = 2
文字光标类型。
W_RESIZE_CURSOR = 10
调整窗口左边框大小的光标类型。
WAIT_CURSOR = 3
等待光标类型。

jFrame.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR ));	//使用系统光标
setCursor(Toolkit.getDefaultToolkit().createCustomCursor(icon.getImage(), new Point(10, 10), "norm"));	//系统默认工具包下创建自定义图片光标
		//图片光标变化
		addMouseListener(new MouseAdapter() {
			public void mouseEntered(MouseEvent e) {
				setCursor(Toolkit.getDefaultToolkit().createCustomCursor(eg.getImage(), new Point(0, 0), "kaishi"));

			}
		});
  • 消息输入框

package eg;

public class Eg  {
	public static void main(String[] args)
    {
        int sum = 0;
        int option = JOptionPane.YES_OPTION;
        while(option == JOptionPane.YES_OPTION)
        {
            String dataString = JOptionPane.showInputDialog("Enter an int value:");
            int data = Integer.parseInt(dataString);
            sum+=data;
            option = JOptionPane.showConfirmDialog(null, "Continue?");
            JOptionPane.showMessageDialog(null,"the sum is"+ sum);
        }
    }
}
  • 退出提示

按取消之后不会直接退出(添加stop=true;可做到游戏画面静止)
添加监听窗口事件的方法addWindowListener,将WindowAdapter的对象传给这个方法,然后在匿名类中重写了windowClosing的方法,接着在方法里面显示了确认的对话框,对确认按钮进行监听,并实现退出。
关键使用jFrame.setDefaultCloseOperation(0)(不要用jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)关闭)
在点击确定后使用System.exit(0);退出
详见

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class test implements ActionListener{
	
	
	int width = 400, height = 400;
	boolean stop = false;	ImageIcon img;
	
	JLabel label = new JLabel();
	JDialog jDialog = new JDialog();
	//加载图片
	ImageIcon up = new ImageIcon("up.png");	
	ImageIcon down = new ImageIcon("down.png");	
	ImageIcon left = new ImageIcon("left.png");	
	ImageIcon right = new ImageIcon("right.png");	
	void tests() {
		new Timer(15, this).start();
		jDialog.setLayout(null);	//仅关闭按钮的jDialog窗体
		jDialog.setVisible(true);
		jDialog.setTitle("GiF");
		jDialog.setBounds(Toolkit.getDefaultToolkit().getSscreenSize().width/2-width/2, Toolkit.getDefaultToolkit().getScreenSize().height/2-height/2, width, height);
		jDialog.add(label);		
		//		以下是关键		
		jDialog.setDefaultCloseOperation(0);
		jDialog.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e) {
				stop=true;
				int result = JOptionPane.showConfirmDialog(jDialog,"是否退出","警告",JOptionPane.YES_NO_OPTION);	//弹出语句(输出,输出类继承对象使用Eg.this)
				if(result==JOptionPane.OK_OPTION){System.exit(0);}	//使用jDialog.dispose()并不能关闭进程
				else{stop=false;}
			}
		});	
		//		以上是关键
	}	
	public static void main(String[] args) {	
	new test().tests();
	}

	public void actionPerformed(ActionEvent e) {
		int t=0, x=10, y=4,
		if(!stop){
		t++; x++;
		label.setIcon(img);
		if(t%4==0){img=up;}
		else if(t%4==1){img=right;}
		else if(t%4==2){img=down;}
		else img=left;
		label.setBounds(x, y, img.getIconWidth(), img.getIconHeight());
		}
	}
}
  • 利用线程延迟时间

try {new Thread();Thread.sleep(150);}
catch (InterruptedException e) {e.printStackTrace();}

import java.awt.*;
import javax.swing.JFrame;

public class Eg extends JFrame{

Eg(){
	setBounds(0, 0, 800, 800);
	setVisible(true);
	setDefaultCloseOperation(3);
	}
	
public void paint(Graphics g){
	
	g.fillRect(0, 0, 800, 800);
	g.setColor(Color.red);
	for (int i = 0; i <100; i++) {
		g.drawLine(i*10+40, 40, i*10+40, 800);
		try {new Thread();Thread.sleep(15);} 
		catch (InterruptedException e) {e.printStackTrace();}
		
		g.drawLine(40, i*10+40, 800, i*10+40);
		try {new Thread();Thread.sleep(150);} 
		catch (InterruptedException e) {e.printStackTrace();}
			}
		}
public static void main(String[] args) {
	new Eg().repaint();}
}

匿名内部线程改变背景颜色

new Thread(new Runnable() {
			int x=0,y=0,z=0,w=0;
			public void run() {
				while(true){
					try {
						new Thread();
						Thread.sleep(150);
						x++;y+=1;z+=2;w+=3;

					jFrame.setBackground(new Color(x%255,y%255,z%255,w%255));
					} catch (Exception e) {}
				}
			}
		}).start();
  • 音乐播放

需要先下载jl1.0.1.jar >> 点击下载
java游戏问题_第2张图片
java游戏问题_第3张图片
java游戏问题_第4张图片

以下是在eclipse中进行的项目中添加jar方法,如果你的是IDE或其他编译器,自行百度:编译器名称+添加jar的方法
如果出现其它不能添加的问题,自行百度:编译器名称+添加jar的方法

java游戏问题_第5张图片

如果Add External JARS 不能点击,就先点击下 JRE System Library [JacaSE - x.x] 让其显示出来

有的eclipse会有module path 和 class path 两种路径,如果出现的话就选择class path 添加

java游戏问题_第6张图片
java游戏问题_第7张图片

package eg;

import java.io.*;
import javax.swing.*;
import java.awt.FileDialog;
import javazoom.jl.player.Player;	//引用添加的jar包

public class MP3Player extends Eg{
	
String MP3Players() {		//跳出文件选择器,选择文件后将路径返回
	
        		FileDialog fd = new FileDialog(this,"Chooes music", FileDialog.LOAD);
		         fd.setVisible(true);
		         return fd.getDirectory() +fd.getFile();
		         
    }
 
    public void play(String filename) {
        try {
            BufferedInputStream buffer = new BufferedInputStream(
            new FileInputStream(filename));
            Player player = new Player(buffer);
            player.play();
        } catch (Exception e) {
            System.out.println(e);
        }
    }
 
    public static void main(String[] args) {
    	new MP3Player().play(new MP3Player().MP3Players());
    }
}

源码地址

以上可以播放音乐
  • 得到object变量的类型

定义变量name(如:int name;)
先强制转换为object(目标格式)
naem.getClass() 获取变量类型
name.tostring() 变量类型转换为字符串格式
name.toURL() 变量类型转换为文件格式

System.out.println((Object)name.getClass());
  • 多线程

源码地址1
源码地址2

  1. 开启电脑程序

package eg;
public class Eg {
  public static void main(String[] args) throws Exception {
      //方式一:使用Runtime的exec方法
      Runtime.getRuntime().exec("C:\\Windows\\system32\\mspaint.exe");		//打开画图(路径之间使用了双斜杠)
      //方式二:使用ProcessBuilder类中的start方法
      new ProcessBuilder("C:/Windows/system32/notepad.exe").start();		//打开记事本(路径之间使用了反斜杠)
  }
}
  • 关于游戏对象的显示

假定无框窗体width = 600,height = 300,图片像素60*30,图片坐标为(x,y)
如果让图片移动到边界自动穿过(类似贪吃蛇可穿墙游戏),那么对图片而言则有以下设置:

if( x<0 ) x=width-60;	//图片是在坐标的右下角,所以当达到有边界时需要减去图片的width
if( x>width-60 ) x=0;
if( y<0 ) y=height-30;	//当达到下边界时需要减去图片的height
if( y>height-30 ) y=0;
  • 图片旋转

转载

package eg;
import java.awt.*;
import java.awt.image.*;
import java.awt.geom.AffineTransform;
import javax.swing.*;

//图像旋转演示

public class Eg extends JFrame{

	private static final long serialVersionUID = 1L;
	int t;
	Image image;
	Graphics2D bufImageG; //缓冲区图像的图形环境   
	ImagePane imagePane=new ImagePane();
	BufferedImage bufImage,originalBufImage; //用于显示的缓冲区图像
	
	public Eg(){
		image = new ImageIcon("picture/snake/begin.png").getImage();
		
		add(imagePane); //增加组件到容器上
		setSize(200, 200); //设置窗口尺寸
		setLocationRelativeTo(null);
		setVisible(true); //设置窗口可视
		setDefaultCloseOperation(3);     //关闭窗口时退出程序
	}
	
	public static void main(String[] args){
		new Eg();
	}

	class ImagePane extends JPanel {
		private static final long serialVersionUID = 1L;
		
		public void loadImage(int t) {
	
			image = new ImageIcon("eg.png").getImage();
			originalBufImage =  new BufferedImage(image.getWidth(this),image.getHeight(this),2);     //创建原始缓冲区图像			
			originalBufImage.createGraphics().drawImage(image, 0, 0, this); //传输源图像数据到缓冲区图像中

			BufferedImage filteredBufImage =new BufferedImage(image.getWidth(this),image.getHeight(this),2); //过滤后的图像
			AffineTransform transform = new AffineTransform(); //仿射变换对象
			transform.rotate(Math.toRadians(t++%360),75,75); //旋转图像
			new AffineTransformOp(transform, null).filter(originalBufImage, filteredBufImage);//过滤图像,目标图像在filteredBufImage
			bufImage = filteredBufImage; //让用于显示的缓冲区图像指向过滤后的图像

		}

		public void paint(Graphics g){
			repaint();
			loadImage(t);
			super.paint(g);
			Graphics2D g2 = (Graphics2D) g;
			g2.drawImage(bufImage,0,0,this);    //绘制图片
			try {t++;new Thread();Thread.sleep(15);} catch (Exception e) {}
		}
	}
}
//添加到paint方法内
douel angel+=0.1;	//设置旋转角
				Graphics2D graphics2d = (Graphics2D) g;
				graphics2d.rotate(Math.toRadians(angel),500,500);	//实现旋转,将数值角转化为角度值,旋转中心坐标
  • 刷新问题

swing下的Timer(计时器)需要添加 ActionListener接口实现public void actionPerformed(ActionEvent e) {}方法,表述形式为 Timer timer = new Timer(delay, listener);其优点时可以通过delay控制方法内的刷新帧率,使用start开启计时
paint中的repaint方法也可做到刷新帧率的作用,其作用域仅局限于paint方法内及其调用对象
(闪烁问题的解决)

  • Java计时问题

System计时
System.currentTimeMillis(); //精确到毫秒>> 1s=1000ms
System.nanoTime(); //精确到纳秒>>> 1s=1000 000 000 ns
使用util 下的Timer类
m的n次方

//毫秒计时
long begintime = System.currentTimeMillis(); //初始时间
long endtinme=System.currentTimeMillis(); //结束时间
long costTime = (endtime - begintime); //间隔时间(costTime / 1000 变成秒)
//纳秒计时
long begintime = System.nanoTime(); //初始时间
long endtime = System.nanoTime(); //结束时间
long costTime = (endtime - begintime); //间隔时间(costTime / 1000 变成微秒;costTime / Math.pow(10,6) 变成微秒;costTime / Math.pow(10,9) 变成秒)

package eg;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;


public class Eg{

    /**
     * @显示当前时间
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //获得系统的时间,单位为毫秒,转换为妙
        long totalMilliSeconds = System.currentTimeMillis();
        
        DateFormat dateFormatterChina = DateFormat.getDateTimeInstance(DateFormat.MEDIUM,DateFormat.MEDIUM);//格式化输出
        TimeZone timeZoneChina = TimeZone.getTimeZone("Asia/Shanghai");//获取时区 这句加上,很关键。
        dateFormatterChina.setTimeZone(timeZoneChina);//设置系统时区
        
        long totalSeconds = totalMilliSeconds / 1000;
			System.out.println(totalSeconds/3600/24/365);	//与1970年年相差的年份
        
        
        //求出现在的秒
        long currentSecond = totalSeconds % 60;
        
        //求出现在的分
        long totalMinutes = totalSeconds / 60;
        long currentMinute = totalMinutes % 60;
        
        //求出现在的小时
        long totalHour = totalMinutes / 60;
        long currentHour = totalHour % 24;
        
        //显示时间
        System.out.println("总毫秒为: " + totalMilliSeconds);
        System.out.println(currentHour + ":" + currentMinute + ":" + currentSecond + " GMT");
        
        
        Date nowTime = new Date(System.currentTimeMillis());
        System.out.println(System.currentTimeMillis());
        SimpleDateFormat sdFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:dd");
        String retStrFormatNowDate = sdFormatter.format(nowTime);
          
        System.out.println(retStrFormatNowDate);
    }

}
//util 下的Timer具有定时功能
package eg;

import java.util.*;

public class Eg{
	Timer timer = new Timer();
	Eg(){
		
	timer.schedule(new TimerTask() {	//新建定时任务,设定工作,间隔时间执行工作
		
		public void run() {
			System.out.println("learn...");
			new Eg(); //实现了重复性
			timer.cancel();
		}
	}, 3000);
	
	
	
	}
	public static void main(String[] args) {
		new Eg();}
}
  • 文件的输入输出

//输入
try{  
			FileWriter fw = new FileWriter(new File("Text/snake.txt")); 
			fw.write(sx+"\r\n");
			fw.write(sy+"\r\n");
			fw.close(); 
		}catch(Throwable e){}


//输出
		try {
			fs = new BufferedReader(new FileReader("Text/snake.txt"));
			String read;
			while ((read = fs.readLine()) != null) {
				System.out.println(read);

			}} catch (IOException e) {}}

//选取开头值
try {
			bufferedReader = new BufferedReader(new FileReader("Text/snake0.txt"));
			while ((string= bufferedReader.readLine()) != null) {
				string0= string;	//当改行有内容才输出,bufferedReader.readLine()本身不具备判断效应,若在大括号内输入string= bufferedReader.readLine()),则max是空值
			}} catch (IOException e) {}
			
			if(len-2>Integer.valueOf(smax)){
						try {
							FileWriter writer = new FileWriter(new File("Text/snake0.txt"));
							writer.write(String.valueOf(len-2));
							writer.close(); 
						} catch (IOException g) {}}}
  • 颜色选择窗格

//以内部类方式导入
JColorChooser chooser = new JColorChooser(new DefaultColorSelectionModel()); //颜色选择窗格
	class Colorchoose extends JFrame {
		/**
		 * 
		 */
		private static final long serialVersionUID = 1L;
		Colorchoose() {
			setAlwaysOnTop(true);
			setTitle("颜色选择");
			setBounds(0, 0, 300, 300);
			setVisible(true);
			add(chooser);
			//chooser.getColor();得到选择颜色
			chooser. setColor();	//设置颜色
		}
	}
	
  • java错误机制

  • Java异常

你可能感兴趣的:(java游戏问题)