手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏19敌人可以被打死

简介: 手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏19敌人可以被打死

完善AttackAbleObject.java

AttackAbleObject添加isHit方法判断,当enemy未死时,是否被player攻击,考察2个条件:

dyn.hasHitBoxCollide(this):player的hitbox是否和enemy的hurtbox发生了重叠

dyn.isHitting():player是否正在攻击(player和enemy离得很近,但没有按下攻击键,也会触发第一个条件)

public abstract class AttackAbleObject extends GameObject{
    private Transform _transform;
    private int _cx1;
    private int _cx2;
    private int _cy1;
    private int _cy2;
    private boolean _hitting = false;
    private int _hp = 0;
    private int _strength;
    public AttackAbleObject(Transform trans, int hp, int strength,
                            int hurt_x, int hurt_y, int hurtscale_x, int hurtscale_y, int hitoffset_x1,
                            int hitoffset_y1, int hitoffset_x2, int hitoffset_y2) {
        super(trans,hurt_x,hurt_y,hurtscale_x, hurtscale_y);
        _hp = hp;
        _strength = strength;
        _transform = trans;
        this.setHitBoxOffsets(hitoffset_x1,hitoffset_y1,hitoffset_x2,hitoffset_y2);
    }
    public Shape getHitBox(){
        AffineTransform as = new AffineTransform();
        as.setTransform(_transform.getTransform());
        return as.createTransformedShape(new Rectangle(_cx1,_cy1,_cx2,_cy2));
    }
    public void setHitBoxOffsets(int x1,int y1, int x2, int y2){
        _cx1 = x1;
        _cx2 = x2;
        _cy1 = y1;
        _cy2 = y2;
    }
    public void setStrength(int strength){
        _strength = strength;
    }
    public int getStrength(){
        return _strength;
    }
    public void setHp(int hp){
        _hp = hp;
    }
    public int getHp(){
        return _hp;
    }
    public void takeDamage(AttackAbleObject dyn){
        setHp(getHp()-dyn.getStrength());
    }
    public boolean isHitting(){
        return _hitting;
    }
    public void setHitting(boolean hit){
        _hitting = hit;
    }
    public boolean hasHitBoxCollide(GameObject other){
        Area areaA = new Area(getHitBox());
        areaA.intersect(new Area(other.getHurtBox()));
        return !areaA.isEmpty() && Math.abs(getZ()-other.getZ())< Config.Z_FIGHT_DIST;
    }
    public boolean isDead(){
        return getHp()<=0;
    }
    public boolean isHit(AttackAbleObject dyn){
        if(!isDead()){
                if(dyn.hasHitBoxCollide(this) && dyn.isHitting()){
                    return true;
                }
                else{
                    return false;
                }
        }
        return false;
    }
}

enemy的update方法中判断是否被player攻击,如果是,减血(this.takeDamage(_player))

public class Enemy extends AttackAbleObject{
    @Override
    public void update(Graphics2D g){
        _animator.show(g);
        followPath();
        if(!this.isDead()){
            _animator.show(g);
            followPath();
            if(this.isHit(_player)){
                this.takeDamage(_player);
            }
        }
    }

同时player的handleAttack()方法中要设置正在攻击(setHitting(true))

public class Player extends AttackAbleObject{
    void handleAttack(){
        if(_attack){
            _hitDelayTimer -= Config.TIMER_DIF;
            if(_hitDelayTimer<=_hitBoxDelay){
                setHitting(true);
            }
            if(_hitDelayTimer<=0){
                _rdyToAttack = true;
                _attack = false;
        }

如果您迷路了,请参考完整源码:


项目源码


项目源码

目录
相关文章
|
11天前
|
Java
Java实现贪吃蛇游戏
本文介绍了如何使用Java实现一个简单的贪吃蛇游戏。
45 4
|
11天前
|
IDE Java API
Java游戏开发基础:从零开始制作一个简单的2D游戏
本文介绍了使用Java开发一个简单的2D避障游戏的基础流程。
51 10
|
8天前
|
前端开发 Java 程序员
菜鸟之路day02-04拼图小游戏开发一一JAVA基础综合项目
本项目基于黑马程序员教程,涵盖面向对象进阶、继承、多态等知识,历时约24小时完成。项目去除了登录和注册模块,专注于单机游戏体验。使用Git进行版本管理,代码托管于Gitee。项目包含窗体搭建、事件监听、图片加载与打乱、交互逻辑实现、菜单功能及美化界面等内容。通过此项目,巩固了Java基础并提升了实际开发能力。 仓库地址:[https://gitee.com/zhang-tenglan/puzzlegame.git](https://gitee.com/zhang-tenglan/puzzlegame.git)
33 6
|
11天前
|
Java 应用服务中间件 API
【潜意识Java】javaee中的SpringBoot在Java 开发中的应用与详细分析
本文介绍了 Spring Boot 的核心概念和使用场景,并通过一个实战项目演示了如何构建一个简单的 RESTful API。
29 5
|
11天前
|
前端开发 Java 数据库连接
【潜意识Java】深度解读JavaWeb开发在Java学习中的重要性
深度解读JavaWeb开发在Java学习中的重要性
24 4
|
11天前
|
SQL Java API
|
11天前
|
前端开发 Java 数据库连接
Java后端开发-使用springboot进行Mybatis连接数据库步骤
本文介绍了使用Java和IDEA进行数据库操作的详细步骤,涵盖从数据库准备到测试类编写及运行的全过程。主要内容包括: 1. **数据库准备**:创建数据库和表。 2. **查询数据库**:验证数据库是否可用。 3. **IDEA代码配置**:构建实体类并配置数据库连接。 4. **测试类编写**:编写并运行测试类以确保一切正常。
27 2
|
23天前
|
监控 JavaScript 数据可视化
建筑施工一体化信息管理平台源码,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
智慧工地云平台是专为建筑施工领域打造的一体化信息管理平台,利用大数据、云计算、物联网等技术,实现施工区域各系统数据汇总与可视化管理。平台涵盖人员、设备、物料、环境等关键因素的实时监控与数据分析,提供远程指挥、决策支持等功能,提升工作效率,促进产业信息化发展。系统由PC端、APP移动端及项目、监管、数据屏三大平台组成,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
|
25天前
|
监控 Java
java异步判断线程池所有任务是否执行完
通过上述步骤,您可以在Java中实现异步判断线程池所有任务是否执行完毕。这种方法使用了 `CompletionService`来监控任务的完成情况,并通过一个独立线程异步检查所有任务的执行状态。这种设计不仅简洁高效,还能确保在大量任务处理时程序的稳定性和可维护性。希望本文能为您的开发工作提供实用的指导和帮助。
85 17
|
1月前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者