2 fasmort Fasmort 于 2017.01.10 14:45 提问

关于JAVA2D地形检测的问题

一个数组Point()型dixing_point[],每个point的x,y都是随机生成,算法思路是遍历所有point,如果角色坐标x,y在任何point的20范围以外,储存当前x,y的位置为save_x,save_y,如果进入任何point范围,则不作记录,反过来将x,y读取成之前记录的坐标。
我大概知道算法的漏洞在哪里,在系统判断point1坐标的时候,我可能进入了ponit2并记录了坐标。但循环如此之快,按理来说应该有可能实现。
现在的实际情况是:10个随机生成的障碍,总有一个且只有一个确实起作用了。其它9个障碍和空气一样。。。请求高手们告诉我为什么T_T
地形算法如下:

    private void checkDixing(){
        Thread checkThread = new Thread(new Runnable(){  
            public void run(){
                while(true){
                    for(Point i:dixing_point){
                        //System.out.println(i);
            if(Math.abs(me_x - i.x)<20 && Math.abs(me_y - i.y)<20){
                x=save_x;
                y=save_y;
            }
                else{
                    save_x=x;
                    save_y=y;
                }
                    }
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }}});
        checkThread.start();
        }

2个回答

bjjoy2009
bjjoy2009   2017.01.10 15:33
已采纳

对于x,y,save_x,save_y赋值,应该添加同步操作,因为是不同线程去处理,否则不能保证两个操作处理的是最新的x,y的值。

算法逻辑问题
循环里边,save_x和save_y,一定等与x,y,因为me_x和me_y一定会在一个障碍点的范围外。
x和y,又被save_x和save_y赋值后(如果me_x和me_y就是x,y的话)。

解决:感觉程序设计问题,不用线程去处理当前位置(因为任务移动有明确的事件,参考观察者模式去设计)
每当键盘操作产生新的人位置x,y,就判断是否在所有障碍点范围内。

Fasmort
Fasmort 谢谢。后来采用了if中直接检测四边的方式,去掉了else。
一年多之前 回复
bjjoy2009
bjjoy2009   2017.01.10 14:58

x,y两个参数是外部定义的,是否有其他线程给他们赋值,如果有,是否要做同步操作?
用java的volatile 修饰x,y,或者添加synchronized,保证在修改x,y时是最新的值。
程序不是很全,有点蒙的感觉啊,试试

Fasmort
Fasmort x,y是全局变量。x,y由键盘控制赋值,自加自减,用于移动。此算法里若进入障碍范围的一刹那会重新弹回上一个可记录的坐标点,应该不影响计算
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
射线与地形的碰撞检测
要检测物体是否和地形相交,你需要创建一些碰撞检测方法。一个有用的方法是使用射线和地形间的碰撞检测。例如,一个物体在场景中移动,你可以追踪一条指向物体移动方向的射线并获取它与地形间的距离。 要检测射线和地形的碰撞,你可以在射线和高度图之间进行碰撞检测,用来替代射线和地形网格(很多三角形)间的碰撞检测。碰撞检测分成两个部分,首先,你在射线上执行一个线性搜索知道你找到在地形上和地形之下的两个点。接着,你
【Unity3D】学习笔记(第7记)射线碰撞检测
unity中关于射线的有一个非常重要的函数类Physcics类,该类有LineCast和RayCast两种射线投射方式;第一种是以起点和射线方向为参数的投射,第二种是以起点和终点为参数的投射。既然是射线碰撞,那么被射物体必须有被碰撞组件(如BoxCollider等);
Java标准教程:Java 2D绘图--第3章 基本几何图形
在之前的课程中,您已经学习了绘图的基本概念,包括坐标系和graphic 对象创建的基本信息。现在,您将了解2D 绘图类的更详细的信息。本科展示如何使用Graphics2D 类绘制基本的几何图形和任意的形状,以及如何使用花哨的轮廓和填充风格展示图形。这些主题分为以下几个章节。l         绘制基本几何图形:本节展示如何创建标准的集合图形,例如点,线,曲线,圆弧,矩形和椭圆。l         绘制任意图形:本节展示如何直接使用基本几何图形组合绘制任意形状,使用GeneralPath 类进行
图形与java2D小结与经验
1.坐标系统是确定屏幕上每个点的一个方案。 2.GUI组件的左上角坐标是(0,0).一个坐标系统由x坐标和 y坐标构成。 3.坐标单元用像素来衡量。像素代表了显示器上的最小分辨单元。 4.在JAVA中,图形环境使得可以在屏幕上绘图。图形对象通过控制如何绘图的信息来管理图形环境。 5.Graphics对象包含了绘图方法,字体控制、颜色控制等等。 6.通常为响应一个事件而产生对paint方法
unity复杂地形检测角色是否在地面上(与地面碰撞)(着地)的方法
这个问题困扰了我几天,在我找到解决方案之前,尝试了以下方法1.射线,在角色坐标(一般是脚底),发射一根向下的射线,长度大约为0.2,这样是的确可以检测到玩家是否在地面的,但只适用于简单地形,如果你配置好了下落动画,那么用这种方法在斜面上往下走的话就会导致检测为false,如果有动画的话,就会播放浮空动画..这是由于角色往前走了一步时,刚体还没来得及让玩家因重力而下降足够的高度,导致射线不能射到斜面...
Java2D和控件UGI
Java2D和控件Java2D和控件Java2D和控件Java2D和控件Java2D和控件Java2D和控件Java2D和控件
计算机图形学 应用java2D和3D
华章机械工业出版社的那本,好不容易终于从华章把教师资源也给下载了,特此给需要的朋友们。
QC Vuforia 扩展追踪和智能地形介绍
一、扩展追踪 扩展追踪(Extended Tracking)是2.8.7版本SDK更新的。主要功能如下图: 正常识别图像,并加载模型。当摄像头此时脱离标志图像区域时会发生什么呢?没错,模型会消失。这是我们以前做AR时候需要注意的地方,那就是必须对准标示物(部分或者全部)。但是有了Extended Tracking功能之后,就不一定了。见下图: 从这两幅图,应该就能看出
Java2D图形绘制
图形处理类J2SE提供了一组应用程序接口(API),用于处理2D图形,主要功能如下:(1)绘制和填充简单及复杂的形状(2)裁剪、合成图形及透明度(3)对图形进行各种几何变换(4)对高级字体进行处理并对字符串进行格式化Java2D API中对图形处理的类:1.Graphics类2.Graphics2D类3.Shape类(抽象类)绘制几何图形 - 线段Java2D支持对图形的绘制,包括绘制线段,矩形,...
java2d参考大全
java2d参考大全java2d参考大全java2d参考大全java2d参考大全