服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

实现游戏中的图片滚屏功能

    实现游戏中的文字滚屏功能一文中讲述了如何实现文字滚屏功能,在本文中我们将实现图片滚动的功能,其实现的原理是相似的,只不过图片的相对复杂一些。

    首先我们应该准备一个大小适当的图片,目的是实现让他从屏幕底部滚动到屏幕的中间。这样的情况比较简单,我们不需要考虑双缓冲的问题。有的时候我们需要自己绘画图片,可能算发挥比较复杂,这时候就需要考虑双缓冲问题,为了得到更好的效果,避免闪屏,我们应该在后台画图然后把它copy到当前屏幕的适当位置,因为copy的速度是比你直接在当前屏幕画的速度快的。在canvas类中提供了一个函数isdoublebuffered(),如果返回true的话,那么表示设备支持双缓冲,那么我们就没有必要自己实现这个技术了。如果返回false那么我们就应该使用双缓冲技术。你可以参考应用双缓冲技术解决画面闪烁的问题 。

   为了简单我们使用一个图片代替我们自己画的工作,这样我们没有使用双缓冲的可能了,因为只有通过指定width和height的空的图片才是可以修改的。像从jar文件中读取、从子节数组中创建的图片都是不可修改的。
实现游戏中的图片滚屏功能

 

 

 

 

 

 

 

下面是源代码
import javax.microedition.lcdui.display;
import javax.microedition.lcdui.form;
import javax.microedition.midlet.midlet;
import javax.microedition.midlet.midletstatechangeexception;

public class guessnumber extends midlet
{
    private display display;
    private welcomecanvas welcomecanvas;
    private form mainform;


    protected void startapp() throws midletstatechangeexception
    {
    
        initmidlet();

    }
   
    private void initmidlet()
    {
        display = display.getdisplay(this);
        mainform = new form("guess number");
        mainform.append("this is a game");
        welcomecanvas = new welcomecanvas(display,mainform);
        display.setcurrent(welcomecanvas);
    }

 
    protected void pauseapp()
    {
       
    }

 
    protected void destroyapp(boolean arg0) throws midletstatechangeexception
    {
       
    }

}

public class welcomecanvas extends canvas
{

    private display display;
    private displayable next;
    private timer timer = new timer();
    private int width = getwidth();
    private int height = getheight();
    private int i = height;
    private int left;
    private int incheight;
    private image image;
    private boolean going = true;

    public welcomecanvas(display display, displayable disp) {
        super();
        image = getimage("image.png");
        left = (width - image.getwidth()) / 2;
        incheight = image.getheight();
        this.display = display;
        this.next = disp;
        scrolltask st = new scrolltask();
        timer.schedule(st, 100, 100);

    }

    private image getimage(string filename)
    {
        try
        {
            return image.createimage("/" + filename);
        } catch (ioexception e)
        {
            return null;
        }
    }

    protected void paint(graphics arg0)
    {
        int oldcolor = arg0.getcolor();
        arg0.setcolor(255, 255, 255);
        arg0.fillrect(0, 0, width, height);
        arg0.setcolor(oldcolor);

        arg0.drawimage(image, left, i, graphics.left | graphics.top);

    }

    public void keypressed(int keycode)
    {
        if (!going)
            display.setcurrent(next);
    }

    private class scrolltask extends timertask
    {
        public void run()
        {

            if (i > height / 2)
            {
                i = i - incheight;
                repaint();
            } else
            {
                going = false;
                timer.cancel();
            }

        }
    }
}

扫描关注微信公众号