OpenDanmaku icon indicating copy to clipboard operation
OpenDanmaku copied to clipboard

DanmakuItem.willHit()有问题

Open jiaoyang623 opened this issue 8 years ago • 2 comments

如果这个item没有被draw,它的mContainerWidth就是0,这导致willHit()总是返回true。一条航道只能画一个弹幕。

    public boolean willHit(IDanmakuItem runningItem) {
        if (runningItem.getWidth() + runningItem.getCurrX() > mContainerWidth) {
            return true;
        }

        if (runningItem.getSpeedFactor()>= mFactor) {
            return false;
        }

        float len1 = runningItem.getCurrX() + runningItem.getWidth();
        float t1 = len1 / (runningItem.getSpeedFactor() * DanmakuItem.sBaseSpeed);
        float len2 = t1 * mFactor * DanmakuItem.sBaseSpeed;
        if (len2 > len1) {
            return true;
        } else {
            return false;
        }

    }

jiaoyang623 avatar Jun 29 '17 03:06 jiaoyang623

建议写法是在调用willHit的时候把控件宽度传进来

if (!item.willHit(di, getWidth())) {
    return (i + ind) % mMaxRow;
}

修改接口willHit(IDanmakuItem runningItem, int viewWidth)和实现

    public boolean willHit(IDanmakuItem runningItem, int viewWidth) {
        // 修改成viewWidth*0.95是因为需要保持两条弹幕的间距
        if (runningItem.getWidth() + runningItem.getCurrX() > viewWidth * 0.95) {
            return true;
        }

        if (runningItem.getSpeedFactor() >= mFactor) {
            return false;
        }

        float len1 = runningItem.getCurrX() + runningItem.getWidth();
        float t1 = len1 / (runningItem.getSpeedFactor() * DanmakuItem.sBaseSpeed);
        float len2 = t1 * mFactor * DanmakuItem.sBaseSpeed;
        if (len2 > len1) {
            return true;
        } else {
            return false;
        }

    }

jiaoyang623 avatar Jun 30 '17 03:06 jiaoyang623

Yes i found this too!

Reone avatar Feb 25 '20 04:02 Reone