diff --git a/Classes/AppDelegate.cpp b/Classes/AppDelegate.cpp index 6afed02..ba629ba 100644 --- a/Classes/AppDelegate.cpp +++ b/Classes/AppDelegate.cpp @@ -1,6 +1,8 @@ #include "AppDelegate.h" #include "Scenes/WelcomeScene.h" #include "Scenes/ExampleGameScene.h" +#include "Scenes/OnlineGameScene.h" +#include "Scenes/SocketServerScene.h" // #define USE_AUDIO_ENGINE 1 // #define USE_SIMPLE_AUDIO_ENGINE 1 @@ -95,8 +97,10 @@ bool AppDelegate::applicationDidFinishLaunching() { register_all_packages(); // create a scene. it's an autorelease object - auto scene = WelcomeScene::createScene(); - + auto scene = OnlineGameScene::createScene(); + //auto scene = SocketServerScene::createScene(); + //auto scene = ExampleGameScene::createScene(); + // run director->runWithScene(scene); diff --git a/Classes/GameSettingScene.cpp b/Classes/GameSettingScene.cpp new file mode 100644 index 0000000..92e73be --- /dev/null +++ b/Classes/GameSettingScene.cpp @@ -0,0 +1,12 @@ +#include "GameSettingScene.h" + + + +GameSettingScene::GameSettingScene() +{ +} + + +GameSettingScene::~GameSettingScene() +{ +} diff --git a/Classes/Players/Charactor.cpp b/Classes/Players/Charactor.cpp index 77ee696..088a40e 100644 --- a/Classes/Players/Charactor.cpp +++ b/Classes/Players/Charactor.cpp @@ -52,8 +52,67 @@ Charactor::Charactor(string _name) { hitEffectBegin = 53; hitEffectEnd = 60;//被击打特效 } - else { + else if (name == "Goku") { + idleNum = 4; + runNum = 6; + meleeAttack1Num = 4; + meleeAttack2Num = 9; + meleeAttack3Num = 15; + rangedAttackNum = 6; + jumpNum = 7; + hitNum = 2; + deadNum = 5; + winNum = 8; + hittedAwayNum = 7; //todo + dashNum = 2; + defendNum = 1; + chargeNum = 4; + ultimateNum = 10; + + ultimateBallNum = 4; + ultimateBallBegin = 11; + ultimateBallEnd = 14;//大招 + chargeEffectNum = 11; + chargeEffectBegin = 0; + chargeEffectEnd = 10;//蓄力 + rangedBallNumber = 30;//远程攻击 + explosionNum = 17; + explosionBegin = 31; + explosionEnd = 47;//爆炸 + hitEffectNum = 8; + hitEffectBegin = 53; + hitEffectEnd = 60;//被击打特效 + } + else if (name == "Frieza") { + idleNum = 3; + runNum = 8; + meleeAttack1Num = 4; + meleeAttack2Num = 7; + meleeAttack3Num = 11; + rangedAttackNum = 6; + jumpNum = 7; + hitNum = 2; + deadNum = 4; + winNum = 5; + hittedAwayNum = 7; + dashNum = 2; + defendNum = 1; + chargeNum = 4; + ultimateNum = 5; + ultimateBallNum = 4; + ultimateBallBegin = 11; + ultimateBallEnd = 14;//大招 + chargeEffectNum = 11; + chargeEffectBegin = 0; + chargeEffectEnd = 10;//蓄力 + rangedBallNumber = 30;//远程攻击 + explosionNum = 17; + explosionBegin = 31; + explosionEnd = 47;//爆炸 + hitEffectNum = 8; + hitEffectBegin = 53; + hitEffectEnd = 60;//被击打特效 } rangedBallStr = name + "_boom_" + std::to_string(rangedBallNumber) + ".png"; diff --git a/Classes/Players/PlayerSprite.cpp b/Classes/Players/PlayerSprite.cpp index 6b02872..83aafb4 100644 --- a/Classes/Players/PlayerSprite.cpp +++ b/Classes/Players/PlayerSprite.cpp @@ -207,6 +207,7 @@ void PlayerSprite::moveLeft() if (isRun) { return; } + isMove = true; auto animation = Animation::createWithSpriteFrames(runVector, 0.09f); auto animate = Animate::create(animation); auto MoveAnimate = RepeatForever::create(animate); @@ -229,6 +230,7 @@ void PlayerSprite::moveRight() if (isRun) { return; } + isMove = true; auto animation = Animation::createWithSpriteFrames(runVector, 0.09f); auto animate = Animate::create(animation); auto MoveAnimate = RepeatForever::create(animate); @@ -447,6 +449,7 @@ void PlayerSprite::dashLeft(Vec2 oppoentPosition) if (isRun) { return; } + isMove = true; setFlippedX(false); physicPlayer->getPhysicsBody()->setVelocity(Vec2(-800,0)); auto animation = Animation::createWithSpriteFrames(dashVector, 0.09f, 0); @@ -462,6 +465,7 @@ void PlayerSprite::dashRight(Vec2 oppoentPosition) if (isRun) { return; } + isMove = true; setFlippedX(true); physicPlayer->getPhysicsBody()->setVelocity(Vec2(800, 0)); auto animation = Animation::createWithSpriteFrames(dashVector, 0.09f, 0); @@ -553,7 +557,7 @@ void PlayerSprite::defend() { /* 蓄力 */ void PlayerSprite::charge() { - if (isRun) { + if (getActionByTag(0) == NULL) { return; } auto end = CallFuncN::create([&](Ref* sender) { diff --git a/Classes/Players/PlayerSprite.h b/Classes/Players/PlayerSprite.h index cbe1169..0db5d05 100644 --- a/Classes/Players/PlayerSprite.h +++ b/Classes/Players/PlayerSprite.h @@ -72,6 +72,7 @@ class PlayerSprite : public Sprite bool stopJump = true, stopMeleeAttack = true, stopRangedAttack = true; bool isHitted = false, isHitting = false, isUltimate = false; bool isDead = false, isWin = false; + bool isMove = false; int hittedCount = 0; /*被连击的判断变量*/ bool isDouble = false; diff --git a/Classes/Scenes/ExampleGameScene.cpp b/Classes/Scenes/ExampleGameScene.cpp index 6445b9b..7e08b18 100644 --- a/Classes/Scenes/ExampleGameScene.cpp +++ b/Classes/Scenes/ExampleGameScene.cpp @@ -1,11 +1,13 @@ #include "ExampleGameScene.h" #include "SimpleAudioEngine.h" +#include "GamePauseScene.h" #include "../configuration.h" +#include "../ShareSingleton.h" #include "../Players/PlayerSprite.h" +using namespace CocosDenshion; #include #include #include - USING_NS_CC; /* * tag 动画 @@ -75,14 +77,14 @@ bool ExampleGameScene::init() #pragma endregion #pragma region 创建场景 - /* Todo:美工 */ - - /* 添加背景图片 */ - auto bgSprite = Sprite::create("exampleBackground.png"); + int selectedBg = ShareSingleton::GetInstance()->selectedBackground; + char bgName[20]; + sprintf(bgName, "bg/bg%d.png", selectedBg); + auto bgSprite = Sprite::create("bg/bg4.png"); bgSprite->setPosition(visibleSize / 2); bgSprite->setScale(visibleSize.width / bgSprite->getContentSize().width, visibleSize.height / bgSprite->getContentSize().height); this->addChild(bgSprite, 0); - + /* 添加地面 */ ground = Sprite::create("ground.png"); ground->setScale(visibleSize.width / ground->getContentSize().width, 1.2f); @@ -95,10 +97,11 @@ bool ExampleGameScene::init() groundbody->setTag(1); groundbody->setDynamic(false); ground->setPhysicsBody(groundbody); + ground->setVisible(false); this->addChild(ground, 1); #pragma endregion - + #pragma region 创建精灵 /* Todo:创建精灵的人需要修改一下这里的初始帧 */ /* 创建一张贴图,使用贴图创建精灵 */ @@ -117,17 +120,19 @@ bool ExampleGameScene::init() physicPlayer1->setScale(1.2f); addChild(physicPlayer1, 3); - player1->initSprite("Kid_Buu", physicPlayer1); + player1->initSprite("Goku", physicPlayer1); player1->initAnimateFrame(); player1->setPosition(Vec2(visibleSize.width / 4 * 3, visibleSize.height / 2 - 300)); player1->setFlippedX(true); player1->setVisible(true); - addChild(player1, 3); + addChild(player1 , 3); player1->idle(); player2 = new PlayerSprite(); /* 添加player2的物理刚体 */ - physicPlayer2 = Sprite::create("physicplayer.png"); + /* 弗利萨的尾巴问题,所以得换个刚体绑定 */ + physicPlayer2 = Sprite::create("physicplayerForFrieza.png"); + //physicPlayer2 = Sprite::create("physicplayer.png"); physicPlayer2->setPosition(Vec2(visibleSize.width / 4, visibleSize.height / 2 - 300)); auto player2Body = PhysicsBody::createBox(physicPlayer2->getContentSize(), PhysicsMaterial(10000.0f, 0.0f, 0.0f)); player2Body->setCategoryBitmask(0xFFFFFFFF); @@ -139,7 +144,8 @@ bool ExampleGameScene::init() physicPlayer2->setScale(1.2f); addChild(physicPlayer2, 3); - player2->initSprite("Kid_Buu", physicPlayer2); + player2->initSprite("Frieza", physicPlayer2); + isFreiza = true; player2->initAnimateFrame(); player2->setPosition(Vec2(visibleSize.width / 4, visibleSize.height / 2 - 300)); player2->setFlippedX(true); @@ -157,6 +163,9 @@ bool ExampleGameScene::init() Sprite* player1hpBorder = Sprite::create("hp.png", CC_RECT_PIXELS_TO_POINTS(Rect(0, 320, 420, 47))); Sprite* player1hpContent = Sprite::create("hp.png", CC_RECT_PIXELS_TO_POINTS(Rect(610, 362, 4, 16))); + //Sprite* player1hpBorder = Sprite::create("hp1.png"); +// Sprite* player1hpContent = Sprite::create("hp2.png"); + player1Hp = ProgressTimer::create(player1hpContent); player1Hp->setScaleX(90); player1Hp->setAnchorPoint(Vec2(0, 0)); @@ -199,9 +208,11 @@ bool ExampleGameScene::init() player2Hp->setMidpoint(Point(0, 1)); player2Hp->setPercentage(100); player2Hp->setPosition(Vec2(origin.x + 14 * player2Hp->getContentSize().width, origin.y + visibleSize.height - 2 * player2Hp->getContentSize().height)); + //player2Hp->setPosition(Vec2(100,100)); addChild(player2Hp, 1); player2hpBorder->setAnchorPoint(Vec2(0, 0)); player2hpBorder->setPosition(Vec2(origin.x + player2Hp->getContentSize().width, origin.y + visibleSize.height - player2hpBorder->getContentSize().height)); + //player2hpBorder->setPosition(Vec2(300, 300)); addChild(player2hpBorder, 0); /* Player2的Mp */ @@ -223,18 +234,58 @@ bool ExampleGameScene::init() #pragma endregion -#pragma region 游戏界面的菜单项 - /* Todo: 美工人员请在这里添加游戏界面的菜单项,如暂停游戏,设置,声音开关 */ +#pragma region 音乐 + + auto audio = SimpleAudioEngine::getInstance(); + /*预加载并循环播放背景音乐*/ + // audio->preloadBackgroundMusic("music/WelcomeSceneBackground.mp3"); + audio->playBackgroundMusic("music/MainGameSceneBgm.mp3", true); + audio->setBackgroundMusicVolume(0.80); + + /*预加载点击音效*/ + audio->preloadEffect("music/ClickCamera.wav"); + audio->setEffectsVolume(0.80); + + /*加载并播放 3 2 1 开始 音乐*/ + audio->playEffect("music/321.mp3", false, 1.0f, 0.0f, 1.0f); #pragma endregion -#pragma region 音乐 - /* Todo: 美工人员请在这里添加音乐的相关代码 */ +#pragma region 游戏界面的菜单项 + + /* Todo: 美工人员请在这里添加游戏界面的菜单项,如暂停游戏,设置,声音开关 */ + /*声音开关,默认打开 voiceState == true*/ + voiceState = 1; + voiceItem = MenuItemImage::create( + "button/SoundOn.png", + "button/SoundOff.png", + CC_CALLBACK_1(ExampleGameScene::VoicePauseSelectedCallback, this) + ); + voiceItem->setPosition(ccp(visibleSize.width - voiceItem->getContentSize().width / 2, + visibleSize.height / 2 - voiceItem->getContentSize().height / 2 - 60)); + auto VoiceMenu = Menu::create(voiceItem, NULL); + VoiceMenu->setPosition(Vec2::ZERO); + addChild(VoiceMenu, 0); + + /*游戏暂停按钮 */ + playOrPauseState = 1; + playOrPauseItem = MenuItemImage::create( + "button/play.png", + "button/pause.png", + CC_CALLBACK_1(ExampleGameScene::playOrPauseCallback, this) + ); + playOrPauseItem->setPosition(ccp(visibleSize.width - playOrPauseItem->getContentSize().width / 2, + visibleSize.height/2 - playOrPauseItem->getContentSize().height / 2)); + //playOrPauseItem->setPosition(Vec2(480, 70)); + auto playOrPauseMenu = Menu::create(playOrPauseItem, NULL); + playOrPauseMenu->setPosition(Vec2::ZERO); + addChild(playOrPauseMenu, 0); #pragma endregion + #pragma region 添加监听器 auto keyboardListener = EventListenerKeyboard::create(); @@ -265,6 +316,7 @@ bool ExampleGameScene::init() auto changeItem = MenuItemLabel::create(label, CC_CALLBACK_1(ExampleGameScene::hitTest, this)); auto menu = Menu::create(changeItem, NULL); menu->setPosition(visibleSize.width / 2, visibleSize.height / 2); + menu->setVisible(false); addChild(menu, 2); auto label2 = Label::createWithTTF("dead", "fonts/arial.ttf", 24); @@ -272,6 +324,7 @@ bool ExampleGameScene::init() auto changeItem2 = MenuItemLabel::create(label2, CC_CALLBACK_1(ExampleGameScene::deadTest, this)); auto menu2 = Menu::create(changeItem2, NULL); menu2->setPosition(visibleSize.width / 2 + 50, visibleSize.height / 2); + menu2->setVisible(false); addChild(menu2, 2); #pragma endregion @@ -305,6 +358,15 @@ bool ExampleGameScene::onContactSeparate(PhysicsContact & contact) /* 按下键盘 */ void ExampleGameScene::onKeyPressed(EventKeyboard::KeyCode code, Event* event) { + + if (chargeEffect1 != NULL) { + chargeEffect1->removeFromParentAndCleanup(true); + chargeEffect1 = NULL; + } + if (chargeEffect2 != NULL) { + chargeEffect2->removeFromParentAndCleanup(true); + chargeEffect2 = NULL; + } switch (code) { case cocos2d::EventKeyboard::KeyCode::KEY_LEFT_ARROW: LeftKeyPressed(); @@ -377,8 +439,11 @@ void ExampleGameScene::onKeyReleased(EventKeyboard::KeyCode code, Event* event) { switch (code) { case cocos2d::EventKeyboard::KeyCode::KEY_LEFT_ARROW: + player1->isMove = false; player1->stopActionByTag(1); - physicPlayer1->getPhysicsBody()->setVelocity(Vec2(0,0)); + if (physicPlayer1->getPhysicsBody()->getVelocity().x < 0) { + physicPlayer1->getPhysicsBody()->setVelocity(Vec2(0, 0)); + } /* 考虑先按1后按2,先松1的情况 */ if (player1->getActionByTag(2) == nullptr) { player1->idle(); @@ -386,8 +451,11 @@ void ExampleGameScene::onKeyReleased(EventKeyboard::KeyCode code, Event* event) LeftKeyState = false; break; case cocos2d::EventKeyboard::KeyCode::KEY_RIGHT_ARROW: + player1->isMove = false; player1->stopActionByTag(2); - physicPlayer1->getPhysicsBody()->setVelocity(Vec2(0, 0)); + if (physicPlayer1->getPhysicsBody()->getVelocity().x > 0) { + physicPlayer1->getPhysicsBody()->setVelocity(Vec2(0, 0)); + } if (player1->getActionByTag(1) == nullptr) { player1->idle(); } @@ -406,21 +474,34 @@ void ExampleGameScene::onKeyReleased(EventKeyboard::KeyCode code, Event* event) case cocos2d::EventKeyboard::KeyCode::KEY_3: break; case cocos2d::EventKeyboard::KeyCode::KEY_5: - player1->stopActionByTag(12); - if(chargeEffect1 != NULL) chargeEffect1->removeFromParentAndCleanup(true); - player1->idle(); + if (player1->getActionByTag(12) != nullptr) { + player1->stopActionByTag(12); + if (chargeEffect1 != NULL) { + chargeEffect1->removeFromParentAndCleanup(true); + chargeEffect1 = NULL; + } + player1->idle(); + } break; case cocos2d::EventKeyboard::KeyCode::KEY_A: + player2->isMove = false; player2->stopActionByTag(1); - physicPlayer2->getPhysicsBody()->setVelocity(Vec2(0, 0)); + if (physicPlayer2->getPhysicsBody()->getVelocity().x < 0) + { + physicPlayer2->getPhysicsBody()->setVelocity(Vec2(0, 0)); + } if (player2->getActionByTag(2) == nullptr) { player2->idle(); } A_KeyState = false; break; case cocos2d::EventKeyboard::KeyCode::KEY_D: + player2->isMove = false; player2->stopActionByTag(2); - physicPlayer2->getPhysicsBody()->setVelocity(Vec2(0, 0)); + if (physicPlayer2->getPhysicsBody()->getVelocity().x > 0) + { + physicPlayer2->getPhysicsBody()->setVelocity(Vec2(0, 0)); + } if (player2->getActionByTag(1) == nullptr) { player2->idle(); } @@ -435,9 +516,14 @@ void ExampleGameScene::onKeyReleased(EventKeyboard::KeyCode code, Event* event) case cocos2d::EventKeyboard::KeyCode::KEY_J: break; case cocos2d::EventKeyboard::KeyCode::KEY_Y: - player2->stopActionByTag(12); - if (chargeEffect2 != NULL) chargeEffect2->removeFromParentAndCleanup(true); - player2->idle(); + if (player2->getActionByTag(12) != nullptr) { + player2->stopActionByTag(12); + if (chargeEffect2 != NULL) { + chargeEffect2->removeFromParentAndCleanup(true); + chargeEffect2 = NULL; + } + player2->idle(); + } break; default: break; @@ -551,7 +637,15 @@ void ExampleGameScene::updateHP_MP(float delay) /* TODO:这里的对打逻辑存在一点小问题,有时候会出现两个人互打的情况; */ void ExampleGameScene::hit(float dt) { - if (abs(player1->getPositionX() - player2->getPositionX()) < 100) { + /* 因为弗利萨尾巴太长,所以判定距离的方法得区别开来 */ + bool flag = false; + if (isFreiza) { + flag = abs(physicPlayer1->getPositionX() - physicPlayer2->getPositionX()) < physicPlayer1->getContentSize().width + physicPlayer2->getContentSize().width - 50; + } + else { + flag = abs(player1->getPositionX() - player2->getPositionX()) < 100; + } + if (flag) { bool player1FirstAttack = false,bothIdle = false; if (player1->isHitting && player2->isHitting) { player1FirstAttack = player1LastHit > player2LastHit; @@ -888,7 +982,7 @@ void ExampleGameScene::createRangedBall(PlayerSprite* player,bool isPlayer1) { /* 生成蓄力效果 */ Sprite* ExampleGameScene::createChargeEffect(PlayerSprite* player) { - if (player->isRun) return NULL; + if (player->isRun ||player->isMove ) return NULL; Sprite* effect = Sprite::createWithSpriteFrame(player->chargeEffectVector.front()); effect->setScale(2.0f); effect->setPosition(player->getPosition() + Vec2(0, 30)); @@ -912,3 +1006,54 @@ void ExampleGameScene::createHitEffect(PlayerSprite* player) { }),NULL); hitEffect->runAction(seq); } + +/* 声音暂停 回调*/ +void ExampleGameScene::VoicePauseSelectedCallback(Ref * pSender) +{ + /*声音按钮切换以及声音控制*/ + if (voiceState) { + SimpleAudioEngine::getInstance()->pauseBackgroundMusic(); + SimpleAudioEngine::getInstance()->pauseAllEffects(); + voiceState = 0; + voiceItem->setNormalImage(Sprite::create("button/SoundOff.png")); + } + else { + SimpleAudioEngine::getInstance()->resumeBackgroundMusic(); + SimpleAudioEngine::getInstance()->resumeAllEffects(); + voiceState = 1; + SimpleAudioEngine::getInstance()->playEffect("music/ClickCamera.wav", false, 1.0f, 0.0f, 1.0f); + voiceItem->setNormalImage(Sprite::create("button/SoundOn.png")); + } +} + +/*游戏暂停,弹出暂停场景的回调函数*/ +void ExampleGameScene::playOrPauseCallback(Object * pSender) +{ + /*得到窗口的大小*/ + Size visibleSize = Director::sharedDirector()->getVisibleSize(); + RenderTexture *renderTexture = RenderTexture::create(visibleSize.width, visibleSize.height); + + /*遍历当前类的所有子节点信息,画入renderTexture中。 + 这里类似截图。*/ + renderTexture->begin(); + this->getParent()->visit(); + renderTexture->end(); + + /*将游戏界面暂停,压入场景堆栈。并切换到GamePauseScene界面*/ + Director::sharedDirector()->pushScene(GamePauseScene::CreateScene(renderTexture)); + + log(" to game pause scene"); + + /* 播放暂停按钮切换*/ + if (playOrPauseState) { + SimpleAudioEngine::getInstance()->playEffect("music/ClickCamera.wav", false, 1.0f, 0.0f, 1.0f); + playOrPauseState = 0; + //Director::getInstance()->set + playOrPauseItem->setNormalImage(Sprite::create("button/pause.png")); + } + else { + SimpleAudioEngine::getInstance()->playEffect("music/ClickCamera.wav", false, 1.0f, 0.0f, 1.0f); + playOrPauseState = 1; + playOrPauseItem->setNormalImage(Sprite::create("button/play.png")); + } +} diff --git a/Classes/Scenes/ExampleGameScene.h b/Classes/Scenes/ExampleGameScene.h index 3ca4f67..a6dffdb 100644 --- a/Classes/Scenes/ExampleGameScene.h +++ b/Classes/Scenes/ExampleGameScene.h @@ -72,6 +72,10 @@ class ExampleGameScene : public cocos2d::Layer Sprite* createChargeEffect(PlayerSprite* player); /*生成被击打效果*/ void createHitEffect(PlayerSprite* player); + /* 设置背景音乐打开或者关闭 */ + void VoicePauseSelectedCallback(Ref * pSender); + /*设置游戏暂停*/ + void playOrPauseCallback(Object * pSender); /* implement the "static create()" method manually */ @@ -95,9 +99,18 @@ class ExampleGameScene : public cocos2d::Layer /*攻击炮的列表*/ std::list player1UltimateBalls, player2UltimateBalls; std::list player1RangedBalls, player2RangedBalls; + /* 弗利萨因为他的尾巴太长,有一些麻烦的东西和其他人不同 */ + bool isFreiza = false; __int64 player1LastHit, player2LastHit; ShareSingleton* shareInstance = ShareSingleton::GetInstance(); + + /*为真,正在播放*/ + int voiceState; + MenuItemImage* voiceItem; + /*为真 正在游戏,为假暂停*/ + int playOrPauseState; + MenuItemImage* playOrPauseItem; }; #endif /* __GameScene_SCENE_H__ */ diff --git a/Classes/Scenes/GamePauseScene.cpp b/Classes/Scenes/GamePauseScene.cpp new file mode 100644 index 0000000..2f913f4 --- /dev/null +++ b/Classes/Scenes/GamePauseScene.cpp @@ -0,0 +1,117 @@ +#include "GamePauseScene.h" +#include "cocos2d.h" +#include "WelcomeScene.h" +#include "SimpleAudioEngine.h" +using namespace CocosDenshion; + +/*暂停页面的创建 ,将当前游戏场景截图作为纹理传入暂停场景,然后出现菜单按钮*/ +cocos2d::Scene * GamePauseScene::CreateScene(RenderTexture * sqr) +{ + Scene *scene = Scene::create(); + GamePauseScene *layer = GamePauseScene::create(); + scene->addChild(layer, 1); + /*增加部分:使用Game界面中截图的sqr纹理图片创建Sprite + 并将Sprite添加到GamePauseScene场景层中 + 得到窗口的大小*/ + Size visibleSize = Director::sharedDirector()->getVisibleSize(); + Sprite *back_spr = Sprite::createWithTexture(sqr->getSprite()->getTexture()); + /*放置位置,这个相对于中心位置。*/ + back_spr->setPosition(ccp(visibleSize.width / 2, visibleSize.height / 2)); + /* 翻转,因为UI坐标和OpenGL坐标不同*/ + back_spr->setFlipY(true); + /*图片颜色变灰色*/ + back_spr->setColor(Color3B::GRAY); + scene->addChild(back_spr); + return scene; + +} + +bool GamePauseScene::init() +{ +#pragma region Cocos2dx自动生成的内容:一些基本配置 + + if (!Layer::init()) + { + return false; + } + auto visibleSize = Director::getInstance()->getVisibleSize(); + Vec2 origin = Director::getInstance()->getVisibleOrigin(); + +#pragma endregion + +#pragma region 游戏暂停标签 + auto GamePauseImage = CCMenuItemImage::create("button/GamePause.png", "button/GamePause/png"); + GamePauseImage->setPosition(ccp(visibleSize.width / 2, visibleSize.height / 2 + 150)); + +#pragma endregion + + +#pragma region 继续游戏按钮 + /*继续游戏按钮*/ + ContinueGameItem = CCMenuItemImage::create( + "button/continue-normal.png", + "button/continue-selected.png", + this, + menu_selector(GamePauseScene::ContinueGameCallback) + ); + ContinueGameItem->setPosition(ccp(visibleSize.width / 2, visibleSize.height / 2 + 70)); + +#pragma endregion + + +#pragma region 退出游戏按钮 + /*退出游戏按钮*/ + QuiteGameItem = CCMenuItemImage::create( + "button/close-normal.png", + "button/close-selected.png", + this, + menu_selector(GamePauseScene::QuiteGameCallback) + ); + QuiteGameItem->setPosition(ccp(visibleSize.width / 2, visibleSize.height / 2 - 70)); + +#pragma endregion + + +#pragma region 返回菜单按钮 + + /*返回菜单按钮*/ + ReturnToMenuSceneItem = CCMenuItemImage::create( + "button/back2-normal.png", + "button/back2-selected.png", + this, + menu_selector(GamePauseScene::ReturnToMenuSceneCallback) + ); + ReturnToMenuSceneItem->setPosition(ccp(visibleSize.width / 2, visibleSize.height / 2)); + + Menu* pMenu = Menu::create(GamePauseImage,ContinueGameItem, QuiteGameItem, ReturnToMenuSceneItem, NULL); + pMenu->setPosition(Vec2::ZERO); + this->addChild(pMenu, 2); + +#pragma endregion + + + return true; +} + +/* 继续游戏按钮的回调*/ +void GamePauseScene::ContinueGameCallback(Object * pSender) +{ + Director::sharedDirector()->popScene(); +} + +/*返回菜单按钮的回调*/ +void GamePauseScene::ReturnToMenuSceneCallback(Object * pSender) +{ + float t = 1.0f; + auto newScene = WelcomeScene::createScene(); + auto replacesense = TransitionFade::create(t, newScene); + Director::sharedDirector()->replaceScene(replacesense); +} + +/*结束游戏的回调*/ +void GamePauseScene::QuiteGameCallback(Object * pSender) +{ + Director::sharedDirector()->end(); +} + + diff --git a/Classes/Scenes/GamePauseScene.h b/Classes/Scenes/GamePauseScene.h new file mode 100644 index 0000000..732e2b8 --- /dev/null +++ b/Classes/Scenes/GamePauseScene.h @@ -0,0 +1,44 @@ +/************************************************************************** + +* Copyright: + +* Author: qiuyihao + +* Date: 2018-06-27 + +* Description: 游戏主场景的暂停界面 + +**************************************************************************/ + +#ifndef _GAMEPAUSESCENE_H_ +#define _GAMEPAUSESCENE_H_ +#include "cocos2d.h" + +USING_NS_CC; + +class GamePauseScene : public cocos2d::Layer +{ +public: + virtual bool init(); + static cocos2d::Scene* CreateScene(RenderTexture* sqr); + + /*继续游戏*/ + void ContinueGameCallback(Object* pSender); + /*返回主界面*/ + void ReturnToMenuSceneCallback(Object* pSender); + /*退出游戏*/ + void QuiteGameCallback(Object* pSender); + + /* implement the "static create()" method manually */ + CREATE_FUNC(GamePauseScene); + +private: + /*继续游戏按钮*/ + MenuItemImage * ContinueGameItem; + /*结束游戏按钮*/ + MenuItemImage * QuiteGameItem; + /*返回菜单按钮*/ + MenuItemImage * ReturnToMenuSceneItem; +}; + +#endif \ No newline at end of file diff --git a/Classes/Scenes/GameSettingScene.cpp b/Classes/Scenes/GameSettingScene.cpp new file mode 100644 index 0000000..5a95f4a --- /dev/null +++ b/Classes/Scenes/GameSettingScene.cpp @@ -0,0 +1,172 @@ +#include "GameSettingScene.h" +#include "SimpleAudioEngine.h" +#include "SelectRoleScene.h" +using namespace CocosDenshion; + +cocos2d::Scene * GameSettingScene::createScene() +{ + log("create setting scene"); + return GameSettingScene::create(); +} + +/* 初始化场景元素 */ +bool GameSettingScene::init() +{ + +#pragma region Cocos2dx自动生成的内容:一些基本配置 + + if (!Scene::init()) + { + log("setting scene wrong"); + + return false; + } + auto visibleSize = Director::getInstance()->getVisibleSize(); + Vec2 origin = Director::getInstance()->getVisibleOrigin(); + log("setting scene"); + +#pragma endregion + +#pragma region 背景图片 + auto bg = Sprite::create("bg/GameSettingSceneBackground.png"); + bg->setPosition(visibleSize / 2); + addChild(bg, 0); +#pragma endregion + +#pragma region 创建控制背景音乐按钮以及添加回调 + openOrCloseVoiceState = true; + bgmItem = MenuItemImage::create( + "setting/closeBgm-normal.png", + "setting/closeBgm-selected.png", + CC_CALLBACK_1(GameSettingScene::controlVoiceCallback, this) + ); + bgmItem->setPosition(Vec2(200, 300)); + +#pragma endregion + + +#pragma region 直接开始游戏,进入选择游戏界面 + + startGameItem = MenuItemImage::create( + "setting/setting-start-normal.png", + "setting/setting-start-selected.png", + CC_CALLBACK_1(GameSettingScene::startGameCallback, this) + ); + startGameItem->setPosition(Vec2(200, 240)); + +#pragma endregion + + +#pragma region 关于游戏 + + aboutGameItem = MenuItemImage::create( + "setting/aboutGame-normal.png", + "setting/aboutGame-selected.png", + CC_CALLBACK_1(GameSettingScene::aboutGameCallback, this) + ); + aboutGameItem->setPosition(Vec2(200, 180)); + +#pragma endregion + + +#pragma region 创建点击菜单 + + auto settingMenu = Menu::create(bgmItem, startGameItem, aboutGameItem, NULL); + settingMenu->setPosition(Vec2::ZERO); + addChild(settingMenu, 0); + +#pragma endregion + + +#pragma region 添加悟空人物 + Sprite* wukong = Sprite::create("setting/SunWuKong.png"); + wukong->setPosition(Vec2(500, 200)); + addChild(wukong, 0); +#pragma endregion + + +#pragma region 添加对话框 + + welcomeDialogue = Sprite::create("setting/setting-welcome-Dialogue.png"); + welcomeDialogue->setPosition(Vec2(700, 400)); + addChild(welcomeDialogue, 1); + + closeBgmDialogue = Sprite::create("setting/closeBgm-Dialogue.png"); + closeBgmDialogue->setPosition(Vec2(700, 400)); + closeBgmDialogue->setVisible(false); + addChild(closeBgmDialogue, 1); + + openBgmDialogue = Sprite::create("setting/openBgm-Dialogue.png"); + openBgmDialogue->setPosition(Vec2(700, 400)); + openBgmDialogue->setVisible(false); + addChild(openBgmDialogue, 1); + + aboutGameDialogue = Sprite::create("setting/aboutGame-Dialogue.png"); + aboutGameDialogue->setPosition(Vec2(700, 400)); + aboutGameDialogue->setVisible(false); + addChild(aboutGameDialogue, 1); + +#pragma endregion + + + return true; +} + + +/*控制背景音乐回调函数,打开或者关闭 */ +void GameSettingScene::controlVoiceCallback(Ref * pSender) +{ + SimpleAudioEngine::getInstance()->playEffect("music/ClickCamera.wav", false, 1.0f, 0.0f, 1.0f); + + auto audio = SimpleAudioEngine::getInstance(); + /*即将关闭背景音乐*/ + if (openOrCloseVoiceState) { + SimpleAudioEngine::getInstance()->pauseAllEffects(); + bgmItem->setNormalImage(Sprite::create("setting/openBgm-normal.png")); + bgmItem->setSelectedImage(Sprite::create("setting/openBgm-selected.png")); + openOrCloseVoiceState = false; + + openBgmDialogue->setVisible(false); + closeBgmDialogue->setVisible(true); + aboutGameDialogue->setVisible(false); + welcomeDialogue->setVisible(false); + + } + /*即将打开背景音乐*/ + else { + /*预加载并循环播放背景音乐*/ + audio->playBackgroundMusic("music/WelcomeSceneBgm.mp3", true); + audio->setBackgroundMusicVolume(0.80); + + bgmItem->setNormalImage(Sprite::create("setting/closeBgm-normal.png")); + bgmItem->setSelectedImage(Sprite::create("setting/closeBgm-selected.png")); + + openOrCloseVoiceState = true; + + openBgmDialogue->setVisible(true); + closeBgmDialogue->setVisible(false); + aboutGameDialogue->setVisible(false); + welcomeDialogue->setVisible(false); + } +} +/*开始游戏,进入选择角色界面*/ +void GameSettingScene::startGameCallback(Ref * pSender) +{ + float t = 0.8f; + SimpleAudioEngine::getInstance()->playEffect("music/ClickCamera.wav", false, 1.0f, 0.0f, 1.0f); + auto newScene = SelectRoleScene::createScene(); + auto replacesense = CCTransitionFade::create(t, newScene); + + Director::sharedDirector()->replaceScene(replacesense); +} + +/*关于游戏,修改对话框*/ +void GameSettingScene::aboutGameCallback(Ref * pSender) +{ + SimpleAudioEngine::getInstance()->playEffect("music/ClickCamera.wav", false, 1.0f, 0.0f, 1.0f); + openBgmDialogue->setVisible(false); + closeBgmDialogue->setVisible(false); + aboutGameDialogue->setVisible(true); + welcomeDialogue->setVisible(false); + +} diff --git a/Classes/Scenes/GameSettingScene.h b/Classes/Scenes/GameSettingScene.h new file mode 100644 index 0000000..5fb46cb --- /dev/null +++ b/Classes/Scenes/GameSettingScene.h @@ -0,0 +1,45 @@ +/************************************************************************** + +* Copyright: + +* Author: qiuyihao + +* Date: 2018-06-27 + +* Description: 游戏设置界面 + +**************************************************************************/ + +#ifndef _GAMESETTING_SCENE_H_ +#define _GAMESETTING_SCENE_H_ +#include "cocos2d.h" + +USING_NS_CC; + +class GameSettingScene : public cocos2d::Scene +{ +public: + static cocos2d::Scene* createScene(); + + virtual bool init(); + + /*控制bgm回调函数*/ + void controlVoiceCallback(Ref * pSender); + /*游戏开始,进入选择角色选择界面*/ + void startGameCallback(Ref * pSender); + /*关于游戏*/ + void aboutGameCallback(Ref * pSender); + + + /* implement the "static create()" method manually */ + CREATE_FUNC(GameSettingScene); +private: + /*为true声音打开,为false声音关闭,默认true*/ + bool openOrCloseVoiceState; //额有自带的api。。 + /* 菜单按钮项*/ + MenuItemImage *bgmItem, *startGameItem, *aboutGameItem; + /*对话框精灵*/ + Sprite *welcomeDialogue, *openBgmDialogue, *closeBgmDialogue, *aboutGameDialogue; +}; + +#endif \ No newline at end of file diff --git a/Classes/Scenes/OnlineGameScene.cpp b/Classes/Scenes/OnlineGameScene.cpp new file mode 100644 index 0000000..eb27955 --- /dev/null +++ b/Classes/Scenes/OnlineGameScene.cpp @@ -0,0 +1,1214 @@ +#include "OnlineGameScene.h" +#include "SimpleAudioEngine.h" +#include "GamePauseScene.h" +#include "../configuration.h" +#include "../ShareSingleton.h" +#include "../Players/PlayerSprite.h" +using namespace CocosDenshion; +#include +#include +#include +USING_NS_CC; +/* +* tag 动画 +* 0 idle +* 1 moveLeft +* 2 moveRight +* 3 jump +* 4 meleeAttack +* 5 rangeAttack +* 6 hitted +* 7 dead +* 8 win +* 9 ultimate +* 10 +* 11 defend +* 12 charge +* 13 dashLeft +* 14 dashRight +*/ +void OnlineGameScene::setPhysicsWorld(PhysicsWorld* world) { m_world = world; } + +Scene* OnlineGameScene::createScene() +{ +#pragma region 设置物理环境 + + srand((unsigned)time(NULL)); + auto scene = Scene::createWithPhysics(); + scene->getPhysicsWorld()->setGravity(Vec2(0, -1000.0f)); + scene->getPhysicsWorld()->setAutoStep(true); + auto layer = OnlineGameScene::create(); + layer->setPhysicsWorld(scene->getPhysicsWorld()); + scene->addChild(layer); + return scene; + +#pragma endregion +} + + +/* 当文件不存在时,打印有用的错误消息而不是分段错误 */ +static void problemLoading(const char* filename) +{ + printf("Error while loading: %s\n", filename); + printf("Depending on how you compiled you might have to add 'Resources/' in front of filenames in OnlineGameSceneScene.cpp\n"); +} + +/* 初始化场景函数 */ +bool OnlineGameScene::init() +{ +#pragma region Cocos2dx自动生成的内容:一些基本配置 + + if (!Layer::init()) + { + return false; + } + visibleSize = Director::getInstance()->getVisibleSize(); + Vec2 origin = Director::getInstance()->getVisibleOrigin(); + + auto edgeSp = Sprite::create(); //创建边界 + auto boundBody = PhysicsBody::createEdgeBox(visibleSize, PhysicsMaterial(1000.0f, 1.0f, 0.0f), 3); + boundBody->setCategoryBitmask(0xFFFFFFFF); + boundBody->setCollisionBitmask(0xFFFFFFFF); + boundBody->setContactTestBitmask(0xFFFFFFFF); + edgeSp->setPosition(visibleSize.width / 2, visibleSize.height / 2); //位置设置在屏幕中央 + edgeSp->setPhysicsBody(boundBody); + addChild(edgeSp); + +#pragma endregion + +#pragma region 创建场景 + int selectedBg = ShareSingleton::GetInstance()->selectedBackground; + char bgName[20]; + sprintf(bgName, "bg/bg%d.png", selectedBg); + auto bgSprite = Sprite::create("bg/bg4.png"); + bgSprite->setPosition(visibleSize / 2); + bgSprite->setScale(visibleSize.width / bgSprite->getContentSize().width, visibleSize.height / bgSprite->getContentSize().height); + this->addChild(bgSprite, 0); + + /* 添加地面 */ + ground = Sprite::create("ground.png"); + ground->setScale(visibleSize.width / ground->getContentSize().width, 1.2f); + ground->setPosition(visibleSize.width / 2, 0); + auto groundbody = PhysicsBody::createBox(ground->getContentSize(), PhysicsMaterial(1000.0f, 0.0f, 10000.0f)); + + groundbody->setCategoryBitmask(0xFFFFFFFF); + groundbody->setCollisionBitmask(0xFFFFFFFF); + groundbody->setContactTestBitmask(0xFFFFFFFF); + groundbody->setTag(1); + groundbody->setDynamic(false); + ground->setPhysicsBody(groundbody); + ground->setVisible(false); + this->addChild(ground, 1); + +#pragma endregion + +#pragma region 创建精灵 + /* Todo:创建精灵的人需要修改一下这里的初始帧 */ + /* 创建一张贴图,使用贴图创建精灵 */ + player1 = new PlayerSprite(); + + /* 添加player1的物理刚体 */ + physicPlayer1 = Sprite::create("physicplayer.png"); + physicPlayer1->setPosition(Vec2(visibleSize.width / 4 * 3, visibleSize.height / 2 - 300)); + auto player1Body = PhysicsBody::createBox(physicPlayer1->getContentSize(), PhysicsMaterial(10000.0f, 0.0f, 0.0f)); + player1Body->setCategoryBitmask(0xFFFFFFFF); + player1Body->setContactTestBitmask(0xFFFFFFFF); + player1Body->setContactTestBitmask(0xFFFFFFFF); + player1Body->setDynamic(true); + physicPlayer1->setPhysicsBody(player1Body); + physicPlayer1->setVisible(false); + physicPlayer1->setScale(1.2f); + addChild(physicPlayer1, 3); + + player1->initSprite("Goku", physicPlayer1); + player1->initAnimateFrame(); + player1->setPosition(Vec2(visibleSize.width / 4 * 3, visibleSize.height / 2 - 300)); + player1->setFlippedX(true); + player1->setVisible(true); + addChild(player1, 3); + player1->idle(); + + player2 = new PlayerSprite(); + /* 添加player2的物理刚体 */ + physicPlayer2 = Sprite::create("physicplayerForFrieza.png"); + physicPlayer2->setPosition(Vec2(visibleSize.width / 4, visibleSize.height / 2 - 300)); + auto player2Body = PhysicsBody::createBox(physicPlayer2->getContentSize(), PhysicsMaterial(10000.0f, 0.0f, 0.0f)); + player2Body->setCategoryBitmask(0xFFFFFFFF); + player2Body->setContactTestBitmask(0xFFFFFFFF); + player2Body->setContactTestBitmask(0xFFFFFFFF); + player2Body->setDynamic(true); + physicPlayer2->setPhysicsBody(player2Body); + physicPlayer2->setVisible(false); + physicPlayer2->setScale(1.2f); + addChild(physicPlayer2, 3); + + player2->initSprite("Frieza", physicPlayer2); + isFreiza = true; + player2->initAnimateFrame(); + player2->setPosition(Vec2(visibleSize.width / 4, visibleSize.height / 2 - 300)); + player2->setFlippedX(true); + player2->setVisible(true); + addChild(player2, 3); + player2->idle(); + +#pragma endregion + +#pragma region hp条和mp条 + + /* Todo:请美工在这里优化HP条和MP条 */ + /* Player1的Hp */ + Sprite* player1hpBorder = Sprite::create("hp.png", CC_RECT_PIXELS_TO_POINTS(Rect(0, 320, 420, 47))); + Sprite* player1hpContent = Sprite::create("hp.png", CC_RECT_PIXELS_TO_POINTS(Rect(610, 362, 4, 16))); + + //Sprite* player1hpBorder = Sprite::create("hp1.png"); +// Sprite* player1hpContent = Sprite::create("hp2.png"); + + player1Hp = ProgressTimer::create(player1hpContent); + player1Hp->setScaleX(90); + player1Hp->setAnchorPoint(Vec2(0, 0)); + player1Hp->setType(ProgressTimerType::BAR); + player1Hp->setBarChangeRate(Point(1, 0)); + player1Hp->setMidpoint(Point(0, 1)); + player1Hp->setPercentage(100); + player1Hp->setPosition(Vec2(origin.x + 14 * player1Hp->getContentSize().width + 500, origin.y + visibleSize.height - 2 * player1Hp->getContentSize().height)); + addChild(player1Hp, 1); + player1hpBorder->setAnchorPoint(Vec2(0, 0)); + player1hpBorder->setPosition(Vec2(origin.x + player1Hp->getContentSize().width + 500, origin.y + visibleSize.height - player1hpBorder->getContentSize().height)); + addChild(player1hpBorder, 0); + + /* Player1的Mp */ + Sprite* player1mpBorder = Sprite::create("hp.png", CC_RECT_PIXELS_TO_POINTS(Rect(0, 320, 420, 47))); + Sprite* player1mpContent = Sprite::create("hp.png", CC_RECT_PIXELS_TO_POINTS(Rect(610, 362, 4, 16))); + + player1Mp = ProgressTimer::create(player1mpContent); + player1Mp->setScaleX(90); + player1Mp->setAnchorPoint(Vec2(0, 0)); + player1Mp->setType(ProgressTimerType::BAR); + player1Mp->setBarChangeRate(Point(1, 0)); + player1Mp->setMidpoint(Point(0, 1)); + player1Mp->setPercentage(50); + player1Mp->setPosition(Vec2(origin.x + 14 * player1Mp->getContentSize().width + 500, origin.y + visibleSize.height - 2 * player1Mp->getContentSize().height - 100)); + addChild(player1Mp, 1); + player1mpBorder->setAnchorPoint(Vec2(0, 0)); + player1mpBorder->setPosition(Vec2(origin.x + player1Mp->getContentSize().width + 500, origin.y + visibleSize.height - player1mpBorder->getContentSize().height - 100)); + addChild(player1mpBorder, 0); + + /* Player2的Hp */ + Sprite* player2hpBorder = Sprite::create("hp.png", CC_RECT_PIXELS_TO_POINTS(Rect(0, 320, 420, 47))); + Sprite* player2hpContent = Sprite::create("hp.png", CC_RECT_PIXELS_TO_POINTS(Rect(610, 362, 4, 16))); + + player2Hp = ProgressTimer::create(player2hpContent); + player2Hp->setScaleX(90); + player2Hp->setAnchorPoint(Vec2(0, 0)); + player2Hp->setType(ProgressTimerType::BAR); + player2Hp->setBarChangeRate(Point(1, 0)); + player2Hp->setMidpoint(Point(0, 1)); + player2Hp->setPercentage(100); + player2Hp->setPosition(Vec2(origin.x + 14 * player2Hp->getContentSize().width, origin.y + visibleSize.height - 2 * player2Hp->getContentSize().height)); + //player2Hp->setPosition(Vec2(100,100)); + addChild(player2Hp, 1); + player2hpBorder->setAnchorPoint(Vec2(0, 0)); + player2hpBorder->setPosition(Vec2(origin.x + player2Hp->getContentSize().width, origin.y + visibleSize.height - player2hpBorder->getContentSize().height)); + //player2hpBorder->setPosition(Vec2(300, 300)); + addChild(player2hpBorder, 0); + + /* Player2的Mp */ + Sprite* player2mpBorder = Sprite::create("hp.png", CC_RECT_PIXELS_TO_POINTS(Rect(0, 320, 420, 47))); + Sprite* player2mpContent = Sprite::create("hp.png", CC_RECT_PIXELS_TO_POINTS(Rect(610, 362, 4, 16))); + + player2Mp = ProgressTimer::create(player2mpContent); + player2Mp->setScaleX(90); + player2Mp->setAnchorPoint(Vec2(0, 0)); + player2Mp->setType(ProgressTimerType::BAR); + player2Mp->setBarChangeRate(Point(1, 0)); + player2Mp->setMidpoint(Point(0, 1)); + player2Mp->setPercentage(50); + player2Mp->setPosition(Vec2(origin.x + 14 * player2Mp->getContentSize().width, origin.y + visibleSize.height - 2 * player2Mp->getContentSize().height - 100)); + addChild(player2Mp, 1); + player2mpBorder->setAnchorPoint(Vec2(0, 0)); + player2mpBorder->setPosition(Vec2(origin.x + player2Mp->getContentSize().width, origin.y + visibleSize.height - player2mpBorder->getContentSize().height - 100)); + addChild(player2mpBorder, 0); + +#pragma endregion + +#pragma region 音乐 + + auto audio = SimpleAudioEngine::getInstance(); + /*预加载并循环播放背景音乐*/ + // audio->preloadBackgroundMusic("music/WelcomeSceneBackground.mp3"); + audio->playBackgroundMusic("music/MainGameSceneBgm.mp3", true); + audio->setBackgroundMusicVolume(0.80); + + /*预加载点击音效*/ + audio->preloadEffect("music/ClickCamera.wav"); + audio->setEffectsVolume(0.80); + + /*加载并播放 3 2 1 开始 音乐*/ + audio->playEffect("music/321.mp3", false, 1.0f, 0.0f, 1.0f); + +#pragma endregion + +#pragma region 游戏界面的菜单项 + + /* Todo: 美工人员请在这里添加游戏界面的菜单项,如暂停游戏,设置,声音开关 */ + /*声音开关,默认打开 voiceState == true*/ + voiceState = 1; + voiceItem = MenuItemImage::create( + "button/SoundOn.png", + "button/SoundOff.png", + CC_CALLBACK_1(OnlineGameScene::VoicePauseSelectedCallback, this) + ); + voiceItem->setPosition(ccp(visibleSize.width - voiceItem->getContentSize().width / 2, + visibleSize.height / 2 - voiceItem->getContentSize().height / 2 - 60)); + auto VoiceMenu = Menu::create(voiceItem, NULL); + VoiceMenu->setPosition(Vec2::ZERO); + addChild(VoiceMenu, 0); + + /*游戏暂停按钮 */ + playOrPauseState = 1; + playOrPauseItem = MenuItemImage::create( + "button/play.png", + "button/pause.png", + CC_CALLBACK_1(OnlineGameScene::playOrPauseCallback, this) + ); + playOrPauseItem->setPosition(ccp(visibleSize.width - playOrPauseItem->getContentSize().width / 2, + visibleSize.height/2 - playOrPauseItem->getContentSize().height / 2)); + //playOrPauseItem->setPosition(Vec2(480, 70)); + auto playOrPauseMenu = Menu::create(playOrPauseItem, NULL); + playOrPauseMenu->setPosition(Vec2::ZERO); + addChild(playOrPauseMenu, 0); + +#pragma endregion + +#pragma region 初始化客户端程序 + + client = SocketClient::construct(); + client->onRecv = CC_CALLBACK_2(OnlineGameScene::onReceive, this); + client->onDisconnect = CC_CALLBACK_0(OnlineGameScene::onDisconnect, this); + /* 合并代码的时候把下面的ip地址改成127.0.0.1就能本地调试了,为了确定是否成功看一下输出里是否有error */ + if (!client->connectServer("103.46.128.49", 17047)) + { + CCLOG("%s", "Client connect error"); + } + uid = rand() % 100000; /* 生成一个随机的uid,仅用于代码调试 */ + SocketData data(uid, KEYCODESEND::FIRSTCONNECT); + client->sendMessage((char*)(&data), sizeof(SocketData)); + +#pragma endregion + + + +#pragma region 添加监听器 + + auto keyboardListener = EventListenerKeyboard::create(); + keyboardListener->onKeyPressed = CC_CALLBACK_2(OnlineGameScene::onKeyPressed, this); + keyboardListener->onKeyReleased = CC_CALLBACK_2(OnlineGameScene::onKeyReleased, this); + _eventDispatcher->addEventListenerWithSceneGraphPriority(keyboardListener, this); + + auto contactListener = EventListenerPhysicsContact::create(); + contactListener->onContactBegin = CC_CALLBACK_1(OnlineGameScene::onConcactBegin, this); + contactListener->onContactSeparate = CC_CALLBACK_1(OnlineGameScene::onContactSeparate, this); + _eventDispatcher->addEventListenerWithSceneGraphPriority(contactListener, this); + +#pragma endregion + +#pragma region 添加定时器 + + schedule(schedule_selector(OnlineGameScene::update), 0.0f, kRepeatForever, 0); + schedule(schedule_selector(OnlineGameScene::hit), 0.0f, kRepeatForever, 0); /* 被打判断 */ + schedule(schedule_selector(OnlineGameScene::isCharge), 1.0f, kRepeatForever, 0); + schedule(schedule_selector(OnlineGameScene::updateHP_MP), 0.1f, kRepeatForever, 0); + +#pragma endregion + +#pragma region 测试动画用按钮------邵梓硕 + + auto label = Label::createWithTTF("hit", "fonts/arial.ttf", 24); + + auto changeItem = MenuItemLabel::create(label, CC_CALLBACK_1(OnlineGameScene::hitTest, this)); + auto menu = Menu::create(changeItem, NULL); + menu->setPosition(visibleSize.width / 2, visibleSize.height / 2); + menu->setVisible(false); + addChild(menu, 2); + + auto label2 = Label::createWithTTF("dead", "fonts/arial.ttf", 24); + + auto changeItem2 = MenuItemLabel::create(label2, CC_CALLBACK_1(OnlineGameScene::deadTest, this)); + auto menu2 = Menu::create(changeItem2, NULL); + menu2->setPosition(visibleSize.width / 2 + 50, visibleSize.height / 2); + menu2->setVisible(false); + addChild(menu2, 2); + +#pragma endregion + + return true; +} + +/* 碰撞发生函数 */ +bool OnlineGameScene::onConcactBegin(PhysicsContact & contact) +{ + return true; +} + + +/* 碰撞的两个物体离开时响应函数 */ +bool OnlineGameScene::onContactSeparate(PhysicsContact & contact) +{ + /* 离开的时候移除速度 */ + if (physicPlayer1->getPhysicsBody()->getVelocity().x != -250 || physicPlayer1->getPhysicsBody()->getVelocity().x == 250) { + physicPlayer1->getPhysicsBody()->setVelocity(Vec2::ZERO); + } + if (physicPlayer2->getPhysicsBody()->getVelocity().x != -250 || physicPlayer2->getPhysicsBody()->getVelocity().x == 250) { + physicPlayer2->getPhysicsBody()->setVelocity(Vec2::ZERO); + } + return true; +} + + +#pragma region 键盘相关事件 + +/* 按下键盘 */ +void OnlineGameScene::onKeyPressed(EventKeyboard::KeyCode code, Event* event) +{ + SocketData data(uid, KEYCODESEND::LEFT); + if (chargeEffect1 != NULL) { + chargeEffect1->removeFromParentAndCleanup(true); + chargeEffect1 = NULL; + } + if (chargeEffect2 != NULL) { + chargeEffect2->removeFromParentAndCleanup(true); + chargeEffect2 = NULL; + } + switch (code) { + case cocos2d::EventKeyboard::KeyCode::KEY_LEFT_ARROW: + if (event == nullptr) { + LeftKeyPressed(); + LeftKeyState = true; + } + break; + case cocos2d::EventKeyboard::KeyCode::KEY_RIGHT_ARROW: + if (event == nullptr) { + RightKeyPressed(); + RightKeyState = true; + } + break; + case cocos2d::EventKeyboard::KeyCode::KEY_UP_ARROW: + if (event == nullptr) { + player1->jump(); + } + break; + case cocos2d::EventKeyboard::KeyCode::KEY_DOWN_ARROW: + if (event == nullptr) { + player1->defend(); + } + break; + case cocos2d::EventKeyboard::KeyCode::KEY_1: + if (event == nullptr) { + if (player1->getActionByTag(6) == nullptr) { + One_KeyPressed(); + player1LastHit = time(NULL); + } + } + break; + case cocos2d::EventKeyboard::KeyCode::KEY_2: + if (event == nullptr) { + createRangedBall(player1, true); + player1->rangedAttack(); + } + break; + case cocos2d::EventKeyboard::KeyCode::KEY_3: + if (event == nullptr) { + createUltimateBall(player1, true); + player1->ultimate(); + } + break; + case cocos2d::EventKeyboard::KeyCode::KEY_5: + if (event == nullptr) { + chargeEffect1 = createChargeEffect(player1); + player1->charge(); + } + break; + case cocos2d::EventKeyboard::KeyCode::KEY_A: + A_KeyPressed(); + A_KeyState = true; + client->sendMessage((char*)(&data), sizeof(SocketData)); + break; + case cocos2d::EventKeyboard::KeyCode::KEY_D: + data.codeSend = KEYCODESEND::RIGHT; + client->sendMessage((char*)(&data), sizeof(SocketData)); + D_KeyPressed(); + D_KeyState = true; + break; + case cocos2d::EventKeyboard::KeyCode::KEY_W: + player2->jump(); + data.codeSend = KEYCODESEND::UP; + client->sendMessage((char*)(&data), sizeof(SocketData)); + break; + case cocos2d::EventKeyboard::KeyCode::KEY_G: + if (player2->getActionByTag(6) == nullptr) { + player2LastHit = time(NULL); + G_KeyPressed(); + } + data.codeSend = KEYCODESEND::G; + client->sendMessage((char*)(&data), sizeof(SocketData)); + break; + case cocos2d::EventKeyboard::KeyCode::KEY_H: + createRangedBall(player2, false); + player2->rangedAttack(); + data.codeSend = KEYCODESEND::H; + client->sendMessage((char*)(&data), sizeof(SocketData)); + break; + case cocos2d::EventKeyboard::KeyCode::KEY_Y: + chargeEffect2 = createChargeEffect(player2); + player2->charge(); + data.codeSend = KEYCODESEND::Y; + client->sendMessage((char*)(&data), sizeof(SocketData)); + break; + case cocos2d::EventKeyboard::KeyCode::KEY_J: + createUltimateBall(player2, false); + player2->ultimate(); + data.codeSend = KEYCODESEND::J; + client->sendMessage((char*)(&data), sizeof(SocketData)); + break; + default: + break; + } +} + +/* 释放按键 */ +void OnlineGameScene::onKeyReleased(EventKeyboard::KeyCode code, Event* event) +{ + SocketData data(uid, KEYCODESEND::UPRELEASE); + switch (code) { + case cocos2d::EventKeyboard::KeyCode::KEY_LEFT_ARROW: + if (event == nullptr) { + player1->isMove = false; + player1->stopActionByTag(1); + if (physicPlayer1->getPhysicsBody()->getVelocity().x < 0) { + physicPlayer1->getPhysicsBody()->setVelocity(Vec2(0, 0)); + } + /* 考虑先按1后按2,先松1的情况 */ + if (player1->getActionByTag(2) == nullptr) { + player1->idle(); + } + LeftKeyState = false; + } + break; + case cocos2d::EventKeyboard::KeyCode::KEY_RIGHT_ARROW: + if (event == nullptr) { + player1->isMove = false; + player1->stopActionByTag(2); + if (physicPlayer1->getPhysicsBody()->getVelocity().x > 0) { + physicPlayer1->getPhysicsBody()->setVelocity(Vec2(0, 0)); + } + if (player1->getActionByTag(1) == nullptr) { + player1->idle(); + } + RightKeyState = false; + } + break; + case cocos2d::EventKeyboard::KeyCode::KEY_UP_ARROW: + break; + case cocos2d::EventKeyboard::KeyCode::KEY_DOWN_ARROW: + if (event == nullptr) { + player1->stopActionByTag(11); + player1->idle(); + } + break; + case cocos2d::EventKeyboard::KeyCode::KEY_1: + break; + case cocos2d::EventKeyboard::KeyCode::KEY_2: + break; + case cocos2d::EventKeyboard::KeyCode::KEY_3: + break; + case cocos2d::EventKeyboard::KeyCode::KEY_5: + if (event == nullptr) { + if (player1->getActionByTag(12) != nullptr) { + player1->stopActionByTag(12); + if (chargeEffect1 != NULL) { + chargeEffect1->removeFromParentAndCleanup(true); + chargeEffect1 = NULL; + } + player1->idle(); + } + } + break; + case cocos2d::EventKeyboard::KeyCode::KEY_A: + player2->isMove = false; + player2->stopActionByTag(1); + if (physicPlayer2->getPhysicsBody()->getVelocity().x < 0) + { + physicPlayer2->getPhysicsBody()->setVelocity(Vec2(0, 0)); + } + if (player2->getActionByTag(2) == nullptr) { + player2->idle(); + } + A_KeyState = false; + data.codeSend = KEYCODESEND::LEFTRELEASE; + client->sendMessage((char*)(&data), sizeof(SocketData)); + break; + case cocos2d::EventKeyboard::KeyCode::KEY_D: + player2->isMove = false; + player2->stopActionByTag(2); + if (physicPlayer2->getPhysicsBody()->getVelocity().x > 0) + { + physicPlayer2->getPhysicsBody()->setVelocity(Vec2(0, 0)); + } + if (player2->getActionByTag(1) == nullptr) { + player2->idle(); + } + D_KeyState = false; + data.codeSend = KEYCODESEND::RIGHTRELEASE; + client->sendMessage((char*)(&data), sizeof(SocketData)); + break; + case cocos2d::EventKeyboard::KeyCode::KEY_W: + client->sendMessage((char*)(&data), sizeof(SocketData)); + break; + case cocos2d::EventKeyboard::KeyCode::KEY_G: + data.codeSend = KEYCODESEND::G_RELEASE; + client->sendMessage((char*)(&data), sizeof(SocketData)); + break; + case cocos2d::EventKeyboard::KeyCode::KEY_H: + data.codeSend = KEYCODESEND::H_RELEASE; + client->sendMessage((char*)(&data), sizeof(SocketData)); + break; + case cocos2d::EventKeyboard::KeyCode::KEY_J: + data.codeSend = KEYCODESEND::J_RELEASE; + client->sendMessage((char*)(&data), sizeof(SocketData)); + break; + case cocos2d::EventKeyboard::KeyCode::KEY_Y: + data.codeSend = KEYCODESEND::Y_RELEASE; + client->sendMessage((char*)(&data), sizeof(SocketData)); + if (player2->getActionByTag(12) != nullptr) { + player2->stopActionByTag(12); + if (chargeEffect2 != NULL) { + chargeEffect2->removeFromParentAndCleanup(true); + chargeEffect2 = NULL; + } + player2->idle(); + } + break; + default: + break; + } +} +#pragma endregion + + +void OnlineGameScene::update(float delay) +{ + /* 如果是被打飞的状态,那么让刚体和精灵的位置相同 */ + if (player1->getActionByTag(6) == nullptr) { + player1->setPositionX(physicPlayer1->getPositionX()); + } + else + { + /* 如果不是,那么移动动作实际上是在移动刚体,因此将精灵和刚体的位置保持一致 */ + physicPlayer1->setPosition(player1->getPosition()); + } + if (player2->getActionByTag(6) == nullptr) { + player2->setPositionX(physicPlayer2->getPositionX()); + } + else { + physicPlayer2->setPosition(player2->getPosition()); + } + + + +#pragma region 移动冲刺判断 + /* 左键松开,如果此时播放的为向左移动的动画,则暂停;下面同理 */ + if (LeftKeyState == false && (player1->getActionByTag(13) != nullptr || player1->getActionByTag(1) != nullptr)) { + firstPressL = false; + player1->stopAllActions(); + player1->idle(); + } + else if (LeftKeyState == true && (player1->getActionByTag(0) != nullptr)) { + player1->stopActionByTag(0); + player1->moveLeft(); + } + + if (RightKeyState == false && (player1->getActionByTag(14) != nullptr || player1->getActionByTag(2) != nullptr)) { + firstPressR = false; + player1->stopAllActions(); + player1->idle(); + } + else if (RightKeyState == true && (player1->getActionByTag(0) != nullptr)) { + player1->stopActionByTag(0); + player1->moveRight(); + } + if (A_KeyState == false && (player2->getActionByTag(13) != nullptr || player2->getActionByTag(1) != nullptr)) { + firstPressA = false; + player2->stopAllActions(); + player2->idle(); + } + else if (A_KeyState == true && (player2->getActionByTag(0) != nullptr)) { + player2->stopActionByTag(0); + player2->moveLeft(); + } + if (D_KeyState == false && (player2->getActionByTag(14) != nullptr || player2->getActionByTag(2) != nullptr)) { + firstPressD = false; + player2->stopAllActions(); + player2->idle(); + } + else if (D_KeyState == true && (player2->getActionByTag(0) != nullptr)) { + player2->stopActionByTag(0); + player2->moveRight(); + } +#pragma endregion + +} + +/* Todo: 双人对战的人完成这部分的代码 */ +void OnlineGameScene::gameOver() +{ + +} + +/* 集气状态 */ +void OnlineGameScene::isCharge(float dt) +{ + if (player1->getActionByTag(12) != nullptr) { + player1->setMp(player1->getMp() + 5); + } + if (player2->getActionByTag(12) != nullptr) { + player2->setMp(player2->getMp() + 5); + } +} + +/* 更新hp和mp */ +void OnlineGameScene::updateHP_MP(float delay) +{ + if (player1->getHp() != player1Hp->getPercentage()) { + player1Hp->runAction(CCProgressFromTo::create(0.25f, player1Hp->getPercentage(), player1->getHp() * 1.0)); + } + if (player2->getHp() != player2Hp->getPercentage()) { + player2Hp->runAction(CCProgressFromTo::create(0.25f, player2Hp->getPercentage(), player2->getHp() * 1.0)); + } + if (player1->getMp() != player1Mp->getPercentage()) { + player1Mp->runAction(CCProgressFromTo::create(0.25f, player1Mp->getPercentage(), player1->getMp() * 1.0)); + } + if (player2->getMp() != player2Mp->getPercentage()) { + player2Mp->runAction(CCProgressFromTo::create(0.25f, player2Mp->getPercentage(), player2->getMp() * 1.0)); + } + /* 判断游戏结束 */ + if (player1->getHp() <= 0 || player2->getHp() <= 0) { + gameOver(); + } +} + + +/* TODO:这里的对打逻辑存在一点小问题,有时候会出现两个人互打的情况; */ +void OnlineGameScene::hit(float dt) +{ + bool flag = false; + if (isFreiza) { + flag = abs(physicPlayer1->getPositionX() - physicPlayer2->getPositionX()) < physicPlayer1->getContentSize().width + physicPlayer2->getContentSize().width - 50; + } + else { + flag = abs(player1->getPositionX() - player2->getPositionX()) < 100; + } + if (flag) { + bool player1FirstAttack = false,bothIdle = false; + if (player1->isHitting && player2->isHitting) { + player1FirstAttack = player1LastHit > player2LastHit; + } + else if (player1->isHitting) { + player1FirstAttack = true; + } + else if (player2->isHitting) { + player1FirstAttack = false; + } + else { + bothIdle = true; + } + if (player1FirstAttack && + ((player1->isFlippedX() && player1->getPositionX() < player2->getPositionX()) || + (!player1->isFlippedX() && player1->getPositionX() > player2->getPositionX()))) { + player2->setFlippedX(!player1->isFlippedX()); + if (player2->isHitted == false) { + shareInstance->opponentFlipx = player1->isFlippedX(); + createHitEffect(player2); + } + if (player2->getActionByTag(6) == nullptr) { + player2->hit(); + } + } + else if (!player1FirstAttack && !bothIdle && + ((player2->isFlippedX() && player1->getPositionX() > player2->getPositionX()) || + (!player2->isFlippedX() && player1->getPositionX() < player2->getPositionX()))) { + player1->setFlippedX(!player2->isFlippedX()); + if (player1->isHitted == false) { + shareInstance->opponentFlipx = player2->isFlippedX(); + createHitEffect(player1); + } + if (player1->getActionByTag(6) == nullptr) { + player1->hit(); + } + } + } +#pragma region 判断是否被远程攻击击中 + + for (Sprite* ball : player1RangedBalls) + { + if (ball->getPositionX() > 1100 || ball->getPositionX() < 40) { + ball->removeFromParentAndCleanup(true); + player1RangedBalls.remove(ball); + break; + } + else if (abs(player2->getPositionX() - ball->getPositionX()) < 80 && player2->getPositionY() < 120) { + player2->setFlippedX(!player1->isFlippedX()); + if (player2->isHitted == false) { + shareInstance->opponentFlipx = player1->isFlippedX(); + createHitEffect(player2); + } + player2->hit(); + ball->removeFromParentAndCleanup(true); + player1RangedBalls.remove(ball); + break; + } + } + for (Sprite* ball : player2RangedBalls) + { + if (ball->getPositionX() > 1100 || ball->getPositionX() < 40) { + ball->removeFromParentAndCleanup(true); + player2RangedBalls.remove(ball); + break; + } + else if (abs(player1->getPositionX() - ball->getPositionX()) < 80 && player1->getPositionY() < 120) { + player1->setFlippedX(!player2->isFlippedX()); + if (player1->isHitted == false) { + shareInstance->opponentFlipx = player2->isFlippedX(); + createHitEffect(player1); + } + player1->hit(); + ball->removeFromParentAndCleanup(true); + player2RangedBalls.remove(ball); + break; + } + } + +#pragma endregion + +} + +/* 点击按钮发生被打状态,仅用于测试代码 */ +void OnlineGameScene::hitTest(Ref* sender) +{ + if (!player2->isDouble) { + player2->hittedCount = 0; + scheduleOnce(schedule_selector(OnlineGameScene::hittedCounter), 2.0f); + player2->isDouble = true; + } + else { + player2->hittedCount++; + } + player2->hit(); + createHitEffect(player2); +} + + +/* 点击按钮发生死亡状态,仅用于测试代码 */ +void OnlineGameScene::deadTest(Ref* sender) +{ + if(!player2->isDead) + player2->dead(); +} + +/* 左键第一次按下时响应 */ +void OnlineGameScene::LeftKeyPressed() +{ + if (firstPressL) { + /* 如果是第一次按下,firstPressL设为false, 向左移动,然后延时0.3秒将firstPressL重新设为true */ + player1->moveLeft(); + scheduleOnce(schedule_selector(OnlineGameScene::LeftKeyPressed), 0.30f); + firstPressL = false; + } + else + { + /* 若firstPressL为true,说明在0.3f以内,相当于dash */ + player1->dashLeft(player2->getPosition()); + firstPressL = true; + } + +} + +/* 延时0.3秒将firstPressL重新设为true */ +void OnlineGameScene::LeftKeyPressed(float t) +{ + firstPressL = true; +} + +/* 右键第一次按下时响应 */ +void OnlineGameScene::RightKeyPressed() +{ + if (firstPressR) { + player1->moveRight(); + scheduleOnce(schedule_selector(OnlineGameScene::RightKeyPressed), 0.30f); + firstPressR = false; + } + else + { + player1->dashRight(player2->getPosition()); + firstPressR = true; + } +} +/* 延时0.3秒将firstPressR重新设为true */ +void OnlineGameScene::RightKeyPressed(float t) +{ + firstPressR = true; +} + +/* A键第一次按下时响应 */ +void OnlineGameScene::A_KeyPressed() +{ + if (firstPressA) { + player2->moveLeft(); + scheduleOnce(schedule_selector(OnlineGameScene::A_KeyPressed), 0.30f); + firstPressA = false; + } + else + { + player2->dashLeft(player1->getPosition()); + firstPressA = true; + } +} + +/* 延时0.3秒将firstPressA重新设为true */ +void OnlineGameScene::A_KeyPressed(float t) +{ + firstPressA = true; +} + +/* D键第一次按下时响应 */ +void OnlineGameScene::D_KeyPressed() +{ + if (firstPressD) { + player2->moveRight(); + scheduleOnce(schedule_selector(OnlineGameScene::D_KeyPressed), 0.30f); + firstPressD = false; + } + else + { + player2->dashRight(player1->getPosition()); + firstPressD = true; + } +} +/* 延时0.3秒将firstPressD重新设为true */ +void OnlineGameScene::D_KeyPressed(float t) +{ + firstPressD = true; +} + +/* 延时判断攻击类型:出拳,出拳+上勾拳,出拳+上勾拳+飞踢 */ +void OnlineGameScene::One_KeyPressed() +{ + if (secondPress1) { + player1->meleeAttack2(); + scheduleOnce(schedule_selector(OnlineGameScene::One_KeyPressed), 1.8f); + secondPress1 = false; + firstPress1 = false; + } + else if (firstPress1) { + player1->meleeAttack1(); + scheduleOnce(schedule_selector(OnlineGameScene::One_KeyPressed), 1.5f); + firstPress1 = false; + secondPress1 = true; + } + else + { + player1->meleeAttack3(); + firstPress1 = true; + secondPress1 = false; + } +} +void OnlineGameScene::One_KeyPressed(float t) +{ + firstPress1 = true; + secondPress1 = false; +} + +/* 延时判断攻击类型:出拳,出拳+上勾拳,出拳+上勾拳+飞踢 */ +void OnlineGameScene::G_KeyPressed() +{ + if (secondPressG) { + player2->meleeAttack2(); + scheduleOnce(schedule_selector(OnlineGameScene::G_KeyPressed), 1.8f); + secondPressG = false; + firstPressG = false; + } + else if (firstPressG) { + player2->meleeAttack1(); + scheduleOnce(schedule_selector(OnlineGameScene::G_KeyPressed), 1.5f); + firstPressG = false; + secondPressG = true; + } + else + { + player2->meleeAttack3(); + firstPressG = true; + secondPressG = false; + } +} +void OnlineGameScene::G_KeyPressed(float t) +{ + firstPressG = true; + secondPressG = false; +} + +void OnlineGameScene::hittedCounter(float t) +{ + player1->isDouble = false; +} + +/*生成大招的球,注意这里没有remove,请在遍历球列表时进行remove*/ +void OnlineGameScene::createUltimateBall(PlayerSprite* player, bool isPlayer1) { + if (player->isRun || player->getMp() < 50) return; + Sprite* Ball = Sprite::createWithSpriteFrame(player->ultimateBallVector.back()); + Ball->setVisible(false); + Ball->setScale(3.0f); + PlayerSprite* opponent; + if (isPlayer1) { + player1UltimateBalls.push_back(Ball); + opponent = player2; + } + else + { + player2UltimateBalls.push_back(Ball); + opponent = player1; + } + + addChild(Ball, 3); + auto animationBall = Animation::createWithSpriteFrames(player->ultimateBallVector, 0.1f); + auto animateBall = Animate::create(animationBall); + auto actBall = RepeatForever::create(animateBall); + /*设置球的方向*/ + int direction = 1; + if (!player->isFlippedX()) direction = -1; + auto shootBall = MoveTo::create(1.0f, Vec2(player->getPositionX() + 500 * direction, visibleSize.height / 2 - 300)); + /*球的动作:延迟,可见,动画,移动,爆炸,销毁*/ + auto seqBall = Sequence::create(DelayTime::create(1.0f), CallFuncN::create([Ball, player](Ref* sender) { + Ball->setPosition(player->getPositionX(), player->getPositionY() + 300); + Ball->setVisible(true); + }), animateBall, shootBall,CallFuncN::create([Ball, player, opponent, this](Ref* sender) { + /*爆炸*/ + Sprite* explosion = Sprite::createWithSpriteFrame(player->explosionVector.front()); + explosion->setPosition(Ball->getPosition()); + explosion->setScale(4.0f); + auto exploseAnimation = Animation::createWithSpriteFrames(player->explosionVector, 0.06f); + auto explose = Animate::create(exploseAnimation); + auto seq = Sequence::create(explose, CallFuncN::create([explosion](Ref* sender) { + explosion->removeFromParentAndCleanup(true); + }), NULL); + if (Ball->getBoundingBox().containsPoint(opponent->getPosition())) { + opponent->hitByUltimate(); + } + explose->setTag(1); + addChild(explosion, 3); + explosion->runAction(seq); + Ball->removeFromParentAndCleanup(true); + }), NULL); + Ball->runAction(seqBall); +} + +/* 生成远程攻击的球,注意这里没有remove,请在遍历球列表时进行remove */ +void OnlineGameScene::createRangedBall(PlayerSprite* player,bool isPlayer1) { + if (player->isRun || player->getMp() < 10) return; + Sprite* Ball = Sprite::createWithSpriteFrame(player->rangedBallVector.back()); + Ball->setFlippedX(!player->isFlippedX()); + Ball->setVisible(false); + /*设置球的方向*/ + int direction = 1; + if (!player->isFlippedX()) direction = -1; + Ball->setPosition(player->getPositionX() + 70 * direction, player->getPositionY() + 20); + if (isPlayer1) { + player1RangedBalls.push_back(Ball); + } + else + { + player2RangedBalls.push_back(Ball); + } + addChild(Ball, 3); + MoveTo* moveTo; + if (Ball->isFlippedX()) { + moveTo = MoveTo::create((Ball->getPositionX() + 30) / 360, Vec2(-30, Ball->getPositionY())); + } + else { + moveTo = MoveTo::create((1200 - Ball->getPositionX()) / 360, Vec2(1200, Ball->getPositionY())); + } + /*球的动作:延迟,可见,移动,销毁*/ + auto seqBall = Sequence::create(DelayTime::create(0.5f), CallFuncN::create([Ball](Ref* sender) { + Ball->setVisible(true); + }), moveTo, NULL); + Ball->runAction(seqBall); +} + +/* 生成蓄力效果 */ +Sprite* OnlineGameScene::createChargeEffect(PlayerSprite* player) { + if (player->isRun ||player->isMove ) return NULL; + Sprite* effect = Sprite::createWithSpriteFrame(player->chargeEffectVector.front()); + effect->setScale(2.0f); + effect->setPosition(player->getPosition() + Vec2(0, 30)); + addChild(effect, 1); + auto effectAnimation = Animation::createWithSpriteFrames(player->chargeEffectVector, 0.05f); + auto effectAnimate = Animate::create(effectAnimation); + auto effectAct = RepeatForever::create(effectAnimate); + effect->runAction(effectAct); + return effect; +} + +/* 生成被击打效果,在hitTest里被调用 */ +void OnlineGameScene::createHitEffect(PlayerSprite* player) { + Sprite* hitEffect = Sprite::createWithSpriteFrame(player->hitEffectVector.front()); + hitEffect->setPosition(player->getPosition()); + addChild(hitEffect, 3); + auto hitEffectAnimation = Animation::createWithSpriteFrames(player->hitEffectVector, 0.04f); + auto hitEffectAnimate = Animate::create(hitEffectAnimation); + auto seq = Sequence::create(hitEffectAnimate, CallFuncN::create([hitEffect](Ref* sender) { + hitEffect->removeFromParentAndCleanup(true); + }),NULL); + hitEffect->runAction(seq); +} + +/* 声音暂停 回调*/ +void OnlineGameScene::VoicePauseSelectedCallback(Ref * pSender) +{ + /*声音按钮切换以及声音控制*/ + if (voiceState) { + SimpleAudioEngine::getInstance()->pauseBackgroundMusic(); + SimpleAudioEngine::getInstance()->pauseAllEffects(); + voiceState = 0; + voiceItem->setNormalImage(Sprite::create("button/SoundOff.png")); + } + else { + SimpleAudioEngine::getInstance()->resumeBackgroundMusic(); + SimpleAudioEngine::getInstance()->resumeAllEffects(); + voiceState = 1; + SimpleAudioEngine::getInstance()->playEffect("music/ClickCamera.wav", false, 1.0f, 0.0f, 1.0f); + voiceItem->setNormalImage(Sprite::create("button/SoundOn.png")); + } +} + +/*游戏暂停,弹出暂停场景的回调函数*/ +void OnlineGameScene::playOrPauseCallback(Object * pSender) +{ + /*得到窗口的大小*/ + Size visibleSize = Director::sharedDirector()->getVisibleSize(); + RenderTexture *renderTexture = RenderTexture::create(visibleSize.width, visibleSize.height); + + /*遍历当前类的所有子节点信息,画入renderTexture中。 + 这里类似截图。*/ + renderTexture->begin(); + this->getParent()->visit(); + renderTexture->end(); + + /*将游戏界面暂停,压入场景堆栈。并切换到GamePauseScene界面*/ + Director::sharedDirector()->pushScene(GamePauseScene::CreateScene(renderTexture)); + + log(" to game pause scene"); + + /* 播放暂停按钮切换*/ + if (playOrPauseState) { + SimpleAudioEngine::getInstance()->playEffect("music/ClickCamera.wav", false, 1.0f, 0.0f, 1.0f); + playOrPauseState = 0; + //Director::getInstance()->set + playOrPauseItem->setNormalImage(Sprite::create("button/pause.png")); + } + else { + SimpleAudioEngine::getInstance()->playEffect("music/ClickCamera.wav", false, 1.0f, 0.0f, 1.0f); + playOrPauseState = 1; + playOrPauseItem->setNormalImage(Sprite::create("button/play.png")); + } +} + +#pragma region 服务端相关代码 + +/* 接受来自服务端的数据 */ +void OnlineGameScene::onReceive(const char * data, int count) +{ + SocketData* revData = (SocketData*)data; + if (revData->uid != uid) { + switch (revData->codeSend) + { + /* 这里不知道为什么不能用KEYCODESEND::LEFT,是我记错了???所以只能用很难记的数字了 */ + case 0: + onKeyPressed(EventKeyboard::KeyCode::KEY_LEFT_ARROW, nullptr); + break; + case 1: + onKeyPressed(EventKeyboard::KeyCode::KEY_RIGHT_ARROW, nullptr); + break; + case 2: + onKeyPressed(EventKeyboard::KeyCode::KEY_UP_ARROW, nullptr); + break; + case 3: + onKeyPressed(EventKeyboard::KeyCode::KEY_DOWN_ARROW, nullptr); + break; + case 4: + onKeyPressed(EventKeyboard::KeyCode::KEY_1, nullptr); + break; + case 5: + onKeyPressed(EventKeyboard::KeyCode::KEY_2, nullptr); + break; + case 6: + onKeyPressed(EventKeyboard::KeyCode::KEY_5, nullptr); + break; + case 7: + onKeyPressed(EventKeyboard::KeyCode::KEY_3, nullptr); + break; + case 8: + onKeyReleased(EventKeyboard::KeyCode::KEY_LEFT_ARROW, nullptr); + break; + case 9: + onKeyReleased(EventKeyboard::KeyCode::KEY_RIGHT_ARROW, nullptr); + break; + case 10: + onKeyReleased(EventKeyboard::KeyCode::KEY_UP_ARROW, nullptr); + break; + case 11: + onKeyReleased(EventKeyboard::KeyCode::KEY_DOWN_ARROW, nullptr); + break; + case 12: + onKeyReleased(EventKeyboard::KeyCode::KEY_1, nullptr); + break; + case 13: + onKeyReleased(EventKeyboard::KeyCode::KEY_2, nullptr); + break; + case 14: + onKeyReleased(EventKeyboard::KeyCode::KEY_5, nullptr); + break; + case 15: + onKeyReleased(EventKeyboard::KeyCode::KEY_3, nullptr); + break; + case 17: + transfer(); + break; + default: + break; + } + } +} + +/* 断开连接 */ +void OnlineGameScene::onDisconnect() +{ + CCLOG("%s", "onDisconnect"); +} + + +#pragma endregion + + +void OnlineGameScene::transfer() +{ + PlayerSprite* temp = player1; + player1 = player2; + player2 = temp; + Sprite* temp2 = physicPlayer1; + physicPlayer1 = physicPlayer2; + physicPlayer2 = temp2; + ProgressTimer* temp3 = player1Hp; + player1Hp = player2Hp; + player2Hp = temp3; + temp3 = player1Mp; + player1Mp = player2Mp; + player2Mp = temp3; +} \ No newline at end of file diff --git a/Classes/Scenes/OnlineGameScene.h b/Classes/Scenes/OnlineGameScene.h new file mode 100644 index 0000000..ba0641c --- /dev/null +++ b/Classes/Scenes/OnlineGameScene.h @@ -0,0 +1,129 @@ +/************************************************************************** + +* Copyright: + +* Author: LittleFish + +* Date: 2018-07-02 + +* Description: 联网对战游戏界面 + +**************************************************************************/ + +#ifndef __ONLINEGAME_SCENE_H__ +#define __ONLINEGAME_SCENE_H__ + +#include "cocos2d.h" +#include "SelectRoleScene.h" +#include "Players\PlayerSprite.h" +#include "..\ShareSingleton.h" +#include "..\SocketUtil\SocketClient.h" +#include "..\SocketUtil\SocketData.h" + + +class OnlineGameScene: public cocos2d::Layer +{ +public: + static PhysicsWorld* world; + static cocos2d::Scene* createScene(); + void setPhysicsWorld(PhysicsWorld * world); + + virtual bool init(); + + /* 碰撞发生函数 */ + bool onConcactBegin(PhysicsContact & contact); + /* 碰撞的两个物体离开时响应函数 */ + bool onContactSeparate(PhysicsContact & contact); + + /* 按下键盘 */ + void onKeyPressed(EventKeyboard::KeyCode code, Event * event); + + /* 释放按键 */ + void onKeyReleased(EventKeyboard::KeyCode code, Event * event); + + void update(float delay); + + /*测试函数*/ + void hitTest(Ref* sender); + void deadTest(Ref* sender); + + void hit(float dt); + void gameOver(); + void isCharge(float dt); /* 是否集气 */ + void updateHP_MP(float delay); + + void RightKeyPressed(); + void RightKeyPressed(float t); + void LeftKeyPressed(); + void LeftKeyPressed(float t); + void A_KeyPressed(); + void A_KeyPressed(float t); + void D_KeyPressed(); + void D_KeyPressed(float t); + void One_KeyPressed(); + void One_KeyPressed(float t); + void G_KeyPressed(); + void G_KeyPressed(float t); + + void hittedCounter(float t); + /*生成大招球*/ + void createUltimateBall(PlayerSprite* player, bool isPlayer1); + /*生成远程攻击球*/ + void createRangedBall(PlayerSprite* player, bool isPlayer1); + /*生成蓄力效果*/ + Sprite* createChargeEffect(PlayerSprite* player); + /*生成被击打效果*/ + void createHitEffect(PlayerSprite* player); + /* 设置背景音乐打开或者关闭 */ + void VoicePauseSelectedCallback(Ref * pSender); + /*设置游戏暂停*/ + void playOrPauseCallback(Object * pSender); + + /* 接受来自服务端的数据 */ + void onReceive(const char* data, int count); + /* 断开连接 */ + void onDisconnect(); + /* 交换player1和player2 */ + void transfer(); + + /* implement the "static create()" method manually */ + CREATE_FUNC(OnlineGameScene); + +private: + PhysicsWorld * m_world; + Size visibleSize; + /* 地面和玩家 */ + Sprite* ground; + PlayerSprite* player1, *player2; + Sprite* physicPlayer1, *physicPlayer2; + cocos2d::ProgressTimer* player1Hp, *player1Mp, *player2Hp,* player2Mp; + Sprite* chargeEffect1; + Sprite* chargeEffect2; + /*双击键盘的判定变量*/ + bool firstPressR = true, firstPressL = true, RightKeyState = false, LeftKeyState = false; + bool firstPressA = true, firstPressD = true, A_KeyState = false, D_KeyState = false; + bool firstPress1 = true, secondPress1 = false; + bool firstPressG = true, secondPressG = false; + /*攻击炮的列表*/ + std::list player1UltimateBalls, player2UltimateBalls; + std::list player1RangedBalls, player2RangedBalls; + + __int64 player1LastHit, player2LastHit; + ShareSingleton* shareInstance = ShareSingleton::GetInstance(); + + /*为真,正在播放*/ + int voiceState; + MenuItemImage* voiceItem; + /*为真 正在游戏,为假暂停*/ + int playOrPauseState; + MenuItemImage* playOrPauseItem; + + bool isFreiza = false; + + + /* 客户端 */ + SocketClient* client; + int uid = 0; +}; + +#endif /* __GameScene_SCENE_H__ */ diff --git a/Classes/Scenes/SelectBackgroundScene.cpp b/Classes/Scenes/SelectBackgroundScene.cpp index 97f0599..dfde4cd 100644 --- a/Classes/Scenes/SelectBackgroundScene.cpp +++ b/Classes/Scenes/SelectBackgroundScene.cpp @@ -1,6 +1,8 @@ #include "SelectBackgroundScene.h" #include "SimpleAudioEngine.h" #include "ExampleGameScene.h" +#include "../ShareSingleton.h" +using namespace CocosDenshion; Scene* SelectBackgroundScene::createScene() { @@ -32,48 +34,83 @@ bool SelectBackgroundScene::init() #pragma region UI界面 /* Todo:美工人员请将这里的图片替换为你选的素材和按你的需要设置位置 */ + /*游戏背景*/ + auto bg = Sprite::create("bg/selectBackgroundSceneBackground.png"); + bg->setPosition(visibleSize / 2); + addChild(bg, 0); + /* 这里的场景的变量名仅仅是为了基本框架的构建,请在选好场景之后替换这些变量名 */ /* 可选场景1 */ bgItem1 = MenuItemImage::create( - "bg1.jpg", - "bg1.jpg", + "bg/bg1-small.png", + "bg/bg1-small.png", CC_CALLBACK_1(SelectBackgroundScene::bgSelectedCallback, this, 1)); - bgItem1->setPosition(Vec2(200, 500)); + bgItem1->setPosition(Vec2(120, 500)); /* 可选场景2 */ bgItem2 = MenuItemImage::create( - "bg2.jpg", - "bg2.jpg", + "bg/bg2-small.png", + "bg/bg2-small.png", CC_CALLBACK_1(SelectBackgroundScene::bgSelectedCallback, this, 2)); - bgItem2->setPosition(Vec2(700, 500)); + bgItem2->setPosition(Vec2(380, 500)); /* 可选场景3 */ bgItem3 = MenuItemImage::create( - "bg3.jpg", - "bg3.jpg", + "bg/bg3-small.png", + "bg/bg3-small.png", CC_CALLBACK_1(SelectBackgroundScene::bgSelectedCallback, this, 3)); - bgItem3->setPosition(Vec2(200, 200)); + bgItem3->setPosition(Vec2(640, 500)); /* 可选场景4 */ bgItem4 = MenuItemImage::create( - "bg4.jpg", - "bg4.jpg", + "bg/bg4-small.png", + "bg/bg4-small.png", CC_CALLBACK_1(SelectBackgroundScene::bgSelectedCallback, this, 4)); - bgItem4->setPosition(Vec2(700, 200)); - + bgItem4->setPosition(Vec2(900, 500)); + /* 可选场景5 */ + bgItem5 = MenuItemImage::create( + "bg/bg5-small.png", + "bg/bg5-small.png", + CC_CALLBACK_1(SelectBackgroundScene::bgSelectedCallback, this, 5)); + bgItem5->setPosition(Vec2(120, 300)); + /* 可选场景6 */ + bgItem6 = MenuItemImage::create( + "bg/bg6-small.png", + "bg/bg6-small.png", + CC_CALLBACK_1(SelectBackgroundScene::bgSelectedCallback, this, 6)); + bgItem6->setPosition(Vec2(380, 300)); + /* 可选场景7 */ + bgItem7 = MenuItemImage::create( + "bg/bg7-small.png", + "bg/bg7-small.png", + CC_CALLBACK_1(SelectBackgroundScene::bgSelectedCallback, this, 7)); + bgItem7->setPosition(Vec2(640, 300)); + /* 可选场景8 */ + bgItem8 = MenuItemImage::create( + "bg/bg8-small.png", + "bg/bg8-small.png", + CC_CALLBACK_1(SelectBackgroundScene::bgSelectedCallback, this, 8)); + bgItem8->setPosition(Vec2(900, 300)); + + /* 确定按钮 */ confirmItem = MenuItemImage::create( - "confirm.png", - "confirm.png", + "button/confirm-normal.png", + "button/confirm-selected.png", CC_CALLBACK_1(SelectBackgroundScene::startGame, this)); - confirmItem->setPosition(Vec2(500, 100)); - - auto menu = Menu::create(bgItem1, bgItem2, bgItem3, bgItem4, confirmItem, NULL); + confirmItem->setPosition(Vec2(512, 200)); + + /*选择地图字样*/ + auto chooseBg = Sprite::create("button/ChooseBackground.png"); + chooseBg->setPosition(Vec2(512, 680)); + this->addChild(chooseBg, 0); + + auto menu = Menu::create(bgItem1, bgItem2, bgItem3, bgItem4, bgItem5, bgItem6, bgItem7, bgItem8,confirmItem, NULL); menu->setPosition(Vec2::ZERO); this->addChild(menu, 1); /* 场景边框:选中使显示 */ frame = Sprite::create("frame.png"); - frame->setPosition(Vec2(200, 500)); /* 默认情况下选择场景1 */ + frame->setPosition(Vec2(120, 495)); /* 默认情况下选择场景1 */ frame->setVisible(true); - this->addChild(frame, 0); + this->addChild(frame, 1); #pragma endregion @@ -83,19 +120,41 @@ bool SelectBackgroundScene::init() /* 高亮被选择的游戏场景 */ void SelectBackgroundScene::bgSelectedCallback(Ref* pSender, int option) { + SimpleAudioEngine::getInstance()->playEffect("music/ClickCamera.wav", false, 1.0f, 0.0f, 1.0f); + log("%d option", option); switch (option) { case 1: - frame->setPosition(Vec2(200, 500)); + frame->setPosition(Vec2(120, 495)); + selectedBackground = 1; break; case 2: - frame->setPosition(Vec2(700, 500)); + frame->setPosition(Vec2(380, 495)); + selectedBackground = 2; break; case 3: - frame->setPosition(Vec2(200, 200)); + frame->setPosition(Vec2(640, 495)); + selectedBackground = 3; break; case 4: - frame->setPosition(Vec2(700, 200)); + frame->setPosition(Vec2(900, 495)); + selectedBackground = 4; + break; + case 5: + frame->setPosition(Vec2(120, 300)); + selectedBackground = 5; + break; + case 6: + frame->setPosition(Vec2(380, 300)); + selectedBackground = 6; + break; + case 7: + frame->setPosition(Vec2(640, 300)); + selectedBackground = 7; + break; + case 8: + frame->setPosition(Vec2(900, 300)); + selectedBackground = 8; break; default: break; @@ -106,9 +165,11 @@ void SelectBackgroundScene::bgSelectedCallback(Ref* pSender, int option) /* 开始游戏 */ void SelectBackgroundScene::startGame(Ref * pSender) { - /* Todo:美工人员请替换这里的转场特效 */ float t = 1.2f; + SimpleAudioEngine::getInstance()->playEffect("music/ClickCamera.wav", false, 1.0f, 0.0f, 1.0f); + ShareSingleton::GetInstance()->selectedBackground = this->selectedBackground; auto newScene = ExampleGameScene::createScene(); - auto replacesense = CCTransitionPageTurn::create(t, newScene, false); + auto replacesense = CCTransitionFade::create(t, newScene); Director::sharedDirector()->replaceScene(replacesense); + } diff --git a/Classes/Scenes/SelectBackgroundScene.h b/Classes/Scenes/SelectBackgroundScene.h index 4ba49ae..522c3fd 100644 --- a/Classes/Scenes/SelectBackgroundScene.h +++ b/Classes/Scenes/SelectBackgroundScene.h @@ -38,7 +38,7 @@ class SelectBackgroundScene : public cocos2d::Scene private: /* 可选场景1-4 */ - MenuItemImage * bgItem1, *bgItem2, *bgItem3, *bgItem4; + MenuItemImage * bgItem1, *bgItem2, *bgItem3, *bgItem4, *bgItem5, *bgItem6, *bgItem7, *bgItem8; /* 一个边框,用于高亮已经选择的场景 */ Sprite * frame; /* 确定按钮,点击进入游戏界面 */ diff --git a/Classes/Scenes/SelectRoleScene.cpp b/Classes/Scenes/SelectRoleScene.cpp index 02d8dee..31660f5 100644 --- a/Classes/Scenes/SelectRoleScene.cpp +++ b/Classes/Scenes/SelectRoleScene.cpp @@ -4,6 +4,8 @@ #include "SelectBackgroundScene.h" #include +using namespace CocosDenshion; + Scene* SelectRoleScene::createScene() { @@ -35,6 +37,11 @@ bool SelectRoleScene::init() /* Todo:美工人员请将这里的图片替换为你选的素材和按你的需要设置位置 */ /* 这里的角色的变量名仅仅是为了基本框架的构建,请在选好角色之后替换这些变量名 */ + /*游戏背景*/ + auto bg = Sprite::create("bg/selectRoleSceneBackground.png"); + bg->setPosition(visibleSize / 2); + addChild(bg, 0); + /* 可选角色1 */ roleItem1 = MenuItemImage::create( "role1.png", @@ -62,30 +69,45 @@ bool SelectRoleScene::init() /* 确定按钮 */ player1ConfirmItem = MenuItemImage::create( - "confirm.png", - "confirm.png", + "button/confirm-normal.png", + "button/confirm-selected.png", CC_CALLBACK_1(SelectRoleScene::confirmCallback, this, '1')); player1ConfirmItem->setPosition(Vec2(150, 100)); player1ConfirmItem->setVisible(false); player2ConfirmItem = MenuItemImage::create( - "confirm.png", - "confirm.png", + "button/confirm-normal.png", + "button/confirm-selected.png", CC_CALLBACK_1(SelectRoleScene::confirmCallback, this, '2')); player2ConfirmItem->setPosition(Vec2(850, 100)); player2ConfirmItem->setVisible(false); /* 回到主菜单按纽 */ backItem = MenuItemImage::create( - "back.png", - "back.png", + "button/back-normal.png", + "button/back-selected.png", CC_CALLBACK_1(SelectRoleScene::menuBackCallback, this)); backItem->setPosition(Vec2(500, 100)); + /*x选择角色字样*/ + auto chooseRole = Sprite::create("button/ChooseRole.png"); + chooseRole->setPosition(Vec2(512, 680)); + this->addChild(chooseRole, 0); + auto menu = Menu::create(roleItem1, roleItem2, roleItem3, roleItem4, backItem, player1ConfirmItem, player2ConfirmItem, NULL); menu->setPosition(Vec2::ZERO); this->addChild(menu, 1); + /*表明是角色1,2的图片*/ + auto role1 = Sprite::create("role/role1.png"); + auto role2 = Sprite::create("role/role2.png"); + role1->setPosition(Vec2(150, 500)); + role2->setPosition(Vec2(850, 500)); + addChild(role1, 1); + addChild(role2, 1); + + + /* 当你选择了一个角色之后,将会显示出该角色的大图在左下角或右下角,在此之前该图片是不可见的 */ /* 已选角色1 */ roleItem1_big = Sprite::create("role1-big.png"); @@ -136,14 +158,17 @@ bool SelectRoleScene::init() void SelectRoleScene::menuBackCallback(Ref* pSender) { float t = 1.2f; + SimpleAudioEngine::getInstance()->playEffect("music/ClickCamera.wav", false, 1.0f, 0.0f, 1.0f); auto newScene = WelcomeScene::createScene(); - auto replacesense = CCTransitionPageTurn::create(t, newScene, false); + auto replacesense = CCTransitionFade::create(t, newScene); Director::sharedDirector()->replaceScene(replacesense); } /* 选择角色 */ void SelectRoleScene::roleSelectedCallback(Ref* pSender, char option) { + SimpleAudioEngine::getInstance()->playEffect("music/ClickCamera.wav", false, 1.0f, 0.0f, 1.0f); + if (!player1Selected) { /* 当前是为player1选择角色 */ invisibleRolesBig(); switch (option) /* 判断选择的是哪一个角色 */ @@ -256,6 +281,7 @@ void SelectRoleScene::invisibleRolesBig() void SelectRoleScene::confirmCallback(Ref* pSender, char option) { auto particle = ParticleFlower::create(); + SimpleAudioEngine::getInstance()->playEffect("music/ClickCamera.wav", false, 1.0f, 0.0f, 1.0f); switch (option) { case '1': @@ -274,7 +300,7 @@ void SelectRoleScene::confirmCallback(Ref* pSender, char option) /* 如果play2也已经选择好角色了,那么进入游戏背景选择界面(这里试过了不能放在switch里,所以让case2 直接break) */ float t = 1.2f; auto newScene = SelectBackgroundScene::createScene(); - auto replacesense = CCTransitionPageTurn::create(t, newScene, false); + auto replacesense = CCTransitionFade::create(t, newScene); Director::sharedDirector()->replaceScene(replacesense); } diff --git a/Classes/Scenes/SocketServerScene.cpp b/Classes/Scenes/SocketServerScene.cpp new file mode 100644 index 0000000..a3300e7 --- /dev/null +++ b/Classes/Scenes/SocketServerScene.cpp @@ -0,0 +1,69 @@ +#include "SocketServerScene.h" +#include "SimpleAudioEngine.h" +#include "GameSettingScene.h" +#include "..\SocketUtil\SocketData.h" + + +using namespace CocosDenshion; +USING_NS_CC; + +Scene* SocketServerScene::createScene() +{ + return SocketServerScene::create(); +} + +/* 当文件不存在时,打印有用的错误消息而不是分段错误 */ +static void problemLoading(const char* filename) +{ + printf("Error while loading: %s\n", filename); + printf("Depending on how you compiled you might have to add 'Resources/' in front of filenames in SocketServerSceneScene.cpp\n"); +} + +/* 初始化场景函数 */ +bool SocketServerScene::init() +{ +#pragma region Cocos2dx自动生成的内容:一些基本配置 + + if (!Scene::init()) + { + return false; + } + auto visibleSize = Director::getInstance()->getVisibleSize(); + Vec2 origin = Director::getInstance()->getVisibleOrigin(); + +#pragma endregion + + auto label = Label::createWithSystemFont("Server", "Arial", 24.f); + label->setPosition(500, 400); + addChild(label, 1); + +#pragma region 服务器相关配置 + + server = SocketServer::getInstance(); + server->startServer(8000); + server->onRecv = CC_CALLBACK_2(SocketServerScene::onReceive, this); + + schedule(schedule_selector(SocketServerScene::update), 0.05f, kRepeatForever, 0); + +#pragma endregion + + return true; +} + + +void SocketServerScene::update(float dt) +{ + server->update(dt); +} + +void SocketServerScene::onReceive(const char * data, int count) +{ + //SocketData* myData = (SocketData*)data; + //CCLOG("%d %d", myData->uid, myData->codeSend); + server->sendMessage(data, count); +} + + + + + diff --git a/Classes/Scenes/SocketServerScene.h b/Classes/Scenes/SocketServerScene.h new file mode 100644 index 0000000..5c50911 --- /dev/null +++ b/Classes/Scenes/SocketServerScene.h @@ -0,0 +1,42 @@ +/************************************************************************** + +* Copyright: + +* Author: LittleFish + +* Date: 2018-07-02 + +* Description: 一个服务器界面类 + +**************************************************************************/ + +#ifndef __SOCKETSERVER_SCENE_H__ +#define __SOCKETSERVER_SCENE_H__ + +#include "cocos2d.h" +#include "SelectRoleScene.h" +#include "..\SocketUtil\SocketServer.h" + + + +class SocketServerScene: public cocos2d::Scene +{ +public: + static cocos2d::Scene* createScene(); + + virtual bool init(); + + /* 发送信息 */ + void update(float dt); + + /* 接受数据 */ + void onReceive(const char* data, int count); + + /* implement the "static create()" method manually */ + CREATE_FUNC(SocketServerScene); + +private: + SocketServer* server; +}; + +#endif /* __SOCKETSERVER_SCENE_H__*/ \ No newline at end of file diff --git a/Classes/Scenes/WelcomeScene.cpp b/Classes/Scenes/WelcomeScene.cpp index 179f94e..1b1cd6b 100644 --- a/Classes/Scenes/WelcomeScene.cpp +++ b/Classes/Scenes/WelcomeScene.cpp @@ -1,6 +1,7 @@ #include "WelcomeScene.h" #include "SimpleAudioEngine.h" - +#include "GameSettingScene.h" +using namespace CocosDenshion; USING_NS_CC; Scene* WelcomeScene::createScene() @@ -30,40 +31,77 @@ bool WelcomeScene::init() #pragma endregion -#pragma region UI界面 +#pragma region UI界面 背景图片 + + auto bg = Sprite::create("bg/startSceneBackground.png"); + bg->setPosition(visibleSize / 2); + addChild(bg, 0); + + /* 添加悟空人物 */ + Sprite* wukong = Sprite::create("setting/SunWuKong.png"); + wukong->setPosition(Vec2(250, 200)); + addChild(wukong, 0); - /* Todo:美工人员请在这里添加为WelcomeScene添加UI界面的美化 */ + /* 添加对话框*/ + auto welcomeDialogue = Sprite::create("setting/welcome-Dialogue.png"); + welcomeDialogue->setPosition(Vec2(450, 400)); + addChild(welcomeDialogue, 1); + +#pragma endregion + + + +#pragma region 预添加音效和背景音乐 + + auto audio = SimpleAudioEngine::getInstance(); + /*预加载并循环播放背景音乐*/ + audio->playBackgroundMusic("music/WelcomeSceneBgm.mp3", true); + audio->setBackgroundMusicVolume(0.80); + + /*预加载音效*/ + audio->preloadEffect("music/ClickCamera.wav"); + audio->setEffectsVolume(0.80); #pragma endregion #pragma region 开始游戏按钮 - /* Todo:美工人员请将这里的图片替换为你选的素材和按你的需要设置位置 */ auto startItem = MenuItemImage::create( - "start-normal.png", - "start-selected.png", + "button/start-normal.png", + "button/start-selected.png", CC_CALLBACK_1(WelcomeScene::startGameCallback, this)); - startItem->setPosition(Vec2(origin.x + visibleSize.width / 2, origin.y + visibleSize.height / 2 + 100)); - + //startItem->setPosition(Vec2(origin.x + visibleSize.width / 2, origin.y + visibleSize.height / 3 + 20)); + startItem->setPosition(Vec2(800, 300)); #pragma endregion +#pragma region 游戏设置按钮 + + auto settingItem = MenuItemImage::create( + "button/setting-normal.png", + "button/setting-selected.png", + CC_CALLBACK_1(WelcomeScene::settingGameCallback, this) + ); + //settingItem->setPosition(Vec2(origin.x + visibleSize.width / 2, origin.y + visibleSize.height / 3 - 60)); + settingItem->setPosition(Vec2(800, 210)); + +#pragma endregion #pragma region 结束游戏按钮 - /* Todo:美工人员请将这里的图片替换为你选的素材和按你的需要设置位置 */ auto closeItem = MenuItemImage::create( - "close-normal.png", - "close-selected.png", + "button/close-normal.png", + "button/close-selected.png", CC_CALLBACK_1(WelcomeScene::menuCloseCallback, this)); - closeItem->setPosition(Vec2(origin.x + visibleSize.width / 2, origin.y + visibleSize.height / 2)); + closeItem->setPosition(Vec2(origin.x + visibleSize.width / 2, origin.y + visibleSize.height / 3 - 140)); + closeItem->setPosition(Vec2(800, 120)); #pragma endregion - auto menu = Menu::create(startItem, closeItem, NULL); + auto menu = Menu::create(startItem, closeItem, settingItem, NULL); menu->setPosition(Vec2::ZERO); this->addChild(menu, 1); return true; @@ -72,7 +110,8 @@ bool WelcomeScene::init() /* 关闭游戏 */ void WelcomeScene::menuCloseCallback(Ref* pSender) { - Director::getInstance()->end(); + SimpleAudioEngine::getInstance()->playEffect("music/ClickCamera.wav", false, 1.0f, 0.0f, 1.0f); + Director::getInstance()->end(); #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) exit(0); @@ -81,12 +120,26 @@ void WelcomeScene::menuCloseCallback(Ref* pSender) void WelcomeScene::startGameCallback(Ref* pSender) { - float t = 1.2f; + SimpleAudioEngine::getInstance()->playEffect("music/ClickCamera.wav", false, 1.0f, 0.0f, 1.0f); + + float t = 0.8f; auto newScene = SelectRoleScene::createScene(); - auto replacesense = CCTransitionPageTurn::create(t, newScene, false); + auto replacesense = CCTransitionFade::create(t, newScene); Director::sharedDirector()->replaceScene(replacesense); } +void WelcomeScene::settingGameCallback(Ref * pSender) +{ + SimpleAudioEngine::getInstance()->playEffect("music/ClickCamera.wav", false, 1.0f, 0.0f, 1.0f); + + float t = 0.8f; + auto newScene = GameSettingScene::createScene(); + auto replacescene = CCTransitionFade::create(t, newScene); + Director::sharedDirector()->replaceScene(replacescene); + +} + + diff --git a/Classes/Scenes/WelcomeScene.h b/Classes/Scenes/WelcomeScene.h index 9a6d3a2..c9b9add 100644 --- a/Classes/Scenes/WelcomeScene.h +++ b/Classes/Scenes/WelcomeScene.h @@ -28,6 +28,9 @@ class WelcomeScene : public cocos2d::Scene void startGameCallback(Ref * pSender); + void settingGameCallback(Ref* pSender); + + /* implement the "static create()" method manually */ CREATE_FUNC(WelcomeScene); }; diff --git a/Classes/ShareSingleton.cpp b/Classes/ShareSingleton.cpp index c5f27a2..11e02e7 100644 --- a/Classes/ShareSingleton.cpp +++ b/Classes/ShareSingleton.cpp @@ -6,6 +6,7 @@ class ShareSingleton public: bool opponentFlipx = false; + int selectedBackground = 1; static ShareSingleton* GetInstance() { diff --git a/Classes/ShareSingleton.h b/Classes/ShareSingleton.h index e2331cb..7bad527 100644 --- a/Classes/ShareSingleton.h +++ b/Classes/ShareSingleton.h @@ -22,6 +22,10 @@ class ShareSingleton return &Instance; } bool opponentFlipx = false; + + /*代表选择地图序号*/ + int selectedBackground = 1; + }; #endif \ No newline at end of file diff --git a/Classes/SocketUtil/SocketBase.cpp b/Classes/SocketUtil/SocketBase.cpp new file mode 100644 index 0000000..91933ea --- /dev/null +++ b/Classes/SocketUtil/SocketBase.cpp @@ -0,0 +1,67 @@ +#include "SocketBase.h" + +SocketBase::SocketBase() +{ + _bInitSuccess = false; + + WORD wVersionRequested; + wVersionRequested = MAKEWORD(2, 0); + WSADATA wsaData; + int nRet = WSAStartup(wVersionRequested, &wsaData); + if (nRet != 0) + { + fprintf(stderr, "Initilize Error!\n"); + return; + } + _bInitSuccess = true; + +} + +SocketBase::~SocketBase() +{ + if (_bInitSuccess) + { + WSACleanup(); + } +} + +void SocketBase::closeConnect(HSocket socket) +{ +#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) + close(socket); +#elif (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) + closesocket(socket); +#endif +} +/* 判断套接字是否错误的方法 */ +bool SocketBase::error(HSocket socket) +{ +#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) + return socket == SOCKET_ERROR; +#elif (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) + return socket < 0; +#endif +} + +bool SocketBase::nonBlock(HSocket socket) +{ +#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) + + int flags; + flags = fcntl(socket, F_GETFL, 0); + flags != O_NONBLOCK; + if (fcntl(socket, F_SETFL, flags) < 0) + { + return false; + } +#else + u_long ulOn; + ulOn = 1; + if (ioctlsocket(socket, FIONBIO, &ulOn) == SOCKET_ERROR) + { + return false; + } +#endif + + return true; +} \ No newline at end of file diff --git a/Classes/SocketUtil/SocketBase.h b/Classes/SocketUtil/SocketBase.h new file mode 100644 index 0000000..321e4eb --- /dev/null +++ b/Classes/SocketUtil/SocketBase.h @@ -0,0 +1,78 @@ +#ifndef __SOCKET_BASE_H__ +#define __SOCKET_BASE_H__ +#include "cocos2d.h" +#include +#include +USING_NS_CC; + +#include +#pragma comment(lib, "WS2_32.lib") +#define HSocket SOCKET + +/* 消息类型 */ +enum MessageType +{ + DISCONNECT, + RECEIVE, + NEW_CONNECTION +}; + +/* 网络消息定义 */ +class SocketMessage +{ +private: + MessageType msgType; + Data* msgData; + +public: + + /* 构造一个SocketMessage */ + SocketMessage(MessageType type, unsigned char* data, int dataLen) + { + msgType = type; + msgData = new Data; + msgData->copy(data, dataLen); + } + /* 构造空消息 */ + SocketMessage(MessageType type) + { + msgType = type; + msgData = nullptr; + } + /* 取得消息数据 */ + Data* getMsgData() { return msgData; } + /* 取得消息的类型 */ + MessageType getMsgType() { return msgType; } + /* 析构数据 */ + ~SocketMessage() + { + if (msgData) + CC_SAFE_DELETE(msgData); + } +}; + +/* Socket基类定义 */ +class SocketBase : public Ref +{ +public: + SocketBase(); + ~SocketBase(); + /* 非阻塞 */ + bool nonBlock(HSocket socket); + +protected: + /* 关闭连接 */ + void closeConnect(HSocket socket); + /* 网络错误 */ + bool error(HSocket socket); + +protected: + /* 互斥锁 */ + std::mutex _mutex; + +private: + /* 是否初始化成功 */ + bool _bInitSuccess; +}; + +#endif \ No newline at end of file diff --git a/Classes/SocketUtil/SocketClient.cpp b/Classes/SocketUtil/SocketClient.cpp new file mode 100644 index 0000000..8180c94 --- /dev/null +++ b/Classes/SocketUtil/SocketClient.cpp @@ -0,0 +1,171 @@ +#include "SocketClient.h" + +SocketClient* SocketClient::construct() +{ + SocketClient* client = new SocketClient; + return client; +} + +/* 销毁客户端 */ +void SocketClient::destroy() +{ + delete this; +} + +SocketClient::SocketClient(void) : + onRecv(nullptr), + _socektClient(0) +{ +} + +SocketClient::~SocketClient(void) +{ + this->clear(); +} + +/* 断开服务器连接,清除消息队列,解注册调度器 */ +void SocketClient::clear() +{ + if (_socektClient != 0) + { + _mutex.lock(); + this->closeConnect(_socektClient); + _mutex.unlock(); + } + + for (auto msg : _UIMessageQueue) + { + CC_SAFE_DELETE(msg); + } + _UIMessageQueue.clear(); + + Director::getInstance()->getScheduler()->unscheduleAllForTarget(this); +} +/* 初始化客户端 */ +bool SocketClient::initClient() +{ + this->clear(); + + _socektClient = socket(AF_INET, SOCK_STREAM, 0); + if (error(_socketServer)) + { + log("init client error!"); + _socektClient = 0; + return false; + } + + Director::getInstance()->getScheduler()->scheduleUpdate(this, 0, false); + return true; +} +/* 连接服务器 */ +bool SocketClient::connectServer(const char* serverIP, unsigned short port) +{ + if (!this->initClient()) + { + return false; + } + + struct sockaddr_in serverAddr; + memset(&serverAddr, 0, sizeof(struct sockaddr_in)); + + serverAddr.sin_family = AF_INET; + serverAddr.sin_port = htons(port); + serverAddr.sin_addr.s_addr = inet_addr(serverIP); + + int ret = 0; + ret = connect(_socektClient, (struct sockaddr*)&serverAddr, sizeof(struct sockaddr)); + if (ret < 0) + { + _socektClient = 0; + return false; + } + + std::thread recvThread(&SocketClient::recvMessage, this); + recvThread.detach(); + + return true; +} + +/* 接受消息 */ +void SocketClient::recvMessage() +{ + char recvBuf[1024]; + int ret = 0; + while (true) + { + ret = recv(_socektClient, recvBuf, sizeof(recvBuf), 0); + if (ret < 0) + { + log("recv error!"); + break; + } + if (ret > 0 && onRecv != nullptr) + { + std::lock_guard lk(_UIMessageQueueMutex); + SocketMessage * msg = new SocketMessage(RECEIVE, (unsigned char*)recvBuf, ret); + _UIMessageQueue.push_back(msg); + } + } + /* 接受消息错误,发送断开连接的消息 */ + _mutex.lock(); + this->closeConnect(_socektClient); + if (onDisconnect != nullptr) + { + std::lock_guard lk(_UIMessageQueueMutex); + SocketMessage * msg = new SocketMessage(DISCONNECT); + _UIMessageQueue.push_back(msg); + } + _socektClient = 0; + _mutex.unlock(); +} +/* 发送消息 */ +void SocketClient::sendMessage(const char* data, int count) +{ + if (_socektClient != 0) + { + int ret = send(_socektClient, data, count, 0); + if (ret < 0) + { + log("send error!"); + } + } +} + +void SocketClient::update(float dt) +{ + if (_UIMessageQueue.size() == 0) + { + return; + } + + _UIMessageQueueMutex.lock(); + + if (_UIMessageQueue.size() == 0) + { + _UIMessageQueueMutex.unlock(); + return; + } + SocketMessage *msg = *(_UIMessageQueue.begin()); + _UIMessageQueue.pop_front(); + + switch (msg->getMsgType()) + { + case DISCONNECT: + if (onDisconnect) + { + this->onDisconnect(); + } + break; + case RECEIVE: + if (onRecv) + { + this->onRecv((const char*)msg->getMsgData()->getBytes(), msg->getMsgData()->getSize()); + } + break; + default: + break; + } + + CC_SAFE_DELETE(msg); + _UIMessageQueueMutex.unlock(); +} \ No newline at end of file diff --git a/Classes/SocketUtil/SocketClient.h b/Classes/SocketUtil/SocketClient.h new file mode 100644 index 0000000..b5759bd --- /dev/null +++ b/Classes/SocketUtil/SocketClient.h @@ -0,0 +1,43 @@ +#ifndef __SOCKET_CLIENT_H__ +#define __SOCKET_CLIENT_H__ +#include "SocketBase.h" + +/* Socket客户端定义 */ +class SocketClient : public SocketBase +{ +public: + static SocketClient* construct(); + void destroy(); + /* 连接服务器 */ + bool connectServer(const char* serverIP, unsigned short port); + /* 发送消息 */ + void sendMessage(const char* data, int count); + /* 接受消息的回调 */ + std::function onRecv; + /* 断开了连接的回调 */ + std::function onDisconnect; + /* 循环调度方法 */ + void update(float dt); + +CC_CONSTRUCTOR_ACCESS: + SocketClient(void); + ~SocketClient(void); + +private: + bool initClient(); + /* 接受消息 */ + void recvMessage(); + void clear(); + +private: + /* 服务器套接字 */ + HSocket _socketServer; + /* 客户端套接字 */ + HSocket _socektClient; + /* 消息队列 */ + std::list _UIMessageQueue; + /* 消息队列锁 */ + std::mutex _UIMessageQueueMutex; +}; + +#endif \ No newline at end of file diff --git a/Classes/SocketUtil/SocketData.h b/Classes/SocketUtil/SocketData.h new file mode 100644 index 0000000..ff503a3 --- /dev/null +++ b/Classes/SocketUtil/SocketData.h @@ -0,0 +1,16 @@ +#pragma once +enum KEYCODESEND +{ + LEFT,RIGHT,UP,DOWN,G,H,Y,J, + LEFTRELEASE, RIGHTRELEASE, UPRELEASE,DOWNRELEASE, G_RELEASE, H_RELEASE, Y_RELEASE, J_RELEASE, + FIRSTCONNECT, TRANSFER +}; +struct SocketData +{ + int uid; + KEYCODESEND codeSend; + SocketData(int u, KEYCODESEND k) { + uid = u; + codeSend = k; + } +}; diff --git a/Classes/SocketUtil/SocketServer.cpp b/Classes/SocketUtil/SocketServer.cpp new file mode 100644 index 0000000..9899be4 --- /dev/null +++ b/Classes/SocketUtil/SocketServer.cpp @@ -0,0 +1,282 @@ +#include "SocketServer.h" + +SocketServer* SocketServer::s_server = nullptr; +/* 单例服务器 */ +SocketServer* SocketServer::getInstance() +{ + if (s_server == nullptr) + { + s_server = new SocketServer; + } + + return s_server; +} + +/* 销毁服务器实例 */ +void SocketServer::destroyInstance() +{ + CC_SAFE_DELETE(s_server); +} + +SocketServer::SocketServer() : + _socketServer(0), + onRecv(nullptr), + onStart(nullptr), + onNewConnection(nullptr) +{ + +} + +SocketServer::~SocketServer() +{ + this->clear(); +}; +/* 清除服务器数据 */ +void SocketServer::clear() +{ + if (_socketServer) + { + /* 锁住 */ + _mutex.lock(); + /* 关闭连接 */ + this->closeConnect(_socketServer); + /* 解锁 */ + _mutex.unlock(); + } + for (auto msg : _UIMessageQueue) + { + CC_SAFE_DELETE(msg); + } + _UIMessageQueue.clear(); + Director::getInstance()->getScheduler()->unscheduleAllForTarget(this); +} + + +/* 启动服务器 */ +bool SocketServer::startServer(unsigned short port) +{ + if (!initServer(port)) + { + return false; + } + + return true; +} + +/* 初始化服务器 */ +bool SocketServer::initServer(unsigned short port) +{ + /* 如果存在服务器套接字,先关闭连接 */ + if (_socketServer != 0) + { + this->closeConnect(_socketServer); + } + _socketServer = socket(AF_INET, SOCK_STREAM, 0); + if (error(_socketServer)) + { + log("socket error!"); + _socketServer = 0; + return false; + } + + do + { + struct sockaddr_in sockAddr; + memset(&sockAddr, 0, sizeof(sockAddr)); + _serverPort = port; + + sockAddr.sin_family = AF_INET; + sockAddr.sin_port = htons(_serverPort); + /*自动设定机器的IP*/ + sockAddr.sin_addr.s_addr = htonl(INADDR_ANY); + int ret = 0; + ret = bind(_socketServer, (const sockaddr*)&sockAddr, sizeof(sockAddr)); + if (ret < 0) + { + log("bind error!"); + break; + } + /*监听,允许连接数*/ + ret = listen(_socketServer, 5); + if (ret < 0) + { + log("listen error!"); + break; + } + char hostName[256]; + gethostname(hostName, sizeof(hostName)); + struct hostent* hostInfo = gethostbyname(hostName); + char* ip = inet_ntoa(*(struct in_addr *)*hostInfo->h_addr_list); + /*启动接受客户端线程*/ + this->acceptClient(); + if (onStart != nullptr) + { + log("start server!"); + this->onStart(ip); + } + + return true; + + } while (false); + /*关闭连接*/ + this->closeConnect(_socketServer); + _socketServer = 0; + return false; +} +/*接受客户端*/ +void SocketServer::acceptClient() +{ + std::thread th(&SocketServer::acceptFunc, this); + th.detach(); +} +/*接受的线程*/ +void SocketServer::acceptFunc() +{ + int len = sizeof(sockaddr); + struct sockaddr_in sockAddr; + /*轮询接受客户端连接*/ + while (true) + { + HSocket clientSock = accept(_socketServer, (sockaddr*)&sockAddr, &len); + if (error(clientSock)) + { + log("accept error!"); + } + else + { + this->newClientConnected(clientSock); + } + } +} +/* 新的客户端连接进来调用的方法 */ +void SocketServer::newClientConnected(HSocket socket) +{ + log("new connect!"); + _clientSockets.push_back(socket); + std::thread th(&SocketServer::recvMessage, this, socket); + th.detach(); + + /*新连接的回调*/ + if (onNewConnection) + { + std::lock_guard lk(_UIMessageQueueMutex); + SocketMessage * msg = new SocketMessage(NEW_CONNECTION, (unsigned char*)&socket, sizeof(HSocket)); + _UIMessageQueue.push_back(msg); + } +} +/* 处理接收到的消息 */ +void SocketServer::recvMessage(HSocket socket) +{ + char buff[1024]; + int ret = 0; + while (true) + { + ret = recv(socket, buff, sizeof(buff), 0); + if (ret < 0) + { + log("recv(%d) error!", socket); + break; + } + else + { + if (ret > 0 && onRecv != nullptr) + { + std::lock_guard lk(_UIMessageQueueMutex); + RecvData recvData; + /*构建接受消息,并加入队列*/ + recvData.socketClient = socket; + memcpy(recvData.data, buff, ret); + recvData.dataLen = ret; + SocketMessage * msg = new SocketMessage(RECEIVE, (unsigned char*)&recvData, sizeof(RecvData)); + _UIMessageQueue.push_back(msg); + } + } + } + + _mutex.lock(); + this->closeConnect(socket); + if (onDisconnect != nullptr) + { + std::lock_guard lk(_UIMessageQueueMutex); + SocketMessage * msg = new SocketMessage(DISCONNECT, (unsigned char*)&socket, sizeof(HSocket)); + _UIMessageQueue.push_back(msg); + } + _mutex.unlock(); +} + + +void SocketServer::sendMessage(HSocket socket, const char* data, int count) +{ + /*遍历所有连接的数据*/ + for (auto& sock : _clientSockets) + { + if (sock == socket) + { + int ret = send(socket, data, count, 0); + if (ret < 0) //发送错误 + { + log("send error!"); + } + break; + } + } +} +/*发送消息*/ +void SocketServer::sendMessage(const char* data, int count) +{ + for (auto& socket : _clientSockets) + { + int ret = send(socket, data, count, 0); + if (ret < 0) + { + log("send error!"); + } + } +} +/*调度方法*/ +void SocketServer::update(float dt) +{ + if (_UIMessageQueue.size() == 0) + { + return; + } + + /*队列锁住*/ + _UIMessageQueueMutex.lock(); + + if (_UIMessageQueue.size() == 0) + { + _UIMessageQueueMutex.unlock(); + return; + } + SocketMessage *msg = *(_UIMessageQueue.begin()); + _UIMessageQueue.pop_front(); + + switch (msg->getMsgType()) + { + case NEW_CONNECTION: + if (onNewConnection) + { + this->onNewConnection(*(HSocket*)msg->getMsgData()->getBytes()); + } + break; + case DISCONNECT: + if (onDisconnect) + { + this->onDisconnect(*(HSocket*)msg->getMsgData()->getBytes()); + } + break; + case RECEIVE: + if (onRecv) + { + RecvData* recvData = (RecvData*)msg->getMsgData()->getBytes(); + this->onRecv((const char*)recvData->data, recvData->dataLen); + } + break; + default: + break; + } + /*清除消息*/ + CC_SAFE_DELETE(msg); + _UIMessageQueueMutex.unlock(); +} \ No newline at end of file diff --git a/Classes/SocketUtil/SocketServer.h b/Classes/SocketUtil/SocketServer.h new file mode 100644 index 0000000..a50d213 --- /dev/null +++ b/Classes/SocketUtil/SocketServer.h @@ -0,0 +1,73 @@ +#ifndef __SOCKET_SERVER_H__ +#define __SOCKET_SERVER_H__ + +#include "SocketBase.h" + +/* 接受数据结构封装 */ +struct RecvData +{ + HSocket socketClient; + int dataLen; + char data[1024]; +}; + +class SocketServer : public SocketBase +{ +public: + /* 单例服务器 */ + static SocketServer* getInstance(); + void destroyInstance(); + /* 启动服务器 */ + bool startServer(unsigned short port); + /* 发送消息 */ + void sendMessage(HSocket socket, const char* data, int count); + void sendMessage(const char* data, int count); + + void update(float dt); + + /* 开始 */ + std::function onStart; + /* 新连接 */ + std::function onNewConnection; + /* 收到数据 */ + std::function onRecv; + /* 断开连接 */ + std::function onDisconnect; + +CC_CONSTRUCTOR_ACCESS: + SocketServer(); + ~SocketServer(); + +private: + + void clear(); + + bool initServer(unsigned short port); + + void acceptClient(); + + void acceptFunc(); + + void newClientConnected(HSocket socket); + + void recvMessage(HSocket socket); + +private: + /* 服务器单例实例 */ + static SocketServer* s_server; + /* 服务器套接字 */ + HSocket _socketServer; + /* 服务器绑定的端口号 */ + unsigned short _serverPort; + +private: + /* 客户端列表 */ + std::list _clientSockets; + /* 消息队列 */ + std::list _UIMessageQueue; + /* 消息队列互斥锁 */ + std::mutex _UIMessageQueueMutex; + +}; + +#endif \ No newline at end of file diff --git a/README.md b/README.md index c8a8b17..2c7b3c2 100644 --- a/README.md +++ b/README.md @@ -95,6 +95,14 @@ *** +#### 鏇存柊鍐呭锛2018/07/03 + +* 寮楀埄钀 + 鎮熺┖ +* 鑱旂綉瀵规垬 +* 棣栧厛鏄疓amescene.cpp锛岃繖涓槸鐢ㄤ簬鍙屼汉瀵规垬鐨 +* 鐒跺悗鏄疧nlineGameScene.cpp锛岃繖涓槸绋嬪簭鍚姩鏃剁洿鎺ュ惎鍔ㄧ殑鐣岄潰锛屽湪鍚姩涔嬪墠闇瑕佷笅杞絪erver鍒嗘敮涓嬬殑浠g爜鐒跺悗鍏堣窇server鐨勪唬鐮佷綔涓烘湇鍔$ +* 鐩墠OnlineGameScene.cpp 閲岀殑璁块棶鐨刬p鍦板潃闇瑕佹敼鍔紝鍏蜂綋璇风洿鎺ョ湅init鍑芥暟涓仈缃戦儴鍒嗙殑浠g爜銆 + ### 鏇存柊鍐呭锛2018/06/26 * 鏈鏂扮増璇蜂笅杞絤aster鍒嗘敮鐨勪唬鐮 diff --git a/Resources/Frieza.plist b/Resources/Frieza.plist new file mode 100644 index 0000000..00b34e0 --- /dev/null +++ b/Resources/Frieza.plist @@ -0,0 +1,1136 @@ + + + + + frames + + Frieza_attack_01.png + + aliases + + spriteOffset + {0,0} + spriteSize + {98,115} + spriteSourceSize + {98,115} + textureRect + {{237,1235},{98,115}} + textureRotated + + + Frieza_attack_02.png + + aliases + + spriteOffset + {0,0} + spriteSize + {130,114} + spriteSourceSize + {130,114} + textureRect + {{137,414},{130,114}} + textureRotated + + + Frieza_attack_03.png + + aliases + + spriteOffset + {0,0} + spriteSize + {119,115} + spriteSourceSize + {119,115} + textureRect + {{1,835},{119,115}} + textureRotated + + + Frieza_attack_04.png + + aliases + + spriteOffset + {0,0} + spriteSize + {101,116} + spriteSourceSize + {101,116} + textureRect + {{360,987},{101,116}} + textureRotated + + + Frieza_attack_05.png + + aliases + + spriteOffset + {0,0} + spriteSize + {119,110} + spriteSourceSize + {119,110} + textureRect + {{247,806},{119,110}} + textureRotated + + + Frieza_attack_06.png + + aliases + + spriteOffset + {0,0} + spriteSize + {120,106} + spriteSourceSize + {120,106} + textureRect + {{125,766},{120,106}} + textureRotated + + + Frieza_attack_07.png + + aliases + + spriteOffset + {0,0} + spriteSize + {165,101} + spriteSourceSize + {165,101} + textureRect + {{175,87},{165,101}} + textureRotated + + + Frieza_attack_08.png + + aliases + + spriteOffset + {0,0} + spriteSize + {97,104} + spriteSourceSize + {97,104} + textureRect + {{189,1693},{97,104}} + textureRotated + + + Frieza_attack_09.png + + aliases + + spriteOffset + {0,0} + spriteSize + {82,107} + spriteSourceSize + {82,107} + textureRect + {{112,1565},{82,107}} + textureRotated + + + Frieza_attack_10.png + + aliases + + spriteOffset + {0,0} + spriteSize + {161,99} + spriteSourceSize + {161,99} + textureRect + {{1,91},{161,99}} + textureRotated + + + Frieza_attack_11.png + + aliases + + spriteOffset + {0,0} + spriteSize + {172,88} + spriteSourceSize + {172,88} + textureRect + {{1,1},{172,88}} + textureRotated + + + Frieza_charge_01.png + + aliases + + spriteOffset + {0,0} + spriteSize + {113,147} + spriteSourceSize + {113,147} + textureRect + {{1,192},{113,147}} + textureRotated + + + Frieza_charge_02.png + + aliases + + spriteOffset + {0,0} + spriteSize + {118,110} + spriteSourceSize + {118,110} + textureRect + {{122,874},{118,110}} + textureRotated + + + Frieza_charge_03.png + + aliases + + spriteOffset + {0,0} + spriteSize + {82,109} + spriteSourceSize + {82,109} + textureRect + {{1,1561},{82,109}} + textureRotated + + + Frieza_charge_04.png + + aliases + + spriteOffset + {0,0} + spriteSize + {78,116} + spriteSourceSize + {78,116} + textureRect + {{119,1202},{78,116}} + textureRotated + + + Frieza_defend_01.png + + aliases + + spriteOffset + {0,-19} + spriteSize + {107,75} + spriteSourceSize + {107,113} + textureRect + {{1,1645},{107,75}} + textureRotated + + + Frieza_die_01.png + + aliases + + spriteOffset + {0,-18} + spriteSize + {99,77} + spriteSourceSize + {99,113} + textureRect + {{1,1722},{99,77}} + textureRotated + + + Frieza_die_02.png + + aliases + + spriteOffset + {0,-22} + spriteSize + {127,69} + spriteSourceSize + {127,113} + textureRect + {{427,305},{127,69}} + textureRotated + + + Frieza_die_03.png + + aliases + + spriteOffset + {0,-27} + spriteSize + {130,59} + spriteSourceSize + {130,113} + textureRect + {{269,430},{130,59}} + textureRotated + + + Frieza_die_04.png + + aliases + + spriteOffset + {0,-30} + spriteSize + {129,53} + spriteSourceSize + {129,113} + textureRect + {{269,491},{129,53}} + textureRotated + + + Frieza_fastMove_01.png + + aliases + + spriteOffset + {0,0} + spriteSize + {115,113} + spriteSourceSize + {115,113} + textureRect + {{387,647},{115,113}} + textureRotated + + + Frieza_fastMove_02.png + + aliases + + spriteOffset + {0,0} + spriteSize + {154,85} + spriteSourceSize + {154,85} + textureRect + {{345,1},{154,85}} + textureRotated + + + Frieza_hit_01.png + + aliases + + spriteOffset + {0,0} + spriteSize + {111,94} + spriteSourceSize + {111,94} + textureRect + {{389,551},{111,94}} + textureRotated + + + Frieza_hit_02.png + + aliases + + spriteOffset + {0,0} + spriteSize + {105,90} + spriteSourceSize + {105,90} + textureRect + {{221,1601},{105,90}} + textureRotated + + + Frieza_idle_01.png + + aliases + + spriteOffset + {0,0} + spriteSize + {96,116} + spriteSourceSize + {96,116} + textureRect + {{356,1090},{96,116}} + textureRotated + + + Frieza_idle_02.png + + aliases + + spriteOffset + {0,0} + spriteSize + {96,116} + spriteSourceSize + {96,116} + textureRect + {{237,1137},{96,116}} + textureRotated + + + Frieza_idle_03.png + + aliases + + spriteOffset + {0,0} + spriteSize + {101,116} + spriteSourceSize + {101,116} + textureRect + {{238,1034},{101,116}} + textureRotated + + + Frieza_idle_04.png + + aliases + + spriteOffset + {-11,0} + spriteSize + {112,116} + spriteSourceSize + {134,116} + textureRect + {{120,986},{112,116}} + textureRotated + + + Frieza_idle_05.png + + aliases + + spriteOffset + {-6,0} + spriteSize + {122,116} + spriteSourceSize + {134,116} + textureRect + {{129,648},{122,116}} + textureRotated + + + Frieza_idle_06.png + + aliases + + spriteOffset + {-4,0} + spriteSize + {126,116} + spriteSourceSize + {134,116} + textureRect + {{133,530},{126,116}} + textureRotated + + + Frieza_idle_07.png + + aliases + + spriteOffset + {0,0} + spriteSize + {134,116} + spriteSourceSize + {134,116} + textureRect + {{1,378},{134,116}} + textureRotated + + + Frieza_idle_08.png + + aliases + + spriteOffset + {-10,0} + spriteSize + {114,116} + spriteSourceSize + {134,116} + textureRect + {{242,918},{114,116}} + textureRotated + + + Frieza_idle_09.png + + aliases + + spriteOffset + {-9,0} + spriteSize + {116,116} + spriteSourceSize + {134,116} + textureRect + {{368,869},{116,116}} + textureRotated + + + Frieza_idle_10.png + + aliases + + spriteOffset + {-13,0} + spriteSize + {108,116} + spriteSourceSize + {134,116} + textureRect + {{1,1047},{108,116}} + textureRotated + + + Frieza_jump_01.png + + aliases + + spriteOffset + {-15,0} + spriteSize + {96,104} + spriteSourceSize + {128,104} + textureRect + {{288,1693},{96,104}} + textureRotated + + + Frieza_jump_02.png + + aliases + + spriteOffset + {-12,0} + spriteSize + {84,122} + spriteSourceSize + {128,122} + textureRect + {{1,664},{84,122}} + textureRotated + + + Frieza_jump_03.png + + aliases + + spriteOffset + {-3,0} + spriteSize + {122,83} + spriteSourceSize + {128,83} + textureRect + {{1,750},{122,83}} + textureRotated + + + Frieza_jump_04.png + + aliases + + spriteOffset + {0,0} + spriteSize + {130,123} + spriteSourceSize + {130,123} + textureRect + {{295,305},{130,123}} + textureRotated + + + Frieza_jump_05.png + + aliases + + spriteOffset + {-8,0} + spriteSize + {112,153} + spriteSourceSize + {128,153} + textureRect + {{164,190},{112,153}} + textureRotated + + + Frieza_jump_06.png + + aliases + + spriteOffset + {-24,0} + spriteSize + {78,158} + spriteSourceSize + {128,158} + textureRect + {{342,88},{78,158}} + textureRotated + + + Frieza_jump_07.png + + aliases + + spriteOffset + {-20,0} + spriteSize + {84,168} + spriteSourceSize + {128,168} + textureRect + {{175,1},{84,168}} + textureRotated + + + Frieza_knockOff.png + + aliases + + spriteOffset + {0,0} + spriteSize + {109,56} + spriteSourceSize + {109,56} + textureRect + {{349,1460},{109,56}} + textureRotated + + + Frieza_knockOff_01.png + + aliases + + spriteOffset + {0,0} + spriteSize + {100,67} + spriteSourceSize + {100,67} + textureRect + {{328,1620},{100,67}} + textureRotated + + + Frieza_rangedAttack_01.png + + aliases + + spriteOffset + {0,0} + spriteSize + {99,115} + spriteSourceSize + {99,115} + textureRect + {{401,434},{99,115}} + textureRotated + + + Frieza_rangedAttack_02.png + + aliases + + spriteOffset + {0,0} + spriteSize + {98,115} + spriteSourceSize + {98,115} + textureRect + {{118,1282},{98,115}} + textureRotated + + + Frieza_rangedAttack_03.png + + aliases + + spriteOffset + {0,0} + spriteSize + {143,108} + spriteSourceSize + {143,108} + textureRect + {{150,304},{143,108}} + textureRotated + + + Frieza_rangedAttack_04.png + + aliases + + spriteOffset + {0,0} + spriteSize + {113,106} + spriteSourceSize + {113,106} + textureRect + {{234,1432},{113,106}} + textureRotated + + + Frieza_rangedAttack_05.png + + aliases + + spriteOffset + {0,0} + spriteSize + {121,107} + spriteSourceSize + {121,107} + textureRect + {{253,697},{121,107}} + textureRotated + + + Frieza_rangedAttack_06.png + + aliases + + spriteOffset + {0,0} + spriteSize + {124,110} + spriteSourceSize + {124,110} + textureRect + {{261,585},{124,110}} + textureRotated + + + Frieza_run_01.png + + aliases + + spriteOffset + {-15,0} + spriteSize + {98,116} + spriteSourceSize + {128,116} + textureRect + {{1,1157},{98,116}} + textureRotated + + + Frieza_run_02.png + + aliases + + spriteOffset + {-15,0} + spriteSize + {98,115} + spriteSourceSize + {128,115} + textureRect + {{1,1361},{98,115}} + textureRotated + + + Frieza_run_03.png + + aliases + + spriteOffset + {-15,0} + spriteSize + {98,114} + spriteSourceSize + {128,114} + textureRect + {{1,1461},{98,114}} + textureRotated + + + Frieza_run_04.png + + aliases + + spriteOffset + {-15,0} + spriteSize + {98,115} + spriteSourceSize + {128,115} + textureRect + {{354,1290},{98,115}} + textureRotated + + + Frieza_run_05.png + + aliases + + spriteOffset + {-13,0} + spriteSize + {100,116} + spriteSourceSize + {128,116} + textureRect + {{119,1100},{100,116}} + textureRotated + + + Frieza_run_06.png + + aliases + + spriteOffset + {-13,0} + spriteSize + {102,115} + spriteSourceSize + {128,115} + textureRect + {{1,1257},{102,115}} + textureRotated + + + Frieza_run_07.png + + aliases + + spriteOffset + {-12,0} + spriteSize + {104,114} + spriteSourceSize + {128,114} + textureRect + {{118,1382},{104,114}} + textureRotated + + + Frieza_run_08.png + + aliases + + spriteOffset + {-14,0} + spriteSize + {100,115} + spriteSourceSize + {128,115} + textureRect + {{355,1188},{100,115}} + textureRotated + + + Frieza_ultimate_01.png + + aliases + + spriteOffset + {0,0} + spriteSize + {86,130} + spriteSourceSize + {86,130} + textureRect + {{1,496},{86,130}} + textureRotated + + + Frieza_ultimate_02.png + + aliases + + spriteOffset + {0,0} + spriteSize + {103,121} + spriteSourceSize + {103,121} + textureRect + {{376,764},{103,121}} + textureRotated + + + Frieza_ultimate_03.png + + aliases + + spriteOffset + {0,0} + spriteSize + {78,126} + spriteSourceSize + {78,126} + textureRect + {{1,584},{78,126}} + textureRotated + + + Frieza_ultimate_04.png + + aliases + + spriteOffset + {0,0} + spriteSize + {100,108} + spriteSourceSize + {100,108} + textureRect + {{349,1518},{100,108}} + textureRotated + + + Frieza_ultimate_05.png + + aliases + + spriteOffset + {0,0} + spriteSize + {69,140} + spriteSourceSize + {69,140} + textureRect + {{1,307},{69,140}} + textureRotated + + + Frieza_up_01.png + + aliases + + spriteOffset + {0,-25} + spriteSize + {108,59} + spriteSourceSize + {108,113} + textureRect + {{232,1540},{108,59}} + textureRotated + + + Frieza_up_02.png + + aliases + + spriteOffset + {0,-23} + spriteSize + {87,61} + spriteSourceSize + {87,113} + textureRect + {{430,1620},{87,61}} + textureRotated + + + Frieza_up_03.png + + aliases + + spriteOffset + {0,-38} + spriteSize + {126,37} + spriteSourceSize + {126,113} + textureRect + {{261,546},{126,37}} + textureRotated + + + Frieza_up_04.png + + aliases + + spriteOffset + {0,-30} + spriteSize + {144,53} + spriteSourceSize + {144,113} + textureRect + {{319,250},{144,53}} + textureRotated + + + Frieza_up_05.png + + aliases + + spriteOffset + {0,-22} + spriteSize + {77,69} + spriteSourceSize + {77,113} + textureRect + {{110,1649},{77,69}} + textureRotated + + + Frieza_up_06.png + + aliases + + spriteOffset + {0,-18} + spriteSize + {85,77} + spriteSourceSize + {85,113} + textureRect + {{102,1722},{85,77}} + textureRotated + + + Frieza_up_07.png + + aliases + + spriteOffset + {0,-12} + spriteSize + {100,89} + spriteSourceSize + {100,113} + textureRect + {{386,1709},{100,89}} + textureRotated + + + Frieza_win_01.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,156} + spriteSourceSize + {80,156} + textureRect + {{342,168},{80,156}} + textureRotated + + + Frieza_win_02.png + + aliases + + spriteOffset + {0,0} + spriteSize + {68,114} + spriteSourceSize + {68,114} + textureRect + {{352,1390},{68,114}} + textureRotated + + + Frieza_win_03.png + + aliases + + spriteOffset + {0,0} + spriteSize + {75,113} + spriteSourceSize + {75,113} + textureRect + {{117,1488},{75,113}} + textureRotated + + + Frieza_win_04.png + + aliases + + spriteOffset + {0,0} + spriteSize + {95,115} + spriteSourceSize + {95,115} + textureRect + {{235,1335},{95,115}} + textureRotated + + + Frieza_win_05.png + + aliases + + spriteOffset + {0,0} + spriteSize + {93,117} + spriteSourceSize + {93,117} + textureRect + {{1,952},{93,117}} + textureRotated + + + + metadata + + format + 3 + pixelFormat + RGBA8888 + premultiplyAlpha + + realTextureFileName + Frieza.png + size + {501,1800} + smartupdate + $TexturePacker:SmartUpdate:e1f761db6ce3386aadae874742921c40:88d571ffa6f3819e115777cfc6ddd430:9c3542a0fa9aa0a615619c6135dba39c$ + textureFileName + Frieza.png + + + diff --git a/Resources/Frieza.png b/Resources/Frieza.png new file mode 100644 index 0000000..ea0a2bd Binary files /dev/null and b/Resources/Frieza.png differ diff --git a/Resources/Frieza_boom.plist b/Resources/Frieza_boom.plist new file mode 100644 index 0000000..0ce883d --- /dev/null +++ b/Resources/Frieza_boom.plist @@ -0,0 +1,941 @@ + + + + + frames + + Frieza_boom_00.png + + aliases + + spriteOffset + {-1,-9} + spriteSize + {66,59} + spriteSourceSize + {68,105} + textureRect + {{435,232},{66,59}} + textureRotated + + + Frieza_boom_01.png + + aliases + + spriteOffset + {0,-9} + spriteSize + {66,59} + spriteSourceSize + {68,105} + textureRect + {{431,852},{66,59}} + textureRotated + + + Frieza_boom_02.png + + aliases + + spriteOffset + {0,-9} + spriteSize + {66,59} + spriteSourceSize + {72,105} + textureRect + {{431,913},{66,59}} + textureRotated + + + Frieza_boom_03.png + + aliases + + spriteOffset + {-4,-6} + spriteSize + {86,91} + spriteSourceSize + {102,105} + textureRect + {{1,987},{86,91}} + textureRotated + + + Frieza_boom_04.png + + aliases + + spriteOffset + {-2,1} + spriteSize + {87,103} + spriteSourceSize + {97,105} + textureRect + {{1,882},{87,103}} + textureRotated + + + Frieza_boom_05.png + + aliases + + spriteOffset + {3,0} + spriteSize + {80,95} + spriteSourceSize + {96,105} + textureRect + {{1,1080},{80,95}} + textureRotated + + + Frieza_boom_06.png + + aliases + + spriteOffset + {7,1} + spriteSize + {78,89} + spriteSourceSize + {94,105} + textureRect + {{343,1043},{78,89}} + textureRotated + + + Frieza_boom_07.png + + aliases + + spriteOffset + {2,1} + spriteSize + {86,103} + spriteSourceSize + {96,105} + textureRect + {{345,753},{86,103}} + textureRotated + + + Frieza_boom_08.png + + aliases + + spriteOffset + {-1,-1} + spriteSize + {90,103} + spriteSourceSize + {94,105} + textureRect + {{101,774},{90,103}} + textureRotated + + + Frieza_boom_09.png + + aliases + + spriteOffset + {0,0} + spriteSize + {84,105} + spriteSourceSize + {90,105} + textureRect + {{345,841},{84,105}} + textureRotated + + + Frieza_boom_10.png + + aliases + + spriteOffset + {1,0} + spriteSize + {87,105} + spriteSourceSize + {89,105} + textureRect + {{1,775},{87,105}} + textureRotated + + + Frieza_boom_11.png + + aliases + + spriteOffset + {-8,0} + spriteSize + {128,128} + spriteSourceSize + {144,128} + textureRect + {{369,499},{128,128}} + textureRotated + + + Frieza_boom_12.png + + aliases + + spriteOffset + {4,-1} + spriteSize + {122,122} + spriteSourceSize + {158,128} + textureRect + {{369,629},{122,122}} + textureRotated + + + Frieza_boom_13.png + + aliases + + spriteOffset + {-5,1} + spriteSize + {122,122} + spriteSourceSize + {164,128} + textureRect + {{1,553},{122,122}} + textureRotated + + + Frieza_boom_14.png + + aliases + + spriteOffset + {9,-1} + spriteSize + {120,122} + spriteSourceSize + {138,128} + textureRect + {{125,553},{120,122}} + textureRotated + + + Frieza_boom_15.png + + aliases + + spriteOffset + {-3,0} + spriteSize + {72,71} + spriteSourceSize + {78,71} + textureRect + {{240,1121},{72,71}} + textureRotated + + + Frieza_boom_16.png + + aliases + + spriteOffset + {5,-1} + spriteSize + {70,69} + spriteSourceSize + {94,71} + textureRect + {{164,1162},{70,69}} + textureRotated + + + Frieza_boom_17.png + + aliases + + spriteOffset + {-1,0} + spriteSize + {71,69} + spriteSourceSize + {89,71} + textureRect + {{1,1177},{71,69}} + textureRotated + + + Frieza_boom_18.png + + aliases + + spriteOffset + {7,-1} + spriteSize + {69,69} + spriteSourceSize + {83,71} + textureRect + {{314,1134},{69,69}} + textureRotated + + + Frieza_boom_19.png + + aliases + + spriteOffset + {-8,-2} + spriteSize + {247,119} + spriteSourceSize + {263,123} + textureRect + {{248,497},{247,119}} + textureRotated + + + Frieza_boom_20.png + + aliases + + spriteOffset + {-8,9} + spriteSize + {247,133} + spriteSourceSize + {263,153} + textureRect + {{1,295},{247,133}} + textureRotated + + + Frieza_boom_21.png + + aliases + + spriteOffset + {1,5} + spriteSize + {281,143} + spriteSourceSize + {283,153} + textureRect + {{1,1},{281,143}} + textureRotated + + + Frieza_boom_22.png + + aliases + + spriteOffset + {-10,2} + spriteSize + {245,149} + spriteSourceSize + {265,153} + textureRect + {{284,1},{245,149}} + textureRotated + + + Frieza_boom_23.png + + aliases + + spriteOffset + {-8,-1} + spriteSize + {247,147} + spriteSourceSize + {263,163} + textureRect + {{1,146},{247,147}} + textureRotated + + + Frieza_boom_24.png + + aliases + + spriteOffset + {16,-4} + spriteSize + {247,145} + spriteSourceSize + {283,163} + textureRect + {{250,248},{247,145}} + textureRotated + + + Frieza_boom_25.png + + aliases + + spriteOffset + {10,-6} + spriteSize + {245,121} + spriteSourceSize + {265,163} + textureRect + {{1,430},{245,121}} + textureRotated + + + Frieza_boom_26.png + + aliases + + spriteOffset + {0,0} + spriteSize + {61,52} + spriteSourceSize + {61,52} + textureRect + {{193,841},{61,52}} + textureRotated + + + Frieza_boom_27.png + + aliases + + spriteOffset + {0,0} + spriteSize + {61,52} + spriteSourceSize + {61,52} + textureRect + {{186,1099},{61,52}} + textureRotated + + + Frieza_boom_28.png + + aliases + + spriteOffset + {0,0} + spriteSize + {52,61} + spriteSourceSize + {52,61} + textureRect + {{193,778},{52,61}} + textureRotated + + + Frieza_boom_29.png + + aliases + + spriteOffset + {0,0} + spriteSize + {61,52} + spriteSourceSize + {61,52} + textureRect + {{430,974},{61,52}} + textureRotated + + + Frieza_boom_30.png + + aliases + + spriteOffset + {6,0} + spriteSize + {69,55} + spriteSourceSize + {81,55} + textureRect + {{190,904},{69,55}} + textureRotated + + + Frieza_boom_31.png + + aliases + + spriteOffset + {-2,0} + spriteSize + {42,53} + spriteSourceSize + {100,93} + textureRect + {{202,677},{42,53}} + textureRotated + + + Frieza_boom_32.png + + aliases + + spriteOffset + {-4,0} + spriteSize + {56,73} + spriteSourceSize + {96,93} + textureRect + {{435,86},{56,73}} + textureRotated + + + Frieza_boom_33.png + + aliases + + spriteOffset + {-3,-3} + spriteSize + {62,83} + spriteSourceSize + {92,93} + textureRect + {{435,1},{62,83}} + textureRotated + + + Frieza_boom_34.png + + aliases + + spriteOffset + {-2,-3} + spriteSize + {69,87} + spriteSourceSize + {97,93} + textureRect + {{423,1084},{69,87}} + textureRotated + + + Frieza_boom_35.png + + aliases + + spriteOffset + {-1,-3} + spriteSize + {84,93} + spriteSourceSize + {100,99} + textureRect + {{344,948},{84,93}} + textureRotated + + + Frieza_boom_36.png + + aliases + + spriteOffset + {0,-2} + spriteSize + {79,89} + spriteSourceSize + {95,93} + textureRect + {{83,1155},{79,89}} + textureRotated + + + Frieza_boom_37.png + + aliases + + spriteOffset + {-3,-2} + spriteSize + {88,95} + spriteSourceSize + {96,99} + textureRect + {{89,1065},{88,95}} + textureRotated + + + Frieza_boom_38.png + + aliases + + spriteOffset + {0,-2} + spriteSize + {92,95} + spriteSourceSize + {92,99} + textureRect + {{247,843},{92,95}} + textureRotated + + + Frieza_boom_39.png + + aliases + + spriteOffset + {0,-2} + spriteSize + {95,95} + spriteSourceSize + {97,99} + textureRect + {{248,746},{95,95}} + textureRotated + + + Frieza_boom_40.png + + aliases + + spriteOffset + {0,0} + spriteSize + {95,99} + spriteSourceSize + {95,99} + textureRect + {{101,677},{95,99}} + textureRotated + + + Frieza_boom_41.png + + aliases + + spriteOffset + {0,0} + spriteSize + {100,98} + spriteSourceSize + {100,98} + textureRect + {{397,300},{100,98}} + textureRotated + + + Frieza_boom_42.png + + aliases + + spriteOffset + {0,0} + spriteSize + {96,98} + spriteSourceSize + {96,98} + textureRect + {{1,677},{96,98}} + textureRotated + + + Frieza_boom_43.png + + aliases + + spriteOffset + {0,0} + spriteSize + {92,98} + spriteSourceSize + {92,98} + textureRect + {{90,879},{92,98}} + textureRotated + + + Frieza_boom_44.png + + aliases + + spriteOffset + {0,0} + spriteSize + {97,98} + spriteSourceSize + {97,98} + textureRect + {{397,400},{97,98}} + textureRotated + + + Frieza_boom_45.png + + aliases + + spriteOffset + {0,3} + spriteSize + {95,90} + spriteSourceSize + {95,98} + textureRect + {{247,937},{95,90}} + textureRotated + + + Frieza_boom_46.png + + aliases + + spriteOffset + {-1,2} + spriteSize + {96,90} + spriteSourceSize + {100,94} + textureRect + {{90,973},{96,90}} + textureRotated + + + Frieza_boom_47.png + + aliases + + spriteOffset + {-1,2} + spriteSize + {94,90} + spriteSourceSize + {96,94} + textureRect + {{247,1029},{94,90}} + textureRotated + + + Frieza_boom_48.png + + aliases + + spriteOffset + {0,0} + spriteSize + {40,33} + spriteSourceSize + {40,33} + textureRect + {{397,248},{40,33}} + textureRotated + + + Frieza_boom_49.png + + aliases + + spriteOffset + {0,0} + spriteSize + {49,47} + spriteSourceSize + {49,47} + textureRect + {{450,753},{49,47}} + textureRotated + + + Frieza_boom_50.png + + aliases + + spriteOffset + {0,0} + spriteSize + {59,55} + spriteSourceSize + {59,55} + textureRect + {{188,1038},{59,55}} + textureRotated + + + Frieza_boom_51.png + + aliases + + spriteOffset + {0,0} + spriteSize + {61,57} + spriteSourceSize + {61,57} + textureRect + {{188,975},{61,57}} + textureRotated + + + Frieza_boom_52.png + + aliases + + spriteOffset + {0,0} + spriteSize + {69,59} + spriteSourceSize + {69,59} + textureRect + {{435,161},{69,59}} + textureRotated + + + Frieza_boom_53.png + + aliases + + spriteOffset + {0,0} + spriteSize + {26,26} + spriteSourceSize + {26,26} + textureRect + {{250,146},{26,26}} + textureRotated + + + Frieza_boom_54.png + + aliases + + spriteOffset + {0,0} + spriteSize + {38,38} + spriteSourceSize + {38,38} + textureRect + {{290,1205},{38,38}} + textureRotated + + + Frieza_boom_55.png + + aliases + + spriteOffset + {0,0} + spriteSize + {44,44} + spriteSourceSize + {44,44} + textureRect + {{202,732},{44,44}} + textureRotated + + + Frieza_boom_56.png + + aliases + + spriteOffset + {0,0} + spriteSize + {46,46} + spriteSourceSize + {46,46} + textureRect + {{450,804},{46,46}} + textureRotated + + + Frieza_boom_57.png + + aliases + + spriteOffset + {0,0} + spriteSize + {48,48} + spriteSourceSize + {48,48} + textureRect + {{437,1173},{48,48}} + textureRotated + + + Frieza_boom_58.png + + aliases + + spriteOffset + {0,0} + spriteSize + {50,50} + spriteSourceSize + {50,50} + textureRect + {{385,1173},{50,50}} + textureRotated + + + Frieza_boom_59.png + + aliases + + spriteOffset + {0,0} + spriteSize + {52,52} + spriteSourceSize + {52,52} + textureRect + {{236,1194},{52,52}} + textureRotated + + + Frieza_boom_60.png + + aliases + + spriteOffset + {0,0} + spriteSize + {54,54} + spriteSourceSize + {54,54} + textureRect + {{430,1028},{54,54}} + textureRotated + + + + metadata + + format + 3 + pixelFormat + RGBA8888 + premultiplyAlpha + + realTextureFileName + Frieza_boom.png + size + {498,1247} + smartupdate + $TexturePacker:SmartUpdate:e892ddfc298ba130e4aa49a9dd71563d:32f8a06389d784c5e51cf2d018148196:57d8059ef5b3a9d9b71374c5f53497b5$ + textureFileName + Frieza_boom.png + + + diff --git a/Resources/Frieza_boom.png b/Resources/Frieza_boom.png new file mode 100644 index 0000000..1f443a3 Binary files /dev/null and b/Resources/Frieza_boom.png differ diff --git a/Resources/GoKu.plist b/Resources/GoKu.plist new file mode 100644 index 0000000..0211529 --- /dev/null +++ b/Resources/GoKu.plist @@ -0,0 +1,1226 @@ + + + + + frames + + Goku_attack_01.png + + aliases + + spriteOffset + {0,0} + spriteSize + {85,114} + spriteSourceSize + {85,114} + textureRect + {{1339,120},{85,114}} + textureRotated + + + Goku_attack_02.png + + aliases + + spriteOffset + {0,0} + spriteSize + {143,117} + spriteSourceSize + {143,117} + textureRect + {{388,147},{143,117}} + textureRotated + + + Goku_attack_03.png + + aliases + + spriteOffset + {0,0} + spriteSize + {130,114} + spriteSourceSize + {130,114} + textureRect + {{805,134},{130,114}} + textureRotated + + + Goku_attack_04.png + + aliases + + spriteOffset + {0,0} + spriteSize + {98,101} + spriteSourceSize + {98,101} + textureRect + {{1709,1},{98,101}} + textureRotated + + + Goku_attack_05.png + + aliases + + spriteOffset + {0,0} + spriteSize + {81,131} + spriteSourceSize + {81,131} + textureRect + {{738,274},{81,131}} + textureRotated + + + Goku_attack_06.png + + aliases + + spriteOffset + {0,0} + spriteSize + {100,105} + spriteSourceSize + {100,105} + textureRect + {{1639,111},{100,105}} + textureRotated + + + Goku_attack_07.png + + aliases + + spriteOffset + {0,0} + spriteSize + {96,91} + spriteSourceSize + {96,91} + textureRect + {{1642,218},{96,91}} + textureRotated + + + Goku_attack_08.png + + aliases + + spriteOffset + {0,0} + spriteSize + {99,136} + spriteSourceSize + {99,136} + textureRect + {{682,1},{99,136}} + textureRotated + + + Goku_attack_09.png + + aliases + + spriteOffset + {0,0} + spriteSize + {72,112} + spriteSourceSize + {72,112} + textureRect + {{1331,357},{72,112}} + textureRotated + + + Goku_attack_10.png + + aliases + + spriteOffset + {0,0} + spriteSize + {93,141} + spriteSourceSize + {93,141} + textureRect + {{507,145},{93,141}} + textureRotated + + + Goku_attack_11.png + + aliases + + spriteOffset + {0,0} + spriteSize + {94,138} + spriteSourceSize + {94,138} + textureRect + {{586,1},{94,138}} + textureRotated + + + Goku_attack_12.png + + aliases + + spriteOffset + {0,0} + spriteSize + {133,141} + spriteSourceSize + {133,141} + textureRect + {{388,292},{133,141}} + textureRotated + + + Goku_attack_13.png + + aliases + + spriteOffset + {0,0} + spriteSize + {142,135} + spriteSourceSize + {142,135} + textureRect + {{449,1},{142,135}} + textureRotated + + + Goku_attack_14.png + + aliases + + spriteOffset + {0,0} + spriteSize + {97,126} + spriteSourceSize + {97,126} + textureRect + {{1056,1},{97,126}} + textureRotated + + + Goku_attack_15.png + + aliases + + spriteOffset + {0,0} + spriteSize + {89,126} + spriteSourceSize + {89,126} + textureRect + {{1024,259},{89,126}} + textureRotated + + + Goku_charge_01.png + + aliases + + spriteOffset + {-4,-10} + spriteSize + {81,130} + spriteSourceSize + {89,150} + textureRect + {{875,1},{81,130}} + textureRotated + + + Goku_charge_02.png + + aliases + + spriteOffset + {2,-15} + spriteSize + {89,120} + spriteSourceSize + {115,150} + textureRect + {{1240,386},{89,120}} + textureRotated + + + Goku_charge_03.png + + aliases + + spriteOffset + {-1,-6} + spriteSize + {75,138} + spriteSourceSize + {101,150} + textureRect + {{388,435},{75,138}} + textureRotated + + + Goku_charge_04.png + + aliases + + spriteOffset + {4,0} + spriteSize + {94,150} + spriteSourceSize + {102,150} + textureRect + {{292,309},{94,150}} + textureRotated + + + Goku_defend_01.png + + aliases + + spriteOffset + {0,0} + spriteSize + {72,97} + spriteSourceSize + {72,97} + textureRect + {{1809,102},{72,97}} + textureRotated + + + Goku_die_01.png + + aliases + + spriteOffset + {0,0} + spriteSize + {90,131} + spriteSourceSize + {90,131} + textureRect + {{783,1},{90,131}} + textureRotated + + + Goku_die_02.png + + aliases + + spriteOffset + {0,-27} + spriteSize + {117,82} + spriteSourceSize + {117,136} + textureRect + {{1305,1},{117,82}} + textureRotated + + + Goku_die_03.png + + aliases + + spriteOffset + {0,-19} + spriteSize + {138,65} + spriteSourceSize + {138,103} + textureRect + {{523,288},{138,65}} + textureRotated + + + Goku_die_04.png + + aliases + + spriteOffset + {0,-15} + spriteSize + {118,73} + spriteSourceSize + {118,103} + textureRect + {{1155,1},{118,73}} + textureRotated + + + Goku_die_05.png + + aliases + + spriteOffset + {0,-28} + spriteSize + {151,47} + spriteSourceSize + {151,103} + textureRect + {{243,323},{151,47}} + textureRotated + + + Goku_fastMove_01.png + + aliases + + spriteOffset + {-5,-2} + spriteSize + {106,129} + spriteSourceSize + {116,133} + textureRect + {{821,266},{106,129}} + textureRotated + + + Goku_fastMove_02.png + + aliases + + spriteOffset + {6,0} + spriteSize + {104,133} + spriteSourceSize + {116,133} + textureRect + {{699,139},{104,133}} + textureRotated + + + Goku_hit_01.png + + aliases + + spriteOffset + {0,0} + spriteSize + {95,137} + spriteSourceSize + {95,137} + textureRect + {{602,141},{95,137}} + textureRotated + + + Goku_hit_02.png + + aliases + + spriteOffset + {0,0} + spriteSize + {93,127} + spriteSourceSize + {93,127} + textureRect + {{929,263},{93,127}} + textureRotated + + + Goku_idle_01.png + + aliases + + spriteOffset + {0,0} + spriteSize + {105,106} + spriteSourceSize + {105,106} + textureRect + {{1512,339},{105,106}} + textureRotated + + + Goku_idle_02.png + + aliases + + spriteOffset + {0,0} + spriteSize + {106,108} + spriteSourceSize + {106,108} + textureRect + {{1531,112},{106,108}} + textureRotated + + + Goku_idle_03.png + + aliases + + spriteOffset + {0,0} + spriteSize + {109,109} + spriteSourceSize + {109,109} + textureRect + {{1490,1},{109,109}} + textureRotated + + + Goku_idle_04.png + + aliases + + spriteOffset + {0,0} + spriteSize + {111,110} + spriteSourceSize + {111,110} + textureRect + {{1344,236},{111,110}} + textureRotated + + + Goku_jump_01.png + + aliases + + spriteOffset + {0,0} + spriteSize + {99,106} + spriteSourceSize + {99,106} + textureRect + {{1541,222},{99,106}} + textureRotated + + + Goku_jump_02.png + + aliases + + spriteOffset + {0,0} + spriteSize + {69,154} + spriteSourceSize + {69,154} + textureRect + {{167,1},{69,154}} + textureRotated + + + Goku_jump_03.png + + aliases + + spriteOffset + {0,0} + spriteSize + {78,144} + spriteSourceSize + {78,144} + textureRect + {{369,1},{78,144}} + textureRotated + + + Goku_jump_04.png + + aliases + + spriteOffset + {0,0} + spriteSize + {83,109} + spriteSourceSize + {83,109} + textureRect + {{1456,228},{83,109}} + textureRotated + + + Goku_jump_05.png + + aliases + + spriteOffset + {0,0} + spriteSize + {74,124} + spriteSourceSize + {74,124} + textureRect + {{1041,387},{74,124}} + textureRotated + + + Goku_jump_06.png + + aliases + + spriteOffset + {0,0} + spriteSize + {60,149} + spriteSourceSize + {60,149} + textureRect + {{307,1},{60,149}} + textureRotated + + + Goku_jump_07.png + + aliases + + spriteOffset + {0,0} + spriteSize + {53,162} + spriteSourceSize + {53,162} + textureRect + {{97,167},{53,162}} + textureRotated + + + Goku_jump_08.png + + aliases + + spriteOffset + {0,0} + spriteSize + {97,99} + spriteSourceSize + {97,99} + textureRect + {{1809,1},{97,99}} + textureRotated + + + Goku_knockOff.png + + aliases + + spriteOffset + {0,0} + spriteSize + {100,67} + spriteSourceSize + {100,67} + textureRect + {{1740,257},{100,67}} + textureRotated + + + Goku_knockOff_01.png + + aliases + + spriteOffset + {0,0} + spriteSize + {92,89} + spriteSourceSize + {92,89} + textureRect + {{1705,406},{92,89}} + textureRotated + + + Goku_rangedAttack_01.png + + aliases + + spriteOffset + {0,0} + spriteSize + {100,115} + spriteSourceSize + {100,115} + textureRect + {{1242,240},{100,115}} + textureRotated + + + Goku_rangedAttack_02.png + + aliases + + spriteOffset + {0,0} + spriteSize + {96,128} + spriteSourceSize + {96,128} + textureRect + {{958,1},{96,128}} + textureRotated + + + Goku_rangedAttack_03.png + + aliases + + spriteOffset + {0,0} + spriteSize + {125,121} + spriteSourceSize + {125,121} + textureRect + {{1117,386},{125,121}} + textureRotated + + + Goku_rangedAttack_04.png + + aliases + + spriteOffset + {0,0} + spriteSize + {125,125} + spriteSourceSize + {125,125} + textureRect + {{1115,259},{125,125}} + textureRotated + + + Goku_rangedAttack_05.png + + aliases + + spriteOffset + {0,0} + spriteSize + {126,123} + spriteSourceSize + {126,123} + textureRect + {{1020,131},{126,123}} + textureRotated + + + Goku_rangedAttack_06.png + + aliases + + spriteOffset + {0,0} + spriteSize + {102,117} + spriteSourceSize + {102,117} + textureRect + {{1235,121},{102,117}} + textureRotated + + + Goku_run_01.png + + aliases + + spriteOffset + {0,0} + spriteSize + {106,108} + spriteSourceSize + {106,108} + textureRect + {{1601,1},{106,108}} + textureRotated + + + Goku_run_02.png + + aliases + + spriteOffset + {0,0} + spriteSize + {105,109} + spriteSourceSize + {105,109} + textureRect + {{1405,349},{105,109}} + textureRotated + + + Goku_run_03.png + + aliases + + spriteOffset + {0,0} + spriteSize + {103,110} + spriteSourceSize + {103,110} + textureRect + {{1426,116},{103,110}} + textureRotated + + + Goku_run_04.png + + aliases + + spriteOffset + {0,0} + spriteSize + {99,113} + spriteSourceSize + {99,113} + textureRect + {{1389,1},{99,113}} + textureRotated + + + Goku_run_05.png + + aliases + + spriteOffset + {0,0} + spriteSize + {95,114} + spriteSourceSize + {95,114} + textureRect + {{660,416},{95,114}} + textureRotated + + + Goku_run_06.png + + aliases + + spriteOffset + {0,0} + spriteSize + {94,114} + spriteSourceSize + {94,114} + textureRect + {{845,397},{94,114}} + textureRotated + + + Goku_ultimate_01.png + + aliases + + spriteOffset + {0,0} + spriteSize + {67,153} + spriteSourceSize + {67,153} + textureRect + {{238,1},{67,153}} + textureRotated + + + Goku_ultimate_02.png + + aliases + + spriteOffset + {0,0} + spriteSize + {98,160} + spriteSourceSize + {98,160} + textureRect + {{143,331},{98,160}} + textureRotated + + + Goku_ultimate_03.png + + aliases + + spriteOffset + {0,0} + spriteSize + {69,166} + spriteSourceSize + {69,166} + textureRect + {{1,345},{69,166}} + textureRotated + + + Goku_ultimate_04.png + + aliases + + spriteOffset + {0,0} + spriteSize + {69,165} + spriteSourceSize + {69,165} + textureRect + {{72,345},{69,165}} + textureRotated + + + Goku_ultimate_05.png + + aliases + + spriteOffset + {0,0} + spriteSize + {68,164} + spriteSourceSize + {68,164} + textureRect + {{97,1},{68,164}} + textureRotated + + + Goku_ultimate_06.png + + aliases + + spriteOffset + {0,0} + spriteSize + {79,134} + spriteSourceSize + {79,134} + textureRect + {{657,280},{79,134}} + textureRotated + + + Goku_ultimate_07.png + + aliases + + spriteOffset + {0,0} + spriteSize + {104,62} + spriteSourceSize + {104,62} + textureRect + {{1512,447},{104,62}} + textureRotated + + + Goku_ultimate_08.png + + aliases + + spriteOffset + {0,0} + spriteSize + {104,67} + spriteSourceSize + {104,67} + textureRect + {{776,407},{104,67}} + textureRotated + + + Goku_ultimate_09.png + + aliases + + spriteOffset + {0,0} + spriteSize + {100,79} + spriteSourceSize + {100,79} + textureRect + {{1741,176},{100,79}} + textureRotated + + + Goku_ultimate_10.png + + aliases + + spriteOffset + {0,0} + spriteSize + {98,119} + spriteSourceSize + {98,119} + textureRect + {{941,392},{98,119}} + textureRotated + + + Goku_up_01.png + + aliases + + spriteOffset + {0,-15} + spriteSize + {138,65} + spriteSourceSize + {138,95} + textureRect + {{590,288},{138,65}} + textureRotated + + + Goku_up_02.png + + aliases + + spriteOffset + {0,-11} + spriteSize + {118,73} + spriteSourceSize + {118,95} + textureRect + {{1230,1},{118,73}} + textureRotated + + + Goku_up_03.png + + aliases + + spriteOffset + {0,-24} + spriteSize + {151,47} + spriteSourceSize + {151,95} + textureRect + {{253,156},{151,47}} + textureRotated + + + Goku_up_04.png + + aliases + + spriteOffset + {0,-6} + spriteSize + {130,83} + spriteSourceSize + {130,95} + textureRect + {{528,428},{130,83}} + textureRotated + + + Goku_up_05.png + + aliases + + spriteOffset + {0,0} + spriteSize + {84,95} + spriteSourceSize + {84,95} + textureRect + {{1619,406},{84,95}} + textureRotated + + + Goku_up_06.png + + aliases + + spriteOffset + {0,-8} + spriteSize + {88,79} + spriteSourceSize + {88,95} + textureRect + {{1796,407},{88,79}} + textureRotated + + + Goku_up_07.png + + aliases + + spriteOffset + {0,0} + spriteSize + {93,95} + spriteSourceSize + {93,95} + textureRect + {{1642,311},{93,95}} + textureRotated + + + Goku_win_01.png + + aliases + + spriteOffset + {0,0} + spriteSize + {99,154} + spriteSourceSize + {99,154} + textureRect + {{152,167},{99,154}} + textureRotated + + + Goku_win_02.png + + aliases + + spriteOffset + {0,0} + spriteSize + {79,75} + spriteSourceSize + {79,75} + textureRect + {{1739,326},{79,75}} + textureRotated + + + Goku_win_03.png + + aliases + + spriteOffset + {0,0} + spriteSize + {79,84} + spriteSourceSize + {79,84} + textureRect + {{1820,326},{79,84}} + textureRotated + + + Goku_win_04.png + + aliases + + spriteOffset + {0,0} + spriteSize + {88,119} + spriteSourceSize + {88,119} + textureRect + {{1145,129},{88,119}} + textureRotated + + + Goku_win_05.png + + aliases + + spriteOffset + {0,0} + spriteSize + {84,150} + spriteSourceSize + {84,150} + textureRect + {{302,156},{84,150}} + textureRotated + + + Goku_win_06.png + + aliases + + spriteOffset + {0,0} + spriteSize + {97,128} + spriteSourceSize + {97,128} + textureRect + {{921,133},{97,128}} + textureRotated + + + Goku_win_07.png + + aliases + + spriteOffset + {0,0} + spriteSize + {94,173} + spriteSourceSize + {94,173} + textureRect + {{1,1},{94,173}} + textureRotated + + + Goku_win_08.png + + aliases + + spriteOffset + {0,0} + spriteSize + {94,167} + spriteSourceSize + {94,167} + textureRect + {{1,176},{94,167}} + textureRotated + + + + metadata + + format + 3 + pixelFormat + RGBA8888 + premultiplyAlpha + + realTextureFileName + Goku.png + size + {1907,512} + smartupdate + $TexturePacker:SmartUpdate:85d1251f622e7dd51691a1b18f0a50a0:549648e7f09dd0349446459bbd3d308e:57d2438bfd6d5791873f5edd42e1a794$ + textureFileName + Goku.png + + + diff --git a/Resources/Goku.png b/Resources/Goku.png new file mode 100644 index 0000000..c62b173 Binary files /dev/null and b/Resources/Goku.png differ diff --git a/Resources/Goku_boom.plist b/Resources/Goku_boom.plist new file mode 100644 index 0000000..a0952a5 --- /dev/null +++ b/Resources/Goku_boom.plist @@ -0,0 +1,941 @@ + + + + + frames + + Goku_boom_00.png + + aliases + + spriteOffset + {0,-11} + spriteSize + {71,58} + spriteSourceSize + {71,108} + textureRect + {{167,446},{71,58}} + textureRotated + + + Goku_boom_01.png + + aliases + + spriteOffset + {0,-11} + spriteSize + {70,58} + spriteSourceSize + {70,108} + textureRect + {{862,427},{70,58}} + textureRotated + + + Goku_boom_02.png + + aliases + + spriteOffset + {-1,-11} + spriteSize + {65,58} + spriteSourceSize + {67,108} + textureRect + {{1174,321},{65,58}} + textureRotated + + + Goku_boom_03.png + + aliases + + spriteOffset + {-2,-8} + spriteSize + {85,90} + spriteSourceSize + {99,108} + textureRect + {{718,244},{85,90}} + textureRotated + + + Goku_boom_04.png + + aliases + + spriteOffset + {0,1} + spriteSize + {87,106} + spriteSourceSize + {99,108} + textureRect + {{360,393},{87,106}} + textureRotated + + + Goku_boom_05.png + + aliases + + spriteOffset + {-2,-1} + spriteSize + {79,96} + spriteSourceSize + {109,108} + textureRect + {{1096,131},{79,96}} + textureRotated + + + Goku_boom_06.png + + aliases + + spriteOffset + {0,0} + spriteSize + {78,90} + spriteSourceSize + {84,108} + textureRect + {{1104,229},{78,90}} + textureRotated + + + Goku_boom_07.png + + aliases + + spriteOffset + {0,1} + spriteSize + {86,106} + spriteSourceSize + {96,108} + textureRect + {{719,136},{86,106}} + textureRotated + + + Goku_boom_08.png + + aliases + + spriteOffset + {-1,-2} + spriteSize + {90,104} + spriteSourceSize + {92,108} + textureRect + {{807,124},{90,104}} + textureRotated + + + Goku_boom_09.png + + aliases + + spriteOffset + {0,0} + spriteSize + {84,108} + spriteSourceSize + {90,108} + textureRect + {{250,393},{84,108}} + textureRotated + + + Goku_boom_10.png + + aliases + + spriteOffset + {1,-1} + spriteSize + {82,106} + spriteSourceSize + {84,108} + textureRect + {{996,229},{82,106}} + textureRotated + + + Goku_boom_11.png + + aliases + + spriteOffset + {-11,0} + spriteSize + {129,128} + spriteSourceSize + {151,128} + textureRect + {{1029,1},{129,128}} + textureRotated + + + Goku_boom_12.png + + aliases + + spriteOffset + {-4,-1} + spriteSize + {121,122} + spriteSourceSize + {161,128} + textureRect + {{250,269},{121,122}} + textureRotated + + + Goku_boom_13.png + + aliases + + spriteOffset + {-9,1} + spriteSize + {121,122} + spriteSourceSize + {153,128} + textureRect + {{373,269},{121,122}} + textureRotated + + + Goku_boom_14.png + + aliases + + spriteOffset + {9,-1} + spriteSize + {121,122} + spriteSourceSize + {139,128} + textureRect + {{497,148},{121,122}} + textureRotated + + + Goku_boom_15.png + + aliases + + spriteOffset + {-7,0} + spriteSize + {72,71} + spriteSourceSize + {86,71} + textureRect + {{1160,1},{72,71}} + textureRotated + + + Goku_boom_16.png + + aliases + + spriteOffset + {1,-1} + spriteSize + {70,69} + spriteSourceSize + {86,71} + textureRect + {{960,322},{70,69}} + textureRotated + + + Goku_boom_17.png + + aliases + + spriteOffset + {-4,0} + spriteSize + {70,69} + spriteSourceSize + {96,71} + textureRect + {{1031,313},{70,69}} + textureRotated + + + Goku_boom_18.png + + aliases + + spriteOffset + {4,-1} + spriteSize + {68,69} + spriteSourceSize + {76,71} + textureRect + {{1103,321},{68,69}} + textureRotated + + + Goku_boom_19.png + + aliases + + spriteOffset + {-8,9} + spriteSize + {247,133} + spriteSourceSize + {263,153} + textureRect + {{533,1},{247,133}} + textureRotated + + + Goku_boom_20.png + + aliases + + spriteOffset + {1,5} + spriteSize + {281,143} + spriteSourceSize + {283,153} + textureRect + {{1,1},{281,143}} + textureRotated + + + Goku_boom_21.png + + aliases + + spriteOffset + {-10,2} + spriteSize + {245,149} + spriteSourceSize + {265,153} + textureRect + {{1,146},{245,149}} + textureRotated + + + Goku_boom_22.png + + aliases + + spriteOffset + {-8,-1} + spriteSize + {247,147} + spriteSourceSize + {263,163} + textureRect + {{1,297},{247,147}} + textureRotated + + + Goku_boom_23.png + + aliases + + spriteOffset + {16,-4} + spriteSize + {247,145} + spriteSourceSize + {283,163} + textureRect + {{284,1},{247,145}} + textureRotated + + + Goku_boom_24.png + + aliases + + spriteOffset + {10,-6} + spriteSize + {245,121} + spriteSourceSize + {265,163} + textureRect + {{782,1},{245,121}} + textureRotated + + + Goku_boom_25.png + + aliases + + spriteOffset + {-8,-2} + spriteSize + {247,119} + spriteSourceSize + {263,123} + textureRect + {{248,148},{247,119}} + textureRotated + + + Goku_boom_26.png + + aliases + + spriteOffset + {0,0} + spriteSize + {61,52} + spriteSourceSize + {61,52} + textureRect + {{808,420},{61,52}} + textureRotated + + + Goku_boom_27.png + + aliases + + spriteOffset + {0,0} + spriteSize + {52,61} + spriteSourceSize + {52,61} + textureRect + {{1177,131},{52,61}} + textureRotated + + + Goku_boom_28.png + + aliases + + spriteOffset + {0,0} + spriteSize + {61,52} + spriteSourceSize + {61,52} + textureRect + {{1094,391},{61,52}} + textureRotated + + + Goku_boom_29.png + + aliases + + spriteOffset + {0,0} + spriteSize + {61,52} + spriteSourceSize + {61,52} + textureRect + {{1034,443},{61,52}} + textureRotated + + + Goku_boom_30.png + + aliases + + spriteOffset + {-1,0} + spriteSize + {79,58} + spriteSourceSize + {81,58} + textureRect + {{86,446},{79,58}} + textureRotated + + + Goku_boom_31.png + + aliases + + spriteOffset + {-3,-2} + spriteSize + {88,95} + spriteSourceSize + {96,99} + textureRect + {{598,328},{88,95}} + textureRotated + + + Goku_boom_32.png + + aliases + + spriteOffset + {0,-2} + spriteSize + {92,95} + spriteSourceSize + {92,99} + textureRect + {{695,331},{92,95}} + textureRotated + + + Goku_boom_33.png + + aliases + + spriteOffset + {0,-2} + spriteSize + {95,95} + spriteSourceSize + {97,99} + textureRect + {{863,330},{95,95}} + textureRotated + + + Goku_boom_34.png + + aliases + + spriteOffset + {0,0} + spriteSize + {95,99} + spriteSourceSize + {95,99} + textureRect + {{899,124},{95,99}} + textureRotated + + + Goku_boom_35.png + + aliases + + spriteOffset + {0,0} + spriteSize + {100,98} + spriteSourceSize + {100,98} + textureRect + {{496,272},{100,98}} + textureRotated + + + Goku_boom_36.png + + aliases + + spriteOffset + {0,0} + spriteSize + {96,98} + spriteSourceSize + {96,98} + textureRect + {{996,131},{96,98}} + textureRotated + + + Goku_boom_37.png + + aliases + + spriteOffset + {0,0} + spriteSize + {92,98} + spriteSourceSize + {92,98} + textureRect + {{810,230},{92,98}} + textureRotated + + + Goku_boom_38.png + + aliases + + spriteOffset + {0,0} + spriteSize + {97,98} + spriteSourceSize + {97,98} + textureRect + {{620,136},{97,98}} + textureRotated + + + Goku_boom_39.png + + aliases + + spriteOffset + {0,3} + spriteSize + {95,90} + spriteSourceSize + {95,98} + textureRect + {{904,225},{95,90}} + textureRotated + + + Goku_boom_40.png + + aliases + + spriteOffset + {-1,2} + spriteSize + {96,90} + spriteSourceSize + {100,94} + textureRect + {{620,236},{96,90}} + textureRotated + + + Goku_boom_41.png + + aliases + + spriteOffset + {-1,2} + spriteSize + {94,90} + spriteSourceSize + {96,94} + textureRect + {{563,418},{94,90}} + textureRotated + + + Goku_boom_42.png + + aliases + + spriteOffset + {0,0} + spriteSize + {40,33} + spriteSourceSize + {40,33} + textureRect + {{1142,445},{40,33}} + textureRotated + + + Goku_boom_43.png + + aliases + + spriteOffset + {0,0} + spriteSize + {49,47} + spriteSourceSize + {49,47} + textureRect + {{1184,244},{49,47}} + textureRotated + + + Goku_boom_44.png + + aliases + + spriteOffset + {-2,0} + spriteSize + {42,53} + spriteSourceSize + {100,93} + textureRect + {{990,455},{42,53}} + textureRotated + + + Goku_boom_45.png + + aliases + + spriteOffset + {-4,0} + spriteSize + {56,73} + spriteSourceSize + {96,93} + textureRect + {{750,425},{56,73}} + textureRotated + + + Goku_boom_46.png + + aliases + + spriteOffset + {-3,-3} + spriteSize + {62,83} + spriteSourceSize + {92,93} + textureRect + {{1,446},{62,83}} + textureRotated + + + Goku_boom_47.png + + aliases + + spriteOffset + {-2,-3} + spriteSize + {69,87} + spriteSourceSize + {97,93} + textureRect + {{792,331},{69,87}} + textureRotated + + + Goku_boom_48.png + + aliases + + spriteOffset + {0,-2} + spriteSize + {79,89} + spriteSourceSize + {95,93} + textureRect + {{659,425},{79,89}} + textureRotated + + + Goku_boom_49.png + + aliases + + spriteOffset + {-1,-3} + spriteSize + {84,93} + spriteSourceSize + {100,99} + textureRect + {{468,425},{84,93}} + textureRotated + + + Goku_boom_50.png + + aliases + + spriteOffset + {0,0} + spriteSize + {59,55} + spriteSourceSize + {59,55} + textureRect + {{1160,74},{59,55}} + textureRotated + + + Goku_boom_51.png + + aliases + + spriteOffset + {0,0} + spriteSize + {61,57} + spriteSourceSize + {61,57} + textureRect + {{1031,384},{61,57}} + textureRotated + + + Goku_boom_52.png + + aliases + + spriteOffset + {0,0} + spriteSize + {69,59} + spriteSourceSize + {69,59} + textureRect + {{960,394},{69,59}} + textureRotated + + + Goku_boom_53.png + + aliases + + spriteOffset + {0,0} + spriteSize + {26,26} + spriteSourceSize + {26,26} + textureRect + {{808,483},{26,26}} + textureRotated + + + Goku_boom_54.png + + aliases + + spriteOffset + {0,0} + spriteSize + {38,38} + spriteSourceSize + {38,38} + textureRect + {{1177,439},{38,38}} + textureRotated + + + Goku_boom_55.png + + aliases + + spriteOffset + {0,0} + spriteSize + {44,44} + spriteSourceSize + {44,44} + textureRect + {{548,372},{44,44}} + textureRotated + + + Goku_boom_56.png + + aliases + + spriteOffset + {0,0} + spriteSize + {46,46} + spriteSourceSize + {46,46} + textureRect + {{1157,391},{46,46}} + textureRotated + + + Goku_boom_57.png + + aliases + + spriteOffset + {0,0} + spriteSize + {48,48} + spriteSourceSize + {48,48} + textureRect + {{1184,194},{48,48}} + textureRotated + + + Goku_boom_58.png + + aliases + + spriteOffset + {0,0} + spriteSize + {50,50} + spriteSourceSize + {50,50} + textureRect + {{496,372},{50,50}} + textureRotated + + + Goku_boom_59.png + + aliases + + spriteOffset + {0,0} + spriteSize + {52,52} + spriteSourceSize + {52,52} + textureRect + {{1088,445},{52,52}} + textureRotated + + + Goku_boom_60.png + + aliases + + spriteOffset + {0,0} + spriteSize + {54,54} + spriteSourceSize + {54,54} + textureRect + {{934,455},{54,54}} + textureRotated + + + + metadata + + format + 3 + pixelFormat + RGBA8888 + premultiplyAlpha + + realTextureFileName + Goku_boom.png + size + {1233,510} + smartupdate + $TexturePacker:SmartUpdate:b3a04ca20fb98af20a0c27181f732476:f64e93606789e815e06538f0fdcd135b:70f2266b87bfc5fa92c9b22b7bc1e77d$ + textureFileName + Goku_boom.png + + + diff --git a/Resources/Goku_boom.png b/Resources/Goku_boom.png new file mode 100644 index 0000000..f6e691f Binary files /dev/null and b/Resources/Goku_boom.png differ diff --git a/Resources/back.png b/Resources/back.png deleted file mode 100644 index bf67a6e..0000000 Binary files a/Resources/back.png and /dev/null differ diff --git a/Resources/bg/1.png b/Resources/bg/1.png new file mode 100644 index 0000000..6a13f52 Binary files /dev/null and b/Resources/bg/1.png differ diff --git a/Resources/bg/GameSettingSceneBackground.png b/Resources/bg/GameSettingSceneBackground.png new file mode 100644 index 0000000..8b875b2 Binary files /dev/null and b/Resources/bg/GameSettingSceneBackground.png differ diff --git a/Resources/bg/bg1-small.png b/Resources/bg/bg1-small.png new file mode 100644 index 0000000..e244671 Binary files /dev/null and b/Resources/bg/bg1-small.png differ diff --git a/Resources/bg/bg1.png b/Resources/bg/bg1.png new file mode 100644 index 0000000..4941625 Binary files /dev/null and b/Resources/bg/bg1.png differ diff --git a/Resources/bg/bg2-small.png b/Resources/bg/bg2-small.png new file mode 100644 index 0000000..21178e5 Binary files /dev/null and b/Resources/bg/bg2-small.png differ diff --git a/Resources/bg/bg2.png b/Resources/bg/bg2.png new file mode 100644 index 0000000..962df91 Binary files /dev/null and b/Resources/bg/bg2.png differ diff --git a/Resources/bg/bg3-small.png b/Resources/bg/bg3-small.png new file mode 100644 index 0000000..85cb9a5 Binary files /dev/null and b/Resources/bg/bg3-small.png differ diff --git a/Resources/bg/bg3.png b/Resources/bg/bg3.png new file mode 100644 index 0000000..534b119 Binary files /dev/null and b/Resources/bg/bg3.png differ diff --git a/Resources/bg/bg4-small.png b/Resources/bg/bg4-small.png new file mode 100644 index 0000000..5708741 Binary files /dev/null and b/Resources/bg/bg4-small.png differ diff --git a/Resources/bg/bg4.png b/Resources/bg/bg4.png new file mode 100644 index 0000000..a5311e3 Binary files /dev/null and b/Resources/bg/bg4.png differ diff --git a/Resources/bg/bg5-small.png b/Resources/bg/bg5-small.png new file mode 100644 index 0000000..e84484e Binary files /dev/null and b/Resources/bg/bg5-small.png differ diff --git a/Resources/bg/bg5.png b/Resources/bg/bg5.png new file mode 100644 index 0000000..03078c8 Binary files /dev/null and b/Resources/bg/bg5.png differ diff --git a/Resources/bg/bg6-small.png b/Resources/bg/bg6-small.png new file mode 100644 index 0000000..d480667 Binary files /dev/null and b/Resources/bg/bg6-small.png differ diff --git a/Resources/bg/bg6.png b/Resources/bg/bg6.png new file mode 100644 index 0000000..53ba773 Binary files /dev/null and b/Resources/bg/bg6.png differ diff --git a/Resources/bg/bg7-small.png b/Resources/bg/bg7-small.png new file mode 100644 index 0000000..31839c2 Binary files /dev/null and b/Resources/bg/bg7-small.png differ diff --git a/Resources/bg/bg7.png b/Resources/bg/bg7.png new file mode 100644 index 0000000..f4287e2 Binary files /dev/null and b/Resources/bg/bg7.png differ diff --git a/Resources/bg/bg8-small.png b/Resources/bg/bg8-small.png new file mode 100644 index 0000000..dc37545 Binary files /dev/null and b/Resources/bg/bg8-small.png differ diff --git a/Resources/bg/bg8.png b/Resources/bg/bg8.png new file mode 100644 index 0000000..13d9d20 Binary files /dev/null and b/Resources/bg/bg8.png differ diff --git a/Resources/bg/selectBackgroundSceneBackground.png b/Resources/bg/selectBackgroundSceneBackground.png new file mode 100644 index 0000000..cc667b9 Binary files /dev/null and b/Resources/bg/selectBackgroundSceneBackground.png differ diff --git a/Resources/bg/selectRoleSceneBackground.png b/Resources/bg/selectRoleSceneBackground.png new file mode 100644 index 0000000..5f9fd9c Binary files /dev/null and b/Resources/bg/selectRoleSceneBackground.png differ diff --git a/Resources/bg/startSceneBackground.png b/Resources/bg/startSceneBackground.png new file mode 100644 index 0000000..af42030 Binary files /dev/null and b/Resources/bg/startSceneBackground.png differ diff --git a/Resources/button/ChooseBackground.png b/Resources/button/ChooseBackground.png new file mode 100644 index 0000000..3ef4fc0 Binary files /dev/null and b/Resources/button/ChooseBackground.png differ diff --git a/Resources/button/ChooseRole.png b/Resources/button/ChooseRole.png new file mode 100644 index 0000000..e8a8a20 Binary files /dev/null and b/Resources/button/ChooseRole.png differ diff --git a/Resources/button/GamePause.png b/Resources/button/GamePause.png new file mode 100644 index 0000000..13d38c0 Binary files /dev/null and b/Resources/button/GamePause.png differ diff --git a/Resources/button/SoundOff.png b/Resources/button/SoundOff.png new file mode 100644 index 0000000..a7871dc Binary files /dev/null and b/Resources/button/SoundOff.png differ diff --git a/Resources/button/SoundOn.png b/Resources/button/SoundOn.png new file mode 100644 index 0000000..b0eb695 Binary files /dev/null and b/Resources/button/SoundOn.png differ diff --git a/Resources/button/back-normal.png b/Resources/button/back-normal.png new file mode 100644 index 0000000..706b7f9 Binary files /dev/null and b/Resources/button/back-normal.png differ diff --git a/Resources/button/back-selected.png b/Resources/button/back-selected.png new file mode 100644 index 0000000..b27c62e Binary files /dev/null and b/Resources/button/back-selected.png differ diff --git a/Resources/button/back2-normal.png b/Resources/button/back2-normal.png new file mode 100644 index 0000000..dd2569b Binary files /dev/null and b/Resources/button/back2-normal.png differ diff --git a/Resources/button/back2-selected.png b/Resources/button/back2-selected.png new file mode 100644 index 0000000..7e1b651 Binary files /dev/null and b/Resources/button/back2-selected.png differ diff --git a/Resources/button/close-normal.png b/Resources/button/close-normal.png new file mode 100644 index 0000000..4c96c48 Binary files /dev/null and b/Resources/button/close-normal.png differ diff --git a/Resources/button/close-selected.png b/Resources/button/close-selected.png new file mode 100644 index 0000000..252e85c Binary files /dev/null and b/Resources/button/close-selected.png differ diff --git a/Resources/button/confirm-normal.png b/Resources/button/confirm-normal.png new file mode 100644 index 0000000..7f93c30 Binary files /dev/null and b/Resources/button/confirm-normal.png differ diff --git a/Resources/button/confirm-selected.png b/Resources/button/confirm-selected.png new file mode 100644 index 0000000..d4b43b0 Binary files /dev/null and b/Resources/button/confirm-selected.png differ diff --git a/Resources/button/continue-normal.png b/Resources/button/continue-normal.png new file mode 100644 index 0000000..611313b Binary files /dev/null and b/Resources/button/continue-normal.png differ diff --git a/Resources/button/continue-selected.png b/Resources/button/continue-selected.png new file mode 100644 index 0000000..13f4589 Binary files /dev/null and b/Resources/button/continue-selected.png differ diff --git a/Resources/button/pause.png b/Resources/button/pause.png new file mode 100644 index 0000000..94e33ef Binary files /dev/null and b/Resources/button/pause.png differ diff --git a/Resources/button/play.png b/Resources/button/play.png new file mode 100644 index 0000000..d0ecaee Binary files /dev/null and b/Resources/button/play.png differ diff --git a/Resources/button/setting-normal.png b/Resources/button/setting-normal.png new file mode 100644 index 0000000..52426f1 Binary files /dev/null and b/Resources/button/setting-normal.png differ diff --git a/Resources/button/setting-selected.png b/Resources/button/setting-selected.png new file mode 100644 index 0000000..9ed81ba Binary files /dev/null and b/Resources/button/setting-selected.png differ diff --git a/Resources/button/start-normal.png b/Resources/button/start-normal.png new file mode 100644 index 0000000..597ec64 Binary files /dev/null and b/Resources/button/start-normal.png differ diff --git a/Resources/button/start-selected.png b/Resources/button/start-selected.png new file mode 100644 index 0000000..0f42d1b Binary files /dev/null and b/Resources/button/start-selected.png differ diff --git a/Resources/close-normal.png b/Resources/close-normal.png deleted file mode 100644 index cf3ab21..0000000 Binary files a/Resources/close-normal.png and /dev/null differ diff --git a/Resources/close-selected.png b/Resources/close-selected.png deleted file mode 100644 index 82314a0..0000000 Binary files a/Resources/close-selected.png and /dev/null differ diff --git a/Resources/confirm.png b/Resources/confirm.png deleted file mode 100644 index d3e10af..0000000 Binary files a/Resources/confirm.png and /dev/null differ diff --git a/Resources/frame.png b/Resources/frame.png index a58259e..f93a063 100644 Binary files a/Resources/frame.png and b/Resources/frame.png differ diff --git a/Resources/hp1.png b/Resources/hp1.png new file mode 100644 index 0000000..882804b Binary files /dev/null and b/Resources/hp1.png differ diff --git a/Resources/hp2.png b/Resources/hp2.png new file mode 100644 index 0000000..ae344b6 Binary files /dev/null and b/Resources/hp2.png differ diff --git a/Resources/music/321.mp3 b/Resources/music/321.mp3 new file mode 100644 index 0000000..54a2f17 Binary files /dev/null and b/Resources/music/321.mp3 differ diff --git a/Resources/music/ClickCamera.wav b/Resources/music/ClickCamera.wav new file mode 100644 index 0000000..e9c185d Binary files /dev/null and b/Resources/music/ClickCamera.wav differ diff --git a/Resources/music/MainGameSceneBgm.mp3 b/Resources/music/MainGameSceneBgm.mp3 new file mode 100644 index 0000000..7ad6059 Binary files /dev/null and b/Resources/music/MainGameSceneBgm.mp3 differ diff --git a/Resources/music/WelcomeSceneBgm.mp3 b/Resources/music/WelcomeSceneBgm.mp3 new file mode 100644 index 0000000..7b07159 Binary files /dev/null and b/Resources/music/WelcomeSceneBgm.mp3 differ diff --git a/Resources/physicplayerForFrieza.png b/Resources/physicplayerForFrieza.png new file mode 100644 index 0000000..f84d150 Binary files /dev/null and b/Resources/physicplayerForFrieza.png differ diff --git a/Resources/role/role1.png b/Resources/role/role1.png new file mode 100644 index 0000000..c6bb7c5 Binary files /dev/null and b/Resources/role/role1.png differ diff --git a/Resources/role/role2.png b/Resources/role/role2.png new file mode 100644 index 0000000..99975ab Binary files /dev/null and b/Resources/role/role2.png differ diff --git a/Resources/setting/SunWuKong.png b/Resources/setting/SunWuKong.png new file mode 100644 index 0000000..5054b51 Binary files /dev/null and b/Resources/setting/SunWuKong.png differ diff --git a/Resources/setting/aboutGame-Dialogue.png b/Resources/setting/aboutGame-Dialogue.png new file mode 100644 index 0000000..9cbbea7 Binary files /dev/null and b/Resources/setting/aboutGame-Dialogue.png differ diff --git a/Resources/setting/aboutGame-normal.png b/Resources/setting/aboutGame-normal.png new file mode 100644 index 0000000..5acf632 Binary files /dev/null and b/Resources/setting/aboutGame-normal.png differ diff --git a/Resources/setting/aboutGame-selected.png b/Resources/setting/aboutGame-selected.png new file mode 100644 index 0000000..a557a19 Binary files /dev/null and b/Resources/setting/aboutGame-selected.png differ diff --git a/Resources/setting/closeBgm-Dialogue.png b/Resources/setting/closeBgm-Dialogue.png new file mode 100644 index 0000000..9c2f526 Binary files /dev/null and b/Resources/setting/closeBgm-Dialogue.png differ diff --git a/Resources/setting/closeBgm-normal.png b/Resources/setting/closeBgm-normal.png new file mode 100644 index 0000000..7fea41f Binary files /dev/null and b/Resources/setting/closeBgm-normal.png differ diff --git a/Resources/setting/closeBgm-selected.png b/Resources/setting/closeBgm-selected.png new file mode 100644 index 0000000..d06cf0b Binary files /dev/null and b/Resources/setting/closeBgm-selected.png differ diff --git a/Resources/setting/openBgm-Dialogue.png b/Resources/setting/openBgm-Dialogue.png new file mode 100644 index 0000000..a8cb112 Binary files /dev/null and b/Resources/setting/openBgm-Dialogue.png differ diff --git a/Resources/setting/openBgm-normal.png b/Resources/setting/openBgm-normal.png new file mode 100644 index 0000000..93c8bc4 Binary files /dev/null and b/Resources/setting/openBgm-normal.png differ diff --git a/Resources/setting/openBgm-selected.png b/Resources/setting/openBgm-selected.png new file mode 100644 index 0000000..54111a0 Binary files /dev/null and b/Resources/setting/openBgm-selected.png differ diff --git a/Resources/setting/setting-start-normal.png b/Resources/setting/setting-start-normal.png new file mode 100644 index 0000000..02b4404 Binary files /dev/null and b/Resources/setting/setting-start-normal.png differ diff --git a/Resources/setting/setting-start-selected.png b/Resources/setting/setting-start-selected.png new file mode 100644 index 0000000..09b7f7e Binary files /dev/null and b/Resources/setting/setting-start-selected.png differ diff --git a/Resources/setting/setting-welcome-Dialogue.png b/Resources/setting/setting-welcome-Dialogue.png new file mode 100644 index 0000000..49cf817 Binary files /dev/null and b/Resources/setting/setting-welcome-Dialogue.png differ diff --git a/Resources/setting/welcome-Dialogue.png b/Resources/setting/welcome-Dialogue.png new file mode 100644 index 0000000..46daddd Binary files /dev/null and b/Resources/setting/welcome-Dialogue.png differ diff --git a/Resources/start-normal.png b/Resources/start-normal.png deleted file mode 100644 index 4efe238..0000000 Binary files a/Resources/start-normal.png and /dev/null differ diff --git a/Resources/start-selected.png b/Resources/start-selected.png deleted file mode 100644 index b98c0ad..0000000 Binary files a/Resources/start-selected.png and /dev/null differ diff --git "a/Resources/\350\265\204\346\272\220 20.png" "b/Resources/\350\265\204\346\272\220 20.png" new file mode 100644 index 0000000..f93a063 Binary files /dev/null and "b/Resources/\350\265\204\346\272\220 20.png" differ