超级玛丽(Java实现)

游戏效果截图

请添加图片描述

源码:

Class1:demon.java

public class demon {
   
   
    public static void main(String[] args){
   
   
     new MyFrame();
    }

}

Class2:MyFrame.java

import javazoom.jl.decoder.JavaLayerException;

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;

public class MyFrame extends JFrame implements KeyListener,Runnable{
   
   

    //用于储存所有的背景
    private List<BackGround> allBg = new ArrayList<>();
    //用于储存当前的背景
    private BackGround nowBg = new BackGround();
    //用于双缓存
    private Image offScreenImage = null;
    //马里奥对象
    private Mario mario = new Mario();
    //定义一个线程对象,用于实现马里奥的运动
    private Thread thread = new Thread(this);
    boolean isOk =false;
    public MyFrame(){
   
   
        //Login login = new Login("lining");
            //设置窗口的大小
            this.setSize(800,600);
            //设置窗口居中显示
            this.setLocationRelativeTo(null);
            //设置窗口的可见性
            this.setVisible(true);
            //设置点击窗口上的关闭键,结束程序
            this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            //设置窗口大小不变
            this.setResizable(false);
            //向窗口对象添加键盘监听器
            this.addKeyListener((KeyListener) this);
            //设置窗口名称
            this.setTitle("SuperMario");
            //初始化图片
            StaticValue.init();
            //初始化马里奥
            mario = new Mario(10,365);
            //创建全部的场景
            for(int i=1;i<=3;i++){
   
   
                allBg.add(new BackGround(i,i==3?true:false));

            }
            //将第一个场景设置为当前场景
            nowBg = allBg.get(0);
            mario.setBackGround(nowBg);
            JOptionPane.showMessageDialog(this,"靓仔你好,请开始你的表演");
            //绘制图像
            repaint();
            thread.start();
            try {
   
   
                new Music();
            } catch (FileNotFoundException e) {
   
   
                e.printStackTrace();
            } catch (JavaLayerException e) {
   
   
                e.printStackTrace();
            }

        }



    @Override
    public void paint(Graphics g) {
   
   
        if(offScreenImage == null){
   
   
            offScreenImage = createImage(800,600);
        }
        Graphics graphics = offScreenImage.getGraphics();
        graphics.fillRect(0,0,800,600);
        //绘制背景
        graphics.drawImage(nowBg.getBaImage(),0,0,this);
        //绘制敌人
        for(Enemy e:nowBg.getEnemyList())
        {
   
   
            graphics.drawImage(e.getShow(),e.getX(),e.getY(),this);
        }
        //绘制障碍物
        for(Obstacle ob:nowBg.getObstacleList())
        {
   
   
            graphics.drawImage(ob.getShow(), ob.getX(), ob.getY(), this);
        }
        //绘制城堡
        graphics.drawImage(nowBg.getTower(),600,130,this);
        //绘制旗杆
        graphics.drawImage(nowBg.getGan(),500,220,this);
        //绘制马里奥
        graphics.drawImage(mario.getShow(), mario.getX(), mario.getY(), this);
        //绘制分数
        Color c = graphics.getColor();
        graphics.setColor(Color.red);
        graphics.setFont(new Font("宋体",Font.BOLD,40));
        graphics.drawString("当前的分数为"+mario.getScore(),300,100);
        graphics.setColor(Color.yellow);
        //将图像绘制到窗口中
        g.drawImage(offScreenImage,0,0,this);
    }

    @Override
    public void keyTyped(KeyEvent e) {
   
   

    }

    @Override
    public void keyPressed(KeyEvent e) {
   
   
        //向右移动
        if(e.getKeyCode() == 39)
            mario.rightMove();
        //向左移动
        if(e.getKeyCode() == 37)
            mario.leftMove();
        //跳跃
        if(e.getKeyCode() == 38)
        {
   
   
            mario.jump();
        }

    }

    @Override
    public void keyReleased(KeyEvent e) {
   
   
        //向左停止
        if(e.getKeyCode() == 37)
            mario.leftStop();
        //向右停止
        if(e.getKeyCode() == 39)
            mario.rightStop();

    }

    @Override
    public void run() {
   
   
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值