⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 collidedemo.java

📁 J2ME MIDP 2.0 无线设备编程的一些源码
💻 JAVA
字号:
//collideDemo.java file
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.game.*;
import java.util.*;

public class collideDemo extends MIDlet implements CommandListener
{
    private Command exitCommand,actCommand;
    private DemoCanvas canvas;
    private DemoTask task ;
    private Timer timer;
    public collideDemo()
    {//创建命令,画布和定时器
        exitCommand =new Command("Exit",Command.EXIT,1);
        actCommand =new Command("Action",Command.SCREEN,1);
        canvas =new DemoCanvas();
        canvas.addCommand(actCommand);
        canvas.addCommand(exitCommand);
        canvas.setCommandListener(this);
        timer = new Timer();
        task = new DemoTask(canvas);
    }
    protected void startApp(  ) 
    {//显示画布并开始游戏执行
        Display.getDisplay(this).setCurrent(canvas);
        timer.schedule(task, 0,100);
    }

    protected void pauseApp(  )
    {
        timer.cancel();
    }

    protected void destroyApp( boolean p1 )
    {
    }

    public void commandAction(Command c,Displayable d)
    {
        if (c ==exitCommand)
        {
            destroyApp(false);
            notifyDestroyed();
        }
        else if (c ==actCommand)
            canvas.Action();
    }
    public class DemoCanvas extends GameCanvas
    {
        private Graphics g;
        private TiledLayer backLayer0;//背景图层
        private Image backImage0,objImage0,objImage1;//保存图像
        private Sprite objSprite0,objSprite1;//精灵
        private int aniCounter =0;//计数器
        private final int left2rightSeq[]={0, 1, 2, 3};//小球0的动画序列
        private final int right2leftSeq[]={3, 2, 1, 0};//小球1的动画序列
        private LayerManager layerMan;//图层管理对象
        private int moveMode =0;//移动模式,0:移动小球0,1:移动小球1
        private int xDirection=0, yDirection=0;//移动距离
        //记录图层backLayer0的每个单元对应的图像块序号
        private byte[ ][ ] backMap= 
            {{1, 2, 2, 2, 2, 2, 2, 4},
             {6, 0, 0, 0, 0, 0,12, 7},
             {6, 0, 0, 0,10, 0, 0, 7},
             {6, 0, 0, 0, 0, 0, 0, 7},
             {6, 0, 0, 0, 0, 0,11, 7},
             {6, 0, 0, 0, 9, 0, 0, 7},
             {6, 0,11, 0, 0, 0, 0, 7},
             {5, 3, 3, 3, 3, 3, 3, 8}};
        public DemoCanvas() 
        {
            super(true);
            g = getGraphics();//得到作图对象
            try 
            {//装入图像
                backImage0 = Image.createImage("/collide_bk.png");
                objImage0 = Image.createImage("/collide1.png");
                objImage1 = Image.createImage("/collide2.png");
            } catch (Exception e) {}
            //创建图层,分块大小为:17×17,单元格数量为:6×6
            backLayer0 = new TiledLayer(8, 8, backImage0, 17, 17);
            for(int y=0;y<8;y++)
            {//逐个设置每个单元格的图像,标记为0的单元格表示不处理
                for(int x=0;x<8;x++)
                    backLayer0.setCell(x, y, backMap[y][x]);
            }
            objSprite0 = new Sprite(objImage0, 17,17);
            objSprite0.setFrameSequence(left2rightSeq);
            objSprite0.defineCollisionRectangle(0, 0, 17, 17);
            objSprite0.move(20,20);
            
            objSprite1 = new Sprite(objImage1, 17,17);
            objSprite1.setFrameSequence(right2leftSeq);
            objSprite1.defineCollisionRectangle(0, 0, 17, 17);
            objSprite1.move(40,40);

            layerMan = new LayerManager();
            layerMan.append(objSprite0);
            layerMan.append(objSprite1);
            layerMan.append(backLayer0);
        }

        public void BallAction0()
        {//直接修改单元格内的图像
            objSprite0.nextFrame();//动画效果
            objSprite0.move(xDirection, yDirection);//移动
            //检测碰撞,不采用象素级检查
            if( objSprite0.collidesWith(backLayer0,false)
                || objSprite0.collidesWith(objSprite1,false) )
            {//如果移动后和其他背景或另一个物体发生碰撞则返回到原来位置
                objSprite0.move(-xDirection, -yDirection);
            }
        }
        public void BallAction1()
        {//对第一球进行滚动
            objSprite1.nextFrame();//动画效果
            objSprite1.move(xDirection, yDirection);//移动
            //检测碰撞,采用象素级检查
            if( objSprite1.collidesWith(backLayer0,true) 
                || objSprite1.collidesWith(objSprite0,true) )
            {//如果移动后和其他背景或另一个物体发生碰撞则返回到原来位置
                objSprite1.move(-xDirection, -yDirection);
            }
        }
        public void CheckKey()
        {
            int keyState = getKeyStates();
            //判断AB键是否被按下,用于在不同的小球间切换
            if((keyState & GAME_A_PRESSED) !=0)
                moveMode = 0;
            else if((keyState & GAME_B_PRESSED) !=0)
                moveMode = 1;
            //判断上下左右键是否被按下,修改移动距离
            if((keyState & UP_PRESSED) !=0)
            {
                yDirection=-2;
            }
            else if((keyState & DOWN_PRESSED) !=0)
            {
                yDirection=2;
            }
            if((keyState & LEFT_PRESSED) !=0)
            {
                xDirection=-2;
            }
            else if((keyState & RIGHT_PRESSED) !=0)
            {
                xDirection=2;
            }
        }
        //执行游戏功能        
        public void Action()
        {
            aniCounter ++;//增加计时器
            g.setColor(0X00FFFFFF);
            g.fillRect(0,0, 136, 136);
            CheckKey();
            if( moveMode ==0)
                BallAction0();
            else
                BallAction1();
            xDirection = yDirection =0;
            layerMan.paint(g,0,0);
            //刷新屏幕
            flushGraphics();
        }
    }
    public class DemoTask extends TimerTask
    {
        private DemoCanvas canvas;
        public DemoTask(DemoCanvas can)
        {
            canvas = can;
        }
        public void run()
        {
            canvas.Action();
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -