使用 dda 算法调试光线投射 地图

如何解决使用 dda 算法调试光线投射 地图

我正在使用爸爸算法编写重铸游戏。我花了几个小时,但我无法调试显然返回错误值的代码。有时它会错过碰撞,或者为十几个不同的值返回相同的输出。如果有人可以查看我的代码并帮助我修复它,我会很高兴。

重铸代码

i - 光线索引(从 0 到 screen_width )

override func touchesEnded(_ touches: Set<UITouch>,with event: UIEvent?) {
        super.touchesEnded(touches,with:event)
        var delta = CGPoint(x: 0,y: 0)
        guard touches.first != nil else { return }
        if let touch = touches.first,let node = myGV.currentGem,node.isMoving == true {
            let touchLocation = touch.location(in: myGV.guessBar!)
            let touchLocation2 = touch.location(in: self)

地图

数字代表颜色(0为空格)

void Raycast::ray( int i,Player &player ) {
    double x = player.position.x,y = player.position.y;

    double theta = ( (double)player.angle - 100.0f * (double)i / (double)SCREEN_WIDTH ) * DEG2RAD;
    double sinus = sin(theta),cosinus = cos(theta);

    double deltaX = 1 / sinus,deltaY = 1 / cosinus ;
    if( sinus == 0 ) deltaX = 0; if( cosinus == 0 ) deltaY = 0;
    

    double distX,distY;
    float stepX,stepY;

    if( sinus > 0 ) {
        stepX = 1;
        distX = ( (double)floor(y) - y + 1.0f ) * deltaX;
    } else {
        stepX = -1;
        distX = ( (double)floor(y) - y ) * deltaX;
    }

    if( cosinus > 0 ) {
        stepY = 1;
        distY = ( (double)floor(x) - x + 1.0f ) * deltaY;
    } else {
        stepY = -1;
        distY = ( (double)floor(x) - x ) * deltaY;
    }

    bool hit = true;
    while( hit ) {
        if( distX < distY ) {
            distX += deltaX;
            y += stepX;
        } else {
            distY += deltaY;
            x += stepY;
        }
        if( mapa[(int)x][(int)y] > 0 ) hit = 0;
    }

    double dist = sqrt( pow(player.position.x-x,2) + pow(player.position.y-y,2) );
    double len = SCREEN_HEIGHT / (2 * dist  );
    drawSegment( i,len,mapa[(int)y][(int)x] );
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?