马里奥杂谈

来源:互联网 发布:粒子群算法伪代码 编辑:程序博客网 时间:2024/06/02 18:35

马里奥线程小游戏实现效果如下:
这里写图片描述

马里奥实现思路:
首先分包:ui(界面),mario.bean(马里奥人物包),costant(配置文件常量),until(工具包),music(音频,声效)

这里写图片描述

第一部写界面:
什么添加组件在此也就不多说了,里面一个重要的知识点就是二级缓冲区的创建,为什么要创建这个,动画都是通过界面刷新,实现为了不出现闪屏的问题,创建缓存取,把所有的图片放在缓冲区,一次性画出来代码如下。

这里写代码片public void paint(Graphics g) {        /** 第一步创建二级缓冲 **/        Image bg = createImage(this.getWidth(), this.getHeight());        /** 获取背景画笔 */        Graphics bg_g = bg.getGraphics();        //画背景图    bg_g.drawImage(backimg.img, backimg.x, backimg.y, null);        //一种类型的东西放在list的集合中,通过遍历一个个画出来        for (int i = 0; i < MyCantent.list.size(); i++) {            bg_g.drawImage(MyCantent.list.get(i).img, MyCantent.list.get(i).x,                    MyCantent.list.get(i).y, MyCantent.list.get(i).width,                    MyCantent.list.get(i).height, null);        }        for (int i = 0; i < MyCantent.bulists.size(); i++) {            Bullit bullit = MyCantent.bulists.get(i);            bg_g.drawImage(bullit.img, bullit.x, bullit.y, bullit.width,                    bullit.height, null);        }        bg_g.drawImage(mario.img, mario.x, mario.y, mario.width, mario.height,                null);        bg_g.drawString("金币数目" + MyCantent.coin_number, 50, 50);        g.drawImage(bg, 0, 0, null);    }

第二部:实现游戏人物的一些功能:移动 跳,发子弹

第一:创建一mario类,继承Thread,也可以实现Runnabel(接口),本人推荐实现接口,单继承多实现。重写父类run方法。
思路:怎么判断人物的移动的方向呢?说到判断肯定是boolean, 向左isLeft,向右isRight,跳isUp,要移动改变的是x,y坐标值

这里写代码片public class Test {  public class Mario{    int x,y,speed;    //怎么去改变布尔值,要加一个键盘监听,下面在慢慢道来。    boolean isRight,isLeft,isUp,isJump;    //图片    Image img = new ImageIcon("路径").getImage();    public void run(){        while(true){        //线程休眠,这里会报一个异常,不要抛,最好抓。抛要层层向上抛,很麻烦            if(isRight){                x+=speed;                    //改变人物图片                img =  new new ImageIcon("路径").getImage();            }else if(isLeft){                x-=speed;                img = new ImageIcon("路径").getImage();            }else if(isUp){                //向上其实是一个跳的功能,写一个方法跳                //没有跳,进来                if(!isJump){                 //为了避免连跳,进来就改变布尔值                isJump = true;                jump();            }        }               try{                    Thread.sleep(30);                }catch(InterruptedException e){                    e.printStackTrace();            }        }    }}  public void jump(){            //跳是线程,用匿名内部类开个线程    new Thread(){        public void run(){            while(true){                for(int i=0; i<120; i++){                    y+=speed;                    Untli.MyThread.sleep(10);                }                for(int i=0;i<120;i++){                    y-=speed;                    Untli.MyThread.sleep(10);            }                //为了不让人物连跳,加个boolean值                    isJump=false;                Untli.MyThread.sleep(10);            }        }       }.start();}        //程序休眠抽取出来,创建工具类,工具类的的特点:不能new,方法是静态的,通用性,``  public class Until{            //构造私有的            private Until(){}    public void myThreadSleep(int  mix){        Thread.sleep(mix);        }catch(InterruptedException e){            e.printStackTrace();        }    }        今天暂时写到这吧,未完待续。}
0 0
原创粉丝点击