Qt2DGRaphix
نسخه ۱.۱موتور گرافیکی ساده ابتدایی دو بعدی چندسکویی روالی
مقدمه
جهت شروع استفاده از این موتور گرافیکی (کیوت تو دی گرافیکس) باید نرمافزار Qt SDKاز نسخه 4.6 به بعد بر روی سیستم شما نصب باشد. تفاوتی نمیکند که از کدام سیستم عامل استفاده میکنید اما در لینوکس ممکن است مشکلاتی با صوت یا تصویر داشته باشد (به دلیل اینکه همه نسخ لینوکس درایورهای کافی ندارند) در صورتی که برنامه نمونه بر روی لینوکس شما اجرا نشد، از دستور زیر برای نصب مایحتاج استفاده نمایید:
sudo apt-get install libgl1-mesa-dev libglu-dev
پس از اینکه برنامه نمونه را کامپایل و اجرا نمودید، از این مستند برای آشنایی با دستورات Qt2DGraphiX بهره بگیرید.
شروع به کار
تمامی دستورات این موتور در فضای نام Qt2DGraphiX قرار دارند بنابراین برای استفاده از آنها یا قبل از هر دستور از Qt2DGraphiX:: استفاده کنید یا در ابتدای برنامه دستور using namespace Qt2DGraphiX; را وارد نمایید. برای فعال شدن و امکان استفاده از دستورات، دو فایل Qt2DGraphiX.hو Qt2DGraphiX_engine.h را درون پوشه برنامه خود کپی کنید و در محیط برنامهسازی (Qt Creator) در یک پروژه GUI Application پس از آنکه همه فایلها غیر از فایل پروژه (*.pro) و فایل اصلی (main.cpp) را پاک کردید (و از پروژه حذف نمودید) فایل Qt2DGraphiX.h را در خط اول main.cpp استفاده کنید. در واقع شما باید دارای یک فایل main.cppباشید دارای محتوای زیر:
#include "Qt2DGraphiX.h" int update() { return 0; } void load() {} int main(int argc, char *argv[] ) { return Qt2DGraphiX::init(argc,argv,load,update,"My Qt2DGraphiX Sample"); }سپس برنامه را کامپایل و اجرا کنید، تا یک صفحه سفید در برابر شما ظاهر شود که با فشردن کلید Escاز آن خارج میشوید.
آشنایی با ساختار یک برنامه گرافیکی
برنامههای گرافیکی برخلاف برنامههای کنسول که تمام منابع سیستم را در اختیار دارند، اینگونه نیستند و تمام منابع را به صورت متناوب از سیستم عامل دریافت میکنند. به عبارت دقیقتر برنامههای کنسولی سنکرون ( Synchronous ) هستند و برنامههای گرافیکی آسنکرون ( Asynchronous ) ، و این یعنی برنامههای گرافیکی ممکن است چند اتفاق به صورت همزمان بیافتد. به عنوان مثال همزمان با اینکه برنامه نصب در حال کپی کردن فایلهاست، کاربر روی کلید کنسل کلیک میکند و برنامه پیام دیگری را نمایش میدهد.
برای سادگی هرچه بیشتر کار، موتور گرافیکی دو تابع برای برنامهساز در نظر می گیرد، یک تابع تنظیمات اولیه که آنرا setup مینامیم و یک تابع نمایش فریم گرافیکی که آنرا render مینامیم. تابع setup تنها یکبار در ابتدای برنامه اجرا میشود و تابع render به صورت متناوب بارها در هر ثانیه اجرا میگردد و فریمهای مختلف برنامه گرافیکی را رسم میکند
دو روش کلی برای نوشتن برنامههای گرافیکی وجود دارد، در روش اول در هر فریم تمام صفحه را پاک میکنند و همه چیز را از ابتدا میکشند، در روش دوم در هر فریم تنها تغییرات را رسم میکنند. روش دوم بسیار دشوارتر است و مناسب سیستمهاییست که سرعت پردازش گرافیکی خوبی ندارند، اما موتور ما از سرعت قابل توجهی برخوردار است پس روش اول را پیشنهاد میکنیم.
برای کسب اطلاعات بیشتر به نمونه برنامهای که همراه موتور عرضه میشود توجه کنید.
مرجع دستورات
init
این دستور برنامه گرافیکی را شروع میکند و موتور را فعال میسازد. در تابع main برنامه اصلی باید تنها یک دستور باشد و آنهم بازگرداندن فراخوانی این تابع است.
پارامترهاint init(int argc,char *argv[],void (*setup)(),int (*hook)(),QString title,int width=640,int height=480,int FPS=60)
پارامتر اول و دوم ورودی تابع اصلی برنامه هستند. پارامتر سوم، نام تابع setup است که باید از نوع void setup() باشد. پارامتر چهارم نام تابع render int render() باشد. این دو تابع توسط موتور فراخوانی میگردند. دقت کنید که تنها باید نام آنها را ارسال کنید.
پارامتر پنجم عنوان برنامه است که بر روی پنجره نمایش داده خواهد شد. پارامترهای ششم و هفتم، ابعاد پنجره را مشخص می کنند و مقدار پیش فرض دارند. پارامتر هشتم نیز تعداد فریمها بر ثانیه را مشخص میکند، یعنی معین میسازد در هر ثانیه چندبار تابع render باید توسط موتور فراخوانی شود که مقدار پیش فرض آن ۶۰ است.
مثال#include "Qt2DGraphiX.h" using namespace Qt2DGraphiX; void setup() { MsgBox ("Nothing to do here"); } int render() { return 0; } int main(int argc, char*argv[]) { return init(argc,argv, setup , render , "My Application"); }
playSound
این دستور یک فایل صوتی را پخش مینماید. رفتار دستور آسنکرون است (یعنی فایل به صورت موازی با جریان برنامه پخش خواهد شد)
پارامترهاvoid playSound(QString filename)
یک پارامتر، آنهم نام و آدرس فایلی که باید پخش شود.
نکته : این دستور ممکن است بر روی برخی از نسخ لینوکس کار نکند.
مثالplaySound("/home/abiusx/Desktop/file1.mp3"); playSound("../bomb.wav");
fillRectangle
یک مستطیل توپر میکشد. کاربرد اصلی آن برای پاک کردن صفحه است.
پارامترهاvoid fillRectangle(int x1,int y1, int x2, int y2, int color)
پارامترهای یک تا چهار مختصال مستطیل هستند. پارامتر پنجم رنگ در قالب RGB به صورت ۲۴ بیت است.
رنگهای RGB ترکیبی از قرمز و سبز وآبی هستند، که به ترتیب بایتهای سوم، دوم و اول یک عدد چهار بایتی را تشکیل میدهند. به عنوان مثال رنگی که تمام قرمز، آبی و سبز آن کامل باشد سفید است : 0xFFFFFF
مثالfillRectangle(0,0,640,480,0x00FF00); //green
MsgBox
یک پیام بر روی صفحه نمایش میدهد. رفتار تابع آسنکرون است.
پارامترهاvoid MsgBox(Variant data);
پارامتر میتواند تمام انواع متغیر زبان سی باشد. تابع بازنویسی شده است.
مثالMsgBox("Hello World!"); float f=2.2; MsgBox(f);
drawCircle
یک دایره توپر میکشد.
پارامترهاvoid drawCircle(int x,int y, int rx,int ry, int border_color,int fill_color=1) void drawCircle(Vector2D center,int r,int border_color,int fill_color=1) void drawCircle(int x,int y, int rx, int border_color,int fill_color=1)
بازنویسیهای مختلفی از تابع وجود دارند. مرکز دایره به همراه شعاع افقی و عمودی، به انضمام رنگ حاشیه و رنگ داخل. در صورتی که رنگ داخل داده نشود، همرنگ حاشیه خواهد شد.
مثالVector2D v(10,10); drawCircle(v,5,0xFF0000); //red circle with radius 5 at 10,10 drawCircle(100,100 , 50 , 60 ,0x00FF00, 0x0000FF);
putPixel
یک نقطه رسم میکند.
پارامترهاvoid putPixel(int x,int y,int color) void putPixel(Vector2D p,int color)
مختصات نقطه به همراه رنگ آن. تابع بازنویسی شده است.
مثالVector2D v(10,10); putPixel (v, 0xFFFFFF); //white pixel at 10,10 putPixel (15,15, 0); //black pixel at 15,15
drawLine
یک خط رسم میکند.
پارامترهاvoid drawLine(int x1,int y1,int x2,int y2,int color) void putPixel(Vector2D p,int color)
مختصات ابتدا و انتهای خط به همراه رنگ
مثالVector2D v(10,10),v2(100,100); drawLine(v,v2,0xFFFF00);
putText
متنی را بر روی صفحه مینویسد.
پارامترهاvoid putText(int x,int y,QString text,int color)
مختصات متن به همراه خود متن و رنگ آن
مثالputText (100,100 , "Hello There!",0);
getFrameCount
تعداد فریمهایی که از ابتدای برنامه تاکنون گذشته برمیگرداند.
پارامترهاint getFrameCount()
مثال
MsgBox(getFrameCount() );
getTime
زمانی که از ابتدای برنامه تاکنون گذشته بر حسب میلیثانیه بر میگرداند.
پارامترهاint getTime()
مثال
qDebug() << getTime();
نکته : دستور qDebug() به مانند دستور cout در سیپلاسپلاس، میتواند مقدار تقریبا تمامی انواع متغیر را در کنسول نمایش دهد. از این دستور برای اهداف خطاگیری در برنامهها استفاده میشود.
getKeyboardKey
کلیدی که بر روی کیبورد فشرده شده است را بر میگرداند.
پارامترهاint getKeyboardKey()
هر کلیدی یک کد مخصوص به خود دارد. لازم نیست کلیدها را حفظ کنید، بلکه با استفاده از Qt::Key_* و جایگزین کردن ستاره با اسم کلید میتوانید تشخیص دهید.
مثالint k=getKeyboardKey(); if (k==Qt::Key_Space) MsgBox("You pressed space!");
نکته مهم : هربار استفاده از این دستور، یک کلید را از بافر برداشته و تخلیه میکند. بنابراین باید مقدار این دستور را در یک متغیر بریزیم و سپس متغیر مورد نظر را با مقادیر مطلوب مقایسه کنیم.
getMouseCoords
مختصات ماوس را برمیگرداند.
پارامترهاVector2D getMouseCoords()
مختصات ماوس در قالب یک متغیر بردار دو بعدی بازگردانده میشود. به مثال توجه کنید.
مثالVector2D v=getMouseCoords(); qDebug() << " mouse is at" << v.x() << " , " << v.y() ;
نکته : متغیرهای نوع بردار دو بعدی قابل جمع و تفریق و عملیات حسابی دیگر با یکدیگر و اعداد صحیح و اعشاری هستند، از این رو کار را بسیار ساده میکنند.
getMouseDownButton
این دستور کلیدهایی از ماوس که پایین هستند را باز میگرداند.
پارامترهاMouseButtons getMouseDownButton()
خروجی در قالب زیر خواهد بود:
MouseButtons b; b=getMouseDownButton(); if (b==LeftButton) qDebug()<<"Left button is down!"; else if (b==LeftRight) MsgBox("You held left and right at the same time! wow!");
نکته : به مانند کار با کیبورد، هر موقع وضعیت کلید ماوس را از موتور بگیرید، وضعیت پاک میشود. بنابراین آنرا درون یک متغیر بریزید و سپس از آن استفاده کنید.
getMousePressButton
این دستور کلیدی از ماوس که کلیک شده بر میگرداند. دقت داشته باشید که فرآیند کلیک شامل پایین رفتن و سپس بالا آمدن یک کلید است.
پارامترهاMouseButtons getMousePressButton()
خروجی در قالب زیر خواهد بود:
MouseButtons b; b=getMousePressButton() if (b==LeftButton) qDebug()<<"Left button is clicked!"; else if (b==LeftRight) MsgBox("You pressed left and right at the same time! wow!");
نکته : به مانند کار با کیبورد، هر موقع وضعیت کلید ماوس را از موتور بگیرید، وضعیت پاک میشود. بنابراین آنرا درون یک متغیر بریزید و سپس از آن استفاده کنید.
setTransform
این دستور پیشرفته، ماتریس تبدیلات دستگاه مختصات را تنظیم میکند. این ماتریس به هنگام رسم هرچیزی خودکار در آن اعمال خواهد شد. با استفاده از ماتریس تبدیلات، میتوان تجانس، انتقال و دوران را اعمال کرد.
پارامترهاvoid setTransform(float translate_x=0,float translate_y=0,float rotate=0,float scale_x=1,float scale_y=1)
دو پارامتر اول انتقال در محورهای x و y هستند. پارامتر سوم زاویه دوران به درجه در جهت حرکت عقربههای ساعت است و پارامتر ۴ و ۵ ضرایب تجانس در محور x و y . همه پارامترها اختیاری هستند، در صورتی که هیچکدام وارد نشوند، ماتریس به حالت اولیه، یعنی ماتریس یکی باز میگردد. تنها راه چرخاندن اشیا استفاده از همین دستور است. دقت داشته باشید که دوران بر محور مختصات صورت میگیرد. برای تسلط به این دستور بهتر است که چندین برنامه با استفاده از آن بنویسید.
مثالdrawLine(10,10, 100,100 , 0xFF0000); //normal red line setTransform(5,5, 15, 1.5, 2.5); //transform matrix drawLine(10,10, 100,100 , 0x0000FF); //transformed green line with same coords
نکته : برای اینکه شکلی را بر روی محوری غیر از محور مختصات دوران دهید، کافیست آنرا در مختصات (0,0) رسم کنید، ولی پارامترهای انتقال را به (x,y) ای که مورد نظر رسم است تغییر دهید. پارامترهای انتقال در دوران دخیل نیستند.
loadImage
این دستور یک فایل تصویری را از فایل خوانده و در متغیری ذخیره میکند. دقت داشته باشید که فرآیند خواندن از دیسک بسیار کند است و تنها باید در ابتدای برنامه در بخش setup صورت بگیرد و دائما در هر فریم تکرا نشود.
پارامترهاImage2D loadImage(QString filepath)
تنها یک پارامتر ورودی وجود دارد آنهم آدرس فایل تصویریست. دقت داشته باشید که این تابع قابلیت بار کردن تصاویر از نوع PNG را نیز دارد که شفافیت میتوانند داشته باشند (و به شکل مستطیل نباشند) خروجی به صورت متغیری از نوع Image2D خواهد بود که در توابع بعدی میتوان آنرا رسم کرد.
مثالImage2D img1; void setup() { img1=loadImage("/home/abiusx/Desktop/image1.png"); } void update() { drawImage(10,10,img1); }
نکته : بیش از ۹۰ درصد برنامههای گرافیکی از رسم تصاویر بر روی صفحه تشکیل شده است. کمتر برنامه گرافیکی از رسم مستطسل و خط و نقطه استفاده میکند.
isImage
این دستور بررسی میکند که یک فایل تصویری صحیح بار شده یا خیر.
پارامترهاbool isImage(Image2D img)
متغیری از نوع Image2D ورودی میگیرد و مقدار true یا false باز میگرداند.
مثالImage2D img1; void setup() { img1=loadImage("/home/abiusx/Desktop/image1.png"); if (! isImage(img1)) MsgBox("Could not load image"); } void update() { drawImage(10,10,img1); }
drawImage
این دستور یک تصویر را بر روی صفحه رسم میکند
پارامترهاvoid drawImage(int x,int y,Image2D img,int width=0,int height=0)
مختصات شروع رسم، به همراه متغیر تصویر. دو پارامتر آخر که اختیاری هستند، مشخص میکنند چه مقدار از تصویر رسم شود.
مثالImage2D img1; void setup() { img1=loadImage("/home/abiusx/Desktop/image1.png"); if (! isImage(img1)) MsgBox("Could not load image"); } void update() { drawImage(10,10,img1); }
دریافت برنامه
پس از اینکه Qt SDK نسخه ۴.۶ به بعد را نصب کردید، برای دریافت بسته کامل Qt2DGraphiX کلیک کنید. دقت داشته باشید که بسته یک پروژه نمونه است، ولی شما کافیست دو فایل Qt2DGraphiX.h و Qt2DGraphiX_engine.h را داخل پروژه خود کپی کنید. یا روی همین پروژه برنامه بنویسید.
بازگشت