学到
双缓存机制
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)或者游戏开发时,您可能会看到类似这样的代码。这段代码看起来是用于在图像上绘制内容。以下是代码的逐行解释:
-
gimage.drawImage(game_pic.bgimgage, 0, 0, null);
- 这行代码的作用是将名为
game_pic.bgimgage
的图像绘制到gimage
对象所代表的图形上下文中。0, 0
是图像的绘制位置,即左上角。最后一个参数null
通常代表图像观察者,在这里它被设置为null
,意味着不需要通知任何观察者图像已经绘制完毕。
- 这行代码的作用是将名为
-
然后在 case 1:
bgg.paintself(gimage);
ennFish.x+=30;
System.out.println("下载");
ennFish.paintself(gimage);
System.out.println(ennFish.x);时将几个图片放入gimage,
-
后面再一次带入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();