1. Cocos2d-x-2.2.3 バージョンのインストールと構成。
1. Cocos2D-X 2.2.3 ディレクトリで、cocos2d-win32.vc2010.sln をクリックします。
私のPCにはvs2019がインストールされているので、クリック後vs2019で開きましたが、開いた後は特に何も考えずにコンパイルを開始し、コンパイルを終えてプロジェクトを開始するとエラー報告が出ました。
错误C1189#error: snprintf のマクロ定義が標準ライブラリ関数宣言 libcocos2d と競合します
その理由は、多くのライブラリまたはプログラムが snprintf() 関数を _snprintf() として定義しているためですが、vs2015 が登場する前は _snprintf() がサポートされていなかったためです。ただし、VS20 19 ではsnprintf() が定義されています。
これは明らかに snprintf() の再定義につながります。
解決策は、snpritf を定義するすべてのファイルで次の定義を見つけることです (おそらく、他の人が提供するライブラリを使用していて競合がある場合は、ライブラリを変更して再コンパイルする必要があります)。
#define snprintf _snprintf で置き換えます
#定義されている場合(_MSC_VER) && _MSC_VER<1900
# snprintf を定義 _snprintf
#endif
便宜上、プロジェクトを vs2010 に直接入れてコンパイルしましたが、たまたま VS2010 もコンピューターにダウンロードされていました。
VS2019でコンパイルされているため、VS2010でコンパイルすると以下のエラーが報告されます。
v142 用のビルド ツールが見つかりません (platform-toolset="v142")
問題の原因
V142 は VS2019 に相当します。プロジェクト以前のコンパイラは VS2019 でしたが、現在は VS2010 に変更されているため、このエラーが報告されます。
v142–>VS2019
v141–>VS2017
v140–>VS2015
v120–>VS2013
現在のコンパイラに対応したツールセットに修正して再コンパイルしてください。
プロジェクト –> プロパティ –> 一般 –> プラットフォーム ツールセット –> 対応するプラットフォーム ツールを選択 v100 は VS2010
それでも動作しない場合は、プロジェクト ディレクトリ内の隠しファイル .vs を削除して再コンパイルしてください。
2.生成完了後、「HelloCpp」を右クリック→スタートアップ、デバッグを開始するとプロジェクトが実行されます。
3. Python を使用して新しいプロジェクトを作成します
具体的な操作は次のとおりです:
(1)2.7 をダウンロードしてインストールします。(2)次に、環境変数を設定し、環境変数 Path に Python のインストール パスを追加します。
cmd コマンド プロンプトを開き、「python --version」と入力すると、構成が成功したことを示す次の内容が表示されます。
COCOS2D インストールディレクトリの tools/project-creator ディレクトリに移動します。
私のパスは F:\Cocos2d-x\cocos2d-x-2.2.3\cocos2d-x-2.2.3\tools\ です。
プロジェクト作成者
(3) Pythonでコマンドを入力する
python create_project.py -project FruitNinja-package com.eyu.helloword -言語 cpp
FruitNinja という名前の新しいプロジェクトが正常に作成されました。言語は C++ で、すべてのバージョンがあり、ビルドしたプロジェクトは cocos2d-x2.2.3フォルダー内のプロジェクト ファイル フォルダーにあります。
(4) 新しく作成したフォルダーに入ると、各プラットフォームのバージョンが表示されます。私のプロジェクトは Windows コンピューターで実行するため、.win32 フォルダーを開き、その中にある .sln ファイルをクリックして、VS2010 で開きます。
クリックしてデバッグを開始すると、このプロジェクトが直接実行できることがわかります。
2. Fruit Ninjaの最初のシーンHelloWorldと2番目のシーンPrepaSceneを実現します
1. HelloWorld シーンを変更する
HelloWorld クラスの init() メソッドを変更します。back.png を使用して画像スプライトを作成し、それを背景としてシーンに追加します。
変更後の HelloWorld シーンは次のようになります。背景画像は 1 つだけです。
3. ゲームの2番目のシーンを実現する
(1) 新しいレイヤークラス PrepareScene を作成します。このクラスにも静的シーンを作成するメソッドがあります。このシーンに PrepareScene レイヤーが追加されます。メソッドの実装は HelloWorld::scene と同じです。
class PrepareScene : public CCLayer
{
public:
PrepareScene();
virtual bool init();
static cocos2d::CCScene* scene();
CREATE_FUNC(PrepareScene);
//把主界面的图片精灵添加到场景中
void loadlogo();
void loadtitle();
void loadmenu();
void scle_rotate(int i); //设置精灵旋转
int index;
private:
#define RING1_ROTATE 1
#define RING2_ROTATE 2
#define RING3_ROTATE 3
#define PEACH_ROTATE 4
#define SANDIA_ROTATE 5
#define BOOM_ROTATE 6
CCSize size; //记录屏幕大小
bool ifstart; //记录主界面状态,是否已经准备好
};
(2)类方法的实现
构造函数,初始化属性
PrepareScene::PrepareScene()
{
index = 0;
angel = 0;
ifstart = false;
}
init函数设置界面的背景图片,init函数中调用了loadlogo()设置界面的其他元素
bool PrepareScene::init()
{
size = CCDirector::sharedDirector()->getWinSize(); //获取屏幕大小
CCSprite* backsp = CCSprite::create("background.jpg"); //用图片创建精灵backsp
backsp->setPosition(ccp(size.width / 2, size.height / 2)); //把锚点设置在屏幕正中央
this->addChild(backsp, -1); //背景图片添加到最底层,负数代表最高优先级
loadlogo();
return true;
}
Loadlogo() 関数は、メイン インターフェイスのバナーとロゴ要素の追加を実現します。バナーがシーンに正常に追加された後、関数を通じてアクション callfun を呼び出し、その後、loadtitle メソッドを呼び出します。
loadtitle 関数の実装は、loadlogo 関数の実装と似ており、次に、loadmenu 関数が呼び出されます。
連続アクション基本アクションのCCActionInterval
CCJumpTo と CCJumpBy は遅延アクション、つまり一定時間後に完了できるアクションです。
CCJumpTo: 特定の CCSprite を特定の位置にジャンプします。
CCJumpBy: 特定の CCSprite を特定の距離だけジャンプします。オブジェクトを元のパスに従って戻すリバースメソッドがあります。
宛先と作成者について:
To: 絶対的なアクション。
作者: 相対アクション。
例: 現在のオブジェクトの座標は (20,20) です。
CCMoveTo(50,50)後は(50,50)の位置に移動します。
CCMoveBy (50, 50) の後は、現在の座標を基準に移動し、最終的な座標は (70, 70) になります。
CCActionInstant は CCFiniteTimeAction を継承し、継続的に実行されるアクション クラスです。つまり、一定の時間内にアクションが実行され、完了します。
//数秒後に座標点に移動
CCMoveTo::create("時間","座標");
CCMoveBy::create("時間","座標");
// 数秒後、指定された位置まで数回バウンドした後
CCJumpTo::create("時間","目標位置","高さ","ゴールまでの数");
CCJumpBy::create("時間","目標位置","高さ","ゴールまでの数");
関数コールバック アクション CCCallFunc
CCCallFunc は、瞬間的なアクション CCActionInstant のサブクラスでもあります。主に 3 つの関数コールバック アクション クラスがあります。3 つの関数コールバックの違いは、パラメーターの数 (0、1、2) です。
CCCallFunc::create('object this', 'callback function'); //コールバック関数: パラメータなし
CCCallFuncN::create('object this', 'callback function'); //コールバック関数: 自身をパラメータとして渡します (CCNode* ノード)
CCCallFuncND::create('object this', 'callback function', 'arbitraryparameter void'); //コールバック関数: 2 つのパラメータ (CCNode* ノード、void* a)
複合アクション
コンビネーション動作とは、その名のとおり、単一の動作を組み合わせてより複雑な動作を形成することです。
移動中に回転したり、バウンス後に関数コールバックアクションを実行したりするなど...
結合アクションのクラスは CCActionInterval のサブクラスでもあり、主に連続アクションと反復アクションの 2 つのカテゴリに分類されます。
- シーケンスアクション: アクションが実行される順序。
CCSpawn::create("action object 1", "action object 2", ..., NULL); //アクションは同時に実行されます
CCSequence::create("action object 1", "action object 2", ..., NULL); //アクションは順番に実行されます
セットフルーツトス
可変速アクション CCEaseAction
CCEaseAction は CCActionInterval のサブクラスでもあります。このタイプのアクションの特徴は、アクションの実行中に速度を変更できることです。CCMoveTo のように、加速または減速で移動したり、加速してから減速して移動したりできます。
このクラスが存在するのは、ゲーム内の一部のアクションが均一に実行されないためです。自由落下するボールのように、落下速度が一定の速度で落下するのではなく、ますます速くなります。したがって、cocos2dx エンジンは、一般的に使用されるいくつかの可変速度クラスをカプセル化します。
このような速度変化は大きく次の 3 種類に分けられます。
(1) イン: 遅い状態から速い状態へ。
(2) アウト: 速いものから遅いものまで。
(3) InOut: 低速から高速になり、その後再び低速になります。
このうち、速度変更は物理学上のいくつかの公式に従って行われます。正弦波、指数関数など。
CCEaseAction が変更するのは、特定の連続アクションの実行中の速度であり、アクションの実行時間は変化しないことに注意してください。
このうち、CCEaseIn、CCEaseOut、CCEaseInOutに関する変更は少し複雑です。
ロードメニュー機能: 3 つまたは 6 つのスプライト要素をシーンに追加し、異なる速度で回転させます。
void PrepareScene::loadmenu()
{
CCSprite* scle1_dojo = CCSprite::create("dojo.png");
CCSprite* scle2_new = CCSprite::create("new-game.png");
CCSprite* scle3_quit = CCSprite::create("quit.png");
CCSprite* peach = CCSprite::create("peach.png");
CCSprite* sandia = CCSprite::create("sandia.png");
CCSprite* boom = CCSprite::create("boom.png");
scle1_dojo->setPosition(ccp(120, 180));
scle2_new->setPosition(ccp(350, 180));
scle3_quit->setPosition(ccp(550, 130));
peach->setPosition(ccp(120, 180));
sandia->setPosition(ccp(350, 180));
boom->setPosition(ccp(550, 130));
this->addChild(scle1_dojo);
this->addChild(scle2_new);
this->addChild(scle3_quit);
this->addChild(peach);
this->addChild(sandia);
this->addChild(boom);
//旋转效果
scle_rotate(RING1_ROTATE);
scle_rotate(RING2_ROTATE);
scle_rotate(RING3_ROTATE);
scle_rotate(PEACH_ROTATE);
scle_rotate(SANDIA_ROTATE);
scle_rotate(BOOM_ROTATE);
ifstart = true; //记录主界面已经准备好
}
实现精灵元素旋转的函数
(3) PrepareSceneクラスの実装後、AppDelegateクラスの機能を変更します。
CCScene* pScene = PrepareScene ::scene(); CCSceneに変更 * pScene = HelloWorld::scene();
ステートメントの場所は次の関数本体内です。
bool AppDelegate::applicationDidFinishLaunching() {
……
// シーン HelloWorld を作成します。これはゲーム プログラムの最初のインターフェイスです
CCScene* pScene = HelloWorld::scene();
trueを返します。
}
次の図に示すように、[実行] をクリックして効果を確認します。その後、2番目のゲームシーンも部分的に実装されます
- シーン切り替えを設定する
1. HelloWorld クラスを変更し、loadScene( float dt);メソッドを追加します。
クラス HelloWorld : public cocos2d::CCLayer
{
……
voidloadScene ( float dt);
};
void HelloWorld::loadScene( float dt)
{
CCScene* シーン = PrepareScene::scene();
//CCTransitionCrossFade* pScene = CCTransitionCrossFade::create(0.1,scene);
CCDirector::sharedDirector()->replaceScene(シーン);
}
loadScene( float dt ); この関数は、HelloWorld シーンを PrepaScene シーン (ゲームのメニュー インターフェイス) に置き換えます。
2. AppDelegate::applicationDidFinishLaunching 関数に加えた変更を元に戻し、HelloWorld.cpp ファイルに戻って init 関数を変更し、次の行を追加し、ワンタイム タイマーを設定して、HelloWorld::loadScene() 関数を実行します。 1.5秒切り替え後のシーンを実現
bool HelloWorld::init()
{
……
// ワンタイム タイマー。1.5 秒の遅延後に対応する本体更新関数を実行します。一度だけ実行し、その後は更新しません。
this ->scheduleOnce(schedule_selector(HelloWorld::loadScene), 1.5f);
this ->setKeypadEnabled( true );
trueを返します。
}