مدخلی بر ساخت انیمیشن در آمیگا (قسمت دوم)
انیمیشن با زمینه
ساده ترین نوع انیمیشن زمینه از کلک xor استفاده میکند. برای مثال اگر شما منطقه ای از صفحه را با یک الگو XOR کنید ، الگو با رنگ متفاوتی از رنگ زمینه روی صفحه ظاهر خواهد شد
(شکل ٤) زمینۀ اصلی را میتوان با XOR کردن مجدد همان الگو و در همان مکان باز یافت. این روش سریع است زیرا عملا هیچ داده ای حرکت داده نشد .است حالت ترسیم COMPLEMENT (مکمل) آمیگا این ایده را پشتیبانی می کند . البته این محدود است زیرا تمام بیت پلن ها مکمل میشوند طوریکه رنگ حاصله همواره با رنگ زمینه تعیین میشود. بدیهی است اگر بطور انتخابی بیت پلن ها را XOR کنید میتوانید کنترل رنگ بیشتری بدست آورید. بجز وقتی شما رنگها را با دقت از رجیسترها انتخاب کرده اید، بخشی از تصاویر XOR که روی هم افتاده اند، رنگی متفاوت با هر دو تصویر خواهد داشت. روشی که اغلب برای انیمیشن تصاویر زمینهای پیچیده به کار می رود، حرکت بلوکهای اصلی داده میباشد این روش اغلب وقت پردازنده را می گیرد ولی خوشبختانه آمیگا بلیتر سخت افزاری دارد که این مشکل را برطرف میکند بلیتر از چهار کانال DMA استفاده میکند تا داده را چهار تا ده برابر سریعتر از پردازنده ۶۸۰۰۰ انتقال دهد. ClipBlit مناطق مستطیلی از یک بخش از حافظه تراشه (chip) را به قسمتی دیگر کپی میکند.
BltBitMap
بیت مپ ها را بصورت آرگومان گرفته و تنها بیت پلن های مشخص شده را blit میکند ( انتقال میدهد)
Clipalit در یک محیط چند کاره ای با ساختار RastPort کار میکند. این در واقع داده پنجره کار (task) دیگر که روی هم افتادگی با این تسک (TASK) دارد را خراب نمی کند. هر دو روتین از مین ترمها (Minterm) یا مقادیر هشت بیتی که مشخص میکنند چگونه مستطیل مبدا به منطقه مقصد انتقال داده میشود استفاده میکنند. اگر شما یک شیئی می خواهید که عملی پیش از انیمیش در یک موقعیت ثابت انجام دهد. بایستی زمینه زیر شیئی را ذخیره کنید تا بتوان آنرا بازیابی کرد. اگر بیش از یک شیئی از محل تقاطع دیگری میگذرد، انتقال این داده ها بایستی در یک last/in - first/out پردازش شوند.
دو شیئی متحرک که روی هم نیز می افتند ، بایستی بدین صورت پردازش شوند
۱) زمینه ۱ را ذخیره کن.
(۲) شیئی ۱ را قرار بده
(۳) زمینه ۲ را ذخیره کن
(۴) شیئی ۲ را قرار بده
(۵) زمینه ۲ را بازیابی کن
(٦) زمینه ۱ را بازیابی کن
اگر شیئی انیمیشن مستطیلی نیست و می خواهید زمینه پشت شکل واقعی شیئی حرکت کند. میتوانید از بلیتر استفاده کنید: ابتدا ، بلیتر تمام بیت پلنهای شیئی را با هم OR می کند تا ماسکی که شکل شیئی را میسازد، تشکیل دهد. هر یک از رنگها را میتوان به عنوان رنگ زمینه در نظر گرفت تا در ماسک در نظر گرفته نشود. سپس بلیتر ماسک را با هر بیت پلن شیئی AND میکند تا تصویری از شیئی با زمینه صفر بسازد (بدون زمینه) سپس ماسک را معکوس کرده و آنرا با بیت پلن های زمینه AND میکند تا یک صفر شبیه شکل شیئی بسازد. حال بلیتر شیئی را با زمینه در حفرهOR میکند. این روش را میتوان بفرم زیر نوشت
D=AB+AC
که A ماسک شیئی و B خود شیئی ، C زمینه و D فریم جدید انیمیشن است.
یعنی هر جا ماسک شیئی صحیح (true) باشد، فریم جدید با خود شیئی عوض میشود و هرگاه ماسک شیئی صحیح نباشد ، فریم جدید با زمینه تعویض می شود.
برای پیاده سازی این عملکرد کندن و گذاشتن ، آدرسهای داده شیئی و زمینه در رجیسترهای داده مبدا بلیتر BLTxDAT بار می شوند ( که x معادل b, a و یا C به شکل فوق می باشد) و مین ترم حاصل از معادله فوق در رجیستر سخت افزاریBLTCON0 گذاشته می شود. اینکار را میتوان با مجزا کردن آن بدو بخش و استفاده از تابع BltBitMap نیز انجام داد (که دو مبدا را همزمان می گیرد.).
وقتی آمیگا تصویری را در حافظه تغییر می دهد، آن را با تغییر یک بیت پلن در یک زمان انجام میدهد به علت پریود محدود زمانی که برای تصحیح هر بیت پلن طول می کشد ، این مسئله باعث میشود که یک شیئی در حال حرکت بیت پلن هایش روی صفحه جدا شوند. شکل دیگری نیز که اتفاق میافتد این است، اگر در جائیکه اشعه ویدئویی در حال عبور است، شروع به رسم اطلاعات جدید بکند، صحنه ای بوجود می آید که شامل قسمتی از موضوع قدیم و قسمتی از موضوع جدید است. اگر دو فریم خیلی متفاوت باشند ، این باعث میشود شکل بد بنظر برسد. راه حل هر دو مشکل این است که از تکنیک بافر دوبل (double) buffer استفاده کنیم، یعنی سیستم یک حافظه تصویر را نمایش دهد، در حالیکه در همان حال در منطقه دیگری از حافظه رسم میکند ، و وقتی عمل رسم بطور کامل صورت گرفت، اشاره گر بدو منطقه عوض میشوند و بدین ترتیب صفحه یکپارچه بودن بصری خود را حفظ میکند این تکنیک از حافظه تصویر دو برابر استفاده میکند و لذا بافر کردن دوگانه یک صفحه با چهار بیت پلن مقدار ۳۲ کیلوبایت از حافظه تراشه را اضافی مصرف می کند.
راه دیگری که در آمیگا کار انیمیشن را ساده میسازد پشتیبانی لغزاندن افقی و عمودی است. اگر خیلی ساده مقادیر RxOffset وRyOffset ساختار ViewPort شکل (۱) را تغییر دهید، صفحه بخش متفاوتی از داده زمینه را نمایش میدهد. بدینگونه هیچ حافظه ای انتقال نمی یابد و لذا لغزاندن سریع و و یکنواخت است. اما یک ابهام در لغزاندن این است که اسپرایتهای سخت افزاری شش و هفت را غیر فعال و ناتوان می سازد .