ساخت بازی Peggle Nights با کیوت بخش پنجم

خوب اولش چند تا قرار داد چون از اینجا وارد قسمت سخت ماجرا میشیم. یکی اینکه سعی کنید اسم متغیر ها و کلاس ها تون مثل من باشه . اسم فایلها هم همینطور. این طوری شما راحت تر هستید. دوم اینکه من بعضی چیزا رو خیلی سطحی از روشون میگذرم. مثلا میگم در ویژوال استودیو یه کلاس اضافه میکنیم. وقتی رو اینا به دلیل حجم زیاد گذاشته نمیشه. خوب اگه کسی مشکلی در این موارد داره در انجمن ها مطرح کنه.

خوب من یه پروژه GUI به نام PeggleNights در ویژوال استودیو ایجاد کردم. خوب اولین کاری که باید انجام بدیم ایه که یه  world به پروژه مون اضافه کنیم. چرا ؟ به دو دلیل. یکی اینکه خوب مسلما یه دنیا نیاز داریم . دوم اینکه مطمئن بشیم که حتما کارهای لازم برای پیوست کردن باکس تو دی به پروژه مون انجام شده.

خوب برای ساختن یه دنیا قبلش نیازه فایلهای Header باکس تو دی کنار فایلهای سورس مون قرار داده بشه.

پوشه Box2D که حاوی Collision و Common و Dynamics و … است رو در مسیر جاری پروژه تون کپی کنید.

مسیر جاری پروژه جایی که فایل های سورس ، فایل های Header و فایل های دیگر برنامه از جمله Resource ها قرار داره. در ویژوال استودیو اگر روی پروژه تون در قسمت Solution Explorer راست کلیک کنید و گزینه Open Folder In Windows Explorer رو بزنید به مسیر جاری پروژه خواهید رفت.در Creator راست کلیک کنید روی یکی از فایلهای پروژه و Show in explorer رو کلیک کنید.

نکته ای که مهم است اینه که باکس تودی با واحد متر کار میکنه و ما با واحد پیکسل .و چون مثلا اگه بخواهیم همون واحد رو برای نمایش اشیا به کار ببریم اشیا خیلی ریز میشن ( مثلا یه شی یه متر در یه متر رو اگه با همین ابعادش به صورت پیکسل نمایش بدیم میشه یک پیکسل در یک پیکسل ! واسه همین واحد متر رو ضرب در یه نسبتی میکنیم تا به پیکسل تبدیل بشه و برعکسشم واسه تبدیل پیکسل به متر . مثلا من اینجا مقدار ۳۰ رو در نظر گرفتم.

پس یه جایی یه const از جنس int به نام RATIO با مقدار ۳۰ داشته باشید. مثلا توی یه فایل .h به نام PhysicsValues.h من یه متغیر const از جنس int و با نام RATIO ساختم:

[cpp] #ifndef PhysicsValues_h__
#define PhysicsValues_h__

const int RATIO = 30;
#endif // PhysicsValues_h__
[/cpp]

خوب در کلاسی که از کلاس QMainWindow ارث برده شده میخوایم یه دنیا اضافه کنیم. خوب برای این کار باید فایل Box2D.h را Include کنیم. البته چون میخواهیم در فایل .h مون فقط اشارگر به دنیا داشته باشیم Forward Declaration در این فایل کافیه. ولی من برای راحتی فعلا include کردم . و یه اشارگر ازش ساختم عضو کلاس. به صورت زیر:

[cpp]</pre>
#ifndef PEGGLENIGHTS_H
#define PEGGLENIGHTS_H
#include <Box2D/Box2D.h>
#include <QtGui/QMainWindow>
#include "ui_pegglenights.h"

class PeggleNights : public QMainWindow
{
Q_OBJECT

public:
PeggleNights(QWidget *parent = 0, Qt::WFlags flags = 0);
~PeggleNights();

private:
Ui::PeggleNightsClass ui;
b2World *_world;
};

#endif // PEGGLENIGHTS_H

[/cpp]

خوب یه تابع به نام CreateWorld عضو این کلاس برای ساختن دنیا مون خواهیم داشت به صورت زیر :

[cpp]</pre>
void PeggleNights::createWorld()
{
b2Vec2 gravity(0, 9.8);
bool doSleep = true;
_world = new b2World(gravity, doSleep );
}
<pre>[/cpp]

خوب نحوه ساختن دنیا رو قبلا گفته بودم. اینجا دیگه توضیحی نمیدم. الان اگه پروژه تون رو کامپایل کنید و خطایی نداشتید بدونید که با باکس تو دی به مشکلی برنمیخورید ان شاء الله 😀

نحوه کامپایل برای کامپایل پروژه در Visual Studio چندین راه وجود دارد : زدن کلید F7 . زدن کلید ترکیبی CTRL+SHIFT+B و یا راست کلیک کردن روی پروژه و زدن گزینه Build . در Creator کلید ترکیبی CTRL+B.

خوب در ادامه قصد داریم یه توپ به این دنیا اضافه کنیم و نمایشش بدیم وای.

برای این کار نیاز داریم که اولا یه Body داشته باشیم  که در شبیه سازی Box2D شرکت کنه و هم نیاز داریم یه جوری این Body و در واقع این توپ رو نمایش بدیم. برای نمایش گرافیکی اش از Qt Graphics View استفاده میکنیم. که قبلا یه آموزش مختصریش توی وبلاگم گذاشته شد.

مختصر بگم که برای نمایش یه سری اشیاء دو بعدی در کیوتی باید یه Scene داشته باشیم و یک View و چندین  آیتم گرافیکی . آیتم های گرافیکی در Scene اضافه شده و از طریق View نمایش داده میشند. توصیه میکنم بخش Qt Graphics View توی Assistant رو حتما بخونید. پس یه اشارگر از جنس QGraphicsScene به کلاس PeggleNights اضافه کنید. به فایل .ui تون هم یک widget از جنس QGraphicsView . یا به صورت زیر عمل کنید. در سازنده این دستورات رو بنویسید:

[cpp]</pre>
PeggleNights::PeggleNights(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
ui.setupUi(this);
_scene = new QGraphicsScene;
QGraphicsView *view = new QGraphicsView(_scene);
setCentralWidget(view);
}
<pre>
[/cpp]

_scene یه اشارگر به شی از کلاس QGraphicsScene است که عضو کلاس تعریف شده . در ضمن تابع setCentralWidget باعث میشه که شما وسیله نمایش این Scene که همون View هست رو به عنوان ویدجت مرکزی در نظرش بگیرید.

تصویر یه توپ رو به Resource ها تون اضافه کنید. و بعد یه تابع به نام createBall به کلاستون اضافه کنید و تو اون کد زیر رو بنویسید:

[cpp]</pre>
void PeggleNights::createBall()
{
//create its body

//create its item
_ball = _scene->addPixmap(QPixmap(":/Resources/ball.png"));
}
<pre>[/cpp]

حالا فراموش نکنید که این تابع رو توی سازنده صدا بزنید. در ضمن تابع addPixmap که عضو کلاس QGraphicsScene هست برای اضافه کردن یه تصویر به scene ماست . من اشارگر به این تصویر اضافه شده به Scene رو هم برای استفاده های بعدی در متغیر _ball عضو کلاس نگه داری کردم. پس تا اینجا فایل هدر و سورس کلاس Mainwindow ما یا کلاس PeggleNights ما به صورت زیر هستش:

[cpp]</pre>
//HEADER

#ifndef PEGGLENIGHTS_H
#define PEGGLENIGHTS_H
#include <Box2D/Box2D.h>
#include <QtGui/QMainWindow>
#include "ui_pegglenights.h"
class QGraphicsScene;
class QGraphicsPixmapItem;
class PeggleNights : public QMainWindow
{
Q_OBJECT

public:
PeggleNights(QWidget *parent = 0, Qt::WFlags flags = 0);
~PeggleNights();

private:
Ui::PeggleNightsClass ui;
b2World *_world;
void createWorld();
QGraphicsScene *_scene;
QGraphicsPixmapItem *_ball;
void createBall();
};

#endif // PEGGLENIGHTS_H

////////////////////////////////////////////////////////
//SOURCE
#include "pegglenights.h"
#include <QGraphicsView>

PeggleNights::PeggleNights(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
ui.setupUi(this);
_scene = new QGraphicsScene;
QGraphicsView *view = new QGraphicsView(_scene);
setCentralWidget(view);
createBall();
}

PeggleNights::~PeggleNights()
{

}

void PeggleNights::createWorld()
{
b2Vec2 gravity(0, 9.8);
bool doSleep = true;
_world = new b2World(gravity, doSleep );
}

void PeggleNights::createBall()
{
//create its body

//create its item
_ball = _scene->addPixmap(QPixmap(":/Resources/ball.png"));
}
<pre>[/cpp]

حالا اگه برنامه رو اجرا کنید باید یه خروجی مثل این داشته باشید:

اما چطوری خاصیت فیزیکی به این توپ بدیم که در ادامه بررسی میکنیم. برای این که مطلب خیلی طولانی نشه این قسمت رو همین جا تموم میکنم و مطالب رو توی قسمت بعدی میذارم فعلا:)

۲,۸۱۶ total views, 1 views today

Print Friendly, PDF & Email

درباره ی سعید دادخواه

یه برنامه نویس !

همچنین ببینید

ریزه میزه – دسترسی به عناصر یک tuple

سلام دوستان گل. من سعی میکنم با توجه به وقت کم من و شما مطالب …

10
دیدگاه بگذارید

avatar
3 Comment threads
7 Thread replies
0 دنبال کنندگان
 
Most reacted comment
داغ ترین نخ نظرات
4 کامنت گذاران
mohammadali1375علی رضا پژوهشسعید دادخواهمحمد کامنت گذاران اخیر
  مشترک شو!  
جدیدترین قدیمی‌ترین دارای بیشترین امتیاز
میخوام باخبر شم از
محمد
Guest

ببخشید دانلود box2d چون در google گذاشتنش برای ایران تحریم هست جای دیگه ایی نیست که بشه دانلود کرد

علی رضا پژوهش
Guest
علی رضا پژوهش

سلام سعید جان
من هنوز نتونستم box2d رو توی فدورا کامپایلش کنم
از cmake-gui هم استفاده می‌کنم
http://bsl.site40.net/pic/c525a48acc00.png
و از بین گزینه ها codeblocks رو انتخاب میکنم اما codeblocks وقتی که پروژه رو باز میکنه هیچ کتابخونه ای نمیسازه

mohammadali1375
Member
mohammadali1375

آقا دمتون گرم. من تا چند وقت پیش چسبیده بودم به C# . هر کاری میخواستم بکنم از xna تا فیزیک انجین ها فقط با C# انجام میدادم. راستش از C++ میترسیدم 😀 . اما الان میبینم که اشتباهی میترسیدم 😀 . یه سوال هم داشتم. چجوری میتونم برای pximapitem آدرس رو در یک متغیر بدم ؟ یعنی اینکارو میکنم ولی به خطی که میخواد اون رو وارد scene کنه گیر میده. در اصل میخوام آدرس رو جایی بدم که نرم افزار اجرا میشه . اونو میتونم با argv[0] و کمی دستکاریش بدست بیارم اما نمیتونم به عنوان آدرس به… Read more »