服务热线:13616026886

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

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

实现游戏中的文字滚屏功能

    在游戏开发的时候,我们可能会需要制作文字滚屏的效果。比如一行文字从屏幕下部滚动到屏幕的中间,在j2me中我们可以借助canvas类以及timer类来完成类似的效果。

    在j2me的高级的图形用户界面api中并没有提供类似滚屏的效果,因此我们需要自己通过canvas类来实现,我们应该在canvas类的paint()的方法中绘制我们要滚动的文字,基本代码如下所示:
    protected void paint(graphics arg0)
    {
        int oldcolor = arg0.getcolor();
        arg0.setcolor(255, 255, 255);
        arg0.fillrect(0, 0, width, height);
        arg0.setcolor(oldcolor);
        arg0.drawstring(welcome, left, i, graphics.left | graphics.top);

    }
当我们初始化一个canvas的子类的时候,paint()方法将被调用,我们需要它定时得往上滚动,因此我们可以借助timer和timertask类,我们在timertask类中通过实现public void run()方法来对文字的y坐标减小一定的数值。当文字到达屏幕的中间的时候停止减少并停止timer。在这里我是实现了一个内部类,当然你也可以实现成匿名内部类。
   private class scrolltask extends timertask
    {
        public void run()
        {
           
            if (i > height / 2)
            {
                i = i - fontheight;
                repaint();
            } else
            {
                going = false;
                timer.cancel();
            }

        }
    }
我们的welcomecanvas类扩展canvas并实现它的paint()方法,在welcomecanvas的构造器中我们把display和下一个displayable的对象传给他,并在其中完成一些具体尺寸的计算。
    public welcomecanvas(display display,displayable disp) {
        super();
        font font = font.getdefaultfont();
        left = (width - font.stringwidth(welcome))/2;
        fontheight = font.getheight();
        this.display = display;
        this.next = disp;
        scrolltask st = new scrolltask();
        timer.schedule(st, 100, 100);
               
    }
当文字滚动到中间后,用户可以通过按下任意键继续操作。因此我们需要keypressed()方法,如果是触摸屏的话你可以用pointerpressed()方法实现。
    public void keypressed(int keycode)
    {
        if(!going)
        display.setcurrent(next);
    }
下图是程序运行的结果,并给出源代码。其实很多类似的效果都可以通过这样的方法来实现。
实现游戏中的文字滚屏功能

 

 

 

 

 

 

 

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
    {
       
    }

}
/*
 * created on 2004-9-24
 *
 * todo to change the template for this generated file go to
 * window - preferences - java - code style - code templates
 */

/**
 * @author e2412c
 *
 * todo to change the template for this generated type comment go to window -
 * preferences - java - code style - code templates
 */
public class welcomecanvas extends canvas
{
    public static final string welcome = "press any key to start";
    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 fontheight;
    private boolean going = true;

    public welcomecanvas(display display,displayable disp) {
        super();
        font font = font.getdefaultfont();
        left = (width - font.stringwidth(welcome))/2;
        fontheight = font.getheight();
        this.display = display;
        this.next = disp;
        scrolltask st = new scrolltask();
        timer.schedule(st, 100, 100);
               
    }

    protected void paint(graphics arg0)
    {
        int oldcolor = arg0.getcolor();
        arg0.setcolor(255, 255, 255);
        arg0.fillrect(0, 0, width, height);
        arg0.setcolor(oldcolor);
        arg0.drawstring(welcome, 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 - fontheight;
                repaint();
            } else
            {
                going = false;
                timer.cancel();
            }

        }
    }
}

扫描关注微信公众号