მეორე ვერსია:

დამატებულია

1. GameObject.cpp და GameObject.h თამაშის ობიექტების კლასი და

2. Player.cpp და Player.h მოთამაშის კლასი, რომელიც არის GameObject კლასის ქვეკლასი

ამიტომაც მისი ორი ცვლადი

protected:
uint _Type;
Vec2 _Pos;

არის protected და არა private, იმიტომ რომ დაინახოს ქვეკლასმა.

ამ ორივე კლასში (GameObject და Player) არის მეთოდები რომლებიც წერს ცვლადებში მნიშვნელობებს და მოაქვს ეს მნიშვნელობები.

GameConstants.h ფაილში დაემატა ერთი მუდმივა #define Z_ORDER_PLAYER 110

GameScene კლასს დაემატა ორი ცვლადი:

Player *_MainPlayer;        // მთავარი მოთამაშე
Vec2 _PlayerVelocity;       // მოთამაშის სიჩქარე გამოთვლილი გიროსკოპის მიერ

ასევე დაემატა 4 მეთოდი:

void CreateObjects();                 // ყველა ობიექტის შექმნის მეთოდი
virtual void onAcceleration(Acceleration *acc, Event *unused_event);    // გიროსკოპის მოძრაობა
void updatePosition();               // მდებარეობის განახლება
void update(float deltaT);          // მეთოდი რომელიც გამოიძახება ყოველ 0.0167 წამში

CreateObjects: მთავარი მოთამაშის შექმნა, ქვედა მარცხენა კუთხეში.

void GameScene::CreateObjects()
{
_MainPlayer = new Player(1, Vec2(_VisibleSize.width * 0.12f, _VisibleSize.height * 0.12f));
this->addChild(_MainPlayer->_Spr, Z_ORDER_PLAYER);
}

onAcceleration: გიროსკოპით დადგენა თუ საით უნდა იმოძრაოს მთავარმა პერსონაჟმა.

void GameScene::onAcceleration(Acceleration *acc, Event *unused_event)      // Acceleration (Device rotation)
{
if(_GameIsPaused == true ) return;

float acceleration = 2.0f;                              // acceleration
float maxVelocity = 2;                                  // Max speed

_PlayerVelocity.x = acc->x * acceleration;
_PlayerVelocity.y = acc->y * acceleration;

if (_PlayerVelocity.x > maxVelocity)
{
_PlayerVelocity.x = maxVelocity;
}
else if (_PlayerVelocity.x < -maxVelocity)
{
_PlayerVelocity.x = -maxVelocity;
}

if (_PlayerVelocity.y > maxVelocity)
{
_PlayerVelocity.y = maxVelocity;
}
else if (_PlayerVelocity.y < -maxVelocity)
{
_PlayerVelocity.y = -maxVelocity;
}
}

updatePosition: მთავარი პერსონაჟის მდებარეობის ცვლილება, მანამდე შემოწმებები რომ არ გაცდეს ეკრანის ჩარჩოებს

void GameScene::updatePosition()                            // Update player position
{

Vec2 pos = _MainPlayer->GetObjectPos();
pos.x += _PlayerVelocity.x;
pos.y += _PlayerVelocity.y;

float imageWidthHalved = 48.0f;
float imageHeightHalved = 48.0f;

float leftBorderLimit = imageWidthHalved;
float rightBorderLimit = _VisibleSize.width – imageWidthHalved;

float topBorderLimit = imageHeightHalved;
float bottomBorderLimit = _VisibleSize.height – imageHeightHalved;

// If out of border, stop player
if (pos.x < leftBorderLimit)
{
pos.x = leftBorderLimit;
_PlayerVelocity.x = 0;
}
else if (pos.x > rightBorderLimit)
{
pos.x = rightBorderLimit;
_PlayerVelocity.x = 0;
}

if (pos.y < topBorderLimit)
{
pos.y = topBorderLimit;
_PlayerVelocity.y = 0;
}
else if (pos.y > bottomBorderLimit)
{
pos.y = bottomBorderLimit;
_PlayerVelocity.y = 0;
}

//    CCLOG(“x = %f      y = %f”, _PlayerVelocity.x, _PlayerVelocity.y);
_MainPlayer->SetObjectDir(_PlayerVelocity);
_MainPlayer->UpdatePosition();
}

update: თუ თამაში შეჩერებული არ არის გამოვიძახომ მთავარი პერსონაჟის მდებარეობის ცვლილების მეთოდი

void GameScene::update(float deltaT)                    // Method called every 0.0167 second
{
if (_GameIsPaused == false)
{
updatePosition();
}
}

პირველი ვერსია:

თამაშის მისამართი GitHub-ზე: https://github.com/pastaread/TanksBattle

დამატებულია

1. GameScene.cpp        მეორე სცენის კლასი, cpp და h ფაილი.
GameScene.h
2. GameConstants.h        თამაშის მუდმივები.  

სათითაოდ თითოეული ფაილის აღწერა

GameScene.h:

public:                                                // ღია მეთოდები
static cocos2d::Scene* createScene();            // მეთოდი სცენის შექმნა
virtual bool init();                             // მეთოდი რომელიც
GameScene აღწერისას გაეშვება
void InitDefaults();                              // ცვლადებისთვის დეფოლტ მნიშვნელობების მინიჭების მეთოდი

void PauseGame(Ref* pSender);                    // დაპაუზების მეთოდი
void ResumeGame(Ref* pSender);                // თამაშის გაგრძელების მეთოდი
void RestartGame(Ref* pSender);                 // თამაშის თავიდან გაშვების მეთოდი
void MainMenu(Ref* pSender);                     // მენიუში დაბრუნების მეთოდი

 
CREATE_FUNC(GameScene);                      // init მეთოდის ავტომატურად გამოძახება
 

private:                                                    // დახურული ცვლადები
Size _VisibleSize;                                              // ეკრანის ზომა
Vec2 _Origin;                                                    // ეკრანის დასაწყისი წერტილი
bool _GameIsPaused;                                     // თამაში მიმდინარეობს თუ შეჩერებულია
Menu *_PauseMenu;                                      // მენიუ

 

GameScene.cpp:

GameScene::init() მეთოდში:

auto pauseItem = MenuItemImage::create(“buttonPause.png”, “buttonPause.png”, CC_CALLBACK_1(GameScene::PauseGame, this));
pauseItem->setPosition(Vec2(_Origin.x + _VisibleSize.width – pauseItem->getContentSize().width/2 , _Origin.y + pauseItem->getContentSize().height/2));
auto menu = Menu::create(pauseItem, NULL);
menu->setPosition(Vec2::ZERO);
this->addChild(menu, 1);

პაუზის ღილაკი, დაჭერისას ეშვება შემდეგი მეთოდი GameScene::PauseGame

GameScene::InitDefaults() მეთოდში

_GameIsPaused = false;                            // სცენის გაშვებისას თამაში დაპაუზებული არ არის

GameScene::PauseGame(Ref* pSender) მეთოდში

if (_GameIsPaused == true) return;                // თუ თამაში უკვე დაპაუზებულია, ხელმეორედ მენიუ არ გაიხსნას
_GameIsPaused = true;

auto bResume = MenuItemImage::create(“buttonResume.png”, “buttonResume.png”, CC_CALLBACK_1(GameScene::ResumeGame, this));
bResume->setScale(0.32f);

auto bMenu = MenuItemImage::create(“buttonMainMenu.png”, “buttonMainMenu.png”, CC_CALLBACK_1(GameScene::MainMenu, this));
bMenu->setScale(0.32f);

auto bRestart = MenuItemImage::create(“buttonRestart.png”, “buttonRestart.png”, CC_CALLBACK_1(GameScene::RestartGame, this));
bRestart->setScale(0.32f);

_PauseMenu = Menu::create(bResume, bMenu, bRestart, NULL); _PauseMenu->alignItemsHorizontallyWithPadding(_VisibleSize.width / 10.0f); _PauseMenu->setPosition(_VisibleSize.width * 0.5f, _VisibleSize.height * 0.5f); this->addChild(_PauseMenu, Z_ORDER_MENU);

// პაუზის მენიუს აგება სამი ღილაკით

GameScene::ResumeGame(Ref* pSender) მეთოდში

_GameIsPaused = false;                            // თამაშის გაგრძელება _PauseMenu->removeFromParentAndCleanup(true);    // მენიუს წაშლა

GameScene::RestartGame(Ref* pSender) მეთოდში

this->removeAllChildrenWithCleanup(true);
Director::getInstance()->popScene();
auto scene = GameScene::createScene();
Director::getInstance()->pushScene(scene);

მენიუს წაშლა, GameScene-ის წაშლა და თავიდან გამოძახება

GameScene::MainMenu(Ref* pSender) მეთოდში

Director::getInstance()->popScene();            // სცენის წაშლა

GameConstants.h:

#define Z_ORDER_MENU 1001                            // კოდში ნებისმიერ ადგილას სადაც არის Z_ORDER_MENU ნიშნავს 1001-ს

HelloWorldScene.cpp:

// New begin
#include “GameScene.h”                            // თამაშის სცენის h ფაილის დაინქლუდება, ქვევით გამოყენების მიზნით
// New end

// New begin
// Button: start game
auto startItem = MenuItemImage::create(“buttonGamePlay.png”, “buttonGamePlay.png”, CC_CALLBACK_1(HelloWorld::startGame, this));
startItem->setPosition(Vec2(visibleSize.width * 0.5f, visibleSize.height * 0.3f));
auto menuStart = Menu::create(startItem, NULL);
menuStart->setPosition(Vec2::ZERO);
this->addChild(menuStart, 1);
// New end                                        // ღილაკი თამაშის სცენის გასაშვებად

// New begin
void HelloWorld::startGame(cocos2d::Ref* pSender)
{
auto scene = GameScene::createScene();
Director::getInstance()->pushScene(scene);
}
// New end                                        // თამაშის სცენის აღწერა და გაშვება

Cocos2d-x-ის კონფიგურაცია Mac-ზე.

1. პირველ რიგში რაც თქვენ დაგჭირდებათ არის Xcode რომელსაც გადმოწერთ AppStore-დან.

2. შემდეგ გადმოიწერთ Cocos2d-x-ს. ჩვენ ვიმუშავებთ ვერსია 3.5-ზე http://www.cocos2d-x.org/download, თუ აღნიშნულ მისამართზე 3.5 ვერსია აღარ არის, მოძებნეთ შემდეგ მისამართზე http://www.cocos2d-x.org/download/version#Cocos2d-x.

3. ამოაარქივეთ გადმოწერილი ფაილი, გახსენით Terminal-ი, შედით ამოარქივებულ ფოლდერში და გაუშვით შემდეგი ბრძანება:

python ./setup.py

4. Mac-ზე ჩვენ მხოლოდ iPhone-ზე ვიმუშავებთ ამიტომ NDK-ს მისამართის მოთხოვნას უბრალოდ Skip გაუკეთეთ. შემდეგ აკრიფეთ შემდეგი 2 ბრძანება:

source /Users/[თქვენი მომხმარებლის სახელი]/.bash_profile

python ./setup.py

5. ისევ Skip გაუკეთეთ NDK-ს მისამართის მოთხოვნას და ახალი პროექტის შესაქმნელად გაუშვით შემდეგი ბრძანება:

cocos new Tanks -p learning.pastaread.tutorialtanks -l cpp -d /Users/[თქვენი მომხმარებლის სახელი]/Documents/Projects

“Tanks” არის პროექტის სახელი;

learning.pastaread.tutorialtanks ეს არის აპლიკაციის უნიკალური იდენთიფიკატორი, რომელიც ყველა აპლიკაცის უნდა ჰქონდეს განსხვავებული, ამიტომ რეკომენდირებულია შებრუნებულად დაწერილ თქვენი საიტის მისამართს მიწერილი პროექტის სახელი. მაგ: თუ თქვენი საიტია mysite.com, მაშინ პროექტის იდენთიფიკატორად შეგიძლიათ ჩაუწეროთ: com.mysite.tanks;

/Users/[თქვენი მომხმარებლის სახელი]/Documents/Projects არის მისამართი სადაც გინდათ რომ პროექტი განთავსდეს. მიუთითეთ ნებისმიერი მისამართი.

6. პროექტის შექმნის შემდეგ შედით ახლად შექმნილ ფოლდერში, შემდეგ ამ ფოლდერში “proj.ios_mac” და გაუშვით Tanks.xcodeproj, Xcode-ს გახსნის შემდეგ დააკომპილირეთ პროექტი და ის უნდა გაიშვას თქვენს აპარატზე.

შემდეგ მისამართზე შეგიძლიათ იხილოთ დაყენების ვიდეო ინსტრუქცია: https://www.youtube.com/watch?v=qXqgSNUf9Cc

Hello Cocos2d-x

მოგესალმებით.

ამ ბლოგზე ჩვენ გავარჩევთ Cocos2d-x, შევქმნით თამაშს და პროგრამირების ენად გამოვიყენებთ C++-ს.

ცოტათი შევეხებით SQL-საც.