Является ли мое бесклассовое программирование AS2 близким к ООП по духу? - PullRequest
2 голосов
/ 20 октября 2011

Итак, я разработчик флеш-игр и пытаюсь перейти с AS2 на AS3 + ООП, всего через 3 года после всех остальных.Существует множество бесплатных, очень полезных материалов, и я трачу 2-3 дня на то, чтобы обдумать некоторые из них, но сейчас я чувствую, что просто хочу начать, попробовать и изучить более сложные вещи.как я иду (так же, как я сделал с AS2).

Я получаю преимущества (большинство аспектов) ООП, и однажды меня заставили научиться делать пару игр в обработке, которые заставили меня написать несколько классов, и мне действительно понравилась вся вещь наследования, котораяЯ думаю, что это самая главная причина, по которой я стремлюсь двигаться дальше.

Я просто хотел спросить о структуре игры - это мой текущий способ программирования на AS2 (см. пример ниже, с некоторым псевдокодом), близкий ккак бы вы организовали вещи в ООП, или в моей игровой логике / структуре есть какие-то большие недостатки, которые я не вижу?Насколько я понимаю, в AS3 / OOP я должен был бы поступить по-другому: иметь класс для движущихся вещей, таких как игрок, герой, ракеты и т. Д., Затем иметь класс врага, который расширяет этот класс, а затем иметь классы для каждого расширяющегося врагавражеский класс, в отличие от того, где каждый «класс» вместо этого является объектом и функцией, вызываемой из основного игрового цикла, а подклассы - вместо «if» в каждой функции.Но кроме этого, мой стиль программирования находится на правильном пути или мне нужно переосмыслить логику моего кода, чтобы он эффективно работал в настройках AS3 / OOP?

Любой совет будет высоко оценен!

function initializeF() {
    initializeVariablesF();
    startGameF();
}

function initializeVariablesF() {
    enemyO = new Object(); //which will contain each enemy instance
    enemyA = new Array(); //which will be a list of all the enemies, maybe superfluous?
    playerShotsA=new Array();
    //and so on...
    enemyDataO = new Object();
    enemyDataO.goblin = new Object();
    //and then some vars relating to the goblin, sort of a class without methods, right?
}

function startGameF() {
    this.onEnterFrame = function() { //my game loop
        checkKeysF(); //checks which keys are pressed, saves it to a global object
        playerMovementF(); //moves the player about depending on which keys are pressed
        playerShotsF(); //deals with the missiles/shots/lasers the player has shot
        enemyCreatorF(); //decides when to create a new enemy
        enemyF(); //deals with all enemies in the enemyA
        enemyShotsF(); //deals with the missiles/etc the enemies have created
    };
}

function enemyCreatorF(){
    //randomly creates an enemy through a "factory" function:
    if (random(20)==1){
        attachEnemyF(enemyDataO.goblin, ...and some values like position etc)
    }
}
function attachEnemyF(a_enemyType, ... a bunch of values like position){
    //create a new enemy object
    var enemy=enemyO[new unique enemy name]
    enemy.enemyType=a_enemyType
    enemy.clip=attachMovie(a_enemyType,"clip", [values like x and y passed on])
    enemyA.push(enemy) 
}
function playerShotsF(){
    for (every shot in playerShotsA){
        //move it about
        for (every enemy in enemyA){
            //if it hits an enemy, add damage to the enemy
        }
    }
}

function enemyF() {
    for (every enemy in enemyA) {
        //check if it's dead/less health than zero, if so remove it from the array, remove it's clip, null it's object
        //if it's not, move it about, maybe have it shoot
        //if it touches the player, decrease the player's health
        //different behavior depending on the enemy's type by "if" or "switch" statements
    }
}

1 Ответ

1 голос
/ 20 октября 2011

Я не уверен, что вопрос подходит для SO, так как он в основном запрашивает мнения, но в любом случае:

  1. Наличие базового класса с базовыми функциями, такими как "перемещение"«hitTest», «render» и т. д. действительно то, что вы должны делать.Затем пусть аватар игрока, враги и т. Д. Наследуются от этого класса.

  2. Суффикс F (и даже суффиксы O и A) совершенно излишен, поскольку любой хороший редактор AS3 уже скажетнезависимо от того, является ли член класса функцией или массивом, объектом и т. д.

  3. Вам не нужно хранить своих врагов как в массиве, так и в объекте, это будет сделаноненужно сложно удалить или добавить противника.Вместо этого просто сохраните их все в массиве и используйте простые циклы для проверки их свойств.

...