Saturday, August 11, 2012

সফটওয়্যার ডেভেলাপমেন্টঃ সি প্লাস প্লাস কিউট প্রজেক্ট 2d Painting

আজকে যে প্রজেক্টটি তৈরি করব তা হল Qt এই টেক্সটিকে কেন্দ্র করে কতগুলো বলের সারি বৃত্তাকারে ক্রমবৃদ্ধি আকারে ঘুরতে থাকবে। আচ্ছা প্রথমে সমস্যাটিকে ছোট ছোট ভাগে ভাগ করে নেই। একটি টেক্সট থাকবে মাঝখানে আর বল থাকবে যেগুলো ঘুরতে থাকবে। for লুপ ইউজ করে ব্যাপারটি এমন করে নিতে হবে যাতে অনেকগুলো বল তৈরি হয় এবং চক্রবৃদ্ধি আকারে ঘুরতে থাকে।


এর জন্য আমরা সি প্লাস প্লাসের ৭ টি ফাইল ইউজ করব। পুরো সোর্সকোডটি আপনি আগে একনজরে এখান
থেকে দেখে নিন।  কিভাবে কম্পাইল করতে হয় তা এই পোস্টে দেখে নিতে পারেন।
HEADERS += \
helper.h \
widget.h \
window.h
SOURCES += \
helper.cpp \
widget.cpp \
window.cpp \
main.cpp

এখানের মূল কাজটি করে helper.cpp ফাইলটি। এখানেই প্রজেক্টের পুরো কাজটি সম্পন্ন হয়।
#include <QtGui>
#include "helper.h"
//! [0]
Helper::Helper()
{
QLinearGradient gradient(QPointF(50, -20), QPointF(80, 20));
// ছবিতে ভাল করে খেয়াল করলে দেখবেন ভেতরের অংশটুকু লাল আর একটি নির্দিষ্ট অংশ পর এটা সবুজ।
// QLinearGradient ক্লাস শুরু বিন্দু এবং শেষ বিন্দু নির্দেশ করে দিচ্ছে যে কোন অংশটুকু লাল হবে
// আর কোনগুলো অন্যকালার।
gradient.setColorAt(0.0, Qt::red);
gradient.setColorAt(1.0, QColor(0xa6, 0xce, 0x39));
// আপনি ইচ্ছে করলে এটাকে ভিন্ন কোন রঙ যেমন নীল রঙ এভাবে দিতে পারেন-
// gradient.setColorAt(1.0, Qt:: blue));
background = QBrush(QColor(64, 32, 64));
// এটা পেছনের ব্যাকগ্রাউন্ড কালার নির্ধারন করছে।
circleBrush = QBrush(gradient);
circlePen = QPen(Qt::black);
circlePen.setWidth(1);
textPen = QPen(Qt::white);
// Qt লেখা টেক্সটি কাল বর্ণের হবে এবং ফন্টের আকার ৫০ হবে।
textFont.setPixelSize(50);
}
//! [0]
//! [1]
void Helper::paint(QPainter *painter, QPaintEvent *event, int elapsed)
{
painter->fillRect(event->rect(), background);
painter->translate(100, 100);
//! [1]
// এখন আমরা যে উইন্ডোটি বানাচ্ছি সেটা (২০০,২০০) পিক্সেলের। আপনি যদি এর আকার বাড়ান
// তাহলে উপরের ট্রান্সলেট মানটিও এমনভাবে বসাতে হবে যাতে পজিশনিং ঠিকভাবে হয়।
//! [2]
painter->save();
painter->setBrush(circleBrush);
painter->setPen(circlePen);
painter->rotate(elapsed * 0.030);
// এই মানটি যদি আপনি পরিবর্তন করেন তাহলে বলগুলো অসম্ভব দ্রুত গতিতে ঘুরবে।
qreal r = elapsed/1000.0;
int n = 30;
// ৩০ টি বল নিয়ে আমরা এখন কাজ করছি।
for (int i = 0; i < n; ++i) {
painter->rotate(30);
qreal radius = 0 + 120.0*((i+r)/n);
qreal circleRadius = 1 + ((i+r)/n)*20;
painter->drawEllipse(QRectF(radius, -circleRadius,
circleRadius*2, circleRadius*2));
// ক্রমবৃদ্ধিকারে ঘুরানোর জন্য এখানেই আসল কাজটি সম্পন্ন হয়। কোডগুলো ভাল করে খেয়াল করুন।
}
painter->restore();
//! [2]
//! [3]
painter->setPen(textPen);
painter->setFont(textFont);
painter->drawText(QRect(-50, -50, 100, 100), Qt::AlignCenter, "Qt");
// Qt লেখাটি কোথায় হবে তার পজিশন নির্দেশ করছে।
}
//! [3]
view raw helper.cpp hosted with ❤ by GitHub


মূল লজিকটা আসলে এখানেই।
১। QLinearGradient  ক্লাস দিয়ে আমরা প্রথমে বলে দিচ্ছি যে শুরু থেকে শেষ পর্যন্ত কালগুলো লাল থেকে সবুজ হবে।
২। QBrush ক্লাস দিয়ে  ব্যাকগ্রাউন্ড কালার এবং Qt টেক্সটের কালার নির্ধারন করছি।
৩। QPainter ক্লাস দিয়ে ব্যাকগ্রাউন্ড কালারকে প্রজেক্টে সেট করছি, এর translate ফাংশন দিয়ে পুরো কাজটি কোথায় বসবে তা নির্ধারন করছি ।
৪। for লুপ দিয়ে ৩০ টি বল তৈরি করে এগুলোকে rotate ফাংশন দিয়ে ঘুরাচ্ছি এবং radius এবং circleradius ভেরিয়েবলের মান এমনভাবে নির্ধারন করা হচ্ছে যাতে চক্রবৃদ্ধি আকারে ঘুরতে পারে।
৫। টেক্সট "Qt" ড্র করছি এবং এর পজিশন নির্ধারন করছি।

সোর্সকোড দেখতে চাইলে বা পরিবর্তন করতে চাইলে এখান থেকে কমিট করতে পারেন। পুরো সোর্সকোড ডাউনলোড করতে ক্লিক করুন এখানে । তৈরি করা প্রজেক্টটির এক্সিকিউটেবল ফাইল ডাউনলোড করুন এখান থেকে।
আমি শুধু এখানে মূল লজিকটুকু এবং এর কোডের গুরুত্বপূর্ন অংশটুকু ব্যাখ্যা করলাম। বাকীটা নিজেকে বুঝে নিতে হবে। তবুও যদি কোন অংশে সমস্যা থাকে যোগাযোগ করবেন।

3 comments:

  1. Quite possibly of one of the thecasinosource.com best thing that you will understand concerning the internet-based playing golf equipment is that it is completely scrambled. Along these traces, there can be no encroachment by outsiders with reference to your info. For the vast majority of the Koreans, betting and half in} playing club video games resembles nothing to joke about.

    ReplyDelete

এখানে আপনি আপনার মূল্যবান মতামতটি প্রকাশ করতে পারেন।