Qt2DGraphiX - Basic 2D Procedual Corssplatform Graphics Engine based on Qt آخرین به روز رسانی : ۱۵ دی ۸۹

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()

خروجی در قالب زیر خواهد بود:

enum MouseButtons {NoButton=0,LeftButton=Qt::LeftButton,RightButton=Qt::RightButton,MidButton=Qt::MidButton ,LeftRight=0x3,All=0x7};
مثال
	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()

خروجی در قالب زیر خواهد بود:

enum MouseButtons {NoButton=0,LeftButton=Qt::LeftButton,RightButton=Qt::RightButton,MidButton=Qt::MidButton ,LeftRight=0x3,All=0x7};
مثال
	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 را داخل پروژه خود کپی کنید. یا روی همین پروژه برنامه بنویسید.


بازگشت

Site Footer

Sliding Sidebar