Arrays 射线投射AS3
我决定我要学习射线铸造,并尝试一下。虽然我决不是一个好的程序员,但我只是认为尝试扩展我的知识会很好,而且这在某些方面可能是有用的:P我一直在尝试遵循这本指南:它实际上是一本很好的指南,但我恐怕我在某个地方出了差错,不知道在哪里。我的代码: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
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时犯了错误。也许这会有所帮助,但我仍然不确定我的代码错在哪里:/是像一个简单的错误需要修复,还是我完全误解了技术?