JAVA-制作小游戏期末实训

源码

import game.frame.Frame;

public class App {
    public static void main(String[] args) {
        System.out.println("starting......");
        new Frame();
    }
}
package game.controller;

import game.model.Enemy;

public class EnemyController implements Runnable{
    private Enemy enemy;
    public EnemyController(Enemy enemy) {
        this.enemy = enemy;
    }

    @Override
    public void run() {
        while (true) {
            try {
                if (enemy.getStatus() == 1 || enemy.getStatus() == -1) {
                    enemy.setStatus(-2);        //  站立状态修改成左跑
                }
                if (enemy.getX() <= -100) {
                    enemy.setStatus(2);
                }
                if (enemy.getX() >= 300) {
                    enemy.setStatus(-2);
                }
                Thread.sleep(50);
            } catch (InterruptedException e){
                e.printStackTrace();
            }
        }
    }
}
package game.frame;
import game.model.BackGround;
import game.model.Enemy;
import game.model.Person;
import javax.swing.JFrame;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.util.Date;
import java.util.List;

public class Frame extends JFrame implements Runnable, KeyListener {
    private Person person;  //  添加人物
    private Date startDate = new Date();    //  游戏开始时间
    private BackGround nowBackGround;       //  当前场景
    public Frame() {
        setTitle("game");   //  窗体标题
        setSize(720, 480);  //  窗体大小
        //  居中显示
        Toolkit toolkit = Toolkit.getDefaultToolkit();  //  获取屏幕工具包
        int width = (int)toolkit.getScreenSize().getWidth();    //  获取屏幕宽度
        int hight = (int)toolkit.getScreenSize().getHeight();    //  获取屏幕高度
        int x = (width - 720) / 2;
        int y = (hight - 480) / 2;
        this.setLocation(x, y);

        //  初始化场景
        nowBackGround = new BackGround(1);

        setVisible(true);   //  设置可见
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);     //  程序随窗体关闭而关闭

        //  监听键盘
        this.addKeyListener(this);

        //  多线程
        Thread thread = new Thread(this);
        thread.start();

        //  创建人物
        person = new Person(0, 250, nowBackGround);
    }

    //  多线程任务
    @Override
    public void run() {
        while (true) {
            try {
                this.person.applyGravity();
                this.repaint(); //  循环重新绘画窗口
                Thread.sleep(50);   //  线程休息50毫秒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    @Override
    public void paint(Graphics g) {
        //  创建图片对象
        BufferedImage image = new BufferedImage(720, 480, BufferedImage.TYPE_3BYTE_BGR);
        //  获取图像画笔
        Graphics graphics = image.getGraphics();
        //  图像画笔绘画图像
        graphics.drawImage(nowBackGround.getShowImage(), 0, 0, this);
        //  添加时间
        long dif = new Date().getTime() - startDate.getTime();
        //  绘画时间
        graphics.drawString("时间 " + (dif/1000/60) + " : " + (dif/1000%60), 600, 60);
        //  绘画击杀数
        graphics.drawString("击杀数: " + person.getKillNum(), 600, 80);
        //  绘画敌人
        List<Enemy> allEnemy = nowBackGround.getAllEnemy();
        for (Enemy enemy : allEnemy) {
            graphics.drawImage(enemy.getShowImage(), enemy.getX(), enemy.getY(), this);
        }
        //  绘画人物
        graphics.drawImage(person.getShowImage(), person.getX(), person.getY(), this);
        //  窗体画笔会话图像
        g.drawImage(image, 0, 0, this);

        //  是否进入下一场景
        if (nowBackGround.isPass(person) && nowBackGround.hasNext()) {
            nowBackGround = nowBackGround.next();
            person.setX(0);
            person.setBackGround(nowBackGround);    //  重新设置场景
        }
    }

    @Override       //  键入某个键时调用
    public void keyTyped(KeyEvent e) {
        //TODO
    }
    @Override       //  按下某个键时调用
    public void keyPressed(KeyEvent e) {
        int keyCode = e.getKeyCode();
        if (keyCode == 68) {    // 按下D时右跑
            this.person.rightRun();
        }
        if (keyCode == 65) {    // 按下A时左跑
            this.person.leftRun();
        }
        if (keyCode == 75) {    // 按下K时跳跃
            this.person.jump();
        }
        if (keyCode == 74) {    // 按下J时攻击
            this.person.attack();
        }
        if (keyCode == 76) {    // 按下L时闪现
            this.person.flash();
        }
        //  当按下A或D键且人物处于跳跃状态时,设置方向改变请求为true
        if (person.getStatus() == 3 || person.getStatus() == -3) {
            if (keyCode == 68) {
                person.setJumpDirectionChangeRequested(true);
                person.setJumpMoveDirection(1);
            } else if (keyCode == 65) {
                person.setJumpDirectionChangeRequested(true);
                person.setJumpMoveDirection(-1);
            }
        }
    }
    @Override       //  释放某个键时调用
    public void keyReleased(KeyEvent e) {
        int keyCode = e.getKeyCode();
        if (keyCode == 68) {    //  释放D时停止右跑
            this.person.stopRightRun();
        }
        if (keyCode == 65) {    //  释放A时停止左跑
            this.person.stopLeftRun();
        }
    }
}
package game.model;

import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;

import game.util.StaticValue;

public class BackGround {
    private BufferedImage showImage = null;     //  显示的场景图片
    private int sort;       //  序号
    private int nextSort;    //  下一个场景序号
    private List<Enemy> allEnemy = new ArrayList<>();   //  敌人

    public BackGround(int sort) {
        this.sort = sort;
        create();
    }

    public void create() {  //  根据sort选择场景
        if (this.sort == 1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拾柒SHY

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值