Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 射线投射AS3_Arrays_Actionscript 3_Grid_Typeerror_Raycasting - Fatal编程技术网

Arrays 射线投射AS3

Arrays 射线投射AS3,arrays,actionscript-3,grid,typeerror,raycasting,Arrays,Actionscript 3,Grid,Typeerror,Raycasting,我决定我要学习射线铸造,并尝试一下。虽然我决不是一个好的程序员,但我只是认为尝试扩展我的知识会很好,而且这在某些方面可能是有用的:P我一直在尝试遵循这本指南:它实际上是一本很好的指南,但我恐怕我在某个地方出了差错,不知道在哪里。我的代码: package rayCast{ import flash.display.MovieClip; import flash.events.Event; import flash.events.MouseEvent; import

我决定我要学习射线铸造,并尝试一下。虽然我决不是一个好的程序员,但我只是认为尝试扩展我的知识会很好,而且这在某些方面可能是有用的:P我一直在尝试遵循这本指南:它实际上是一本很好的指南,但我恐怕我在某个地方出了差错,不知道在哪里。我的代码:

package rayCast{
    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.display.Sprite;

    public class Main extends MovieClip{
        public var charPosX:Number = new Number(192);
        public var charPosY:Number = new Number(192);
        public static var charFov:Number = new Number(60);
        public var charPov:Number = new Number(45);
        public static var charHeight:Number = new Number(32);
        public static var projCharRel:Number = new Number(476);
        public static var rayAngle:Number = new Number(60/200);
        public var gridMap:Array = new Array();
        public var screen:Sprite = new Sprite();

        public function Main(){
            gridMap = [[1,1,1,1,1,1,1,1],[1,0,0,0,0,0,0,1],[1,0,0,1,0,0,0,1],[1,0,0,0,0,0,0,1],[1,0,0,0,1,0,0,1],[1,0,0,0,0,0,0,1],[1,0,0,0,0,0,1,1],[1,1,1,1,1,1,1,1]];
            //addEventListener(Event.ENTER_FRAME, update);
            screen.graphics.lineStyle(1, 0x000000);
            stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownE);
        }

        public function mouseDownE(e:MouseEvent):void{
            for( var i:int =0; i < 200; i++){
                var Ya:Number = new Number();
                var Xb:Number = new Number();
                var oldXb:Number = new Number();
                var oldYa:Number = new Number();
                if(i+charPov-30 > 180){
                    Ya = -64;
                    oldYa = Math.floor(charPosY/64) * (64) -1;
                }
                else{
                    Ya = 64;
                    oldYa = Math.floor(charPosY/64) * (64) + Ya;
                }
                if(charPov > 270 || charPov < 90){
                    Xb = 64;
                    oldXb = Math.floor(charPosX/64) * (64) + Xb;
                }
                else{
                    Xb = -64;
                    oldXb= Math.floor(charPosX/64) * (64) -1;
                }

                var oldXa:Number = charPosX + (charPosY-oldYa)/Math.tan(i+charPov-30);
                var oldYb:Number = charPosX + (charPosX-oldXb)*Math.tan(i+charPov-30);
                var hit:Boolean = false;
                var Xa:Number = 64/Math.tan(i+charPov-30);
                var Yb:Number = 64*Math.tan(i+charPov-30);
                var newYa:Number;
                var newXa:Number;
                var newYb:Number;
                var newXb:Number;
                var aDistance:Number;
                var bDistance:Number;

                while(hit != true){
                    newYa = oldYa + Ya;
                    newXa = oldXa + Xa;
                    if(gridMap[Math.floor(newYa/64)-1][Math.floor(newXa/64)-1] == 1){
                        aDistance = Math.abs(charPosX - newXa)/Math.cos(i+charPov-30);
                        hit=true;
                    }
                    else{
                        oldYa = newYa; oldXa = newXa;
                    }
                }
                hit = false;
                while(hit != true){                 
                    newYb = oldYb + Yb;
                    newXb = oldXb + Xb;
                    if(gridMap[Math.floor(newYb/64)-1][Math.floor(newXb/64)-1] == 1){
                        bDistance = Math.abs(charPosX - newXb)/Math.cos(i+charPov-30);
                        hit=true;
                    }
                    else{
                        oldYb = newYb; oldXb = newXb;
                    }
                }
                if(aDistance >= bDistance){
                    screen.graphics.moveTo(i, 90 - (64 / bDistance * 277)/2)
                    screen.graphics.lineTo(i, 90 + (64 / bDistance * 277)/2)
                }
                else{
                    screen.graphics.moveTo(i, 90 - (64 / aDistance * 277)/2)
                    screen.graphics.lineTo(i, 90 + (64 / aDistance * 277)/2)
                }

            }
        }
    }
}
package-rayCast{
导入flash.display.MovieClip;
导入flash.events.Event;
导入flash.events.MouseEvent;
导入flash.display.Sprite;
公共类Main扩展了MovieClip{
公共变量charPosX:Number=新编号(192);
公共变量charPosY:编号=新编号(192);
公共静态变量charFov:Number=新编号(60);
公共var charPov:编号=新编号(45);
公共静态变量charHeight:编号=新编号(32);
公共静态var项目:编号=新编号(476);
公共静态var光线角度:编号=新编号(60/200);
public-var-gridMap:Array=new-Array();
公共变量屏幕:Sprite=新Sprite();
公共功能Main(){
网格图=[[1,1,1,1,1,1,1,1,1,1],[1,0,0,0,0,0,0,1],[1,0,0,0,0,0,0,1],[1,0,0,0,0,0,0,1,0,0,1],[1,0,0,0,0,0,0,0,1],[1,0,0,0,0,0,0,0,0,0,0,1,1],[1,1,1,1,1];
//addEventListener(Event.ENTER_FRAME,update);
screen.graphics.lineStyle(0x000000);
stage.addEventListener(MouseEvent.MOUSE_DOWN,mouseDownE);
}
公共函数mouseDownE(e:MouseEvent):无效{
对于(变量i:int=0;i<200;i++){
变量Ya:Number=新编号();
变量Xb:Number=新编号();
var oldXb:Number=新编号();
var oldYa:Number=新编号();
如果(i+charPov-30>180){
Ya=-64;
oldYa=数学楼层(charPosY/64)*(64)-1;
}
否则{
Ya=64;
奥尔德雅=数学楼层(charPosY/64)*(64)+Ya;
}
如果(charPov>270 | | charPov<90){
Xb=64;
oldXb=数学楼层(charPosX/64)*(64)+Xb;
}
否则{
Xb=-64;
oldXb=数学楼层(charPosX/64)*(64)-1;
}
var oldXa:Number=charPosX+(charPosY oldYa)/Math.tan(i+charPov-30);
var oldYb:Number=charPosX+(charPosX oldXb)*Math.tan(i+charPov-30);
var hit:Boolean=false;
变量Xa:Number=64/Math.tan(i+charPov-30);
变量Yb:Number=64*Math.tan(i+charPov-30);
var newYa:数字;
var-newXa:数字;
var-newYb:数字;
var newXb:数字;
变量:数量;
var b距离:数字;
while(命中!=真){
新亚=老亚+亚;
newXa=oldXa+Xa;
如果(gridMap[Math.floor(newYa/64)-1][Math.floor(newXa/64)-1]==1){
aDistance=Math.abs(charPosX-newXa)/Math.cos(i+charPov-30);
命中=真;
}
否则{
oldYa=newYa;oldXa=newXa;
}
}
命中=错误;
while(hit!=true){
newYb=oldYb+Yb;
newXb=oldXb+Xb;
if(gridMap[Math.floor(newYb/64)-1][Math.floor(newXb/64)-1]==1){
b距离=Math.abs(charPosX-newXb)/Math.cos(i+charPov-30);
命中=真;
}
否则{
oldYb=newYb;oldXb=newXb;
}
}
如果(A距离>=B距离){
屏幕.图形.移动到(i,90-(64/b距离*277)/2)
屏幕。图形。线条(i,90+(64/b距离*277)/2)
}
否则{
屏幕.图形.移动到(i,90-(64/aDistance*277)/2)
屏幕.图形.lineTo(i,90+(64/aDistance*277)/2)
}
}
}
}
}
它试图做的是在按下鼠标时渲染屏幕。不幸的是,每当我按下鼠标按钮,我就会得到这个类型错误:错误#1010:一个术语没有定义,没有属性。 在rayCast::Main/mouseDownE()处 我想可能是我的gridMap[]有点不对劲,但当我做变量表时,一切似乎都很好:/也许我在变量表上出了问题,但有人能帮我吗?
提前谢谢你,凯尔。

至少你不需要做
newnumber()
,因为这些都是原语,所以你要么声明它们并保持原样,要么赋值为零。是的,你的光线投射循环中没有范围检查,就好像地图是打开的,你的下一个
gridMap[Math.floor(newYa/64)-1]
可能超出范围,因此没有定义。但是我的网格地图是关闭的,地图周围有一个1。当然不会发生这种情况,除非我在相对于gridMap x和y定位newX和newY时犯了错误。也许这会有所帮助,但我仍然不确定我的代码错在哪里:/是像一个简单的错误需要修复,还是我完全误解了技术?