![]() |
|
||||||||||
|
|||||
|
Регистрация: Feb 2013
Сообщений: 51
|
Вопрос 1 : как неявно обьявить переменную в классе
Вопрос 2 : как связать эти переменные с onClipEvent(load){ } помогите решить эти два вопроса из-за них просто плыву в классах а вообще дело в том что изначально я писал игру в кадрах без классов, все получалось никаких проблем не было, когда выяснялось что нужно (это курсовая) использовать ООП естественно нужно было писать в классах, начал копировать работающие функции из кадров в соответственные классы и все поплыло, постоянно какие то проблемы в основном только с переменными они получаю не те значения которые нужны и я не понимаю как их занести в onClipEvent(load){ } потому что если не занести просто не работает много чего (проверял уже когда в кадрах писал) очень прошу помощи! |
|
|||||
|
блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,113
Записей в блоге: 1
|
Цитата:
Цитата:
__________________
hauts.ru |
|
|||||
|
Регистрация: Feb 2013
Сообщений: 51
|
вот даже к примеру у меня есть ф-ция которая прописана в кадре
function initGame() { // init balloon variables nextBulletTime = 0; // init bullet variables nextBullet = 0; bullets = []; // init score score = 0; } function shootBullet() { // see whether there has been enough time to reload if (getTimer() > nextBulletTime) { trace(nextBulletTime); // create bullet clip attachMovie("bullet","bullet"+nextBullet,nextBullet+9999); // set location _root["bullet"+nextBullet]._x = _root.cat._x+13; _root["bullet"+nextBullet]._y = _root.cat._y+25; // add to array bullets.push(nextBullet); //get set for next bullet nextBullet++; nextBulletTime = getTimer()+1000; mySound2 = new Sound(); mySound2.attachSound("booll"); mySound2.start(); } } function moveBullets() { // loop through all bullets for(i=bullets.length-1;i>=0;i--) { // get clip bullet = _root["bullet"+bullets[i]]; bullet._x += 10; // see whether it reached top if (bullet._x > 750) { bullet.removeMovieClip(); bullets.splice(i,1); // see whether it hit a balloon } if (bullet.hitTest(_root.lilo) ) { _root.lilo.unloadMovie(); bullet.removeMovieClip(); bullets.splice(i,1); } } и есть код в клипе onClipEvent(load) { _root.initGame(); } onClipEvent(enterFrame) { _root.moveBullets(); } Добавлено через 7 минут вот так я перевел эти ф-ции в класс class Bullets extends MovieClip { var nextBulletTime = 0; var nextBullet = 0; var bullets = []; function initGame() { // init balloon variables // init bullet variables var nextBulletTime = 0; var nextBullet = 0; var bullets = []; // init score var score = 0; } function shootBullet() { // init score var score = 0; // see whether there has been enough time to reload if (getTimer() > nextBulletTime) { // create bullet clip attachMovie("bullet","bullet"+nextBullet,nextBullet+9999); // set location _root["bullet"+nextBullet]._x = _root.cat._x+13; _root["bullet"+nextBullet]._y = _root.cat._y+25; // add to array bullets.push(nextBullet); //get set for next bullet nextBullet++; nextBulletTime = getTimer()+1000; var mySound2 = new Sound(); mySound2.attachSound("booll"); mySound2.start(); } } function moveBullets() { // loop through all bullets for(var i=bullets.length-1;i>=0;i--) { // get clip var bullet = _root["bullet"+bullets[i]]; bullet._x += 10; // see whether it reached top if (bullet._x > 750) { bullet.removeMovieClip(); bullets.splice(i,1); // see whether it hit a balloon } if (bullet.hitTest(_root.lilo) ) { _root.lilo.unloadMovie(); bullet.removeMovieClip(); bullets.splice(i,1); } } } } а это в кадре function lod() { var Bul:Bullets = new Bullets(); Bul.initGame(); } function game() { Bul.moveBullets(); } ошибок не выдает но с помощью trace проверял различные значения, и они принимают не те значения которые принимали в кадре когда были прописаны, что не так? |
|
|||||
|
блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,113
Записей в блоге: 1
|
Мда. Большая беда.
attachMovie возвращает ссылку на созданный клип. Не нужно потом хитрить с "_root["bullet"+nextBullet]", можно проще: var newBullet = attachMovie("bullet","bullet"+nextBullet,nextBullet+9999); newBullet._x = ... newBullet._y = ... bullets.push(newBullet) var depth = this.getNextHighestDepth(); var newBullet = attachMovie("bullet","bullet_"+depth,depth); newBullet._x = ... newBullet._y = ... bullets.push(newBullet) Теперь насчет кода на клипе. Вы пользуетесь инстанс-нэймами у клипов, и это правильно. Но что вам мешает в том же кадре прописать такой код: Вы избавитесь от неприятных особенностей, связанных с областью видимости, когда пишете на клипах. Да и переключаться с клипов на кадр не нужно будет. Кстати, вам initGame-то вообще не нужна. Просто объявили бы все эти переменные в самом начале и все. Еще одно замечание: Лучше бы заменить на: И еще: — зачем так сложно-то? Можно проще: У вас же массив bullets объявлен, он будет виден внутри функции moveBullets. Относительно кнопки, которая ловит нажатие пробела... Убирайте ее и пропишите следующий код в кадре: var keyListener:Object = {}; keyListener.onKeyDown = function(){ var keyCode == Key.getCode(); if(keyCode == Key.SPACE){ // Здесь стреляем } } Key.addListener(keyListener) Добавлено через 5 минут Обновил страницу, увидел дополнение к вашему посту. Цитата:
Разделите сущности вашей игры по их смыслу и создайте соответствующие классы. Игрок — класс Cat (насколько я понимаю), нужны игровые звуки — создаете класс GameSounds, у которого будете в нужный момент вызвать метод, например, "playShootSound". Нужен общий класс для того, чтобы создать экземпляры игрока, противников, ландшафта и т.д. и контролировать всю игру — создаете класс GameController.
__________________
hauts.ru |
|
|||||
|
Регистрация: Feb 2013
Сообщений: 51
|
Цитата:
|
|
|||||
|
блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,113
Записей в блоге: 1
|
Использование динамических классов почти всегда означает ошибку в логике программы. Динамические классы и создание их полей (переменных) на лету (в рантайме) зачастую грозит неправильной работой всего приложения.
Вы же прекрасно знаете, какие поля класа вам потребуются, зачем вам изменяемый класс-то? dynamic class Bullets extends MovieClip { this["someVar"] = 5;// так выдает ошибку function game() { this["someVar"] = 5; // так ошибки нет но когда вывожу значение с помощью trace пишет не определен } } Цитата:
__________________
hauts.ru |
|
|||||
|
Регистрация: Feb 2013
Сообщений: 51
|
спасибо большое попробую, да я разделил все по классам как вы говорите, но экземпляры создавал в кадре а не в общем классе,
|
|
|||||
|
блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,113
Записей в блоге: 1
|
В кадре просто точку входа создайте. Первый кадр основной временной шкалы:
А в конструкторе GameController`а уже получите ссылку на временную шкалу. Никаких _root`ов и т.п. Примерно так: class GameController{ private var _stageReference:MovieClip; function GameController(stageReference:MovieClip){ _stageReference = stageReference; createLayers(); createPlayer(); createLevel(); initListeners(); } private function createLayers(){ // Создаем слои для элементов игры } } P.S. В некоторых моментах могу ошибаться, возможно те, кто получше меня соображают, как правильнее написать код игры, меня поправят.
__________________
hauts.ru |
|
|||||
|
Регистрация: Feb 2013
Сообщений: 51
|
Цитата:
|
|
|||||
|
блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,113
Записей в блоге: 1
|
А я не понял вашего вопроса.
Смысл следующий: вы можете назначить мувиклипу в кадре onEnterFrame = function()... , а можете и на самом мувиклипе код прописать onClipEvent(enterframe){... . Так вот первый вариант лучше.
__________________
hauts.ru |
![]() |
![]() |
Часовой пояс GMT +4, время: 05:27. |
|
|
« Предыдущая тема | Следующая тема » |
|
|