马里奥线程小游戏实现效果如下:
马里奥实现思路:
首先分包: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();
}
}
今天暂时写到这吧,未完待续。
}