Показать сообщение отдельно
Старый 10.02.2013, 14:21
Hauts вне форума Посмотреть профиль Отправить личное сообщение для Hauts Посетить домашнюю страницу Hauts Найти все сообщения от Hauts
  № 4  
Ответить с цитированием
Hauts
 
Аватар для Hauts

блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,113
Записей в блоге: 1
Отправить сообщение для Hauts с помощью ICQ Отправить сообщение для Hauts с помощью Skype™
Мда. Большая беда.

Код AS1/AS2:
attachMovie("bullet","bullet"+nextBullet,nextBullet+9999);
attachMovie возвращает ссылку на созданный клип. Не нужно потом хитрить с "_root["bullet"+nextBullet]", можно проще:

Код AS1/AS2:
var newBullet = attachMovie("bullet","bullet"+nextBullet,nextBullet+9999);
newBullet._x = ...
newBullet._y = ...
 
bullets.push(newBullet)
"nextBullet+9999" у вас глубина, на которую будет положен новый клип. Зачем так неприлично-то на 9999 этажей прыгать-то? Есть же замечательный метод getNextHighestDepth() для этих целей. С этой поправкой получаем следующее решение:

Код AS1/AS2:
var depth = this.getNextHighestDepth();
var newBullet = attachMovie("bullet","bullet_"+depth,depth);
newBullet._x = ...
newBullet._y = ...
 
bullets.push(newBullet)
Вроде нормально. Кроме одного: вы все клипы складываете в один контейнер. В принципе, ничего плохого, но я бы на вашем месте сначала организовал бы слои для игровых объектов. Просто пустых мувиклипов с нужными instance-нэймами накидать на сцене (или создать программно) и не следить за тем, чтобы пуля, например, под "стенками" (или что там у вас) летела.

Теперь насчет кода на клипе. Вы пользуетесь инстанс-нэймами у клипов, и это правильно. Но что вам мешает в том же кадре прописать такой код:

Код AS1/AS2:
initGame();
this.onEnterFrame = moveBullets;
Вы избавитесь от неприятных особенностей, связанных с областью видимости, когда пишете на клипах. Да и переключаться с клипов на кадр не нужно будет.

Кстати, вам initGame-то вообще не нужна. Просто объявили бы все эти переменные в самом начале и все.

Еще одно замечание:
Код AS1/AS2:
for(i=bullets.length-1;i>=0;i--) {
Лучше бы заменить на:
Код AS1/AS2:
for(var i=0; i < bullets.length; i++ ) {
И еще:
Код AS1/AS2:
bullet = _root["bullet"+bullets[i]];
— зачем так сложно-то? Можно проще:
Код AS1/AS2:
var bullet = bullets[k];
У вас же массив bullets объявлен, он будет виден внутри функции moveBullets.

Относительно кнопки, которая ловит нажатие пробела... Убирайте ее и пропишите следующий код в кадре:

Код AS1/AS2:
var keyListener:Object = {};
keyListener.onKeyDown = function(){
    var keyCode == Key.getCode();
    if(keyCode == Key.SPACE){
        // Здесь стреляем
    }
}
Key.addListener(keyListener)
(могу немного ошибаться, пишу по памяти, в хэлпе точно есть примеры)

Добавлено через 5 минут
Обновил страницу, увидел дополнение к вашему посту.

Цитата:
...что не так?
— почти все. Вам требуется сделать все с применением ООП, а вы пытаетесь все по классам распихать, не понимая основных принципов.

Разделите сущности вашей игры по их смыслу и создайте соответствующие классы. Игрок — класс Cat (насколько я понимаю), нужны игровые звуки — создаете класс GameSounds, у которого будете в нужный момент вызвать метод, например, "playShootSound".

Нужен общий класс для того, чтобы создать экземпляры игрока, противников, ландшафта и т.д. и контролировать всю игру — создаете класс GameController.
__________________
hauts.ru