Просмотр полной версии : Интервал между выстрелами.
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);
}
}
Вот что я написал, но это, увы, не работает. Подскажите, в чём ошибка и как реализовать подобный интервал?
Что то типа:
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();
}
}
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 её как-то передавать надо?
Заранее спасибо за помощь. Я классы только начал осваивать, многое непонятно, если конкретно пошлёте читать что-то по теме - буду только рад))
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);
}
}
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.