java-小游戏之计时任务、双缓冲绘图和移动背景设置

一、计时任务

通常我们在玩游戏时会遇到,“一大波僵尸即将来袭”植物大战僵尸里的,计时任务就是一个任务等待一段时间后执行。

今天我们把飞机游戏设置为自动发射子弹(运用计时器)。

package BallGamev5;

import java.awt.*;
import java.util.ArrayList;

//定义任务线程:让角色自动发射子弹
public class TimerThread implements Runnable{
    //间隔时间
    public long time = 300;
    Player player;
    ArrayList<Bullet> bulletList;

    public TimerThread(Player player, ArrayList<Bullet> bulletList) {
        this.player = player;
        this.bulletList = bulletList;
    }

    @Override
    public void run() {
        while(true){
            try {
                Thread.sleep(time);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            Bullet bullet = new Bullet(player.getX()+23, player.getY(),0,-5,10,10,Color.BLACK );
            bulletList.add(bullet);
        }

    }
}

我们初始化time,也就是经过time时间后执行该任务。我们的目的就是让飞机自动发射子弹,思路是创建一个新线程,来计时添加子弹对象在子弹队列中,再将队列传到画笔那进行绘制。

二、双缓冲绘图(BufferedImage)

我们所看到的图像是由显示缓冲区和显示器共同完成的,两者是一起的,显示器只负责从显示缓冲区取数据显示。我们通常所说的在显示器上画一条直线,其实就是往该显示缓冲区中写入数据。显示器通过不断的刷新(从显示缓冲区取数据),从而使显示缓冲区中数据的改变及时的反映到显示器上。

我们为啥要用双缓冲绘图呢?

不使用双缓冲我们会在窗体看到闪烁,这是因为程序还没来得及运行,显示器就将还没画好图形显示在显示器上了,你所看到的效果可能是一部分一部分地显示出来,造成闪烁。——“生产者”和“消费者”供需不一致所造成的

双缓冲原理:我们创建一个自定义缓冲区,将要画的图像先前存入该缓冲区,再将这个自定义缓冲区的数据传入显示缓冲区,这样就避免了你还没绘制完图片,显示器就从显示缓冲区取数据显示图形。

 BufferedImage bfimg = new BufferedImage(900,900,1);//创建缓冲区
 Graphics bg = bfimg.getGraphics();//获取该缓冲区的画笔

将所有要绘制的图形先绘制在这个缓冲区里(将这个画笔对象传出),然后再用窗体画笔将这个绘制出来。

g.drawImage(bfimg,0,0,null);//绘制缓冲区图

三、背景设置

如何才能想让背景自己”走“,于是我们就这样做,图片向下移动,我们就在窗体最上方绘制消失的部分。

int m = 0;//初始化m值 
bg.drawImage(backgroundImage,0,m,900,m+900,0,0,900,900,null);
 m=m+2;
if(m>= 900){
 m = 0;
}
bg.drawImage(backgroundImage, 0,0,900,m,0,900-m,900,900,null);

我们的窗体大小是900*900的,m为移动的像素点。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值