Я пытаюсь сделать свою первую игру в ActionScript 3. Это простая артиллерийская игра, в которой у вас есть пистолет в левом нижнем углу и летающие по экрану ИИ, которых вы должны сбивать.Теперь, в классической стрелялке, этого можно достичь, либо выпустив пулю из оружия и выполнив хит-тест этой пули с помощью AI мувиклипа, либо просто удалив (или проиграв анимацию смерти) AI мувиклип.Но вот проблема.Я не хочу делать ни один из них.Я хочу показать пистолет с быстрой скорострельностью и, следовательно, без пуль.И я также не хочу, чтобы игрок щелкнул точно по мувиклипу ИИ, чтобы уничтожить их (достаточно лишь пистолета / башни, указывающей в правильном направлении).Итак, вот что я попробовал.
Это изображение должно помочь изобразить все это.
Попытка прикрепить 'линию' к башне и проверить на столкновение сAI клип.Это явно не удалось из-за проблемы ограничивающего прямоугольника, когда линия наклонена
Я попытался поместить несколько крошечных мувиклипов в строку и повторить их в цикле и проверить, нет ли столкновения с ИИ.Этот метод частично работал, но он был слишком медленным и не выглядел как «правильный» метод.
Я рисую 2 гипотетические линии.Один между p1 и p2, а другой соединяет p3 и p4 (см. Изображение выше).p3 ---- длина p4 = AI.width и является горизонтальной линией, проходящей прямо через центр AI MovieClip.После щелчка мышью я проверяю любое пересечение между этими двумя линиями.Теперь, если у меня есть несколько ИИ на экране, снова мне нужно пройтись по каждому из них, нарисовать новый p3 ----- p4 и проверить на пересечение с p1 ----- p2.
Я использую метод 3 прямо сейчас, и у меня есть ощущение, что, как только я начну добавлять больше вещей в игру, частота кадров получит удар.Я уверен, что должен быть более простой / оптимизированный способ сделать это (может быть, что-то жестоко простое).Прикрепление некоторого соответствующего кода.
shipGame.as
var baseAI:BaseAI;
var AIList:Array= new Array;
public function shipGame():void{
trace("still connected!!");
/*
irrelevant code..
*/
stage.addEventListener(Event.ENTER_FRAME, updateGame);
var a:MovieClip = new MovieClip;
aiTimer = setInterval(StartAI, 2000);
}
public function StartAI():void {
baseAI = new BaseAI(this);
AIList.push(baseAI);
}
public function updateGame(event:Event):void {
/*
code to rotate the turret here..
*/
for (var i:int = 0; i < AIList.length; i++)
{
if (AIList[i].myx < 100) {
AIList[i].basicAI.parent.removeChild(AIList[i].basicAI);
AIList.splice(i, 1);
}
}
if (mouseDn) {
basicTurret.gotoAndPlay(2);// Fire animation
for (var j:int = 0; j < AIList.length; j++)
{
if ( intersection(AIList[j])) // intersection(bai:BaseAI) returns boolean. Works fine.
{
AIList[j].shot = true;
}
}
}
}
BaseAI.as
var main:shipGame;
var myy:Number;
var myy:Number;
public function BaseAI(doc:shipGame):void{
main = doc;
basicAI = new BasicAI(); // BasicAI is a movieClip in the library
main.addChild(basicAI);
basicAI.x = 400;
basicAI.y = Math.abs(Math.random() * (280)) + 20;
myy = basicAI.y;
basicAI.addEventListener(Event.ENTER_FRAME, keepMoving);
}
public function keepMoving(evt:Event):void {
basicAI.x -= 5;
myx = basicAI.x;
if (shot && alive) {
alive = false;
basicAI.gotoAndPlay(2);
}
}