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。
11 个月之前 回复
bjjoy2009
bjjoy2009   2017.01.10 14:58

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

Fasmort
Fasmort x,y是全局变量。x,y由键盘控制赋值,自加自减,用于移动。此算法里若进入障碍范围的一刹那会重新弹回上一个可记录的坐标点,应该不影响计算
11 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!