2013-12-19 2 views
0

Я пытаюсь сделать базовую игру лабиринта с небольшим завихрением. С установленными интервалами (установленными событием таймера) лабиринт вращается на 90%. Проблема, с которой я сталкиваюсь, относится к hitTestPoint. Испытание с ударом работает до лабиринта лабиринта и работает после полного 360-процентного вращения, но перестает работать во время поворотов на 90%, 180% и 270%. Я исчерпал все свои знания (ограниченный как 5-месячный AS3-программист) в AS3, чтобы решить эту проблему, и я в конце концов.Проблемы с столкновением с играми

Лабиринт находится в контейнере, и контейнер вращается, это значит, что у лабиринта есть вторичная точка поворота, которая постоянно следует за игроком вокруг лабиринта. дополнительно контейнер перемещается по нажатию клавиши, а не проигрыватель.

Может кто-нибудь, пожалуйста, остановите меня, объяснив, что вызывает проблему, как я могу ее исправить, и, если возможно, покажу мне пример кода, который я должен использовать.

Вот что у меня есть.

stop(); 

import flash.events.Event; 
import flash.utils.Timer; 
import flash.events.TimerEvent; 
import flash.sensors.Accelerometer; 

var speed:Number = 5; 

var northSpeed = speed; 
var southSpeed = speed; 
var eastSpeed = speed; 
var westSpeed = speed; 

var upPressed:Boolean = false; 
var downPressed:Boolean = false; 
var leftPressed:Boolean = false; 
var rightPressed:Boolean = false; 
var Orientation:int = 0; 

var count:int = 0; 
var timer:Timer = new Timer(1000,60); 
var time = 60; 

player.addEventListener(Event.ENTER_FRAME, MovePlayer); 
containBox.maze.addEventListener(Event.ENTER_FRAME, hitWalls); 
stage.addEventListener(KeyboardEvent.KEY_DOWN, KeyPressed); 
stage.addEventListener(KeyboardEvent.KEY_UP, KeyDepressed); 
containBox.maze.addEventListener(Event.ENTER_FRAME, spin); 

timer.start(); 
timer.addEventListener(TimerEvent.TIMER, timerHandle); 

function timerHandle(e:TimerEvent):void 
{ 
    txt_time.text = time; 
    time--; 
} 

function hitWalls(event:Event):void 
{ 
    if (upPressed==true && containBox.maze.hitTestPoint(player.x,player.y,true)) 
    { 
     northSpeed = 0; 
     player.y = player.y+=2; 
    } 
    else 
    { 
     northSpeed = speed; 
    } 
} 


function spin(event:Event):void 
{ 
    if (time <= 0) 
    { 
     txt_time.text = "TIMES UP!"; 
    } 
    if (time <= 54) 
    { 
     containBox.rotation = 90; 
     Orientation = 1; 
    } 
    if (time <= 50) 
    { 
     containBox.rotation = 180; 
     Orientation = 2; 
    } 
     if (time <= 48) 
    { 
     containBox.rotation = 270; 
     Orientation = 3; 
    } 
     if (time <= 46) 
    { 
     containBox.rotation = 0; 
     Orientation = 0; 
    } 

} 

function MovePlayer(event:Event):void 
{ 
    if (Orientation == 0) 
    { 
     if (upPressed) 
     { 
      containBox.maze.y += northSpeed; 
     } 
     if (downPressed) 
     { 
      containBox.maze.y -= southSpeed; 
     } 
     if (leftPressed) 
     { 
      containBox.maze.x += westSpeed; 
     } 
     if (rightPressed) 
     { 
      containBox.maze.x -= eastSpeed; 
     } 
    } 
    else if (Orientation == 1) 
    { 
     if (upPressed) 
     { 
      containBox.maze.x += 5; 
     } 
     if (downPressed) 
     { 
      containBox.maze.x -= 5; 
     } 
     if (leftPressed) 
     { 
      containBox.maze.y -= 5; 
     } 
     if (rightPressed) 
     { 
      containBox.maze.y += 5; 
     } 
    } 
    else if (Orientation == 2) 
    { 
     if (upPressed) 
     { 
      containBox.maze.y -= 5; 
     } 
     if (downPressed) 
     { 
      containBox.maze.y += 5; 
     } 
     if (leftPressed) 
     { 
      containBox.maze.x -= 5; 
     } 
     if (rightPressed) 
     { 
      containBox.maze.x += 5; 
     } 
    } 
    else if (Orientation == 3) 
    { 
     if (upPressed) 
     { 
      containBox.maze.y += 5; 
     } 
     if (downPressed) 
     { 
      containBox.maze.y -= 5; 
     } 
     if (leftPressed) 
     { 
      containBox.maze.x += 5; 
     } 
     if (rightPressed) 
     { 
      containBox.maze.x -= 5; 
     } 
    } 
} 

function KeyPressed(event:KeyboardEvent):void 
{ 
    switch (event.keyCode) 
    { 
     case Keyboard.UP : 
      { 
       upPressed = true; 
       break; 
      }; 
     case Keyboard.DOWN : 
      { 
       downPressed = true; 
       break; 
      }; 
     case Keyboard.LEFT : 
      { 
       leftPressed = true; 
       break; 
      }; 
     case Keyboard.RIGHT : 
      { 
       rightPressed = true; 
       break; 
     } 
    } 
} 

function KeyDepressed(event:KeyboardEvent):void 
{ 
    switch (event.keyCode) 
    { 
     case Keyboard.UP : 
      { 
       upPressed = false; 
       break; 
      }; 
     case Keyboard.DOWN : 
      { 
       downPressed = false; 
       break; 
      }; 
     case Keyboard.LEFT : 
      { 
       leftPressed = false; 
       break; 
      }; 
     case Keyboard.RIGHT : 
      { 
       rightPressed = false; 
       break; 
     } 
    } 
} 

Большое спасибо, Reece.

ответ

0

Для правильного сравнения необходимо преобразование системы координат 2D. См., Игрок в основном стоит на фиксированной точке, таким образом (player.x, player.y) фиксирован, а hitTestPoint() использует координаты, назначенные локально для объекта this, в вашем случае лабиринт. Чтобы получить координаты игрока в системе лабиринта, вам нужно сначала получить глобальную позицию, затем получить локальную позицию, есть функции для этого, localToGlobal() и globalToLocal() соответственно.

function hitWalls(event:Event):void 
{ 
    var p:Point=new Point(player.x,player.y); 
    var dp:Point=containBox.maze.globalToLocal(player.parent.localToGlobal(p)); 
    // now test vs dp instead of player. 
    if (upPressed==true && containBox.maze.hitTestPoint(dp.x,dp.y,true)) 
    { 
     northSpeed = 0; 
     player.y = player.y+=2; 
    } 
    else 
    { 
     northSpeed = speed; 
    } 
} 
Смежные вопросы