Guest User

raycaster

a guest
May 5th, 2013
34
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. package
  2. {
  3.     import flash.display.Shape;
  4.     import flash.display.Sprite;
  5.     import flash.events.Event;
  6.     import flash.events.KeyboardEvent;
  7.     import flash.geom.ColorTransform;
  8.     import flash.text.TextField;
  9.     import flash.utils.getTimer;
  10.     import flash.display.StageQuality;
  11.  
  12.     public class Main extends Sprite
  13.     {
  14.         public var mapWidth:int = 24;
  15.         public var mapHeight:int = 24;
  16.        
  17.         public var worldMap:Array = [
  18.             [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
  19.             [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
  20.             [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
  21.             [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
  22.             [1,0,0,0,0,0,2,2,2,2,2,0,0,0,0,3,0,3,0,3,0,0,0,1],
  23.             [1,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1],
  24.             [1,0,0,0,0,0,2,0,0,0,2,0,0,0,0,3,0,0,0,3,0,0,0,1],
  25.             [1,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1],
  26.             [1,0,0,0,0,0,2,2,0,2,2,0,0,0,0,3,0,3,0,3,0,0,0,1],
  27.             [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
  28.             [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
  29.             [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
  30.             [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
  31.             [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
  32.             [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
  33.             [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
  34.             [1,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
  35.             [1,4,0,4,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
  36.             [1,4,0,0,0,0,5,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
  37.             [1,4,0,4,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
  38.             [1,4,0,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
  39.             [1,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
  40.             [1,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
  41.             [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
  42.         ];
  43.        
  44.         //starting x and y positions
  45.         public var posX:Number = 22;
  46.         public var posY:Number = 12;
  47.        
  48.         //initial direction vector
  49.         public var dirX:Number = -1;
  50.         public var dirY:Number = 0;
  51.        
  52.         //2d raycaster version of the camera plane
  53.         public var planeX:Number = 0;
  54.         public var planeY:Number = 0.66;
  55.        
  56.         //time it takes to process each frame
  57.         public var time:Number = 0;
  58.         public var oldTime:Number = 0;
  59.        
  60.         //set size to 512x384
  61.         [SWF(backgroundColor = "0x000000" , widthPercent = "50" , heightPercent = "50")]
  62.        
  63.         //keyboard booleans
  64.         public var left:Boolean = false;
  65.         public var right:Boolean = false;
  66.         public var up:Boolean = false;
  67.         public var down:Boolean = false;
  68.        
  69.         //fps counter
  70.         public var fps:TextField = new TextField();
  71.        
  72.         //verticle line for drawing
  73.         public var verLine:Sprite = new Sprite();
  74.        
  75.         public function Main():void
  76.         {
  77.             stage.frameRate = 60;
  78.             stage.quality = StageQuality.LOW;
  79.            
  80.             stage.addEventListener(Event.ENTER_FRAME, update);
  81.             stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown);
  82.             stage.addEventListener(KeyboardEvent.KEY_UP, keyUp);
  83.            
  84.             addChild(fps); //FPS counter
  85.             addChild(verLine);
  86.         }
  87.        
  88.         public function update(e:Event):void
  89.         {
  90.             for(var x:Number = 0; x < stage.stageWidth; x++)
  91.             {
  92.                 //calculate ray position and direction
  93.                 var cameraX:Number = 2 * x / Number(stage.stageWidth) - 1; //x-coordinate in camera space
  94.                 var rayPosX:Number = posX;
  95.                 var rayPosY:Number = posY;
  96.                 var rayDirX:Number = dirX + planeX * cameraX;
  97.                 var rayDirY:Number = dirY + planeY * cameraX;
  98.                
  99.                 //which box of the map we're in  
  100.                 var mapX:int = int(rayPosX);
  101.                 var mapY:int = int(rayPosY);
  102.        
  103.                 //length of ray from current position to next x or y-side
  104.                 var sideDistX:Number;
  105.                 var sideDistY:Number;
  106.        
  107.                 //length of ray from one x or y-side to next x or y-side
  108.                 var deltaDistX:Number = Math.sqrt(1 + (rayDirY * rayDirY) / (rayDirX * rayDirX));
  109.                 var deltaDistY:Number = Math.sqrt(1 + (rayDirX * rayDirX) / (rayDirY * rayDirY));
  110.                 var perpWallDist:Number;
  111.        
  112.                 //what direction to step in x or y-direction (either +1 or -1)
  113.                 var stepX:int;
  114.                 var stepY:int;
  115.  
  116.                 var hit:int = 0; //was there a wall hit?
  117.                 var side:int; //was a NS or a EW wall hit?
  118.                
  119.                 //calculate step and initial sideDist
  120.                 if (rayDirX < 0)
  121.                 {
  122.                     stepX = -1;
  123.                     sideDistX = (rayPosX - mapX) * deltaDistX;
  124.                 }
  125.                 else
  126.                 {
  127.                     stepX = 1;
  128.                     sideDistX = (mapX + 1.0 - rayPosX) * deltaDistX;
  129.                 }
  130.                
  131.                 if (rayDirY < 0)
  132.                 {
  133.                     stepY = -1;
  134.                     sideDistY = (rayPosY - mapY) * deltaDistY;
  135.                 }
  136.                 else
  137.                 {
  138.                     stepY = 1;
  139.                     sideDistY = (mapY + 1.0 - rayPosY) * deltaDistY;
  140.                 }
  141.                
  142.                 //perform DDA
  143.                 while (hit == 0)
  144.                 {
  145.                     //jump to next map square, OR in x-direction, OR in y-direction
  146.                     if (sideDistX < sideDistY)
  147.                     {
  148.                         sideDistX += deltaDistX;
  149.                         mapX += stepX;
  150.                         side = 0;
  151.                     }
  152.                     else
  153.                     {
  154.                         sideDistY += deltaDistY;
  155.                         mapY += stepY;
  156.                         side = 1;
  157.                     }
  158.                    
  159.                     //Check if ray has hit a wall
  160.                     if (worldMap[mapX][mapY] > 0)
  161.                     {
  162.                         hit = 1;
  163.                     }
  164.                 }
  165.                
  166.                 //Calculate distance projected on camera direction (oblique distance will give fisheye effect!)
  167.                 if (side == 0)
  168.                 {
  169.                     perpWallDist = Math.abs((mapX - rayPosX + (1 - stepX) / 2) / rayDirX);
  170.                 }
  171.                 else
  172.                 {
  173.                     perpWallDist = Math.abs((mapY - rayPosY + (1 - stepY) / 2) / rayDirY);
  174.                 }
  175.                
  176.                 //Calculate height of line to draw on screen
  177.                 var lineHeight:int = Math.abs(int(stage.stageHeight / perpWallDist));
  178.        
  179.                 //calculate lowest and highest pixel to fill in current stripe
  180.                 var drawStart:int = -lineHeight / 2 + stage.stageHeight / 2;
  181.                
  182.                 if (drawStart < 0)
  183.                 {
  184.                     drawStart = 0;
  185.                 }
  186.                
  187.                 var drawEnd:int = lineHeight / 2 + stage.stageHeight / 2;
  188.                
  189.                 if (drawEnd >= stage.stageHeight)
  190.                 {
  191.                     drawEnd = stage.stageHeight - 1;
  192.                 }
  193.                
  194.                 //choose wall color
  195.                 var colour:ColorTransform = this.transform.colorTransform;
  196.                 switch(worldMap[mapX][mapY])
  197.                 {
  198.                     case 1:  colour.color = 0xFF0000; break; //red
  199.                     case 2:  colour.color = 0x0000FF; break; //green
  200.                     case 3:  colour.color = 0x00FF00; break; //blue
  201.                     case 4:  colour.color = 0xFFFFFF; break; //white
  202.                     default: colour.color = 0xFFFF00; break; //yellow
  203.                 }
  204.        
  205.                 //give x and y sides different brightness
  206.                 if (side == 1)
  207.                 {
  208.                     colour.color = colour.color / 2;
  209.                 }
  210.  
  211.                 //draw the pixels of the stripe as a vertical line
  212.                 verLine.graphics.lineStyle(1, colour.color, 1);
  213.                 verLine.graphics.moveTo(x, drawStart);
  214.                 verLine.graphics.lineTo(x, drawEnd);
  215.                
  216.                 //timing for input and FPS counter
  217.                 oldTime = time;
  218.                 time = getTimer();
  219.                 var frameTime:Number = (time - oldTime) / 1000.0; //frameTime is the time this frame has taken, in seconds
  220.                 fps.text = ("" + 1.0 / frameTime);
  221.                 //redraw();
  222.                 //cls();
  223.                
  224.                 //speed modifiers
  225.                 var moveSpeed:Number = frameTime * 5.0; //the constant value is in squares/second
  226.                 var rotSpeed:Number = frameTime * 3.0; //the constant value is in radians/second
  227.                
  228.                 //move forward if no wall in front of you
  229.                 if (up)
  230.                 {
  231.                     if(worldMap[int(posX + dirX * moveSpeed)][int(posY)] == false) {posX += dirX * moveSpeed;}
  232.                     if(worldMap[int(posX)][int(posY + dirY * moveSpeed)] == false) {posY += dirY * moveSpeed;}
  233.                 }
  234.                
  235.                  //move backwards if no wall behind you
  236.                 if (down)
  237.                 {
  238.                     if(worldMap[int(posX - dirX * moveSpeed)][int(posY)] == false) {posX -= dirX * moveSpeed;}
  239.                     if(worldMap[int(posX)][int(posY - dirY * moveSpeed)] == false) {posY -= dirY * moveSpeed;}
  240.                 }
  241.                
  242.                 //rotate to the right  
  243.                 if (right)
  244.                 {
  245.                     //both camera direction and camera plane must be rotated
  246.                     var oldDirX:Number = dirX;
  247.                     dirX = dirX * Math.cos(-rotSpeed) - dirY * Math.sin(-rotSpeed);
  248.                     dirY = oldDirX * Math.sin(-rotSpeed) + dirY * Math.cos(-rotSpeed);
  249.                     var oldPlaneX:Number = planeX;
  250.                     planeX = planeX * Math.cos(-rotSpeed) - planeY * Math.sin(-rotSpeed);
  251.                     planeY = oldPlaneX * Math.sin(-rotSpeed) + planeY * Math.cos(-rotSpeed);
  252.                 }
  253.                
  254.                 //rotate to the left
  255.                 if (left)
  256.                 {
  257.                     //both camera direction and camera plane must be rotated
  258.                     oldDirX = dirX;
  259.                     dirX = dirX * Math.cos(rotSpeed) - dirY * Math.sin(rotSpeed);
  260.                     dirY = oldDirX * Math.sin(rotSpeed) + dirY * Math.cos(rotSpeed);
  261.                     oldPlaneX = planeX;
  262.                     planeX = planeX * Math.cos(rotSpeed) - planeY * Math.sin(rotSpeed);
  263.                     planeY = oldPlaneX * Math.sin(rotSpeed) + planeY * Math.cos(rotSpeed);
  264.                 }
  265.             }
  266.         }
  267.            
  268.             public function keyDown(e:KeyboardEvent):void
  269.             {
  270.                 if (e.keyCode == 37)
  271.                 {
  272.                     left = true;
  273.                 }
  274.                 if (e.keyCode == 38)
  275.                 {
  276.                     up = true;
  277.                 }
  278.                 if (e.keyCode == 39)
  279.                 {
  280.                     right = true;
  281.                 }
  282.                 if (e.keyCode == 40)
  283.                 {
  284.                     down = true;
  285.                 }
  286.             }
  287.            
  288.             public function keyUp(e:KeyboardEvent):void
  289.             {
  290.                 if (e.keyCode == 37)
  291.                 {
  292.                     left = false;
  293.                 }
  294.                 if (e.keyCode == 38)
  295.                 {
  296.                     up = false;
  297.                 }
  298.                 if (e.keyCode == 39)
  299.                 {
  300.                     right = false;
  301.                 }
  302.                 if (e.keyCode == 40)
  303.                 {
  304.                     down = false;
  305.                 }
  306.             }
  307.         }
  308.     }
Advertisement
Add Comment
Please, Sign In to add comment