java第三天(游戏开发)

学到

双缓存机制

public void paint(Graphics g) {
	//		  super.paint(g);//createImage(width, height) 是一个方法调用,它创建了一个指定宽度和高度的空图像缓冲区。这个方
			  //法可以在 Component 类中找到,因此任何从 Component 继承的类(比如 Applet 或 JPanel)都可以使用这个方法。
			  if (offimagescreen == null) {
				  offimagescreen = createImage(width, height);
		        }
		
			  Graphics gimage=offimagescreen.getGraphics();//Graphics gimage = offimagescreen.getGraphics(); 这行代码是用来获取之前
			  //创建的屏幕外图像缓冲区(offimagescreen)的Graphics对象,这样你就可以在这个图像上进行绘制操作了
		        // 调用父类的paint方法来确保其他组件也被绘制
		        // 确保图像已经被加载
		        // 正确的方式是使用静态变量
	
			  try {
				g.drawImage(game_pic.bgimgage,0,0,null);//这个是绘制底板,缓存区域
				  
				
			
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			  switch (state) {
			case 0:
				gimage.drawImage(game_pic.bgimgage,0,0,null);//背景面这些是将底板都加到缓存区域上
				gimage.setColor(Color.pink);//设置笔为粉红
	//			gimage/设置字体
				gimage.setFont(new Font("仿宋", Font.BOLD,60));
				gimage.drawString("hello world",700,500);
				
				
				break;
	
			case 1:
				bgg.paintself(gimage);
				ennFish.x+=30;
				System.out.println("下载");
				ennFish.paintself(gimage);
			System.out.println(ennFish.x);
			break;
		case 2:
			
			break;
		case 3:
			break;
		case 4:
			break;
			default:
		
			
		}
		  g.drawImage(offimagescreen,0,0,null);//这里将所有缓存的一次加载到图片上
//			g.drawImage(game_pic.dirmgage1,0,0,null);

这是,如果有两个图片加载,那么有图片的两个一起加载就不会造成闪烁了

if (offimagescreen == null) {
				  offimagescreen = createImage(width, height);
		        }
		
			  Graphics gimage=offimagescreen.getGraphics();//Graphics gimage = offimagescreen.getGraphics(); 这行代码是用来获取之前
			  //创建的屏幕外图像缓冲区(offimagescreen)的Graphics对象,这样你就可以在这个图像上进行绘制操作了
		        // 调用父类的paint方法来确保其他组件也被绘制
		        // 确保图像已经被加载
		        // 正确的方式是使用静态变量

这里eImage 函数或方法通常用于创建一个新的图像对象,尤其是在处理图形用户界面(GUI)或游戏开发时。具体到您给出的代码行 offimagescreen = createImage(width, height);,这行代码的意图是创建一个指定宽度和高度的图像对象,并将其赋值给变量 offimagescree

然后

Graphics gimage=offimagescreen.getGraphics();//Graphics gimage = offimagescreen.getGraphics(); 这行代码是用来获取之前

//创建的屏幕外图像缓冲区(offimagescreen)的Graphics对象,这样你就可以在这个图像上进行绘制操作了

底板g.drawImage(game_pic.bgimgage,0,0,null);//这个是绘制底板,缓存区域,

鼠标事件后

case 0:

gimage.drawImage(game_pic.bgimgage,0,0,null);//背景面这些是将底板都加到缓存区域上

gimage.setColor(Color.pink);//设置笔为粉红

// gimage/设置字体

gimage.setFont(new Font("仿宋", Font.BOLD,60));

gimage.drawString("hello world",700,500);

在Java编程语言中,特别是涉及到图形用户界面(GUI)或者游戏开发时,您可能会看到类似这样的代码。这段代码看起来是用于在图像上绘制内容。以下是代码的逐行解释:

  1. gimage.drawImage(game_pic.bgimgage, 0, 0, null);

    • 这行代码的作用是将名为 game_pic.bgimgage 的图像绘制到 gimage 对象所代表的图形上下文中。0, 0 是图像的绘制位置,即左上角。最后一个参数 null 通常代表图像观察者,在这里它被设置为 null,意味着不需要通知任何观察者图像已经绘制完毕。
  2. 然后在 case 1:

    bgg.paintself(gimage);

    ennFish.x+=30;

    System.out.println("下载");

    ennFish.paintself(gimage);

    System.out.println(ennFish.x);时将几个图片放入gimage,

  3. 后面再一次带入g.drawImage(offimagescreen,0,0,null);/

还有就是实现滑动

package common;
import java.awt.*;
import common.game_pic;
public class fish {
	//定义图片
	Image img;
	//定义坐标
	int x;
	int y;
	int width;
	int height;
	//移动速度
	int speed;
	//方向定义
	int dir=1;
	//类型
	int type;
	//分值
	int count;
	//距离,用于检测自身

	//距离,用于碰撞检测
	public Rectangle getrec () {
		return new Rectangle(x,y,width,height);//就相当于是返回一个对象
		
	}
	public void paintself(Graphics g ) {
		g.drawImage(img,x,0,null);//背景面
	
		
	}

}

//敌方鱼左边的鱼
class ennamy_l extends fish{
//	ennamy_l(){
//		
//	}构造方法
	public ennamy_l() {
		// TODO Auto-generated constructor stub
		this.x=5;
		this.y = (int)(Math.random() * 700 + 100);
		this.width=45;
		this.height=69;
		this.speed=10;
		this.count=1;
		this.img=game_pic.dirmgage1;

	}
	public void ds(Graphics g ) {
		g.drawImage(img,0,0,null);//背景面
		
	}
	
	
}

这个是fish的,保证repaint来把这个刷新

public void mouseClicked(MouseEvent e) {
				super.mouseClicked(e);
				if (e.getButton()==1&&state==0) {
					state=1;
					repaint();//重新绘制
					/*总的来说,repaint 方法属于 Component 类,这是所有Swing组件的父类。因此,所有继承自 Component 类的Swing组件,
					 * 如 JButton, JPanel, JFrame 等,都有 repaint 方法。repaint 是Swing组件更新显示的一个关键方法,用于确保用户界面能够反映组件的最新状态。


					 * repaint() 调用的位置是正确的,它位于状态改变之后,这样就可以确保组件在状态改变后能够重新绘制自己,以反映新的状态。
					 */
					
				}
				
			}
		}

时间的定时器

Timer tim=new Timer(400, new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
			       repaint();
			}
		} );
		 tim.start();
相关推荐
吾日三省吾码3 分钟前
JVM 性能调优
java
stm 学习ing8 分钟前
FPGA 第十讲 避免latch的产生
c语言·开发语言·单片机·嵌入式硬件·fpga开发·fpga
湫ccc1 小时前
《Python基础》之字符串格式化输出
开发语言·python
弗拉唐1 小时前
springBoot,mp,ssm整合案例
java·spring boot·mybatis
oi772 小时前
使用itextpdf进行pdf模版填充中文文本时部分字不显示问题
java·服务器
mqiqe2 小时前
Python MySQL通过Binlog 获取变更记录 恢复数据
开发语言·python·mysql
AttackingLin2 小时前
2024强网杯--babyheap house of apple2解法
linux·开发语言·python
少说多做3432 小时前
Android 不同情况下使用 runOnUiThread
android·java