Kuangcp/JavaBase

View on GitHub
gui/src/main/java/com/github/kuangcp/tank/util/TankTool.java

Summary

Maintainability
F
1 wk
Test Coverage
package com.github.kuangcp.tank.util;

import com.github.kuangcp.tank.constant.DirectType;
import com.github.kuangcp.tank.domain.Brick;
import com.github.kuangcp.tank.domain.Hinder;
import com.github.kuangcp.tank.domain.Bullet;
import com.github.kuangcp.tank.domain.Tank;
import lombok.extern.slf4j.Slf4j;

import java.util.Objects;
import java.util.concurrent.TimeUnit;

@Slf4j
public class TankTool {

    /**
     * 碰撞检测函数 坦克之间
     * TODO 重构
     */
    public static boolean ablePass(Tank me, Tank you) {
        if (Objects.isNull(me) || Objects.isNull(you)) {
            return true;
        }
        if (!me.isAlive() || !you.isAlive()) {
            return true;
        }

        boolean flag = true;
        switch (you.getDirect()) {//对方 上下
            case 0:
            case 1:
                switch (me.getDirect()) {//己方 上下左右 分开
                    case 0: {
                        if ((you.getX() - 10 <= me.getX() - 10 &&
                                you.getX() + 10 >= me.getX() - 10 &&
                                you.getY() - 15 <= me.getY() - 15 &&
                                you.getY() + 15 >= me.getY() - 15)
                                ||
                                (you.getX() - 10 <= me.getX() + 10 &&
                                        you.getX() + 10 >= me.getX() + 10 &&
                                        you.getY() - 15 <= me.getY() - 15 &&
                                        you.getY() + 15 >= me.getY() - 15))//判断最前方两个点是否在对方坦克区域内
                        {
                            flag = false;
                        }
                        break;
                    }
                    case 1: {
                        if ((you.getX() - 10 <= me.getX() - 10 &&
                                you.getX() + 10 >= me.getX() - 10 &&
                                you.getY() - 15 <= me.getY() + 15 &&
                                you.getY() + 15 >= me.getY() + 15)
                                ||
                                (you.getX() - 10 <= me.getX() + 10 &&
                                        you.getX() + 10 >= me.getX() + 10 &&
                                        you.getY() - 15 <= me.getY() + 15 &&
                                        you.getY() + 15 >= me.getY() + 15))//判断最前方两个点是否在对方坦克区域内
                        {
                            flag = false;
                        }
                        break;
                    }
                    case 2: {
                        if ((you.getX() - 10 <= me.getX() - 15 &&
                                you.getX() + 10 >= me.getX() - 15 &&
                                you.getY() - 15 <= me.getY() - 10 &&
                                you.getY() + 15 >= me.getY() - 10)
                                ||
                                (you.getX() - 10 <= me.getX() - 15 &&
                                        you.getX() + 10 >= me.getX() - 15 &&
                                        you.getY() - 15 <= me.getY() + 10 &&
                                        you.getY() + 15 >= me.getY() + 10))//判断最前方两个点是否在对方坦克区域内
                        {
                            flag = false;
                        }
                        break;
                    }
                    case 3: {
                        if ((you.getX() - 10 <= me.getX() + 15 &&
                                you.getX() + 10 >= me.getX() + 15 &&
                                you.getY() - 15 <= me.getY() - 10 &&
                                you.getY() + 15 >= me.getY() - 10)
                                ||
                                (you.getX() - 10 <= me.getX() + 15 &&
                                        you.getX() + 10 >= me.getX() + 15 &&
                                        you.getY() - 15 <= me.getY() + 10 &&
                                        you.getY() + 15 >= me.getY() + 10))//判断最前方两个点是否在对方坦克区域内
                        {
                            flag = false;
                        }
                        break;
                    }
                    default:
                        break;
                }

            case 2:
            case 3://对方左右
                switch (me.getDirect()) {//己方 上下左右 分开
                    case 0: {
                        if ((you.getX() - 15 <= me.getX() - 10 &&
                                you.getX() + 15 >= me.getX() - 10 &&
                                you.getY() - 10 <= me.getY() - 15 &&
                                you.getY() + 10 >= me.getY() - 15)
                                ||
                                (you.getX() - 15 <= me.getX() + 10 &&
                                        you.getX() + 15 >= me.getX() + 10 &&
                                        you.getY() - 10 <= me.getY() - 15 &&
                                        you.getY() + 10 >= me.getY() - 15))//判断最前方两个点是否在对方坦克区域内
                        {
                            flag = false;
                        }
                        break;
                    }
                    case 1: {
                        if ((you.getX() - 15 <= me.getX() - 10 &&
                                you.getX() + 15 >= me.getX() - 10 &&
                                you.getY() - 10 <= me.getY() + 15 &&
                                you.getY() + 10 >= me.getY() + 15)
                                ||
                                (you.getX() - 15 <= me.getX() + 10 &&
                                        you.getX() + 15 >= me.getX() + 10 &&
                                        you.getY() - 10 <= me.getY() + 15 &&
                                        you.getY() + 10 >= me.getY() + 15))//判断最前方两个点是否在对方坦克区域内
                        {
                            flag = false;
                        }
                        break;
                    }
                    case 2: {
                        if ((you.getX() - 15 <= me.getX() - 15 &&
                                you.getX() + 15 >= me.getX() - 15 &&
                                you.getY() - 10 <= me.getY() - 10 &&
                                you.getY() + 10 >= me.getY() - 10)
                                ||
                                (you.getX() - 15 <= me.getX() - 15 &&
                                        you.getX() + 15 >= me.getX() - 15 &&
                                        you.getY() - 10 <= me.getY() + 10 &&
                                        you.getY() + 10 >= me.getY() + 10))//判断最前方两个点是否在对方坦克区域内
                        {
                            flag = false;
                        }
                        break;
                    }
                    case 3: {
                        if ((you.getX() - 10 <= me.getX() + 15 &&
                                you.getX() + 10 >= me.getX() + 15 &&
                                you.getY() - 15 <= me.getY() - 10 &&
                                you.getY() + 15 >= me.getY() - 10)
                                ||
                                (you.getX() - 10 <= me.getX() + 15 &&
                                        you.getX() + 10 >= me.getX() + 15 &&
                                        you.getY() - 15 <= me.getY() + 10 &&
                                        you.getY() + 15 >= me.getY() + 10))//判断最前方两个点是否在对方坦克区域内
                        {
                            flag = false;
                        }
                        break;
                    }
                    default:
                        break;
                }
        }
        //switch 语句之外:
        return flag;
    }

    /**
     * FIXME 使用坐标区间是否重合来判断 还需要考虑速度, 目前可以两个方向频繁切换发生重叠
     * <p>
     * 碰撞检测函数 坦克 和 障碍物
     */
    public static boolean ablePass(Tank t, Hinder h) {
        int hx = h.getWidth(), hy = h.getHeight();
        final int halfHeight = t.getHalfHeight();
        final int halfWidth = t.getHalfWidth();

        final int leftX = t.getX() - halfWidth;
        final int rightX = t.getX() + halfWidth;
        switch (t.getDirect()) {
            case DirectType.UP:
                final int upY = t.getY() - halfHeight;
                if (leftX >= h.getHx() && leftX <= h.getHx() + hx
                        && upY >= h.getHy() && upY <= h.getHy() + hy
                        || t.getX() >= h.getHx() && t.getX() <= h.getHx() + hx
                        && upY >= h.getHy() && upY <= h.getHy() + hy
                        || rightX >= h.getHx() && rightX <= h.getHx() + hx
                        && upY >= h.getHy() && upY <= h.getHy() + hy) {
                    return false;
                }
                break;
            case DirectType.DOWN:
                final int downY = t.getY() + halfHeight;
                if (leftX >= h.getHx() && leftX <= h.getHx() + hx
                        && downY >= h.getHy() && downY <= h.getHy() + hy
                        || t.getX() >= h.getHx() && t.getX() <= h.getHx() + hx
                        && downY >= h.getHy() && downY <= h.getHy() + hy
                        || rightX >= h.getHx() && rightX <= h.getHx() + hx
                        && downY >= h.getHy() && downY <= h.getHy() + hy) {
                    return false;
                }
                break;
            case DirectType.LEFT:
                if (t.getX() - halfHeight >= h.getHx() && t.getX() - halfHeight <= h.getHx() + hx
                        && t.getY() - halfWidth >= h.getHy() && t.getY() - halfWidth <= h.getHy() + hy
                        || t.getX() - halfHeight >= h.getHx() && t.getX() - halfHeight <= h.getHx() + hx
                        && t.getY() >= h.getHy() && t.getY() <= h.getHy() + hy
                        || t.getX() - halfHeight >= h.getHx() && t.getX() - halfHeight <= h.getHx() + hx
                        && t.getY() + halfWidth >= h.getHy() && t.getY() + halfWidth <= h.getHy() + hy) {
                    return false;
                }
                break;
            case DirectType.RIGHT:
                if (t.getX() + halfHeight >= h.getHx() - 2 && t.getX() + halfHeight <= h.getHx() + hx
                        && t.getY() + halfWidth >= h.getHy() && t.getY() + halfWidth <= h.getHy() + hy
                        || t.getX() + halfHeight >= h.getHx() - 2 && t.getX() + halfHeight <= h.getHx() + hx
                        && t.getY() >= h.getHy() && t.getY() <= h.getHy() + hy
                        || t.getX() + halfHeight >= h.getHx() - 2 && t.getX() + halfHeight <= h.getHx() + hx
                        && t.getY() - halfWidth >= h.getHy() && t.getY() - halfWidth <= h.getHy() + hy) {
                    return false;
                }
                break;
        }
        return true;
    }

    /**
     * 子弹和障碍物 碰撞监测
     */
    public static void judgeHint(Bullet s, Hinder h) {
        if (s.sx >= h.getHx() - 1 && s.sx <= h.getHx() + h.getWidth()
                && s.sy >= h.getHy() - 1 && s.sy <= h.getHy() + h.getHeight()) {
            s.alive = false;

            if (h instanceof Brick) {
                h.setAlive(false);
            }
        }
    }

    public static void yieldMsTime(long time) {
        yieldTime(time, TimeUnit.MILLISECONDS);
    }

    public static void yieldTime(long time, TimeUnit timeUnit) {
        try {
            timeUnit.sleep(time);
        } catch (InterruptedException e) {
            log.error("", e);
        }
    }
}