Добрий день. as3 недавно вивчати почав. Завдання в наступному: з метою оптимізації хочу векторний великий рівень порізати на клітини і виводити растровими квадратиками тільки те що видно в екрані гри. До самого рівня поки не добрався, але виникли проблеми в тестовому проекті.
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Matrix;
import flash.geom.Rectangle;
import flash.display.MovieClip;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.text.TextField;
import flash.display.Shape;
/ **
*.
* @author Dukobpa3
* /
public class Main extends Sprite
private var Greed: Array = new Array (# 91; # 93;); // масив Rechtangle's клітини які я потім використовую в бітмапДате
private var cellH: int = 50; // власне висота клітки
private var cellW: int = 50; // ширина клітини
public function Main (): void if (stage) init ();
else addEventListener (Event.ADDED_TO_STAGE, init);
>
private function init (e: Event = null): void removeEventListener (Event.ADDED_TO_STAGE, init);
testing (); // запускаємо процидурку
>
private function testing (): void
/ * Це просто мувікліп для прикладу, заповнюю всяким сміттям щоб не малювати його руками. в результаті виходить сітка зі сторонами 50:50 і в кожному осередку написано координати лівого верхнього кута * /
var testClip: MovieClip = new MovieClip ();
for (var ax: int = 0; ax <640 ; ax += cellW ) for (var ay:int = 0 ; ay <480 ; ay += cellH ) var tf:TextField = new TextField();
tf.text = ax + ":" + ay; // це текст в осередку
var box: Shape = new Shape ();
box.graphics.lineStyle (1,0xFF0000);
box.graphics.drawRect (0, 0, cellW, cellH); // а це рамка
testClip.addChild (box);
testClip.addChild (tf);
box.x = ax;
box.y = ay;
tf.x = ax;
tf.y = ay;
>
>
var numx: int = (640% cellW. (640 / cellW + 1). 640 / cellW); // кількість клітин в ширину
var numy: int = (480% cellH. (480 / cellH + 1). 480 / cellH); // кількість клітин в висоту
for (ax = 0; ax
>
>
trace (Greed); // ну це я дивлюся що у мене вийшло
// а ось далі повна лажа. ніфіга не відстрілюють що я не так роблю.
var matr: Matrix = new Matrix ();
for (ax = 0; ax
var bmp: Bitmap = new Bitmap (bmpD);
// створив бітмапдату 50х50 запхав її в бітмапи
bmp.x = Greed # 91; ax # 93; # 91; ay # 93; .x;
bmp.y = Greed # 91; ax # 93; # 91; ay # 93; .y;
// встановив бітмапи координати відображення такі ж як і промальовується прямокутника
bmpD.draw (testClip, null, null, null, Greed # 91; ax # 93; # 91; ay # 93 ;, true);
// ну і власне отрисовать в бітмапдате ту частину мувікліпа яку мені диктує ця група моєї сітки
коротше суть цього проекту - отримати великий мувікліп, порізати його на частини і відобразити в початковому вигляді але вже за допомогою відтворення в BitmapData.Draw () по клітинках. а виходить лажа. в цьому методі є ще параметр matrix, який відповідає за спотворення отрісовиваємих частини, але якщо я правильно розумію його суть, то мені він не потрібен. Так як спотворювати мені нічого не треба, а зміщувати нікуди, так як і розмір исходника і розмір бітмапдати і розмір бітмапи збігаються.
Поточний мій приклад виводить тільки одну клітку, "0: 0", хоча теоретично должон виводити все як треба :)
Коротше я злегка заплутався і вже ніфіга в цьому не розумію :) Спрагу допомоги сан Моісеєвим.
З.И. в коді було ще купа проб і помилок з іншими Трейсі, поудалял в ім'я економії місця, ну і забезпечив своїми поясненнями. Якщо кому цікавий зовсім вже вихідний файл то скину.
Перший раз стикаюся, він:
private function testing (): void
/ * Це просто мувікліп для прикладу, заповнюю всяким сміттям щоб не малювати його руками. в результаті виходить сітка зі сторонами 50:50 і в кожному осередку написано координати лівого верхнього кута * /
var testClip: MovieClip = new MovieClip ();
for (var ax: int = 0; ax <640 ; ax += cellW ) for (var ay:int = 0 ; ay <480 ; ay += cellH ) var tf:TextField = new TextField();
tf.text = ax + ":" + ay; // це текст в осередку
var box: Shape = new Shape ();
box.graphics.lineStyle (1,0xFF0000);
box.graphics.drawRect (0, 0, cellW, cellH); // а це рамка
testClip.addChild (box);
testClip.addChild (tf);
box.x = ax;
box.y = ay;
tf.x = ax;
tf.y = ay;
>
>
var numx: int = (640% cellW. (640 / cellW + 1). 640 / cellW); // кількість клітин в ширину
var numy: int = (480% cellH. (480 / cellH + 1). 480 / cellH); // кількість клітин в висоту
// а ось далі повна лажа. ніфіга не відстрілюють що я не так роблю.
var matr: Matrix = new Matrix ();
var rect: Rectangle = new Rectangle (0, 0, 50, 50);
for (ax = 0; ax
var bmp: Bitmap = new Bitmap (bmpD);
// створив бітмапдату 50х50 запхав її в бітмапи
bmp.x = ax * cellW;
bmp.y = ay * cellH;
// встановив бітмапи координати відображення такі ж як і промальовується прямокутника
matr.tx = -bmp.x;
matr.ty = -bmp.y;
bmpD.draw (testClip, matr, null, null, rect, true);
// ну і власне отрисовать в бітмапдате ту частину мувікліпа яку мені диктує ця група моєї сітки
Працює, спасибі :)
// **********
Тільки щось я знову нічого не зрозумів.
У всіх Хелп вказано що: Rechtangle - відповідає за ту область ВИХІДНОГО об'єкта яку ми копіюємо (в нашому випадку це тестКліп). А в вашому прикладі ми постійно беремо область в позиції 0.0 і з розмірами 50х50.
і що в вашому прикладі робить matr? Логічно подумати то щось на зразок перетягування всього вихідного testClip по відношенню до нашого rect. (Ну типу rect стоїть на місці, а testClip перетягується матрицею за вказаною алгоритму).
Взагалі по мануали я так зрозумів що ми спочатку беремо якусь область на исходнике (саме з цим пов'язані спроби забульбеніть двовимірний масив з прямокутників-областей). А потім за бажанням трансформуємо цю область (вже скопійоване і растеризувати, щось типу пост-ефектів) згідно з правилами матриці.
// *************
Допоможіть розібратись. Що таке rectangle і що таке matrix;