Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   [Алгоритмы] Проблема с определением пересечения обекта (http://www.flasher.ru/forum/showthread.php?t=213884)

ABEnergy 13.02.2017 01:04

Проблема с определением пересечения обекта
 
Ето снова я. Незнаю где писать определение с обектами, тоесть где myPatron пересекаеться c mina[i](тоесть с миной). Весь код програми представлен ниже, также напишите если где-то криво написа что-то, просто моя перая програма на AS, набираюсь опита.(Сам пробовал писать пересичения с обектом, но викидает ошибки все время, решил профи спросить.)



Код:
Код AS3:

import flash.display.MovieClip;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.utils.Timer;
import flash.events.TimerEvent;
 
var fire = false;
stop();
//Движение фона(Етот код можно не смотреть)
var myCosmo:MovieClip = new cosmo();
addChild(myCosmo);
myCosmo.x = 80;myCosmo.y = 200;
var TimeOfLastFire = getTimer();
stage.addEventListener(Event.ENTER_FRAME, go);
 
function go(e:Event){
        fon1.x += 4;fon2.x += 4;
        fon3.x += 6;fon4.x += 6;
        if(fon1.x >= 760){
                fon1.x = -200;
        }
        if(fon2.x >= 760){
                fon2.x = -200;
        }       
        if(fon3.x >= 760){
                fon3.x = -200;
        }
        if(fon4.x >= 760){
                fon4.x = -200;
        }       
}
 
////Клавиши
stage.addEventListener(KeyboardEvent.KEY_DOWN, pres);
function pres(e:KeyboardEvent){
        if(e.keyCode == 38){
                myCosmo.y -= 5;       
        }
        if(e.keyCode == 40){       
                myCosmo.y += 5;
        }
 
        //Создание патрона
        if(e.keyCode == 32){
                if(TimeOfLastFire+300<getTimer()){
                        TimeOfLastFire = getTimer();
                        var myPatron:MovieClip = new patron();
                        addChild(myPatron);
                        myPatron.x = myCosmo.x ;
                        myPatron.y = myCosmo.y;
                        stage.addEventListener(Event.ENTER_FRAME, fire);
                        function fire(e:Event){
                                myPatron.x += 10;
                        }
                }
        }
}
 
 
//Создание мин
var timer:Timer = new Timer(5000, 0);
timer.addEventListener(TimerEvent.TIMER, spawn);
timer.start();
function spawn(e:TimerEvent){
        for(var i = 0;i<1;i++){
                var mina = [3];
                var coord_x = Math.random()*400+200;
                var coord_y = Math.random()*400;
                mina[i] = new boeprypas();
                addChild(mina[i]);
                mina[i].x = coord_x;mina[i].y = coord_y;
                stage.addEventListener(Event.ENTER_FRAME, polet);
                function polet(e:Event){
                        for(var i = 0;i<1;i++){
                                var xmov = (myCosmo.x - mina[i].x)/500;
                                var ymov = (myCosmo.y - mina[i].y)/500;
                                var angle = Math.atan2(xmov, ymov)*180/Math.PI;
                                mina[i].x += xmov;
                                mina[i].y += ymov;
                                mina[i].rotation += 3;
                        }
                }
        }
}


Wolsh 13.02.2017 03:04

1)
Код AS3:

var mina = [3];

Вы создали массив, у которого в нулевой ячейке хранится цифра 3. Мало того, поскольку этот код находится внутри цикла, массив будет создаваться заново при каждом витке цикла (сейчас, правда, этот виток один, так что ошибка незаметна).
2) не надо создавать переменные, которые будут использоваться тут же всего один раз. Можно было сразу написать
Код AS3:

mina[i].x = Math.random()*400+200;
mina[i].y = Math.random()*400;

3) Функции не надо встраивать внутрь других функций, они все должны быть на одном уровне.

ABEnergy 13.02.2017 18:29

спасибо за помощь

Wolsh 13.02.2017 21:02

Если Вы планируете дальше изучать AS3, лучше начните сразу привыкать к правилам оформления кода. Так будет проще и Вам, и другим — например здесь, на форуме. Есть так называаемые "конвенции", в которых подробно расписаны правила. Но для начала хотя бы: с заглавной буквы называются ТОЛЬКО классы. Переменные всегда с маленькой буквы, так что "var TimeOfLastFire" — не пойдет. При объявлении переменных и функций указывается Тип значения.
Код AS3:

var fire:Boolean = false;
function go(e:Event):void {

Это позволяет компилятору находить ошибки еще на этапе сборки ролика. В редакторе Adobe Flash для этого нужно так же включить режим строгой компиляции. Сейчас у Вас просто вообще ничего не проверяется перед сборкой. Включите — посыпятся сообщения об ошибках. Неприятно, но это позволит их исправить. А исправлять придется в любом случае))
Код AS3:

var myPatron:MovieClip = new patron();

Здесь Вы создаете переменную внутри функции. Это называется "локальная переменная". Она будет существовать только те наносекунды, пока выполняется функция; в любом случае к ней нет никакого доступа вне этой функции. Если Вам нужно как-то пользоваться этим патроном в других функциях (например для того же определения столкновения), Вам нужно вынести объявление переменной в тело класса (на тот же уровень, где объявляются функции), а внутри функций Вы сможете менять ее значение, записывая в нее при необходимости ссылку на новый патрон. Когда таких объектов множество, используется массив — его так же объявляют в теле класса, а наполнять можно из других функций.

Добавлено через 3 минуты
Чтобы явно задать размер массива, нужно пользоваться полной формой конструктора
Код AS3:

var mina:Array = new Array(3); // создаем массив с тремя ячейками


ABEnergy 13.02.2017 21:44

спасибо вам, только как включить строгий режим?

Wolsh 13.02.2017 23:16

Вложений: 1
Меню Файл >> Параметры ActionScript
Вложение 32625

ABEnergy 14.02.2017 23:28

не понимаю почему не работает..
Отделил как ви и говорили(внутри лучше не работает), после появления 1 мини все происходит нормально(крутиться, двигаеться), а когда появляеться 2 , 1 перестает двигаться и так со всеми последующими...



var mina:Array = new Array();

var timer:Timer = new Timer(1000, 0);
timer.addEventListener(TimerEvent.TIMER, spawn);
timer.start();
function spawn(e:TimerEvent):void{
timer.start();
for(var i = 0;i<1;i++){
mina[i] = new boeprypas();
addChild(mina[i]);
mina[i].x = Math.random()*400+200;
mina[i].y = Math.random()*400; }

}

addEventListener(Event.ENTER_FRAME, polet);
function polet(e:Event):void{

for(var j = 0;j<mina.length;j++){
var xmov = (myCosmo.x - mina[j].x)/500;
var ymov = (myCosmo.y - mina[j].y)/500;
var angle = Math.atan2(xmov, ymov)*180/Math.PI;
mina[j].x += xmov;
mina[j].y += ymov;
mina[j].rotation += 3;
}
}

undefined 15.02.2017 00:23

Вложений: 1
ABEnergy,если не хочешь чтоб твои темы продолжали закрывать, изучи, наконец, зачем и как работает вот эта кнопка:
Вложение 32645


Часовой пояс GMT +4, время: 23:11.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.