|
|
||||||||||||
Регистрация: May 2011
Сообщений: 221
|
Цитата:
Цитата:
Цитата:
Цитата:
Вобщем, дабы не усложнять всем жизнь пройдусь по тем комментариям, к которым я могу предоставить код. Цитата:
Цитата:
private function sortChild(container:DisplayObjectContainer, child:IsoObject):void { for (var i:int = 0, length:int = _model.buildingsCount; i < length; i++) { var compareBuilding:Building = _model.getBuildingAt(i) as Building; var currentIsNearest:Boolean = false; if (child != compareBuilding) { if (child.isoLeft >= compareBuilding.isoRight && child.isoTop >= compareBuilding.isoBottom) { currentIsNearest = true; } else if (Projection.intersects(child.isoLeft, child.isoRight, compareBuilding.isoLeft, compareBuilding.isoRight) && child.isoTop >= compareBuilding.isoBottom) { currentIsNearest = true; } else if (Projection.intersects(child.isoTop, child.isoBottom, compareBuilding.isoTop, compareBuilding.isoBottom) && child.isoLeft >= compareBuilding.isoRight) { currentIsNearest = true; } if (currentIsNearest && container.getChildIndex(child) < container.getChildIndex(compareBuilding)) { container.swapChildren(child, compareBuilding); } } } } Цитата:
код составление чанка карты private function createChunk():QuadBatch { var chunk:QuadBatch = new QuadBatch(); var tile:Image = new Image(LandscapeAssetManager.instance.getTexture("landscapeTiles_081.png")); tile.alignPivot(HAlign.CENTER, VAlign.TOP); for (var col:int = 0; col < _model.CHUNK_SIZE_IN_TILES; col++) { for (var row:int = 0; row < _model.CHUNK_SIZE_IN_TILES; row++) { var screenPoint:ScreenPoint = IsoTransformer.isoToScreen(col * _model.TILE_SIZE, row * _model.TILE_SIZE); tile.touchable = false; tile.x = screenPoint.x; tile.y = screenPoint.y - _model.TILE_HEIGHT; chunk.addImage(tile); } } return chunk; } Цитата:
package util { public class IsoTransformer { private static const ALPHA_RAD:Number = Math.atan(0.5); private static const TAN:Number = Math.tan(ALPHA_RAD); private static const SIN:Number = Math.sin(ALPHA_RAD); private static const COS:Number = Math.cos(ALPHA_RAD) public static function screenToIso(x:Number, y:Number):IsoPoint { var isoX:Number = (x * TAN + ((y - x * TAN) / 2)) / SIN; var isoY:Number = ((y - x * TAN) / 2) / SIN; return new IsoPoint(isoX, isoY); } public static function isoToScreen(isoX:Number, isoY:Number):ScreenPoint { var x:Number = isoX * COS - isoY * COS; var y:Number = isoX * SIN + isoY * SIN; return new ScreenPoint(x, y); } } } Но меня просто взбесила логика в духе "не понимаю как работает - значит неправильно". Цитата:
код: public function moveBy(xOffset:Number, yOffset:Number):void { x += xOffset; y += yOffset; for (var i:int = 0, length:int = _model.buildingsCount; i < length; i++) { var building:Building = _model.getBuildingAt(i); var localX:Number = x + building.x; var localY:Number = y + _buildingsLayer.y + building.y; var old:Boolean = building.visible; building.visible = (localX + building.screenLeft > 0) && (localX + building.screenRight < _viewportWidth) && (localY + building.screenBottom > 0) && (localY + building.screenTop < _viewportHeight); } } Цитата:
Из серии "я так не делаю - значит неправильно" Цитата:
Вобщем, поверьте мне, я целиком и полностью признаю, что я далеко не гуру разработки, и мне конечно же есть чему учиться и куда стремиться, но черт возьми, киньте в меня камень, если ХОТЯ БЫ ОДИН из этих комментариев справедлив. Я мог бы принять отказ от товарища Rzer, потому что его комментарии хотя бы по делу. Потому что незавершенность задачи, даже при ее больших размерах и малом времени на выполнение (ну леший их знает, может они там вундеркиндов ищут), это хотя бы реальная причина, по которой можно получить отказ. Но отправленные ими комментарии - просто детский лепет, ей-богу. Кстати да, Rzer, большое спасибо, что нашли время заглянуть внутрь кода. |
|
|||||
Регистрация: Oct 2006
Сообщений: 2,281
|
Цитата:
расставить здания в форме прямоугольника, с бОльшей стороной параллельной оси X в с.к. карты. И рядом расположить еще 4 здания здания в форме прямоугольника, с бОльшей стороной параллельной оси Y.Насколько я помню, в таких случаях "наивная" сортировка по координате и дает неправильный порядок отрисовки. Имхо тебя завернули как-раз из-за этого пункта, а остальное - так до кучи. ПС: и поставь высоту у зданий по-больше, чтоб проекции зданий из противоположных сторон прямоугольника заведомо накладывались друг на друга |
|
|||||
Регистрация: May 2011
Сообщений: 221
|
GBee
Насчет сотрудников компании и их способностях я конечно уже мнения не изменю, это правда. Но вообще тема открывалась с целью получения комментариев к коду. Товарищ Rzer писал что то о структуре проекта и архитектурных решениях, но пока так и не пояснил что под этим подразумевалось undefined Но у меня не наивная реализация по одной координате, посмотрите пост выше, в нем приведен фрагмент кода. Могу чуть позже написать демку, в которрой можно будет руками расставлять домики и вы убедитесь, что даже длинные по одной стороне прямоугольники сортируются правильно. Или могу написать подробное объяснение того, как этот алгоритм работает и почему его результат работы будет верным |
|
|||||
Регистрация: Oct 2006
Сообщений: 2,281
|
Если можно, хотелось бы с демкой поиграться
|
|
|||||
Регистрация: May 2011
Сообщений: 221
|
Так, я наконец закончил, можно посмотреть. Прикладываю swf и архив. Наслаждайтесь.
Пожалуйста, учтите, что все это делалось с целью показать как происходит сортировка, а не с целью написать бесподобный код. с клавиатуры кнопочки 1, 2, 3 (те, что на основной части клавиатуры) выбирают "кисточки" 1 - домик вытянутый влево 2 - домик вытянутый вправо 3 - квадратный домик Если домик нельзя поставить в выбранном месте, он подсвечивается красным. Домики сортируются только при установке. "Кисточка" не сортируется. |
|
|||||
Регистрация: Oct 2006
Сообщений: 2,281
|
да признаю, не получилось сломать.
|
|
|||||
Регистрация: Jun 2014
Сообщений: 558
|
не всё гладко
|
Часовой пояс GMT +4, время: 11:26. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|