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

📄 workcanvas.java

📁 实现.多个.mid声音的播放,和图片的移动.可以手动控制图片的移动方向
💻 JAVA
字号:
import java.io.InputStream;

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;

import javax.microedition.media.Manager;
import javax.microedition.media.MediaException;
import javax.microedition.media.Player;
import javax.microedition.media.PlayerListener;

/**
 * @author XiaYaoxing Email: xia198507@126.com
 *
 */
public class WorkCanvas extends Canvas implements Runnable,PlayerListener{
    
    public WorkMIDlet midlet;
    
    /**坦克图片*/
    public Image imgTitle;
    
    /**声音数组*/
    public Player[] sounds;		
    
    /**声音索引*/
    public int soundIndex;
    
    /**场景索引*/
    public int frameIndex;
    
    /**坦克图片的位置X*/
    public int tankPosX;
    
    /**坦克图片的位置Y*/
    public int tankPosY;
    
    /**屏幕宽度*/
    public int width;
    
    /**屏幕高度*/
    public int height;
    
    /**图片宽度*/
    public int imgWidth;
    
    /**图片高度*/
    public int imgHeight;
    
    /**返回命令*/
    public Command commReturn;
    
    Font font = Pub.FONT_LARGE;
    int fontHeight = font.getHeight();
    
    public WorkCanvas(WorkMIDlet midlet){
        setFullScreenMode(true);			//设置全屏显示
        this.midlet = midlet;
        width = getWidth();
//        height = 320;
        height = getHeight();
        sounds = new Player[2];
        loadResource();  					//加载资源
        imgWidth = imgTitle.getWidth();
        imgHeight = imgTitle.getHeight();
        tankPosX = width - imgWidth >> 1;	//图片的初始位置
        tankPosY = height - imgHeight >> 1;
        speed = 10;
        new Thread(this).start();
    }

    /**
     * 加载资源
     */
    private void loadResource() {
        String[] rscMid = {"/newWS.mid","/sheDiao.mid"};
        InputStream is = null;
        try {
            if (imgTitle == null) {
                imgTitle = MyUtil.getImage("/title.jpg");
                System.out.println("/title.jpg");
            }
            for(int i = 0; i < sounds.length; ++i){
//                if(sounds[i] == null){		//声音播放一次后不为空,但是已经不能播放
                    is = getClass().getResourceAsStream(rscMid[i]);
                    sounds[i] = Manager.createPlayer(is,"audio/midi");	//创建声音资源
                    sounds[i].addPlayerListener(this);					//注册声音事件监听
//                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }     
    }

    protected void paint(Graphics g) {
        g.setColor(0xffffff);
        g.fillRect(0,0,width,height);
        g.setFont(font);
        switch(frameIndex){
        	case 0:
        	    g.drawImage(imgTitle,tankPosX,tankPosY,0);
        	    break;
        	case 1:
        	    drawOption(g);		//绘制声音选项
        	    break;
        }
        g.setColor(0);
        g.drawString("返回",width - font.stringWidth("返回"),height - fontHeight,0);
    }
    
//    /**是否正在运动*/
//    private boolean moving;
    
    /**按键处理*/
    public void keyPressed(int keyCode){
        switch(frameIndex){
        	case(0):
        	    switch(keyCode){
        			case Pub.KEY_UP:
        			    direction = UP;		//按方向键时改变图片运动方向
        				break;
        			case Pub.KEY_DOWN:
        			    direction = DOWN;
        				break;
        			case Pub.KEY_LEFT:
        			    direction = LEFT;
        				break;
        			case Pub.KEY_RIGHT:
        			    direction = RIGHT;
        				break;
        			case Pub.SOFT_KEY_RIGHT:
                	    midlet.setCanvas(new SelectCanvas(midlet));			//返回
                	    break;
//        			case Pub.KEY_FIRE:		
//        			    moving = !moving;		//按开火键 暂停/恢复 运动
//        				System.out.println("moving = " + moving);
//        				break;
        	    }
        		break;
        	case(1):
        		switch(keyCode){
        			case Pub.KEY_UP:
        			case Pub.KEY_DOWN:   
        			case Pub.KEY_LEFT:		    
        			case Pub.KEY_RIGHT:
        			    soundIndex = soundIndex == 0 ? 1 : 0;
        				break;
        			case Pub.KEY_FIRE:
        			    try {

        			        sounds[soundIndex].start();	
        			        loadResource();	//注意,声音播放完一次后必须再加载资源才能播放第二次
        			        System.gc();
//                            midlet.setCanvas(new SelectCanvas(midlet));

                        } catch (MediaException e) {
                            e.printStackTrace();
                        }
                        break;
        			case Pub.SOFT_KEY_RIGHT:
                	    midlet.setCanvas(new SelectCanvas(midlet));			//返回
                	    break;
        		}
        		break;
        }
        repaint();
        serviceRepaints();
    }
    
    /**
     * 绘制声音选项
     */
    private void drawOption(Graphics g) {

        
        
        int optionWidth = font.stringWidth("声音1");
        
        int optionX = width - optionWidth >> 1;					//选项的X坐标
        String[] options = {"声音1","声音2"};
        int length = options.length;
        g.setColor(0);
        for(int i = 0;i < length;i ++){
            if(i == soundIndex){					//如果当前选项被选中,则显示红色
                g.setColor(0xff0000);
            }
            g.drawString(options[i],optionX,100 + (fontHeight + 5) * i,0);
            g.setColor(0);
        }
        
    }

    /**是否已经退出*/
    public boolean running = true;
    
    /**坦克移动的方向*/
    public int direction;
    
    /**图片运动速度*/
    public int speed;
    
    public void run() {
        long temp;
        while(running){
            
            temp = System.currentTimeMillis();
            switch(direction){
            	case UP:
            	    tankPosY -= speed;
            	    if(tankPosY <= 0){
            	        direction = DOWN;
            	    }
            	    break;
            	case DOWN:
            	    tankPosY += speed;
            	    if(tankPosY + imgHeight + speed >= height){
            	        direction = UP;
            	    }
            	    break;
            	case LEFT:
            	    tankPosX -= speed;
            	    if(tankPosX <= 0){
            	        direction = RIGHT;
            	    }
            	    break;
            	case RIGHT:
            	    tankPosX += speed;
            	    if(tankPosX + imgWidth >= width){
            	        direction = LEFT;
            	    }
            	    break;
            }
            try {
                Thread.sleep(100 - (System.currentTimeMillis() - temp));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            
            repaint();
            serviceRepaints();
        }
    }
    
    /**设置场景*/
    public void setFrame(int frame){
        frameIndex = frame;
    }

    /**监听播放器发生的事件*/
	public void playerUpdate(Player p, String event, Object arg2) {
		System.out.println("有声音事件发生");
		if(PlayerListener.END_OF_MEDIA.equals(event)){
			System.out.println("声音播放完毕");
			midlet.setCanvas(new SelectCanvas(midlet));
		}
	}


}

⌨️ 快捷键说明

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