Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Интервал между выстрелами. (http://www.flasher.ru/forum/showthread.php?t=112145)

Korsar Nik 19.05.2008 23:01

Интервал между выстрелами.
 
Здравствуйте.
Есть код, который должен осуществлять в игре выстрел. Точнее, при нажатии пробела цеплять к позиции оружия экземпляр пули и в дальнейшем её перемещать) Кроме того, между выстрелами должен выдерживаться определённый интервал, чтобы пушка не стреляла с частотой фрэйм рэйта.

Код:

zigbulCounter = 0;
this.onEnterFrame = function() {
        if (Key.isDown(Key.SPACE)) {
                function shoot() {
                        zigbulCounter++;
                        zigbulname = "zigbul"+i;
                        _root.attachMovie("zigbul", "zigbulname", i, {_x:zig._x+zig._width/2, _y:(zig._y+10)});
                }
                setInterval(this, "shoot", 300);
        }
}

Вот что я написал, но это, увы, не работает. Подскажите, в чём ошибка и как реализовать подобный интервал?

Vertax 19.05.2008 23:19

Что то типа:
Код:

lastShoot = 0;
timeOut = 1000;//Секунда

zigbulCounter = 0;
shoot = function()
{
        zigbulCounter++;
        zigbulname = "zigbul"+i;
        _root.attachMovie("zigbul", "zigbulname", i, {_x:zig._x+zig._width/2, _y:(zig._y+10)});
}

this.onEnterFrame = function()
{
        if (Key.isDown(Key.SPACE) && lastShoot + timeOut < getTimer())
        {
                lastShoot = getTimer();
                shoot();
        }
}


Kuruki 20.05.2008 01:09

Код:

var shoot:Boolean = true;
var shootID:Number;
var depth:Number = 0;
Key.addListener(this);
this.onKeyDown = function () {
        if (Key.getCode() == Key.SPACE && shoot) {//если нажат спэйс и shoot==true
                _root.attachMovie("zigbul", "zigbul" + depth, depth, { _x:zig._x + zig._width / 2, _y:zig._y + 10 } );
                _root["zigbul" + depth].onEnterFrame = move;
                shoot = false;//запретить выстрел
                shootID = setInterval(enableShoot, 300);
                depth++;
        }
}
//двигаться
function move():Void {
        this._x++;
}
//разрешить выстрел
function enableShoot():Void {
        shoot = true;
        clearInterval(shootID);
}

Все работает, при условии, что код находится на гл врем диаграмме.

Korsar Nik 07.06.2008 00:24

Kuruki,
Сейчас переписываю игру в классы и возникла новая проблема с реализацией стрельбы. Решил прибегнуть к Вашему методу (до этого реализовывал интервал проще, но топорнее, через n-ое количество фреймов, теперь делаю по уму). Так вот, если выделить добавление пуль как отдельный класс, то выстрел работает единожды. Я разобрался, что дело в переменной shoot. Если отбросить лишнее, выглядит класс так:

Код:

class Zig_game.Bul extends MovieClip {
        var shoot:Boolean;
        var shootID:Number;
        var depth:Number;
            // Конструктор
        function Bul() {
                shoot = true;
                depth = _root.getNextHighestDepth();
                Key.addListener(this);
                this.onKeyDown = function() {
                        if (Key.getCode() == Key.SPACE && shoot) {
                                trace(shoot);  // выдаёт true
                                shoot = false;
                                trace(shoot);  // выдаёт false
                                shootID = setInterval(enableShoot, 1000);
                                depth++;
                        }
                };
        }
        function enableShoot():Void {
                shoot = true;
                trace(shoot); // выдаёт undefined
                clearInterval(shootID);
        }
}

В самом проекте просто создаю экземпляр класса.
Код:

var bul:Bul = new Bul();
Так вот вопрос, почему в последнем случае переменная shoot трэйсится как неопределённая? Мы же в пределах одного класса работаем! Какие ей пути надо прописывать? Или, может, через get её как-то передавать надо?
Заранее спасибо за помощь. Я классы только начал осваивать, многое непонятно, если конкретно пошлёте читать что-то по теме - буду только рад))

tikhop 07.06.2008 00:32

Код:

class Zig_game.Bul extends MovieClip {
        var shoot:Boolean;
        var shootID:Number;
        var depth:Number;
            // Конструктор
        function Bul() {
                var thisInstance=this //ссылка на экземпляр
                shoot = true;
                depth = _root.getNextHighestDepth();
                Key.addListener(this);
                this.onKeyDown = function() {
                        if (Key.getCode() == Key.SPACE && shoot) {
                                trace(shoot);  // выдаёт true
                                shoot = false;
                                trace(shoot);  // выдаёт false
                                shootID = setInterval(enableShoot, 1000, thisInstance); // передаем ссылку на экземпляр
                                depth++;
                        }
                };
        }
        function enableShoot(thisInstance):Void {
               
                thisInstance.shoot = true;
                trace(thisInstance.shoot); // должно выдавать true
                clearInterval(shootID);
        }
}



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

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