![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|
|
|||||
|
Регистрация: May 2009
Сообщений: 47
|
Цели:
понять что такое MVC и ООП научиться кодить на AS3 Решение: написать скрипт/проект по следующему ТЗ: Цитата:
mvc/Main.as package mvc { import flash.display.Sprite; import mvc.*; public class Main extends Sprite { private var _model:Model; private var _view:Viewer; private var _controller:Controller; public function Main() { _model = new Model(stage); // я так понимаю с точки зрения MVC я сделал крупную ошибку передав всю сцену? см. 118-119 строки модели _view = new Viewer(_model); super.addChild(_view); _controller = new Controller(_view, _model); } } } package mvc { import flash.events.*; import flash.utils.Timer; public class Controller extends EventDispatcher { private var _model:Model; private var _view:Viewer; public function Controller(view:Viewer, model:Model) { _view = view; _model = model; _view.stage.getChildByName('root1').addEventListener(MouseEvent.CLICK, _model.getDataObj); // так и не понял, почему root1 название? вроде везде mc_create _model.loadData.addEventListener(Event.COMPLETE, _model.createObj); // после загрузки txt файла с параметрами, вызываем метод создания шара _model.addEventListener('sharCreated', _view.addObj); _view.addEventListener('sharShowed', InitEvents); } private function InitEvents(e:Event):void { _model.currentShar.addEventListener(Event.ENTER_FRAME, _model.passivMove); _model.currentShar.Obj.addEventListener(MouseEvent.MOUSE_OVER, _model.mouseMove); var time:Timer=new Timer(50, 0); // каждые 50 мс вычисляем скорость мыши по текущим и предыдущим координатам time.addEventListener(TimerEvent.TIMER, _model.OnTimeCursorV); time.start(); } } } mvc/Model.as package mvc { import flash.events.*; import objects.Shar; import flash.net.URLRequest; import flash.net.URLLoader; import flash.events.EventDispatcher; import flash.display.Stage; public class Model extends EventDispatcher { public var currentShar:Shar; public var loadData:URLLoader=new URLLoader(); private var stage:Stage; private const CURSOR_WEIGHT:Number=5; //масса шарика private var g:Number; // сила тяжесть private var stageWidth:uint; private var stageHeight:uint; private var cursorV:Number=0; // сохраненная скорость мыши в момент столкновения private var cursorCurrentV:Number=0; // текущая(мгновенная) скорость мыши private var cursorLastX:Number; private var cursorLastY:Number; private var lastLocalX:Number=0; private var lastLocalY:Number=0; public function Model(stage:Stage) { this.stage=stage; // я так понимаю с точки зрения MVC я сделал крупную ошибку передав всю сцену? см. 118-119 строки this.g=10/stage.frameRate; // сила тяжесть this.stageWidth=stage.stageWidth; this.stageHeight=stage.stageHeight; this.cursorLastX=stageWidth/2; this.cursorLastY=stageHeight/2; } public function getDataObj(e:Event):void { e.target.stage.getChildByName('root1').removeEventListener(MouseEvent.CLICK, getDataObj); //e.target.stage.removeChild(e.target.stage.getChildByName('root1')); // удаление кнопки, почемуто если удалить кнопку, то все перестает работать loadData.load(new URLRequest('data/set.txt')); // считали параметры шара из файла } public function createObj(e:Event = null):void { var arr:Array=new Array(); arr=loadData.data.split(';'); currentShar=new Shar({ // создали экземпляр шара по параметрам из файла (класс objects/Shar.as) X:arr[0], Y:arr[1], M:arr[2], E:arr[3], R:arr[4], C:arr[5] }); dispatchEvent(new Event('sharCreated')); } public function passivMove(e:Event):void { var shar:Object=e.target; // сохраненная скорость мыши при столкновении постепенно уменьшается до 0 if(this.cursorV>0) this.cursorV-=g; else if(this.cursorV<0) this.cursorV=0; var Fc:Number=this.CURSOR_WEIGHT*this.cursorV; // вычислить вектор столкновения мыши с шариком (если мышь не сталкивалась тоthis.cursorV=0 и вектор=0) var XFc:Number=(lastLocalX/shar.R)*Fc; var YFc:Number=(-lastLocalY/shar.R)*Fc; var Fs:Number=shar.M*shar.V; // вычисляем mg var XFs:Number=0*Fs; // знаю что бессмысленно умножать на 0, но с точки зрения физики так понятней, сейчас разговор идет исключительно про MVC и ООП var YFs:Number=1*Fs; var Nx:Number=XFs+XFc; // вычисляем новый результирующий вектор var Ny:Number=YFs+YFc; shar.direc=Math.atan2(Ny, -Nx); // вычисляем новый угол движения шара shar.A=Math.sqrt(Ny*Ny+Nx*Nx)*0.05; // вычисляем скалярную величину нового векутор (0.05 - коэф. ибо без него слишком быстро меняеться) shar.V+=shar.A; // изменяем скорость шарика shar.X+=shar.V*Math.cos(shar.direc); // изменяем координаты, лучше делать через _viewer.updateObj ? shar.Y+=shar.V*Math.sin(shar.direc); // изменяем координаты, лучше делать через _viewer.updateObj ? // далее идут вычисления границу сцены и предотвращения ухода за них шара if(shar.Y+shar.R>=stageHeight) { shar.Y=stageHeight-shar.R; shar.V=0; // сбрасываем скорость на 0, когда шар упал вниз сцены, правильнее будет делать отскок от сцены за счет изменения shar.direc } if(shar.Y-shar.R<=0) { shar.Y=shar.R; shar.V=0; // если уперся в потолок, тоже сбрасываем скорость на 0, в идеале опять же сделать отскок } if(shar.X+shar.R>=stageWidth) { shar.X=stageWidth-shar.R; } if(shar.X-shar.R<=0) { shar.X=shar.R; } } public function OnTimeCursorV(e:TimerEvent):void { var dX:Number=Math.abs(stage.mouseX-cursorLastX); // через таймер же не предать stage.mouseX, он нужен для вычисления скорости мышки за счет измерения изменения координат курсора var dY:Number=Math.abs(stage.mouseY-cursorLastY); this.cursorCurrentV=Math.sqrt(dX*dX+dY*dY); // мгновенная скорость см. 127 строку this.cursorLastX=stage.mouseX; this.cursorLastY=stage.mouseY; } public function mouseMove(e:MouseEvent):void { this.cursorV=this.cursorCurrentV; // мгновенная становиться текущуй скоростью, и используеться в расчетах именно она в момент сталкнвовения с мыщью this.lastLocalX=e.localX; // сохраняем координаты мыши для вычисления вектора силы мыши this.lastLocalY=e.localY; } } } package mvc { import flash.display.Sprite; import flash.events.*; import objects.Shar; public class Viewer extends Sprite { private var _model:Model; public function Viewer(model:Model) { _model=model; } public function addObj(e:Event):void { addChild(e.target.currentShar.Obj); dispatchEvent(new Event('sharShowed')); } public function updateObj(x:Number, y:Number) // пожалуй, этим должен заниматься вьювер, но как туда предать параметры через контроллер? Или можно передать ссылку на сам вьювер? { _model.currentShar.X=x; _model.currentShar.Y=y; } } } package objects { import flash.display.Sprite; public class Shar extends Sprite { private var _obj:Sprite=new Sprite(); private var _X:Number; private var _Y:Number; private var _M:Number; private var _E:Number; private var _R:uint; private var _C:uint; private var _V:Number=1; private var _A:Number; private var _direc:Number=1.5*Math.PI; public function Shar(param:Object) { this.M=param.M; this.E=param.E; this.C=param.C; this.Obj.graphics.drawCircle(0, 0, param.R); this.R=param.R; this.X=param.X; this.Y=param.Y; } public function get Obj():Object { return this._obj; } public function set X(X:Number):void { _X=X; this.Obj.x=X; } public function get X():Number { return _X; } public function set Y(Y:Number):void { _Y=Y; this.Obj.y=Y; } public function get Y():Number { return _Y; } public function set R(r:uint):void { _R=r; this.Obj.width=r*2; this.Obj.height=r*2; } public function get R():uint { return _R; } public function set C(c:uint):void { _C=c; this.Obj.graphics.beginFill(c); } public function get C():uint { return _C; } public function set E(e:Number):void { _E=e; } public function get E():Number { return _E; } public function set M(m:Number):void { _M=m; } public function get M():Number { return _M; } public function set V(v:Number):void { _V=v; } public function get V():Number { return _V; } public function set A(a:Number):void { _A=a; } public function get A():Number { return _A; } public function set direc(d:Number):void { _direc=d; } public function get direc():Number { return _direc; } } } Вопросы: как все поняли в AS я новичок, хотел бы, чтобы меня тыкнули носом в мои ошибки (все, кроме физики объекта), и услышать как бы вы реализовали с точки зрения MVC данный проект, какие есть направления MVC и т.п. P. S. "движка" громко сказано =) |
|
|||||
|
Banned
Регистрация: Aug 2014
Сообщений: 461
|
1) Могу пока только сказать, что свойства принято начинать со строчных.
2) Класс Шар у Вас унаследован от sprite и его название говорит, что ЭТО ШАР, а на деле получается, что ЭТО КОНТЕЙНЕР ДЛЯ ШАРА, ведь шар, который является больше _view, у Вас назван _obj. 3) Сами себя инициализируете через сеттеры, хотя в этом нет необходимости. 4) Graphics размазан по всему классу, это тоже не айс. 5) Жуткие названия, пишите лучше полными именами. Добавлено через 1 час 8 минут И модель у Вас выполняет сразу много обязанностей - загружает, рассчитывает, что-то ещё. Это нарушает Принцип единственной обязанности. |
|
|||||
|
Регистрация: May 2009
Сообщений: 47
|
1) опять затупил, давно не ООПешил, спасибо
2) ну да, он наследует спрайт чтобы рисовать шар и менять его свойсвтва непосредственно + если будет много таких шаров/экземпляров класса. я так понимаю тут достаточно переменовать в SharBox ? 3) действительно, спасибо. 4) а как подругому? ну скажем на сцене текстовое поле и человек ввел туда цвет. он должен значит изменить и у шара, в мое случае через оболочку класс Shar. 5) вот че тока не ожидал но не этого, вроде и так очень полно пишу, ну в любом случае спасибо. 6) ну да, модель это и должна делать, вот только перересовку я хотел во вьювер отдать в метод UpdateObj, но это геморно. Добавлено через 2 минуты см. 6) пункт ответа. это еще одна причина почему я перересовку не вынес во вьювер. "оч плохо" - очень прошу как можно подробней. спасибо! |
|
|||||
|
Регистрация: Jan 2013
Сообщений: 322
|
Цитата:
> отскок (вместо него костыль который обнуляет скорость, когда шарик касается "пол" сцены) сначала программировать научись, потом уже разбирайся в паттернах проектирования. иначе заработаешь себе ооп головного мозга. https://ru.wikipedia.org/wiki/KISS_(...6%D0%B8%D0%BF) и архивируй в zip. |
|
|||||
|
Banned
Регистрация: Aug 2014
Сообщений: 461
|
2) Сейчас ещё посмотрел на класс Шар и могу сказать, что посоветовать мне особо нечего из-за того,
что я не понимаю, что означают свойства, могу лишь догадываться. 2) Вы не понимаете, что такое дисплей лист. 2) Вы не понимаете, что значит наследовать и ещё нужно знать, что такое композиция. 6) Нет, она должна объединять работу классов-модулей, но не быть всем сразу и при том одновременно. Напишите, что означают все свойства в классе Шар, я покажу, как будет лучше. Добавлено через 4 минуты Цитата:
Цитата:
Ему не хватает знаний. Добавлено через 16 минут nubideus, а что Вы думаете по поводу модели ТС? |
|
|||||
|
Gerbert - а в чем собственно резон защищать ТС, если ты даже сам понимаешь, что ему не хватает знаний даже на дисплейЛист, самое основное и первое в АС! Нужно нагло отправлять читать книжки и все тут. Я лично замечаю небольшую болезнь полубога.
__________________
Марк Tween |
|
|||||
|
Регистрация: Jan 2013
Сообщений: 322
|
Цитата:
> а что Вы думаете public function set E(e:Number):void { _E=e; } public function get E():Number { return _E; } public function set M(m:Number):void { _M=m; } public function get M():Number { return _M; } public function set V(v:Number):void { _V=v; } public function get V():Number { return _V; } public function set A(a:Number):void { _A=a; } public function get A():Number { return _A; } public function set direc(d:Number):void { _direc=d; } public function get direc():Number { return _direc; } Цитата:
private var _X:Number; private var _Y:Number; private var _M:Number; // масса private var _E:Number; // эластичность private var _R:uint; // радиус private var _C:uint; // цвет private var _V:Number=1; // наверное скорость private var _A:Number; // хз, прозрачность поди, если цвет есть private var _direc:Number=1.5*Math.PI; // направление |
|
|||||
|
Banned
Регистрация: Aug 2014
Сообщений: 461
|
Цитата:
Цитата:
|
|
||||||||
|
Регистрация: May 2009
Сообщений: 47
|
Цитата:
Цитата:
Цитата:
private var _A:Number; // в школе буквой a обозначали ускорение. Цитата:
Цитата:
Цитата:
события она не слушает, отображение не занимается (за исключением непосредственного изменения координат), вы имеете ввиду загружать данные (из set.txt) можно в самом контроллере? Цитата:
P.S. мне от вас нужно просто получить знания ГДЕ у меня бред (вот как nubideus вырезал кусок кода и сказал что ***** полное, я понял и исправлюсь), и как сделать правильно, и через 2-3 проекта я буду писать код более приемлемый. Не которые вещи я знаю что бред, но не достаточно знаний языка AS для того чтобы сделать правильно как я считаю, вот немного "костылю" в надежде что вы скажите: "у вас там костыль ***, надо делать так ***". P.S.S. покажите мне человека у которого есть знания и он пишет на форуме вопросы? Иначе по вашей логике всех нужно посылать читать книжку, только после прочтения ваш форум не нужен будет в 99.99% случаев. Всем спасибо, жду ваших ответов, советов и дальнейших обоснованных обсираний моего кода. |
![]() |
![]() |
Часовой пояс GMT +4, время: 18:09. |
|
|
« Предыдущая тема | Следующая тема » |
|
|