diff --git a/Classes/AppDelegate.cpp b/Classes/AppDelegate.cpp index 6afed02..1899f14 100644 --- a/Classes/AppDelegate.cpp +++ b/Classes/AppDelegate.cpp @@ -1,6 +1,9 @@ #include "AppDelegate.h" #include "Scenes/WelcomeScene.h" #include "Scenes/ExampleGameScene.h" +#include "Scenes/OnlineGameScene.h" +#include "Scenes/SocketServerScene.h" +#include "Scenes/InputNameScene.h" // #define USE_AUDIO_ENGINE 1 // #define USE_SIMPLE_AUDIO_ENGINE 1 @@ -96,7 +99,9 @@ bool AppDelegate::applicationDidFinishLaunching() { // create a scene. it's an autorelease object auto scene = WelcomeScene::createScene(); - + //auto scene = SocketServerScene::createScene(); + //auto scene = ExampleGameScene::createScene(); + // run director->runWithScene(scene); diff --git a/Classes/Players/Charactor.cpp b/Classes/Players/Charactor.cpp index 77ee696..bfd1447 100644 --- a/Classes/Players/Charactor.cpp +++ b/Classes/Players/Charactor.cpp @@ -52,8 +52,98 @@ 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;//被击打特效 + } + else if (name == "Vegeta") { + idleNum = 4; + runNum = 6; + meleeAttack1Num = 5; + meleeAttack2Num = 12; + meleeAttack3Num = 17; + rangedAttackNum = 5; + jumpNum = 7; + hitNum = 2; + deadNum = 5; + winNum = 6; + hittedAwayNum = 2; // + dashNum = 4; // + defendNum = 1; + chargeNum = 4; + ultimateNum = 7; + 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/Charactor.h b/Classes/Players/Charactor.h index 9d9d712..50dc846 100644 --- a/Classes/Players/Charactor.h +++ b/Classes/Players/Charactor.h @@ -44,6 +44,7 @@ class Charactor char* getBoomStr1() { return (char*)boomStr1.data(); } char* getBoomStr2() { return (char*)boomStr2.data(); } char* getRangedBallStr() { return (char*)rangedBallStr.data(); } + string getName() { return name; } int getIdleNum() { return idleNum; } int getRunNum() { return runNum; } diff --git a/Classes/Players/PlayerSprite.cpp b/Classes/Players/PlayerSprite.cpp index 6b02872..ff3b290 100644 --- a/Classes/Players/PlayerSprite.cpp +++ b/Classes/Players/PlayerSprite.cpp @@ -9,6 +9,14 @@ void PlayerSprite::initSprite(std::string name, Sprite* player) damage = EXAMPLE_PLAYER_DAMAGE; speed = EXAMPLE_PLAYER_SPEED; height = EXAMPLE_PLAYER_HEIGHT; + try { + SpriteFrameCache::getInstance()->addSpriteFramesWithFile(name + ".plist"); + SpriteFrameCache::getInstance()->addSpriteFramesWithFile(name + "_boom.plist"); + } + catch (exception err) { + log("error %s.plist", name.c_str()); + log("error %s_boom.plist", name.c_str()); + } SpriteFrameCache::getInstance()->addSpriteFramesWithFile(name + ".plist"); SpriteFrameCache::getInstance()->addSpriteFramesWithFile(name + "_boom.plist"); charactor = new Charactor(name); @@ -207,6 +215,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 +238,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); @@ -381,12 +391,18 @@ void PlayerSprite::hit() if (isRun) { return; } - if (hittedCount < 3) { - if (hp >= 5) { - hp -= 5; + if (abs(getPositionX()) < 30.0 || abs(getPositionX() - 1022.0) < 30.0 || hittedCount < 3) { + hittedCount %= 3; + if (isDefend) { + isDefend = false; } else { - hp = 0; + if (hp >= 5) { + hp -= 5; + } + else { + hp = 0; + } } auto begin = CallFuncN::create([&](Ref* sender) { isHitted = true; @@ -415,6 +431,9 @@ void PlayerSprite::dead() { stopAllActions(); isDead = true; + if (charactor->getName() == "Vegeta") { + setPosition(getPosition() - Vec2(0, 30)); + } auto animation = Animation::createWithSpriteFrames(deadVector, 0.25f); auto animate = Animate::create(animation); animate->setOriginalTarget(false); @@ -431,13 +450,22 @@ void PlayerSprite::hitByUltimate() else { hp = 0; } - stopAllActions(); + isDefend = false; + auto begin = CallFuncN::create([&](Ref* sender) { + ishitByUltimate = true; + }); + auto animation = Animation::createWithSpriteFrames(deadVector, 0.25f); auto animate = Animate::create(animation); auto end = CallFuncN::create([&](Ref* sender) {; - idle(); + idle(); + ishitByUltimate = false; }); - auto seq = Sequence::create(animate, DelayTime::create(0.2f), end, NULL); + + /* seq 的作用相当于 animate 动作延迟 2f 执行 end 动作 */ + auto seq = Sequence::create(begin, animate, DelayTime::create(0.2f), end, NULL); + stopAllActions(); + stopActionByTag(3); runAction(seq); } @@ -447,6 +475,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 +491,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); @@ -474,6 +504,9 @@ void PlayerSprite::dashRight(Vec2 oppoentPosition) void PlayerSprite::win() { stopAllActions(); isWin = true; + if (charactor->getName() == "Goku") { + setPosition(getPosition() + Vec2(0, 70)); + } auto animation = Animation::createWithSpriteFrames(winVector, 0.25f); auto animate = Animate::create(animation); animate->setOriginalTarget(false); @@ -543,6 +576,7 @@ void PlayerSprite::defend() { if (isRun) { return; } + isDefend = true; auto animation = Animation::createWithSpriteFrames(defendVector, 0.09f); auto animate = Animate::create(animation); auto act = RepeatForever::create(animate); @@ -553,7 +587,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..cdcbda8 100644 --- a/Classes/Players/PlayerSprite.h +++ b/Classes/Players/PlayerSprite.h @@ -68,10 +68,13 @@ class PlayerSprite : public Sprite #pragma region 用于判断当前角色的状态 + bool ishitByUltimate = false; bool isRun = false; bool stopJump = true, stopMeleeAttack = true, stopRangedAttack = true; bool isHitted = false, isHitting = false, isUltimate = false; bool isDead = false, isWin = false; + bool isMove = false; + bool isDefend = false; int hittedCount = 0; /*被连击的判断变量*/ bool isDouble = false; diff --git a/Classes/Scenes/ExampleGameScene.cpp b/Classes/Scenes/ExampleGameScene.cpp index 6445b9b..c6b0cad 100644 --- a/Classes/Scenes/ExampleGameScene.cpp +++ b/Classes/Scenes/ExampleGameScene.cpp @@ -1,11 +1,15 @@ #include "ExampleGameScene.h" #include "SimpleAudioEngine.h" +#include "GamePauseScene.h" +#include "GameOverScene.h" #include "../configuration.h" +#include "../ShareSingleton.h" #include "../Players/PlayerSprite.h" #include #include #include - +#define database UserDefault::getInstance() +using namespace CocosDenshion; USING_NS_CC; /* * tag 动画 @@ -75,14 +79,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(bgName); 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,17 +99,29 @@ bool ExampleGameScene::init() groundbody->setTag(1); groundbody->setDynamic(false); ground->setPhysicsBody(groundbody); + ground->setVisible(false); this->addChild(ground, 1); #pragma endregion - + #pragma region 创建精灵 - /* Todo:创建精灵的人需要修改一下这里的初始帧 */ - /* 创建一张贴图,使用贴图创建精灵 */ + isFreiza = false; + /*注 player1 在右边,使用数字键盘; player2 在左边,使用字母键盘*/ + + string Player1Name = ShareSingleton::GetInstance()->player1; + string Player2Name = ShareSingleton::GetInstance()->player2; + player1 = new PlayerSprite(); /* 添加player1的物理刚体 */ - physicPlayer1 = Sprite::create("physicplayer.png"); + if (Player1Name == "Frieza") { + /* 弗利萨的尾巴问题,所以得换个刚体绑定 */ + physicPlayer1 = Sprite::create("physicplayerForFrieza.png"); + isFreiza = true; + } + else { + 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); @@ -113,21 +129,29 @@ bool ExampleGameScene::init() player1Body->setContactTestBitmask(0xFFFFFFFF); player1Body->setDynamic(true); physicPlayer1->setPhysicsBody(player1Body); - physicPlayer1->setVisible(false); + physicPlayer1->setVisible(true); physicPlayer1->setScale(1.2f); addChild(physicPlayer1, 3); - player1->initSprite("Kid_Buu", physicPlayer1); + player1->initSprite(Player1Name, physicPlayer1); player1->initAnimateFrame(); player1->setPosition(Vec2(visibleSize.width / 4 * 3, visibleSize.height / 2 - 300)); - player1->setFlippedX(true); + player1->setFlippedX(false); player1->setVisible(true); addChild(player1, 3); player1->idle(); player2 = new PlayerSprite(); /* 添加player2的物理刚体 */ - physicPlayer2 = Sprite::create("physicplayer.png"); + if (Player2Name == "Frieza") { + /* 弗利萨的尾巴问题,所以得换个刚体绑定 */ + physicPlayer2 = Sprite::create("physicplayerForFrieza.png"); + isFreiza = true; + } + else { + physicPlayer2 = Sprite::create("physicplayer.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); @@ -135,11 +159,11 @@ bool ExampleGameScene::init() player2Body->setContactTestBitmask(0xFFFFFFFF); player2Body->setDynamic(true); physicPlayer2->setPhysicsBody(player2Body); - physicPlayer2->setVisible(false); + physicPlayer2->setVisible(true); physicPlayer2->setScale(1.2f); addChild(physicPlayer2, 3); - player2->initSprite("Kid_Buu", physicPlayer2); + player2->initSprite(Player2Name, physicPlayer2); player2->initAnimateFrame(); player2->setPosition(Vec2(visibleSize.width / 4, visibleSize.height / 2 - 300)); player2->setFlippedX(true); @@ -152,89 +176,151 @@ bool ExampleGameScene::init() #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))); - + /* Player1的Hp, 右边 */ + Sprite* player1hpAndmpBorder = Sprite::create("Player2Border.png"); + Sprite* player1hpContent = Sprite::create("hp-new.png"); + /* Player1的Mp */ + Sprite* player1mpContent = Sprite::create("mp-new.png"); player1Hp = ProgressTimer::create(player1hpContent); player1Hp->setScaleX(90); - player1Hp->setAnchorPoint(Vec2(0, 0)); + player1Hp->setAnchorPoint(Vec2(1, 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)); + player1Hp->setMidpoint(Point(1, 0)); + player1Hp->setPercentage(50); + player1Hp->setPosition(Vec2(935, 642)); 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))); + player1hpAndmpBorder->setAnchorPoint(Vec2(1, 0)); + player1hpAndmpBorder->setPosition(Vec2(1025, 614)); + addChild(player1hpAndmpBorder, 0); player1Mp = ProgressTimer::create(player1mpContent); player1Mp->setScaleX(90); - player1Mp->setAnchorPoint(Vec2(0, 0)); + player1Mp->setAnchorPoint(Vec2(1, 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)); + player1Mp->setMidpoint(Point(1, 0)); + player1Mp->setPercentage(60); + player1Mp->setPosition(Vec2(935, 625)); 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))); + /* Player2的Hp */ + Sprite* player2hpAndmpBorder = Sprite::create("Player1Border.png"); + Sprite* player2hpContent = Sprite::create("hp-new.png"); + /* Player2的Mp */ + Sprite* player2mpContent = Sprite::create("mp-new.png"); 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->setPercentage(10); + player2Hp->setPosition(Vec2(90, 642)); addChild(player2Hp, 1); - player2hpBorder->setAnchorPoint(Vec2(0, 0)); - player2hpBorder->setPosition(Vec2(origin.x + player2Hp->getContentSize().width, origin.y + visibleSize.height - player2hpBorder->getContentSize().height)); - 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))); + player2hpAndmpBorder->setAnchorPoint(Vec2(0, 0)); + player2hpAndmpBorder->setPosition(Vec2(0, 614)); + addChild(player2hpAndmpBorder, 0); 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)); + player2Mp->setMidpoint(Point(0, 1)); /// 从左到右显示进度条 + player2Mp->setPercentage(20); + player2Mp->setPosition(Vec2(90, 625)); + //player1Mp->setPosition(Vec2(origin.x + 14 * player1Mp->getContentSize().width + 500, origin.y + visibleSize.height - 2 * player1Mp->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 游戏界面的菜单项 +#pragma region 添加游戏人物头像到信息框,以及显示人物姓名 - /* Todo: 美工人员请在这里添加游戏界面的菜单项,如暂停游戏,设置,声音开关 */ + auto player1Icon = Sprite::create("role/" + Player1Name + "-icon.png"); + auto player2Icon = Sprite::create("role/" + Player2Name + "-icon.png"); + + player1Icon->setAnchorPoint(Vec2(1, 0)); + player2Icon->setAnchorPoint(Vec2(0, 0)); + player1Icon->setPosition(Vec2(1012, 631)); + player2Icon->setPosition(Vec2(12, 631)); + + addChild(player1Icon, 0); + addChild(player2Icon, 0); + + + player1Name = Label::createWithTTF(ShareSingleton::GetInstance()->user1.c_str(), "fonts/comicsansms.ttf", 20); + player1Name->setAnchorPoint(Vec2(1, 0)); + player1Name->setPosition(Vec2(935, 660)); + player1Name->setColor(Color3B(0, 0, 0)); + addChild(player1Name, 1); + player2Name = Label::createWithTTF(ShareSingleton::GetInstance()->user2.c_str(), "fonts/comicsansms.ttf", 20); + player2Name->setAnchorPoint(Vec2(0, 0)); + player2Name->setPosition(Vec2(90, 660)); + player2Name->setColor(Color3B(0, 0, 0)); + addChild(player2Name, 1); + + vs = Label::createWithTTF("VS", "fonts/comicsansms.ttf", 60); + vs->setPosition(visibleSize.width / 2, visibleSize.height / 2 + 200); + vs->setColor(Color3B(255, 255, 0)); #pragma endregion + #pragma region 音乐 - /* Todo: 美工人员请在这里添加音乐的相关代码 */ + auto audio = SimpleAudioEngine::getInstance(); + /*预加载并循环播放背景音乐*/ + // audio->preloadBackgroundMusic("music/WelcomeSceneBackground.mp3"); + if (ShareSingleton::GetInstance()->controlVoice) { + 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(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(); @@ -260,28 +346,76 @@ bool ExampleGameScene::init() #pragma region 测试动画用按钮------邵梓硕 - auto label = Label::createWithTTF("hit", "fonts/arial.ttf", 24); + /*auto label = Label::createWithTTF("win", "fonts/arial.ttf", 24); 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); - addChild(menu, 2); + menu->setVisible(true); + addChild(menu, 2);*/ - auto label2 = Label::createWithTTF("dead", "fonts/arial.ttf", 24); + /*auto label2 = Label::createWithTTF("dead", "fonts/arial.ttf", 24); 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); - addChild(menu2, 2); + menu2->setVisible(false); + addChild(menu2, 2);*/ + +#pragma endregion + + //-------------------------------------------------------------------------------------------------------------------------------------------------------- +#pragma region 创建倒计时 + totalTime = 122; + schedule(schedule_selector(ExampleGameScene::updateCountDown), 1); #pragma endregion +#pragma region 三秒回合图标和123倒计时 + bothCanmove = false; + round1 = Sprite::create("round1.png"); + round1->setPosition(Vec2(origin.x + 14 * player2Mp->getContentSize().width + 455, + origin.y + visibleSize.height - 2 * player2Mp->getContentSize().height - 20)); + addChild(round1, 3); + three = Sprite::create("3.png"); + three->setPosition(Vec2(origin.x + 14 * player2Mp->getContentSize().width + 455 + , origin.y + visibleSize.height - 2 * player2Mp->getContentSize().height - 200)); + addChild(three, 3); + isBreak = false; +#pragma endregion + + yIsBreak = false; + fiveIsBreak = false; + /* 爆裂帧动画 */ + explosion(); + + + //addChild(vs, 1); + //-------------------------------------------------------------------------------------------------------------------------------------------------------- + + return true; } /* 碰撞发生函数 */ bool ExampleGameScene::onConcactBegin(PhysicsContact & contact) { + if (player1->getActionByTag(12) != nullptr) { + player1->stopActionByTag(12); + if (chargeEffect1 != NULL) { + chargeEffect1->removeFromParentAndCleanup(true); + chargeEffect1 = NULL; + } + player1->idle(); + } + if (player2->getActionByTag(12) != nullptr) { + player2->stopActionByTag(12); + if (chargeEffect2 != NULL) { + chargeEffect2->removeFromParentAndCleanup(true); + chargeEffect2 = NULL; + } + player2->idle(); + } return true; } @@ -305,142 +439,374 @@ bool ExampleGameScene::onContactSeparate(PhysicsContact & contact) /* 按下键盘 */ void ExampleGameScene::onKeyPressed(EventKeyboard::KeyCode code, Event* event) { - switch (code) { - case cocos2d::EventKeyboard::KeyCode::KEY_LEFT_ARROW: - LeftKeyPressed(); - LeftKeyState = true; - break; - case cocos2d::EventKeyboard::KeyCode::KEY_RIGHT_ARROW: - RightKeyPressed(); - RightKeyState = true; - break; - case cocos2d::EventKeyboard::KeyCode::KEY_UP_ARROW: - player1->jump(); - break; - case cocos2d::EventKeyboard::KeyCode::KEY_DOWN_ARROW: - player1->defend(); - break; - case cocos2d::EventKeyboard::KeyCode::KEY_1: - if (player1->getActionByTag(6) == nullptr) { - One_KeyPressed(); - player1LastHit = time(NULL); - } - break; - case cocos2d::EventKeyboard::KeyCode::KEY_2: - createRangedBall(player1, true); - player1->rangedAttack(); - break; - case cocos2d::EventKeyboard::KeyCode::KEY_3: - createUltimateBall(player1,true); - player1->ultimate(); - break; - case cocos2d::EventKeyboard::KeyCode::KEY_5: - chargeEffect1 = createChargeEffect(player1); - player1->charge(); - break; - case cocos2d::EventKeyboard::KeyCode::KEY_A: - A_KeyPressed(); - A_KeyState = true; - break; - case cocos2d::EventKeyboard::KeyCode::KEY_D: - D_KeyPressed(); - D_KeyState = true; - break; - case cocos2d::EventKeyboard::KeyCode::KEY_W: - player2->jump(); - break; - case cocos2d::EventKeyboard::KeyCode::KEY_G: - if (player2->getActionByTag(6) == nullptr) { - player2LastHit = time(NULL); - G_KeyPressed(); + + if (bothCanmove) { + switch (code) { + case cocos2d::EventKeyboard::KeyCode::KEY_LEFT_ARROW: + if (fiveIsBreak == false) { + if (player1->getActionByTag(12) != nullptr) { + player1->stopActionByTag(12); + if (chargeEffect1 != NULL) { + chargeEffect1->removeFromParentAndCleanup(true); + chargeEffect1 = NULL; + } + } + } + fiveIsBreak = true; + LeftKeyPressed(); + LeftKeyState = true; + break; + case cocos2d::EventKeyboard::KeyCode::KEY_RIGHT_ARROW: + if (fiveIsBreak == false) { + if (player1->getActionByTag(12) != nullptr) { + player1->stopActionByTag(12); + if (chargeEffect1 != NULL) { + chargeEffect1->removeFromParentAndCleanup(true); + chargeEffect1 = NULL; + } + } + } + fiveIsBreak = true; + RightKeyPressed(); + RightKeyState = true; + break; + case cocos2d::EventKeyboard::KeyCode::KEY_UP_ARROW: + if (fiveIsBreak == false) { + if (player1->getActionByTag(12) != nullptr) { + player1->stopActionByTag(12); + if (chargeEffect1 != NULL) { + chargeEffect1->removeFromParentAndCleanup(true); + chargeEffect1 = NULL; + } + } + } + fiveIsBreak = true; + player1->jump(); + UPKeyState = true; + break; + case cocos2d::EventKeyboard::KeyCode::KEY_DOWN_ARROW: + if (FIVEKeyState) { + player1->stopActionByTag(12); + if (chargeEffect1 != NULL) { + chargeEffect1->removeFromParentAndCleanup(true); + chargeEffect1 = NULL; + } + FIVEKeyState = false; + } + if (fiveIsBreak == false) { + if (player1->getActionByTag(12) != nullptr) { + player1->stopActionByTag(12); + if (chargeEffect1 != NULL) { + chargeEffect1->removeFromParentAndCleanup(true); + chargeEffect1 = NULL; + } + } + } + fiveIsBreak = false; + player1->defend(); + break; + case cocos2d::EventKeyboard::KeyCode::KEY_1: + if (fiveIsBreak == false) { + if (player1->getActionByTag(12) != nullptr) { + player1->stopActionByTag(12); + if (chargeEffect1 != NULL) { + chargeEffect1->removeFromParentAndCleanup(true); + chargeEffect1 = NULL; + } + } + } + fiveIsBreak = true; + if (player1->getActionByTag(6) == nullptr && !player1->isHitted && !player2->isHitting) { + player1LastHit = time(NULL); + One_KeyPressed(); + } + DOWNKeyState = false; + break; + case cocos2d::EventKeyboard::KeyCode::KEY_2: + if (fiveIsBreak == false) { + if (player1->getActionByTag(12) != nullptr) { + player1->stopActionByTag(12); + if (chargeEffect1 != NULL) { + chargeEffect1->removeFromParentAndCleanup(true); + chargeEffect1 = NULL; + } + } + } + fiveIsBreak = true; + createRangedBall(player1, true); + player1->rangedAttack(); + DOWNKeyState = false; + break; + case cocos2d::EventKeyboard::KeyCode::KEY_3: + if (fiveIsBreak == false) { + if (player1->getActionByTag(12) != nullptr) { + player1->stopActionByTag(12); + if (chargeEffect1 != NULL) { + chargeEffect1->removeFromParentAndCleanup(true); + chargeEffect1 = NULL; + } + } + } + fiveIsBreak = true; + createUltimateBall(player1, true); + if (!player1->ishitByUltimate) { + player1->ultimate(); + } + DOWNKeyState = false; + break; + case cocos2d::EventKeyboard::KeyCode::KEY_5: + if (DOWNKeyState) { + player1->stopActionByTag(11); + //CCLOG("SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS"); + DOWNKeyState = false; + } + if (fiveIsBreak == false) { + chargeEffect1 = createChargeEffect(player1); + player1->charge(); + } + FIVEKeyState = true; + break; + case cocos2d::EventKeyboard::KeyCode::KEY_A: + if (yIsBreak == false) { + if (player2->getActionByTag(12) != nullptr) { + player2->stopActionByTag(12); + if (chargeEffect2 != NULL) { + chargeEffect2->removeFromParentAndCleanup(true); + chargeEffect2 = NULL; + } + } + } + yIsBreak = true; + A_KeyPressed(); + A_KeyState = true; + S_KeyState = false; + break; + case cocos2d::EventKeyboard::KeyCode::KEY_D: + if (yIsBreak == false) { + if (player2->getActionByTag(12) != nullptr) { + player2->stopActionByTag(12); + if (chargeEffect2 != NULL) { + chargeEffect2->removeFromParentAndCleanup(true); + chargeEffect2 = NULL; + } + } + } + yIsBreak = true; + D_KeyPressed(); + D_KeyState = true; + S_KeyState = false; + break; + case cocos2d::EventKeyboard::KeyCode::KEY_W: + if (yIsBreak == false) { + if (player2->getActionByTag(12) != nullptr) { + player2->stopActionByTag(12); + if (chargeEffect2 != NULL) { + chargeEffect2->removeFromParentAndCleanup(true); + chargeEffect2 = NULL; + } + } + } + yIsBreak = true; + W_KeyState = true; + player2->jump(); + S_KeyState = false; + break; + case cocos2d::EventKeyboard::KeyCode::KEY_S: + if (yIsBreak == false) { + if (player2->getActionByTag(12) != nullptr) { + player2->stopActionByTag(12); + if (chargeEffect2 != NULL) { + chargeEffect2->removeFromParentAndCleanup(true); + chargeEffect2 = NULL; + } + } + } + yIsBreak = true; + player2->defend(); + S_KeyState = true; + break; + case cocos2d::EventKeyboard::KeyCode::KEY_G: + if (yIsBreak == false) { + if (player2->getActionByTag(12) != nullptr) { + player2->stopActionByTag(12); + if (chargeEffect2 != NULL) { + chargeEffect2->removeFromParentAndCleanup(true); + chargeEffect2 = NULL; + } + } + } + yIsBreak = true; + if (player2->getActionByTag(6) == nullptr && !player2->isHitted && !player2->isHitting) { + player2LastHit = time(NULL); + G_KeyPressed(); + } + S_KeyState = false; + break; + case cocos2d::EventKeyboard::KeyCode::KEY_H: + if (yIsBreak == false) { + if (player2->getActionByTag(12) != nullptr) { + player2->stopActionByTag(12); + if (chargeEffect2 != NULL) { + chargeEffect2->removeFromParentAndCleanup(true); + chargeEffect2 = NULL; + } + } + } + yIsBreak = true; + createRangedBall(player2, false); + player2->rangedAttack(); + S_KeyState = false; + break; + case cocos2d::EventKeyboard::KeyCode::KEY_Y: + if (yIsBreak == false) { + chargeEffect2 = createChargeEffect(player2); + player2->charge(); + } + S_KeyState = false; + break; + case cocos2d::EventKeyboard::KeyCode::KEY_J: + if (yIsBreak == false) { + if (player2->getActionByTag(12) != nullptr) { + player2->stopActionByTag(12); + if (chargeEffect2 != NULL) { + chargeEffect2->removeFromParentAndCleanup(true); + chargeEffect2 = NULL; + } + } + } + yIsBreak = true; + createUltimateBall(player2, false); + if (!player2->ishitByUltimate) { + player2->ultimate(); + } + S_KeyState = false; + break; + default: + break; } - break; - case cocos2d::EventKeyboard::KeyCode::KEY_H: - createRangedBall(player2, false); - player2->rangedAttack(); - break; - case cocos2d::EventKeyboard::KeyCode::KEY_Y: - chargeEffect2 = createChargeEffect(player2); - player2->charge(); - break; - case cocos2d::EventKeyboard::KeyCode::KEY_J: - createUltimateBall(player2, false); - player2->ultimate(); - break; - default: - break; } } /* 释放按键 */ void ExampleGameScene::onKeyReleased(EventKeyboard::KeyCode code, Event* event) { - switch (code) { - case cocos2d::EventKeyboard::KeyCode::KEY_LEFT_ARROW: - player1->stopActionByTag(1); - 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: - player1->stopActionByTag(2); - physicPlayer1->getPhysicsBody()->setVelocity(Vec2(0, 0)); - if (player1->getActionByTag(1) == nullptr) { + if (bothCanmove) { + switch (code) { + case cocos2d::EventKeyboard::KeyCode::KEY_LEFT_ARROW: + 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; + fiveIsBreak = false; + break; + case cocos2d::EventKeyboard::KeyCode::KEY_RIGHT_ARROW: + 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; + fiveIsBreak = false; + break; + case cocos2d::EventKeyboard::KeyCode::KEY_UP_ARROW: + UPKeyState = false; + fiveIsBreak = false; + break; + case cocos2d::EventKeyboard::KeyCode::KEY_DOWN_ARROW: + player1->stopActionByTag(11); player1->idle(); - } - RightKeyState = false; - break; - case cocos2d::EventKeyboard::KeyCode::KEY_UP_ARROW: - break; - case cocos2d::EventKeyboard::KeyCode::KEY_DOWN_ARROW: - 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: - player1->stopActionByTag(12); - if(chargeEffect1 != NULL) chargeEffect1->removeFromParentAndCleanup(true); - player1->idle(); - break; - case cocos2d::EventKeyboard::KeyCode::KEY_A: - player2->stopActionByTag(1); - physicPlayer2->getPhysicsBody()->setVelocity(Vec2(0, 0)); - if (player2->getActionByTag(2) == nullptr) { - player2->idle(); - } - A_KeyState = false; - break; - case cocos2d::EventKeyboard::KeyCode::KEY_D: - player2->stopActionByTag(2); - physicPlayer2->getPhysicsBody()->setVelocity(Vec2(0, 0)); - if (player2->getActionByTag(1) == nullptr) { + fiveIsBreak = false; + DOWNKeyState = false; + break; + case cocos2d::EventKeyboard::KeyCode::KEY_1: + fiveIsBreak = false; + break; + case cocos2d::EventKeyboard::KeyCode::KEY_2: + fiveIsBreak = false; + break; + case cocos2d::EventKeyboard::KeyCode::KEY_3: + fiveIsBreak = false; + break; + case cocos2d::EventKeyboard::KeyCode::KEY_5: + if (player1->getActionByTag(12) != nullptr) { + player1->stopActionByTag(12); + if (chargeEffect1 != NULL) { + chargeEffect1->removeFromParentAndCleanup(true); + chargeEffect1 = NULL; + } + player1->idle(); + } + FIVEKeyState = false; + fiveIsBreak = false; + 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; + yIsBreak = false; + 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; + yIsBreak = false; + break; + case cocos2d::EventKeyboard::KeyCode::KEY_W: + yIsBreak = false; + W_KeyState = false; + break; + case cocos2d::EventKeyboard::KeyCode::KEY_S: + player2->stopActionByTag(11); player2->idle(); + yIsBreak = false; + S_KeyState = false; + break; + case cocos2d::EventKeyboard::KeyCode::KEY_G: + yIsBreak = false; + break; + case cocos2d::EventKeyboard::KeyCode::KEY_H: + yIsBreak = false; + break; + case cocos2d::EventKeyboard::KeyCode::KEY_J: + yIsBreak = false; + break; + case cocos2d::EventKeyboard::KeyCode::KEY_Y: + if (player2->getActionByTag(12) != nullptr) { + player2->stopActionByTag(12); + if (chargeEffect2 != NULL) { + chargeEffect2->removeFromParentAndCleanup(true); + chargeEffect2 = NULL; + } + player2->idle(); + } + yIsBreak = false; + break; + default: + break; } - D_KeyState = false; - break; - case cocos2d::EventKeyboard::KeyCode::KEY_W: - break; - case cocos2d::EventKeyboard::KeyCode::KEY_G: - break; - case cocos2d::EventKeyboard::KeyCode::KEY_H: - break; - case cocos2d::EventKeyboard::KeyCode::KEY_J: - break; - case cocos2d::EventKeyboard::KeyCode::KEY_Y: - player2->stopActionByTag(12); - if (chargeEffect2 != NULL) chargeEffect2->removeFromParentAndCleanup(true); - player2->idle(); - break; - default: - break; } } #pragma endregion @@ -448,6 +814,43 @@ void ExampleGameScene::onKeyReleased(EventKeyboard::KeyCode code, Event* event) void ExampleGameScene::update(float delay) { + if (W_KeyState) { + player2->jump(); + } + else if (A_KeyState) { + + } + else if (D_KeyState) { + + } + else { + if (S_KeyState) + player2->defend(); + } + + if (UPKeyState) { + player1->jump(); + } + else if (LeftKeyState) { + + } + else if (RightKeyState) { + + } + else if (FIVEKeyState) { + + } + else { + if (DOWNKeyState) { + //CCLOG("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx"); + player1->defend(); + } + } + ////////////////qyh, 修复从暂停场景回退时,播放按钮没有从暂停状态恢复 + if (ShareSingleton::GetInstance()->controlPause) { + playOrPauseState = 1; + playOrPauseItem->setNormalImage(Sprite::create("button/play.png")); + } /* 如果是被打飞的状态,那么让刚体和精灵的位置相同 */ if (player1->getActionByTag(6) == nullptr) { player1->setPositionX(physicPlayer1->getPositionX()); @@ -509,20 +912,126 @@ void ExampleGameScene::update(float delay) } -/* Todo: 双人对战的人完成这部分的代码 */ +void ExampleGameScene::updateCountDown(float delay) +{ + Vec2 origin = Director::getInstance()->getVisibleOrigin(); + if (totalTime == 122) { + three->removeFromParent(); + two = Sprite::create("2.png"); + two->setPosition(Vec2(origin.x + 14 * player2Mp->getContentSize().width + 455 + , origin.y + visibleSize.height - 2 * player2Mp->getContentSize().height - 200)); + addChild(two, 3); + } + else if (totalTime == 121) { + two->removeFromParent(); + one = Sprite::create("1.png"); + one->setPosition(Vec2(origin.x + 14 * player2Mp->getContentSize().width + 455 + , origin.y + visibleSize.height - 2 * player2Mp->getContentSize().height - 200)); + addChild(one, 3); + } + else if (totalTime == 120) { + one->removeFromParent(); + bothCanmove = true; + + countDown = Label::createWithTTF("120", "fonts/comicsansms.ttf", 48); + countDown->setPosition(visibleSize.width / 2, visibleSize.height / 2 + 250); + countDown->setColor(Color3B(0, 255, 0)); + countDown->enableShadow(); + addChild(countDown, 3); + } + else if (totalTime < 120) { + char str[10]; + sprintf(str, "%d", totalTime); /* 将int类型转化为字符串char*类型 */ + countDown->setString(str); + } + if (totalTime > 0) + totalTime--; + else if (totalTime == 0) + gameOver(); +} + void ExampleGameScene::gameOver() { - + _eventDispatcher->removeAllEventListeners(); + float delay = 3.0f; + /* 停止所有计时器操作 */ + this->unscheduleAllSelectors(); + string name1 = ShareSingleton::GetInstance()->user1; + string name2 = ShareSingleton::GetInstance()->user2; + int score1 = 0, score2 = 0; + +#pragma region WinLabel + winLabel = Label::createWithTTF("", "fonts/comicsansms.ttf", 108); + winLabel->setPosition(visibleSize.width / 2, visibleSize.height / 2); + winLabel->setColor(Color3B(255, 255, 255)); + addChild(winLabel, 2); + + //bothCanmove = false; + if (player1->getHp() > player2->getHp()) { + player1->win(); + player2->dead(); + winLabel->setString(name1 + " Win"); + score1 += 1; + score2 -= 1; + } + else if (player1->getHp() < player2->getHp()) { + player2->win(); + player1->dead(); + winLabel->setString(name2 + " Win"); + score1 -= 1; + score2 += 1; + } + else if (player1->getHp() == player2->getHp()) { + delay = 1.0f; + winLabel->setString("Draw!"); + } +#pragma endregion + +#pragma region 数据存储 + + if (!database->getBoolForKey("isExist")) { + database->setBoolForKey("isExist", true); + } + int one = database->getIntegerForKey(name1.c_str(), 0); + int two = database->getIntegerForKey(name2.c_str(), 0); + /*CCLOG("SSS%d", one); + CCLOG("TTT%d", two);*/ + + score1 = score1 + one; + score2 = score2 + two; + database->setIntegerForKey(name1.c_str(), score1); + database->setIntegerForKey(name2.c_str(), score2); + + database->flush(); + ShareSingleton::GetInstance()->xmlPath = FileUtils::getInstance()->getWritablePath() + "UserDefault.xml"; + //log("%s", ShareSingleton::GetInstance()->xmlPath); + +#pragma endregion + + /*弹出游戏结束界面, 需要延迟1s*/ + scheduleOnce(schedule_selector(ExampleGameScene::CallGameOverScene), delay); } /* 集气状态 */ void ExampleGameScene::isCharge(float dt) { if (player1->getActionByTag(12) != nullptr) { - player1->setMp(player1->getMp() + 5); + player1->setMp(player1->getMp() + 10); + } + else { + if (chargeEffect1 != NULL) { + chargeEffect1->removeFromParentAndCleanup(true); + chargeEffect1 = NULL; + } } if (player2->getActionByTag(12) != nullptr) { - player2->setMp(player2->getMp() + 5); + player2->setMp(player2->getMp() + 10); + } + else { + if (chargeEffect2 != NULL) { + chargeEffect2->removeFromParentAndCleanup(true); + chargeEffect2 = NULL; + } } } @@ -547,11 +1056,62 @@ void ExampleGameScene::updateHP_MP(float delay) } } +void ExampleGameScene::CallGameOverScene(float dt) +{ + +#pragma region 弹出结束游戏场景 + + /*得到窗口的大小*/ + Size visibleSize = Director::sharedDirector()->getVisibleSize(); + RenderTexture *renderTexture = RenderTexture::create(visibleSize.width, visibleSize.height); + + /*遍历当前类的所有子节点信息,画入renderTexture中。 + 这里类似截图。*/ + renderTexture->begin(); + this->getParent()->visit(); + renderTexture->end(); + + auto newScene = GameOverScene::CreateScene(renderTexture); + /*结束游戏界面,压入场景堆栈。并切换到GameOverScene界面*/ + Director::sharedDirector()->pushScene(newScene); + +#pragma endregion +} + /* TODO:这里的对打逻辑存在一点小问题,有时候会出现两个人互打的情况; */ void ExampleGameScene::hit(float dt) { - if (abs(player1->getPositionX() - player2->getPositionX()) < 100) { + if (player2->isHitted || yIsBreak == true) { + if (player2->getActionByTag(12) != nullptr) { + player2->stopActionByTag(12); + if (chargeEffect2 != NULL) { + chargeEffect2->removeFromParentAndCleanup(true); + chargeEffect2 = NULL; + } + } + yIsBreak = true; + } + + if (player1->isHitted || fiveIsBreak == true) { + if (player1->getActionByTag(12) != nullptr) { + player1->stopActionByTag(12); + if (chargeEffect1 != NULL) { + chargeEffect1->removeFromParentAndCleanup(true); + chargeEffect1 = NULL; + } + } + fiveIsBreak = true; + } + /* 因为弗利萨尾巴太长,所以判定距离的方法得区别开来 */ + bool flag = false; + if (isFreiza) { + flag = abs(physicPlayer1->getPositionX() - physicPlayer2->getPositionX()) < physicPlayer1->getContentSize().width + physicPlayer2->getContentSize().width - 50; + } + else { + flag = abs(physicPlayer1->getPositionX() - physicPlayer2->getPositionX()) < physicPlayer1->getContentSize().width + physicPlayer2->getContentSize().width - 10; + } + if (flag) { bool player1FirstAttack = false,bothIdle = false; if (player1->isHitting && player2->isHitting) { player1FirstAttack = player1LastHit > player2LastHit; @@ -599,10 +1159,14 @@ void ExampleGameScene::hit(float dt) player1RangedBalls.remove(ball); break; } - else if (abs(player2->getPositionX() - ball->getPositionX()) < 80 && player2->getPositionY() < 120) { + else if (abs(player2->getPositionX() - ball->getPositionX()) < 40 && player2->getPositionY() < 120) { player2->setFlippedX(!player1->isFlippedX()); if (player2->isHitted == false) { shareInstance->opponentFlipx = player1->isFlippedX(); + if (chargeEffect2 != NULL) { + chargeEffect2->removeFromParentAndCleanup(true); + chargeEffect2 = NULL; + } createHitEffect(player2); } player2->hit(); @@ -618,10 +1182,17 @@ void ExampleGameScene::hit(float dt) player2RangedBalls.remove(ball); break; } - else if (abs(player1->getPositionX() - ball->getPositionX()) < 80 && player1->getPositionY() < 120) { + else if (abs(player1->getPositionX() - ball->getPositionX()) < 40 && player1->getPositionY() < 120) { player1->setFlippedX(!player2->isFlippedX()); if (player1->isHitted == false) { shareInstance->opponentFlipx = player2->isFlippedX(); + if (player1->getActionByTag(12) != nullptr) { + player1->stopActionByTag(12); + if (chargeEffect1 != NULL) { + chargeEffect1->removeFromParentAndCleanup(true); + chargeEffect1 = NULL; + } + } createHitEffect(player1); } player1->hit(); @@ -633,21 +1204,50 @@ void ExampleGameScene::hit(float dt) #pragma endregion +#pragma region 两球相撞动画 + bool end = false; + for (Sprite* ball2 : player2RangedBalls) { + for (Sprite* ball1 : player1RangedBalls) { + if (abs(ball2->getPositionX() - ball1->getPositionX()) < 15) { + auto explore_animation = Animation::createWithSpriteFrames(explore, 0.1f); + AnimationCache::getInstance()->addAnimation(explore_animation, "exploreAnimation"); + auto exploreAnimation = Animate::create(AnimationCache::getInstance()->getAnimation("exploreAnimation")); + SimpleAudioEngine::getInstance()->playEffect("music/explore.wav", false); + + Sprite* temp2 = ball2; + // 先从队列中移除 + ball2->setPosition(Vec2(ball2->getPosition().x + 15, ball2->getPosition().y)); + ball2->stopAllActions(); + ball2->runAction( + Sequence::create( + exploreAnimation + , CallFunc::create([temp2, this] { + temp2->removeFromParentAndCleanup(true); + player2RangedBalls.remove(temp2); + }) + , nullptr + ) + ); + + /*ball2->removeFromParentAndCleanup(true); + player2RangedBalls.remove(ball2);*/ + ball1->removeFromParentAndCleanup(true); + player1RangedBalls.remove(ball1); + end = true; + break; + } + } + if (end) { + break; + } + } +#pragma endregion } /* 点击按钮发生被打状态,仅用于测试代码 */ void ExampleGameScene::hitTest(Ref* sender) { - if (!player1->isDouble) { - player1->hittedCount = 0; - scheduleOnce(schedule_selector(ExampleGameScene::hittedCounter), 2.0f); - player1->isDouble = true; - } - else { - player1->hittedCount++; - } - player1->hit(); - createHitEffect(player1); + player2->win(); } @@ -843,6 +1443,7 @@ void ExampleGameScene::createUltimateBall(PlayerSprite* player, bool isPlayer1) auto seq = Sequence::create(explose, CallFuncN::create([explosion](Ref* sender) { explosion->removeFromParentAndCleanup(true); }), NULL); + /* 这里判断是否被大招击中 */ if (Ball->getBoundingBox().containsPoint(opponent->getPosition())) { opponent->hitByUltimate(); } @@ -888,7 +1489,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 +1513,72 @@ 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/SoundOn.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/SoundOff.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(); + float t = 0.5; + auto replacesense = CCTransitionFade::create(t, GamePauseScene::CreateScene(renderTexture)); + + /*将游戏界面暂停,压入场景堆栈。并切换到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; + ShareSingleton::GetInstance()->controlPause = false; + 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")); + } +} + +void ExampleGameScene::explosion() +{ + auto texture = Director::getInstance()->getTextureCache()->addImage("explosion.png"); + explore.reserve(8); + for (int i = 0; i < 5; i++) { + auto frame = SpriteFrame::createWithTexture(texture, CC_RECT_PIXELS_TO_POINTS(Rect(191 * i, 0, 191, 192))); + explore.pushBack(frame); + } + for (int i = 0; i < 2; i++) { + auto frame = SpriteFrame::createWithTexture(texture, CC_RECT_PIXELS_TO_POINTS(Rect(191 * i, 192, 191, 192))); + } + auto explore_animation = Animation::createWithSpriteFrames(explore, 0.1f); + AnimationCache::getInstance()->addAnimation(explore_animation, "exploreAnimation"); +} diff --git a/Classes/Scenes/ExampleGameScene.h b/Classes/Scenes/ExampleGameScene.h index 3ca4f67..68d0d5b 100644 --- a/Classes/Scenes/ExampleGameScene.h +++ b/Classes/Scenes/ExampleGameScene.h @@ -48,7 +48,13 @@ class ExampleGameScene : public cocos2d::Layer void hit(float dt); void gameOver(); void isCharge(float dt); /* 是否集气 */ - void updateHP_MP(float delay); + void updateHP_MP(float delay);/*判断 mp hp的变化*/ + + /*在游戏结束时,利用一次性监听器,延迟切换*/ + void CallGameOverScene(float dt); + + /* 倒计时update与倒计时相应函数 */ + void updateCountDown(float delay); void RightKeyPressed(); void RightKeyPressed(float t); @@ -72,12 +78,42 @@ 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 */ CREATE_FUNC(ExampleGameScene); private: + /* 倒计时组件 */ + int totalTime; + cocos2d::Label* countDown; + Sprite* round1; + Sprite* one; + Sprite* two; + Sprite* three; + Sprite* go; + bool bothCanmove; + bool isBreak; + + /* 名字 */ + cocos2d::Label* player1Name; + cocos2d::Label* player2Name; + cocos2d::Label* vs; + + /* 胜负 */ + cocos2d::Label* winLabel; + /* 蓄力中断判断 */ + bool yIsBreak; + bool fiveIsBreak; + + /* 爆裂帧动画 */ + void explosion(); + cocos2d::Vector explore; + PhysicsWorld * m_world; Size visibleSize; /* 地面和玩家 */ @@ -92,12 +128,25 @@ class ExampleGameScene : public cocos2d::Layer bool firstPressA = true, firstPressD = true, A_KeyState = false, D_KeyState = false; bool firstPress1 = true, secondPress1 = false; bool firstPressG = true, secondPressG = false; + /* 一直跳跃与防守设置 */ + bool W_KeyState = false, UPKeyState = false; + bool S_KeyState = false, DOWNKeyState = false; + bool FIVEKeyState = false, Y_KeyState = false; /*攻击炮的列表*/ 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/GameOverScene.cpp b/Classes/Scenes/GameOverScene.cpp new file mode 100644 index 0000000..f2c4194 --- /dev/null +++ b/Classes/Scenes/GameOverScene.cpp @@ -0,0 +1,153 @@ +#include "GameOverScene.h" +#include "cocos2d.h" +#include "ExampleGameScene.h" +#include "SelectRoleScene.h" +#include "WelcomeScene.h" +#include "ShareSingleton.h" +#include "SimpleAudioEngine.h" +using namespace CocosDenshion; + +/*暂停页面的创建 ,将当前游戏场景截图作为纹理传入暂停场景,然后出现菜单按钮*/ +cocos2d::Scene * GameOverScene::CreateScene(RenderTexture * sqr) +{ + Scene *scene = Scene::create(); + GameOverScene *layer = GameOverScene::create(); + scene->addChild(layer, 1); + /*增加部分:使用Game界面中截图的sqr纹理图片创建Sprite + 并将Sprite添加到GameOverScene场景层中 + 得到窗口的大小*/ + 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 GameOverScene::init() +{ +#pragma region Cocos2dx自动生成的内容:一些基本配置 + + if (!Layer::init()) + { + return false; + } + auto visibleSize = Director::getInstance()->getVisibleSize(); + Vec2 origin = Director::getInstance()->getVisibleOrigin(); + +#pragma endregion + +#pragma region 游戏结束标签 + auto GameOverImage = CCMenuItemImage::create("button/GameOver.png", "button/GameOver/png"); + GameOverImage->setPosition(ccp(visibleSize.width / 2, visibleSize.height / 2 + 150)); + +#pragma endregion + + + + +#pragma region 重新开始游戏按钮 + /*重新开始游戏按钮*/ + RestartGameItem = CCMenuItemImage::create( + "button/restart-normal.png", + "button/restart-selected.png", + this, + menu_selector(GameOverScene::RestartGameCallback) + ); + RestartGameItem->setPosition(Vec2(visibleSize.width / 3, visibleSize.height / 3)); + +#pragma endregion + + +#pragma region 选择角色按钮 + /*选择角色按钮*/ + ChooseRoleSceneItem = CCMenuItemImage::create( + "button/chooseRole-normal.png", + "button/chooseRole-selected.png", + this, + menu_selector(GameOverScene::ReturnToChooseRoleSceneCallback) + ); + ChooseRoleSceneItem->setPosition(Vec2(2 * visibleSize.width / 3, visibleSize.height / 3 )); + +#pragma endregion + +#pragma region 退出游戏按钮 + /*退出游戏按钮*/ + QuitGameItem = CCMenuItemImage::create( + "button/close-normal.png", + "button/close-selected.png", + this, + menu_selector(GameOverScene::QuiteGameCallback) + ); + QuitGameItem->setPosition(ccp(visibleSize.width / 3, visibleSize.height / 3 - 70)); + +#pragma endregion + + +#pragma region 返回菜单按钮 + + /*返回菜单按钮*/ + ReturnToMenuSceneItem = CCMenuItemImage::create( + "button/back2-normal.png", + "button/back2-selected.png", + this, + menu_selector(GameOverScene::ReturnToMenuSceneCallback) + ); + ReturnToMenuSceneItem->setPosition(Vec2(2 * visibleSize.width / 3, visibleSize.height / 3 - 70)); + + Menu* pMenu = Menu::create(GameOverImage,ChooseRoleSceneItem, RestartGameItem, QuitGameItem, ReturnToMenuSceneItem, NULL); + pMenu->setPosition(Vec2::ZERO); + this->addChild(pMenu, 2); + +#pragma endregion + + + return true; +} + +/*返回菜单按钮的回调*/ +void GameOverScene::ReturnToMenuSceneCallback(Object * pSender) +{ + if (ShareSingleton::GetInstance()->controlVoice) + SimpleAudioEngine::getInstance()->playEffect("music/ClickCamera.wav", false, 1.0f, 0.0f, 1.0f); + + float t = 1.0f; + auto newScene = WelcomeScene::createScene(); + auto replacesense = TransitionFade::create(t, newScene); + Director::sharedDirector()->replaceScene(replacesense); +} + +/*结束游戏的回调*/ +void GameOverScene::QuiteGameCallback(Object * pSender) +{ + if (ShareSingleton::GetInstance()->controlVoice) + SimpleAudioEngine::getInstance()->playEffect("music/ClickCamera.wav", false, 1.0f, 0.0f, 1.0f); + + Director::sharedDirector()->end(); +} + +void GameOverScene::ReturnToChooseRoleSceneCallback(Object * pSender) +{ + float t = 1.0f; + auto newScene = SelectRoleScene::createScene(); + auto replacesense = TransitionFade::create(t, newScene); + Director::sharedDirector()->replaceScene(replacesense); +} + +void GameOverScene::RestartGameCallback(Object * pSender) +{ + float t = 1.0f; + if (ShareSingleton::GetInstance()->controlVoice) + SimpleAudioEngine::getInstance()->playEffect("music/ClickCamera.wav", false, 1.0f, 0.0f, 1.0f); + + auto newScene = ExampleGameScene::createScene(); + auto replacesense = TransitionFade::create(t, newScene); + Director::sharedDirector()->replaceScene(replacesense); +} + + diff --git a/Classes/Scenes/GameOverScene.h b/Classes/Scenes/GameOverScene.h new file mode 100644 index 0000000..3492929 --- /dev/null +++ b/Classes/Scenes/GameOverScene.h @@ -0,0 +1,48 @@ +/************************************************************************** + +* Copyright: + +* Author: qiuyihao + +* Date: 2018-07-02 + +* Description: 游戏主场景的结束界面 + +**************************************************************************/ + +#ifndef _GAMEOVERSCENE_H_ +#define _GAMEOVERSCENE_H_ +#include "cocos2d.h" + +USING_NS_CC; + +class GameOverScene : public cocos2d::Layer +{ +public: + virtual bool init(); + static cocos2d::Scene* CreateScene(RenderTexture* sqr); + + /*返回主界面*/ + void ReturnToMenuSceneCallback(Object* pSender); + /*退出游戏*/ + void QuiteGameCallback(Object* pSender); + /*进入选择角色界面*/ + void ReturnToChooseRoleSceneCallback(Object *pSender); + /*重新开始游戏*/ + void RestartGameCallback(Object* pSender); + + /* implement the "static create()" method manually */ + CREATE_FUNC(GameOverScene); + +private: + /*结束游戏按钮*/ + MenuItemImage * QuitGameItem; + /*返回菜单按钮*/ + MenuItemImage * ReturnToMenuSceneItem; + /*重新开始按钮*/ + MenuItemImage * RestartGameItem; + /*选择角色按钮*/ + MenuItemImage * ChooseRoleSceneItem; +}; + +#endif \ No newline at end of file diff --git a/Classes/Scenes/GamePauseScene.cpp b/Classes/Scenes/GamePauseScene.cpp new file mode 100644 index 0000000..8d380cc --- /dev/null +++ b/Classes/Scenes/GamePauseScene.cpp @@ -0,0 +1,125 @@ +#include "GamePauseScene.h" +#include "cocos2d.h" +#include "WelcomeScene.h" +#include "SimpleAudioEngine.h" +#include "ShareSingleton.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) +{ + if (ShareSingleton::GetInstance()->controlVoice) + SimpleAudioEngine::getInstance()->playEffect("music/ClickCamera.wav", false, 1.0f, 0.0f, 1.0f); + ShareSingleton::GetInstance()->controlPause = true; // 图标按钮需要恢复为播放状态 + Director::sharedDirector()->popScene(); +} + +/*返回菜单按钮的回调*/ +void GamePauseScene::ReturnToMenuSceneCallback(Object * pSender) +{ + if (ShareSingleton::GetInstance()->controlVoice) + SimpleAudioEngine::getInstance()->playEffect("music/ClickCamera.wav", false, 1.0f, 0.0f, 1.0f); + float t = 1.0f; + auto newScene = WelcomeScene::createScene(); + auto replacesense = TransitionFade::create(t, newScene); + Director::sharedDirector()->replaceScene(replacesense); +} + +/*结束游戏的回调*/ +void GamePauseScene::QuiteGameCallback(Object * pSender) +{ + if (ShareSingleton::GetInstance()->controlVoice) + SimpleAudioEngine::getInstance()->playEffect("music/ClickCamera.wav", false, 1.0f, 0.0f, 1.0f); + 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..9ad1535 --- /dev/null +++ b/Classes/Scenes/GameSettingScene.cpp @@ -0,0 +1,181 @@ +#include "GameSettingScene.h" +#include "SimpleAudioEngine.h" +#include "SelectRoleScene.h" +#include "../ShareSingleton.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) +{ + if (ShareSingleton::GetInstance()->controlVoice) + SimpleAudioEngine::getInstance()->playEffect("music/ClickCamera.wav", false, 1.0f, 0.0f, 1.0f); + + SimpleAudioEngine::getInstance()->playEffect("music/ClickCamera.wav", false, 1.0f, 0.0f, 1.0f); + + auto audio = SimpleAudioEngine::getInstance(); + /*即将关闭背景音乐*/ + if (openOrCloseVoiceState) { + SimpleAudioEngine::getInstance()->pauseBackgroundMusic(); + SimpleAudioEngine::getInstance()->pauseAllEffects(); + ShareSingleton::GetInstance()->controlVoice = false; + 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 { + /*预加载并循环播放背景音乐*/ + SimpleAudioEngine::getInstance()->resumeBackgroundMusic(); + SimpleAudioEngine::getInstance()->resumeAllEffects(); + ShareSingleton::GetInstance()->controlVoice = true; //修改全局变量,以便页面间声音控制保持一致 + + 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; + if (ShareSingleton::GetInstance()->controlVoice) + 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) +{ + if (ShareSingleton::GetInstance()->controlVoice) + 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/InputNameScene.cpp b/Classes/Scenes/InputNameScene.cpp new file mode 100644 index 0000000..da5a37a --- /dev/null +++ b/Classes/Scenes/InputNameScene.cpp @@ -0,0 +1,130 @@ +#include "InputNameScene.h" +#include "SimpleAudioEngine.h" +#include "GameSettingScene.h" +#include "ExampleGameScene.h" +#include "../ShareSingleton.h" +using namespace CocosDenshion; +USING_NS_CC; + +Scene* InputNameScene::createScene() +{ + return InputNameScene::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 InputNameSceneScene.cpp\n"); +} + +/* 初始化场景函数 */ +bool InputNameScene::init() +{ +#pragma region Cocos2dx自动生成的内容:一些基本配置 + + if (!Scene::init()) + { + return false; + } + auto visibleSize = Director::getInstance()->getVisibleSize(); + Vec2 origin = Director::getInstance()->getVisibleOrigin(); + +#pragma endregion + + +#pragma region UI界面 背景图片 + + auto bg = Sprite::create("bg/startSceneBackground.png"); + bg->setPosition(visibleSize / 2); + addChild(bg, 0); + +#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 文本输入 + /* VS */ + vs = Label::createWithTTF("VS", "fonts/comicsansms.ttf", 60); + vs->setPosition(visibleSize.width / 2, visibleSize.height / 2); + vs->setColor(Color3B(255, 255, 0)); + addChild(vs, 1); + + /* 两个编辑框 */ + Size boxSize = CCSizeMake(100, 45); + + editBox1 = EditBox::create(boxSize, "green.png"); + editBox2 = EditBox::create(boxSize, "green.png"); + editBox1->setPosition(Vec2(visibleSize.width / 2 + 200, visibleSize.height / 2)); + editBox2->setPosition(Vec2(visibleSize.width / 2 - 200, visibleSize.height / 2)); + + // 默认字体相关 + editBox1->setPlaceHolder("Player1"); + editBox2->setPlaceHolder("Player2"); + editBox1->setPlaceholderFontName("comicsansms"); + editBox2->setPlaceholderFontName("comicsansms"); + editBox1->setPlaceholderFontColor(Color3B::RED); + editBox2->setPlaceholderFontColor(Color3B::RED); + editBox1->setPlaceholderFontSize(32); + editBox2->setPlaceholderFontSize(32); + + // 编辑框文本相关 + editBox1->setFontName("comicsansms"); + editBox2->setFontName("comicsansms"); + editBox1->setFontColor(Color3B::RED); + editBox2->setFontColor(Color3B::RED); + editBox1->setFontSize(36); + editBox2->setFontSize(36); + + this->addChild(editBox1, 2); + this->addChild(editBox2, 2); +#pragma endregion + +#pragma region 确认按钮 + /* 确定按钮 */ + nameConfirmItem = MenuItemImage::create( + "button/confirm-normal.png", + "button/confirm-selected.png", + CC_CALLBACK_1(InputNameScene::confirmCallback, this)); + + nameConfirmItem->setPosition(Vec2(512, 250)); + //addChild(nameConfirmItem); + auto menu = Menu::create(nameConfirmItem, NULL); + menu->setPosition(Vec2::ZERO); + this->addChild(menu, 1); +#pragma endregion + + return true; +} + +/* 确定角色名称 */ +void InputNameScene::confirmCallback(Ref* pSender) +{ + string name1 = editBox1->getText(); + string name2 = editBox2->getText(); + if (name1[0] == ' ' || name2[0] == ' ' || name1 == name2) { + return; + } + auto particle = ParticleFlower::create(); + SimpleAudioEngine::getInstance()->playEffect("music/ClickCamera.wav", false, 1.0f, 0.0f, 1.0f); + + ShareSingleton::GetInstance()->user1 = editBox1->getText(); + ShareSingleton::GetInstance()->user2 = editBox2->getText(); + + float t = 1.2f; + auto newScene = ExampleGameScene::createScene(); + auto replacesense = CCTransitionFade::create(t, newScene); + Director::sharedDirector()->replaceScene(replacesense); + return; +} diff --git a/Classes/Scenes/InputNameScene.h b/Classes/Scenes/InputNameScene.h new file mode 100644 index 0000000..1a505e3 --- /dev/null +++ b/Classes/Scenes/InputNameScene.h @@ -0,0 +1,43 @@ +/************************************************************************** + +* Copyright: + +* Author: WJH + +* Date: 2018-07-02 + +* Description: 输入对战名称界面 + +**************************************************************************/ + +#ifndef __InputNameScene_SCENE_H__ +#define __InputNameScene_SCENE_H__ + +#include "cocos2d.h" +#include "cocos-ext.h" +USING_NS_CC_EXT; +#include "base\CCTouch.h" +USING_NS_CC; + +class InputNameScene : public cocos2d::Scene +{ +private: + /* 编辑框 */ + EditBox * editBox1; + EditBox * editBox2; + MenuItemImage* nameConfirmItem; + cocos2d::Label* vs; +public: + + static cocos2d::Scene* createScene(); + + virtual bool init(); + + /* 确定角色名称 */ + void confirmCallback(cocos2d::Ref * pSender); + + /* implement the "static create()" method manually */ + CREATE_FUNC(InputNameScene); +}; + +#endif /* __InputNameScene_SCENE_H__ */ diff --git a/Classes/Scenes/OnlineGameScene.cpp b/Classes/Scenes/OnlineGameScene.cpp new file mode 100644 index 0000000..0c9e3f1 --- /dev/null +++ b/Classes/Scenes/OnlineGameScene.cpp @@ -0,0 +1,1765 @@ +#include "OnlineGameScene.h" +#include "SimpleAudioEngine.h" +#include "GamePauseScene.h" +#include "GameOverScene.h" +#include "../configuration.h" +#include "../ShareSingleton.h" +#include "../Players/PlayerSprite.h" +#include +#include +#include +#define database UserDefault::getInstance() +using namespace CocosDenshion; +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(bgName); + 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 创建精灵 + isFreiza = false; + /*注 player1 在右边,使用数字键盘; player2 在左边,使用字母键盘*/ + + string Player1Name = ShareSingleton::GetInstance()->player1; + string Player2Name = ShareSingleton::GetInstance()->player2; + + if (Player1Name == "NONE") { + Player1Name = "Frieza"; + } + if (Player2Name == "NONE") { + Player2Name = "Goku"; + } + + player1 = new PlayerSprite(); + + /* 添加player1的物理刚体 */ + if (Player1Name == "Frieza") { + /* 弗利萨的尾巴问题,所以得换个刚体绑定 */ + physicPlayer1 = Sprite::create("physicplayerForFrieza.png"); + isFreiza = true; + } + else { + 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(Player1Name, physicPlayer1); + player1->initAnimateFrame(); + player1->setPosition(Vec2(visibleSize.width / 4 * 3, visibleSize.height / 2 - 300)); + player1->setFlippedX(false); + player1->setVisible(true); + addChild(player1, 3); + player1->idle(); + + player2 = new PlayerSprite(); + /* 添加player2的物理刚体 */ + if (Player2Name == "Frieza") { + /* 弗利萨的尾巴问题,所以得换个刚体绑定 */ + physicPlayer2 = Sprite::create("physicplayerForFrieza.png"); + isFreiza = true; + } + else { + physicPlayer2 = Sprite::create("physicplayer.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); + player2Body->setContactTestBitmask(0xFFFFFFFF); + player2Body->setContactTestBitmask(0xFFFFFFFF); + player2Body->setDynamic(true); + physicPlayer2->setPhysicsBody(player2Body); + physicPlayer2->setVisible(false); + physicPlayer2->setScale(1.2f); + addChild(physicPlayer2, 3); + + player2->initSprite(Player2Name, physicPlayer2); + 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条 + + /* Player1的Hp, 右边 */ + Sprite* player1hpAndmpBorder = Sprite::create("Player2Border.png"); + Sprite* player1hpContent = Sprite::create("hp-new.png"); + /* Player1的Mp */ + Sprite* player1mpContent = Sprite::create("mp-new.png"); + player1Hp = ProgressTimer::create(player1hpContent); + player1Hp->setScaleX(90); + player1Hp->setAnchorPoint(Vec2(1, 0)); + player1Hp->setType(ProgressTimerType::BAR); + player1Hp->setBarChangeRate(Point(1, 0)); + player1Hp->setMidpoint(Point(1, 0)); + player1Hp->setPercentage(50); + player1Hp->setPosition(Vec2(935, 642)); + addChild(player1Hp, 1); + player1hpAndmpBorder->setAnchorPoint(Vec2(1, 0)); + player1hpAndmpBorder->setPosition(Vec2(1025, 614)); + addChild(player1hpAndmpBorder, 0); + + player1Mp = ProgressTimer::create(player1mpContent); + player1Mp->setScaleX(90); + player1Mp->setAnchorPoint(Vec2(1, 0)); + player1Mp->setType(ProgressTimerType::BAR); + player1Mp->setBarChangeRate(Point(1, 0)); + player1Mp->setMidpoint(Point(1, 0)); + player1Mp->setPercentage(60); + player1Mp->setPosition(Vec2(935, 625)); + addChild(player1Mp, 1); + + + /* Player2的Hp */ + Sprite* player2hpAndmpBorder = Sprite::create("Player1Border.png"); + Sprite* player2hpContent = Sprite::create("hp-new.png"); + /* Player2的Mp */ + Sprite* player2mpContent = Sprite::create("mp-new.png"); + 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(10); + player2Hp->setPosition(Vec2(90, 642)); + addChild(player2Hp, 1); + player2hpAndmpBorder->setAnchorPoint(Vec2(0, 0)); + player2hpAndmpBorder->setPosition(Vec2(0, 614)); + addChild(player2hpAndmpBorder, 0); + + 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(20); + player2Mp->setPosition(Vec2(90, 625)); + //player1Mp->setPosition(Vec2(origin.x + 14 * player1Mp->getContentSize().width + 500, origin.y + visibleSize.height - 2 * player1Mp->getContentSize().height - 100)); + addChild(player2Mp, 1); + +#pragma endregion + +#pragma region 添加游戏人物头像到信息框,以及显示人物姓名 + auto player1Icon = Sprite::create("role/" + Player1Name + "-icon.png"); + auto player2Icon = Sprite::create("role/" + Player2Name + "-icon.png"); + + player1Icon->setAnchorPoint(Vec2(1, 0)); + player2Icon->setAnchorPoint(Vec2(0, 0)); + player1Icon->setPosition(Vec2(1012, 631)); + player2Icon->setPosition(Vec2(12, 631)); + + addChild(player1Icon, 0); + addChild(player2Icon, 0); + + + player1Name = Label::createWithTTF(ShareSingleton::GetInstance()->player1.c_str(), "fonts/comicsansms.ttf", 20); + player1Name->setAnchorPoint(Vec2(1, 0)); + player1Name->setPosition(Vec2(935, 660)); + player1Name->setColor(Color3B(0, 0, 0)); + addChild(player1Name, 1); + player2Name = Label::createWithTTF(ShareSingleton::GetInstance()->player2.c_str(), "fonts/comicsansms.ttf", 20); + player2Name->setAnchorPoint(Vec2(0, 0)); + player2Name->setPosition(Vec2(90, 660)); + player2Name->setColor(Color3B(0, 0, 0)); + addChild(player2Name, 1); + + vs = Label::createWithTTF("VS", "fonts/comicsansms.ttf", 60); + vs->setPosition(visibleSize.width / 2, visibleSize.height / 2 + 200); + vs->setColor(Color3B(255, 255, 0)); + +#pragma endregion + + +#pragma region 音乐 + + auto audio = SimpleAudioEngine::getInstance(); + /*预加载并循环播放背景音乐*/ + // audio->preloadBackgroundMusic("music/WelcomeSceneBackground.mp3"); + if (ShareSingleton::GetInstance()->controlVoice) { + 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("127.0.0.1", 8000)) + { + 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("win", "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(true); + 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 + + //-------------------------------------------------------------------------------------------------------------------------------------------------------- +#pragma region 创建倒计时 + totalTime = 122; + schedule(schedule_selector(OnlineGameScene::updateCountDown), 1); + +#pragma endregion + +#pragma region 三秒回合图标和123倒计时 + bothCanmove = false; + round1 = Sprite::create("round1.png"); + round1->setPosition(Vec2(origin.x + 14 * player2Mp->getContentSize().width + 455, + origin.y + visibleSize.height - 2 * player2Mp->getContentSize().height - 20)); + addChild(round1, 3); + three = Sprite::create("3.png"); + three->setPosition(Vec2(origin.x + 14 * player2Mp->getContentSize().width + 455 + , origin.y + visibleSize.height - 2 * player2Mp->getContentSize().height - 200)); + addChild(three, 3); + isBreak = false; +#pragma endregion + + yIsBreak = false; + fiveIsBreak = false; + /* 爆裂帧动画 */ + explosion(); + + + //addChild(vs, 1); + //-------------------------------------------------------------------------------------------------------------------------------------------------------- + + + return true; +} + +/* 碰撞发生函数 */ +bool OnlineGameScene::onConcactBegin(PhysicsContact & contact) +{ + if (player1->getActionByTag(12) != nullptr) { + player1->stopActionByTag(12); + if (chargeEffect1 != NULL) { + chargeEffect1->removeFromParentAndCleanup(true); + chargeEffect1 = NULL; + } + player1->idle(); + } + if (player2->getActionByTag(12) != nullptr) { + player2->stopActionByTag(12); + if (chargeEffect2 != NULL) { + chargeEffect2->removeFromParentAndCleanup(true); + chargeEffect2 = NULL; + } + player2->idle(); + } + 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 (bothCanmove) { + switch (code) { + case cocos2d::EventKeyboard::KeyCode::KEY_LEFT_ARROW: + if (event == nullptr) { + if (fiveIsBreak == false) { + if (player1->getActionByTag(12) != nullptr) { + player1->stopActionByTag(12); + if (chargeEffect1 != NULL) { + chargeEffect1->removeFromParentAndCleanup(true); + chargeEffect1 = NULL; + } + } + } + fiveIsBreak = true; + LeftKeyPressed(); + LeftKeyState = true; + } + break; + case cocos2d::EventKeyboard::KeyCode::KEY_RIGHT_ARROW: + if (event == nullptr) { + if (fiveIsBreak == false) { + if (player1->getActionByTag(12) != nullptr) { + player1->stopActionByTag(12); + if (chargeEffect1 != NULL) { + chargeEffect1->removeFromParentAndCleanup(true); + chargeEffect1 = NULL; + } + } + } + fiveIsBreak = true; + RightKeyPressed(); + RightKeyState = true; + } + break; + case cocos2d::EventKeyboard::KeyCode::KEY_UP_ARROW: + if (event == nullptr) { + if (fiveIsBreak == false) { + if (player1->getActionByTag(12) != nullptr) { + player1->stopActionByTag(12); + if (chargeEffect1 != NULL) { + chargeEffect1->removeFromParentAndCleanup(true); + chargeEffect1 = NULL; + } + } + } + fiveIsBreak = true; + player1->jump(); + UPKeyState = true; + } + break; + case cocos2d::EventKeyboard::KeyCode::KEY_DOWN_ARROW: + if (event == nullptr) { + if (FIVEKeyState) { + player1->stopActionByTag(12); + if (chargeEffect1 != NULL) { + chargeEffect1->removeFromParentAndCleanup(true); + chargeEffect1 = NULL; + } + FIVEKeyState = false; + } + if (fiveIsBreak == false) { + if (player1->getActionByTag(12) != nullptr) { + player1->stopActionByTag(12); + if (chargeEffect1 != NULL) { + chargeEffect1->removeFromParentAndCleanup(true); + chargeEffect1 = NULL; + } + } + } + fiveIsBreak = false; + player1->defend(); + } + break; + case cocos2d::EventKeyboard::KeyCode::KEY_1: + if (event == nullptr) { + if (fiveIsBreak == false) { + if (player1->getActionByTag(12) != nullptr) { + player1->stopActionByTag(12); + if (chargeEffect1 != NULL) { + chargeEffect1->removeFromParentAndCleanup(true); + chargeEffect1 = NULL; + } + } + } + fiveIsBreak = true; + if (player1->getActionByTag(6) == nullptr && !player1->isHitted && !player2->isHitting) { + player1LastHit = time(NULL); + One_KeyPressed(); + } + DOWNKeyState = false; + } + break; + case cocos2d::EventKeyboard::KeyCode::KEY_2: + if (event == nullptr) { + if (fiveIsBreak == false) { + if (player1->getActionByTag(12) != nullptr) { + player1->stopActionByTag(12); + if (chargeEffect1 != NULL) { + chargeEffect1->removeFromParentAndCleanup(true); + chargeEffect1 = NULL; + } + } + } + fiveIsBreak = true; + createRangedBall(player1, true); + player1->rangedAttack(); + DOWNKeyState = false; + } + break; + case cocos2d::EventKeyboard::KeyCode::KEY_3: + if (event == nullptr) { + if (fiveIsBreak == false) { + if (player1->getActionByTag(12) != nullptr) { + player1->stopActionByTag(12); + if (chargeEffect1 != NULL) { + chargeEffect1->removeFromParentAndCleanup(true); + chargeEffect1 = NULL; + } + } + } + fiveIsBreak = true; + createUltimateBall(player1, true); + if (!player1->ishitByUltimate) { + player1->ultimate(); + } + } + DOWNKeyState = false; + break; + case cocos2d::EventKeyboard::KeyCode::KEY_5: + if (event == nullptr) { + if (DOWNKeyState) { + player1->stopActionByTag(11); + DOWNKeyState = false; + } + if (fiveIsBreak == false) { + chargeEffect1 = createChargeEffect(player1); + player1->charge(); + } + FIVEKeyState = true; + } + break; + case cocos2d::EventKeyboard::KeyCode::KEY_A: + if (yIsBreak == false) { + if (player2->getActionByTag(12) != nullptr) { + player2->stopActionByTag(12); + if (chargeEffect2 != NULL) { + chargeEffect2->removeFromParentAndCleanup(true); + chargeEffect2 = NULL; + } + } + } + yIsBreak = true; + A_KeyPressed(); + A_KeyState = true; + S_KeyState = false; + client->sendMessage((char*)(&data), sizeof(SocketData)); + break; + case cocos2d::EventKeyboard::KeyCode::KEY_D: + if (yIsBreak == false) { + if (player2->getActionByTag(12) != nullptr) { + player2->stopActionByTag(12); + if (chargeEffect2 != NULL) { + chargeEffect2->removeFromParentAndCleanup(true); + chargeEffect2 = NULL; + } + } + } + yIsBreak = true; + D_KeyPressed(); + D_KeyState = true; + S_KeyState = false; + data.codeSend = KEYCODESEND::RIGHT; + client->sendMessage((char*)(&data), sizeof(SocketData)); + break; + case cocos2d::EventKeyboard::KeyCode::KEY_W: + if (yIsBreak == false) { + if (player2->getActionByTag(12) != nullptr) { + player2->stopActionByTag(12); + if (chargeEffect2 != NULL) { + chargeEffect2->removeFromParentAndCleanup(true); + chargeEffect2 = NULL; + } + } + } + yIsBreak = true; + W_KeyState = true; + player2->jump(); + S_KeyState = false; + data.codeSend = KEYCODESEND::UP; + client->sendMessage((char*)(&data), sizeof(SocketData)); + break; + case cocos2d::EventKeyboard::KeyCode::KEY_S: + if (yIsBreak == false) { + if (player2->getActionByTag(12) != nullptr) { + player2->stopActionByTag(12); + if (chargeEffect2 != NULL) { + chargeEffect2->removeFromParentAndCleanup(true); + chargeEffect2 = NULL; + } + } + } + yIsBreak = true; + player2->defend(); + S_KeyState = true; + data.codeSend = KEYCODESEND::DOWN; + client->sendMessage((char*)(&data), sizeof(SocketData)); + break; + case cocos2d::EventKeyboard::KeyCode::KEY_G: + if (yIsBreak == false) { + if (player2->getActionByTag(12) != nullptr) { + player2->stopActionByTag(12); + if (chargeEffect2 != NULL) { + chargeEffect2->removeFromParentAndCleanup(true); + chargeEffect2 = NULL; + } + } + } + yIsBreak = true; + if (player2->getActionByTag(6) == nullptr && !player2->isHitted && !player2->isHitting) { + player2LastHit = time(NULL); + G_KeyPressed(); + } + S_KeyState = false; + data.codeSend = KEYCODESEND::G; + client->sendMessage((char*)(&data), sizeof(SocketData)); + break; + case cocos2d::EventKeyboard::KeyCode::KEY_H: + if (yIsBreak == false) { + if (player2->getActionByTag(12) != nullptr) { + player2->stopActionByTag(12); + if (chargeEffect2 != NULL) { + chargeEffect2->removeFromParentAndCleanup(true); + chargeEffect2 = NULL; + } + } + } + yIsBreak = true; + createRangedBall(player2, false); + player2->rangedAttack(); + S_KeyState = false; + data.codeSend = KEYCODESEND::H; + client->sendMessage((char*)(&data), sizeof(SocketData)); + break; + case cocos2d::EventKeyboard::KeyCode::KEY_Y: + if (yIsBreak == false) { + chargeEffect2 = createChargeEffect(player2); + player2->charge(); + } + S_KeyState = false; + data.codeSend = KEYCODESEND::Y; + client->sendMessage((char*)(&data), sizeof(SocketData)); + break; + case cocos2d::EventKeyboard::KeyCode::KEY_J: + if (yIsBreak == false) { + if (player2->getActionByTag(12) != nullptr) { + player2->stopActionByTag(12); + if (chargeEffect2 != NULL) { + chargeEffect2->removeFromParentAndCleanup(true); + chargeEffect2 = NULL; + } + } + } + yIsBreak = true; + createUltimateBall(player2, false); + if (!player2->ishitByUltimate) { + player2->ultimate(); + } + S_KeyState = false; + 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); + if (bothCanmove) { + 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; + fiveIsBreak = 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; + fiveIsBreak = false; + } + break; + case cocos2d::EventKeyboard::KeyCode::KEY_UP_ARROW: + if (event == nullptr) { + UPKeyState = false; + fiveIsBreak = false; + } + break; + case cocos2d::EventKeyboard::KeyCode::KEY_DOWN_ARROW: + if (event == nullptr) { + player1->stopActionByTag(11); + player1->idle(); + fiveIsBreak = false; + DOWNKeyState = false; + } + break; + case cocos2d::EventKeyboard::KeyCode::KEY_1: + if (event == nullptr) { + fiveIsBreak = false; + } + break; + case cocos2d::EventKeyboard::KeyCode::KEY_2: + if (event == nullptr) { + fiveIsBreak = false; + } + break; + case cocos2d::EventKeyboard::KeyCode::KEY_3: + if (event == nullptr) { + fiveIsBreak = false; + } + 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(); + } + FIVEKeyState = false; + fiveIsBreak = false; + } + 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; + yIsBreak = 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; + yIsBreak = false; + data.codeSend = KEYCODESEND::RIGHTRELEASE; + client->sendMessage((char*)(&data), sizeof(SocketData)); + break; + case cocos2d::EventKeyboard::KeyCode::KEY_W: + yIsBreak = false; + W_KeyState = false; + client->sendMessage((char*)(&data), sizeof(SocketData)); + break; + case cocos2d::EventKeyboard::KeyCode::KEY_S: + player2->stopActionByTag(11); + player2->idle(); + yIsBreak = false; + S_KeyState = false; + data.codeSend = KEYCODESEND::DOWNRELEASE; + client->sendMessage((char*)(&data), sizeof(SocketData)); + break; + case cocos2d::EventKeyboard::KeyCode::KEY_G: + yIsBreak = false; + data.codeSend = KEYCODESEND::G_RELEASE; + client->sendMessage((char*)(&data), sizeof(SocketData)); + break; + case cocos2d::EventKeyboard::KeyCode::KEY_H: + yIsBreak = false; + data.codeSend = KEYCODESEND::H_RELEASE; + client->sendMessage((char*)(&data), sizeof(SocketData)); + break; + case cocos2d::EventKeyboard::KeyCode::KEY_J: + yIsBreak = false; + data.codeSend = KEYCODESEND::J_RELEASE; + client->sendMessage((char*)(&data), sizeof(SocketData)); + break; + case cocos2d::EventKeyboard::KeyCode::KEY_Y: + if (player2->getActionByTag(12) != nullptr) { + player2->stopActionByTag(12); + if (chargeEffect2 != NULL) { + chargeEffect2->removeFromParentAndCleanup(true); + chargeEffect2 = NULL; + } + player2->idle(); + } + yIsBreak = false; + data.codeSend = KEYCODESEND::Y_RELEASE; + client->sendMessage((char*)(&data), sizeof(SocketData)); + break; + default: + break; + } + } +} +#pragma endregion + + +void OnlineGameScene::update(float delay) +{ + if (W_KeyState) { + player2->jump(); + } + else if (A_KeyState) { + + } + else if (D_KeyState) { + + } + else { + if (S_KeyState) + player2->defend(); + } + + if (UPKeyState) { + player1->jump(); + } + else if (LeftKeyState) { + + } + else if (RightKeyState) { + + } + else if (FIVEKeyState) { + + } + else { + if (DOWNKeyState) { + //CCLOG("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx"); + player1->defend(); + } + } + ////////////////qyh, 修复从暂停场景回退时,播放按钮没有从暂停状态恢复 + if (ShareSingleton::GetInstance()->controlPause) { + playOrPauseState = 1; + playOrPauseItem->setNormalImage(Sprite::create("button/play.png")); + } + /* 如果是被打飞的状态,那么让刚体和精灵的位置相同 */ + 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 + +} + +void OnlineGameScene::updateCountDown(float delay) +{ + Vec2 origin = Director::getInstance()->getVisibleOrigin(); + if (totalTime == 122) { + three->removeFromParent(); + two = Sprite::create("2.png"); + two->setPosition(Vec2(origin.x + 14 * player2Mp->getContentSize().width + 455 + , origin.y + visibleSize.height - 2 * player2Mp->getContentSize().height - 200)); + addChild(two, 3); + } + else if (totalTime == 121) { + two->removeFromParent(); + one = Sprite::create("1.png"); + one->setPosition(Vec2(origin.x + 14 * player2Mp->getContentSize().width + 455 + , origin.y + visibleSize.height - 2 * player2Mp->getContentSize().height - 200)); + addChild(one, 3); + } + else if (totalTime == 120) { + one->removeFromParent(); + bothCanmove = true; + + countDown = Label::createWithTTF("120", "fonts/comicsansms.ttf", 48); + countDown->setPosition(visibleSize.width / 2, visibleSize.height / 2 + 250); + countDown->setColor(Color3B(0, 255, 0)); + countDown->enableShadow(); + addChild(countDown, 3); + } + else if (totalTime < 120) { + char str[10]; + sprintf(str, "%d", totalTime); /* 将int类型转化为字符串char*类型 */ + countDown->setString(str); + } + if (totalTime > 0) + totalTime--; + else if (totalTime == 0) + gameOver(); +} + +void OnlineGameScene::gameOver() +{ + _eventDispatcher->removeAllEventListeners(); + float delay = 3.0f; + /* 停止所有计时器操作 */ + this->unscheduleAllSelectors(); + string name1 = ShareSingleton::GetInstance()->player1; + string name2 = ShareSingleton::GetInstance()->player2; + int score1 = 0, score2 = 0; + +#pragma region WinLabel + winLabel = Label::createWithTTF("", "fonts/comicsansms.ttf", 108); + winLabel->setPosition(visibleSize.width / 2, visibleSize.height / 2); + winLabel->setColor(Color3B(255, 255, 255)); + addChild(winLabel, 2); + + //bothCanmove = false; + if (player1->getHp() > player2->getHp()) { + player1->win(); + player2->dead(); + winLabel->setString(name1 + " Win"); + score1 += 1; + score2 -= 1; + } + else if (player1->getHp() < player2->getHp()) { + player2->win(); + player1->dead(); + winLabel->setString(name2 + " Win"); + score1 -= 1; + score2 += 1; + } + else if (player1->getHp() == player2->getHp()) { + delay = 1.0f; + winLabel->setString("Draw!"); + } +#pragma endregion + +#pragma region 数据存储 + + if (!database->getBoolForKey("isExist")) { + database->setBoolForKey("isExist", true); + } + int one = database->getIntegerForKey(name1.c_str(), 0); + int two = database->getIntegerForKey(name2.c_str(), 0); + /*CCLOG("SSS%d", one); + CCLOG("TTT%d", two);*/ + + score1 = score1 + one; + score2 = score2 + two; + database->setIntegerForKey(name1.c_str(), score1); + database->setIntegerForKey(name2.c_str(), score2); + + database->flush(); + ShareSingleton::GetInstance()->xmlPath = FileUtils::getInstance()->getWritablePath() + "UserDefault.xml"; + //log("%s", ShareSingleton::GetInstance()->xmlPath); + +#pragma endregion + + /*弹出游戏结束界面, 需要延迟1s*/ + scheduleOnce(schedule_selector(OnlineGameScene::CallGameOverScene), delay); +} + +/* 集气状态 */ +void OnlineGameScene::isCharge(float dt) +{ + if (player1->getActionByTag(12) != nullptr) { + player1->setMp(player1->getMp() + 10); + } + else { + if (chargeEffect1 != NULL) { + chargeEffect1->removeFromParentAndCleanup(true); + chargeEffect1 = NULL; + } + } + if (player2->getActionByTag(12) != nullptr) { + player2->setMp(player2->getMp() + 10); + } + else { + if (chargeEffect2 != NULL) { + chargeEffect2->removeFromParentAndCleanup(true); + chargeEffect2 = NULL; + } + } +} + +/* 更新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(); + } +} + +void OnlineGameScene::CallGameOverScene(float dt) +{ + +#pragma region 弹出结束游戏场景 + + /*得到窗口的大小*/ + Size visibleSize = Director::sharedDirector()->getVisibleSize(); + RenderTexture *renderTexture = RenderTexture::create(visibleSize.width, visibleSize.height); + + /*遍历当前类的所有子节点信息,画入renderTexture中。 + 这里类似截图。*/ + renderTexture->begin(); + this->getParent()->visit(); + renderTexture->end(); + + auto newScene = GameOverScene::CreateScene(renderTexture); + /*结束游戏界面,压入场景堆栈。并切换到GameOverScene界面*/ + Director::sharedDirector()->pushScene(newScene); + +#pragma endregion +} + + +/* TODO:这里的对打逻辑存在一点小问题,有时候会出现两个人互打的情况; */ +void OnlineGameScene::hit(float dt) +{ + if (player2->isHitted || yIsBreak == true) { + if (player2->getActionByTag(12) != nullptr) { + player2->stopActionByTag(12); + if (chargeEffect2 != NULL) { + chargeEffect2->removeFromParentAndCleanup(true); + chargeEffect2 = NULL; + } + } + yIsBreak = true; + } + + if (player1->isHitted || fiveIsBreak == true) { + if (player1->getActionByTag(12) != nullptr) { + player1->stopActionByTag(12); + if (chargeEffect1 != NULL) { + chargeEffect1->removeFromParentAndCleanup(true); + chargeEffect1 = NULL; + } + } + fiveIsBreak = true; + } + /* 因为弗利萨尾巴太长,所以判定距离的方法得区别开来 */ + bool flag = false; + if (isFreiza) { + flag = abs(physicPlayer1->getPositionX() - physicPlayer2->getPositionX()) < physicPlayer1->getContentSize().width + physicPlayer2->getContentSize().width - 50; + } + else { + flag = abs(physicPlayer1->getPositionX() - physicPlayer2->getPositionX()) < physicPlayer1->getContentSize().width + physicPlayer2->getContentSize().width - 10; + } + 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()) < 40 && player2->getPositionY() < 120) { + player2->setFlippedX(!player1->isFlippedX()); + if (player2->isHitted == false) { + shareInstance->opponentFlipx = player1->isFlippedX(); + if (chargeEffect2 != NULL) { + chargeEffect2->removeFromParentAndCleanup(true); + chargeEffect2 = NULL; + } + 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()) < 40 && player1->getPositionY() < 120) { + player1->setFlippedX(!player2->isFlippedX()); + if (player1->isHitted == false) { + shareInstance->opponentFlipx = player2->isFlippedX(); + if (player1->getActionByTag(12) != nullptr) { + player1->stopActionByTag(12); + if (chargeEffect1 != NULL) { + chargeEffect1->removeFromParentAndCleanup(true); + chargeEffect1 = NULL; + } + } + createHitEffect(player1); + } + player1->hit(); + ball->removeFromParentAndCleanup(true); + player2RangedBalls.remove(ball); + break; + } + } + +#pragma endregion + +#pragma region 两球相撞动画 + bool end = false; + for (Sprite* ball2 : player2RangedBalls) { + for (Sprite* ball1 : player1RangedBalls) { + if (abs(ball2->getPositionX() - ball1->getPositionX()) < 15) { + auto explore_animation = Animation::createWithSpriteFrames(explore, 0.1f); + AnimationCache::getInstance()->addAnimation(explore_animation, "exploreAnimation"); + auto exploreAnimation = Animate::create(AnimationCache::getInstance()->getAnimation("exploreAnimation")); + SimpleAudioEngine::getInstance()->playEffect("music/explore.wav", false); + + Sprite* temp2 = ball2; + // 先从队列中移除 + ball2->setPosition(Vec2(ball2->getPosition().x + 15, ball2->getPosition().y)); + ball2->stopAllActions(); + ball2->runAction( + Sequence::create( + exploreAnimation + , CallFunc::create([temp2, this] { + temp2->removeFromParentAndCleanup(true); + player2RangedBalls.remove(temp2); + }) + , nullptr + ) + ); + + /*ball2->removeFromParentAndCleanup(true); + player2RangedBalls.remove(ball2);*/ + ball1->removeFromParentAndCleanup(true); + player1RangedBalls.remove(ball1); + end = true; + break; + } + } + if (end) { + break; + } + } +#pragma endregion +} + +/* 点击按钮发生被打状态,仅用于测试代码 */ +void OnlineGameScene::hitTest(Ref* sender) +{ + player2->win(); +} + + +/* 点击按钮发生死亡状态,仅用于测试代码 */ +void OnlineGameScene::deadTest(Ref* sender) +{ + if (!player1->isDead) + player1->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/SoundOn.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/SoundOff.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(); + float t = 0.5; + auto replacesense = CCTransitionFade::create(t, GamePauseScene::CreateScene(renderTexture)); + + /*将游戏界面暂停,压入场景堆栈。并切换到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; + ShareSingleton::GetInstance()->controlPause = false; + 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")); + } +} + +void OnlineGameScene::explosion() +{ + auto texture = Director::getInstance()->getTextureCache()->addImage("explosion.png"); + explore.reserve(8); + for (int i = 0; i < 5; i++) { + auto frame = SpriteFrame::createWithTexture(texture, CC_RECT_PIXELS_TO_POINTS(Rect(191 * i, 0, 191, 192))); + explore.pushBack(frame); + } + for (int i = 0; i < 2; i++) { + auto frame = SpriteFrame::createWithTexture(texture, CC_RECT_PIXELS_TO_POINTS(Rect(191 * i, 192, 191, 192))); + } + auto explore_animation = Animation::createWithSpriteFrames(explore, 0.1f); + AnimationCache::getInstance()->addAnimation(explore_animation, "exploreAnimation"); +} + + +#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..042bd56 --- /dev/null +++ b/Classes/Scenes/OnlineGameScene.h @@ -0,0 +1,163 @@ +/************************************************************************** + +* 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);/*判断 mp hp的变化*/ + + /*在游戏结束时,利用一次性监听器,延迟切换*/ + void CallGameOverScene(float dt); + + /* 倒计时update与倒计时相应函数 */ + void updateCountDown(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: + /* 倒计时组件 */ + int totalTime; + cocos2d::Label* countDown; + Sprite* round1; + Sprite* one; + Sprite* two; + Sprite* three; + Sprite* go; + bool bothCanmove; + bool isBreak; + + /* 名字 */ + cocos2d::Label* player1Name; + cocos2d::Label* player2Name; + cocos2d::Label* vs; + + /* 胜负 */ + cocos2d::Label* winLabel; + /* 蓄力中断判断 */ + bool yIsBreak; + bool fiveIsBreak; + + /* 爆裂帧动画 */ + void explosion(); + cocos2d::Vector explore; + + 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; + /* 一直跳跃与防守设置 */ + bool W_KeyState = false, UPKeyState = false; + bool S_KeyState = false, DOWNKeyState = false; + bool FIVEKeyState = false, Y_KeyState = false; + /*攻击炮的列表*/ + 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; + + /* 客户端 */ + SocketClient* client; + int uid = 0; +}; + +#endif /* __GameScene_SCENE_H__ */ diff --git a/Classes/Scenes/RankListScene.cpp b/Classes/Scenes/RankListScene.cpp new file mode 100644 index 0000000..89dedf0 --- /dev/null +++ b/Classes/Scenes/RankListScene.cpp @@ -0,0 +1,130 @@ +#include "RankListScene.h" +#include "SimpleAudioEngine.h" +#include "GameSettingScene.h" +#include "../ShareSingleton.h" +#include "GamePauseScene.h" +#include +//#include +using namespace tinyxml2; +using namespace CocosDenshion; +USING_NS_CC; + +Scene* RankListScene::createScene() +{ + return RankListScene::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 RankListSceneScene.cpp\n"); +} + +/* 初始化场景函数 */ +bool RankListScene::init() +{ +#pragma region Cocos2dx自动生成的内容:一些基本配置 + + if (!Scene::init()) + { + return false; + } + auto visibleSize = Director::getInstance()->getVisibleSize(); + Vec2 origin = Director::getInstance()->getVisibleOrigin(); + +#pragma endregion + CCLOG(ShareSingleton::GetInstance()->xmlPath.c_str()); + +#pragma region 排行榜前5名 + handleRankList(); + +#pragma endregion + + +#pragma region UI界面 背景图片 + + auto bg = Sprite::create("bg/startSceneBackground.png"); + bg->setPosition(visibleSize / 2); + addChild(bg, 0); + +#pragma endregion + +#pragma region 预添加音效和背景音乐 + + auto audio = SimpleAudioEngine::getInstance(); + /*预加载并循环播放背景音乐*/ + audio->playBackgroundMusic("music/RankListSceneBgm.mp3", true); + audio->setBackgroundMusicVolume(0.80); + + /*预加载音效*/ + audio->preloadEffect("music/ClickCamera.wav"); + audio->setEffectsVolume(0.80); + + /*返回菜单按钮*/ + auto ReturnToMenuSceneItem = CCMenuItemImage::create( + "button/back2-normal.png", + "button/back2-selected.png", + this, + menu_selector(GamePauseScene::ReturnToMenuSceneCallback) + ); + ReturnToMenuSceneItem->setPosition(Vec2(visibleSize.width / 2, 80)); + + Menu* pMenu = Menu::create(ReturnToMenuSceneItem, NULL); + pMenu->setPosition(Vec2::ZERO); + this->addChild(pMenu, 2); +#pragma endregion + CCLOG(ShareSingleton::GetInstance()->xmlPath.c_str()); + return true; +} + +/* 从xml文件得到排行榜 */ +void RankListScene::handleRankList() +{ + auto visibleSize = Director::getInstance()->getVisibleSize(); + Vec2 origin = Director::getInstance()->getVisibleOrigin(); + + string xmlPath = ShareSingleton::GetInstance()->xmlPath; + auto doc = new tinyxml2::XMLDocument(); + doc->Parse(FileUtils::getInstance()->getStringFromFile(xmlPath.c_str()).c_str()); + auto root = doc->RootElement(); + + map rankList; + for (auto e = root->FirstChildElement() + 1; e; e = e->NextSiblingElement()) + { + int number = 0; + sscanf(e->FirstChild()->Value(), "%d", &number); + rankList.insert(pair(e->Value(), number)); + } + int count = 5 > rankList.size() ? rankList.size() : 5; + for (int x = 0; x < count; ++x) { + pair temp("NONE", -1000); + for (auto m = rankList.begin(); m != rankList.end(); m++) { + if (m->second > temp.second) { + temp.first = m->first; + temp.second = m->second; + } + } + for (auto m = rankList.begin(); m != rankList.end(); m++) { + if (m->second == temp.second) { + rankList.erase(m); + break; + } + } + + int score = temp.second; + char cStr[10]; + sprintf(cStr, "%d", score); + + char cStr2[10]; + sprintf(cStr2, "%d", x+1); + string str1 = cStr2; + string str = str1 + ". " + temp.first+ ": " + cStr; + + Label* rank = Label::createWithTTF(str.c_str(), "fonts/comicsansms.ttf", 60); + rank->setPosition(visibleSize.width / 2, visibleSize.height - 80 * (x + 3.5)); + rank->setColor(Color3B(0, 255, 0)); + ranks.push_back(rank); + addChild(rank, 1); + } +} \ No newline at end of file diff --git a/Classes/Scenes/RankListScene.h b/Classes/Scenes/RankListScene.h new file mode 100644 index 0000000..12e1c4f --- /dev/null +++ b/Classes/Scenes/RankListScene.h @@ -0,0 +1,35 @@ +/************************************************************************** + +* Copyright: + +* Author: WJH + +* Date: 2018-07-02 + +* Description: 游戏排行榜界面 + +**************************************************************************/ + +#ifndef __RankLisScene_SCENE_H__ +#define __RankLisScene_SCENE_H__ + +#include "cocos2d.h" +using namespace std; +#include + +class RankListScene : public cocos2d::Scene +{ +private: + list ranks; + +public: + static cocos2d::Scene* createScene(); + + virtual bool init(); + + void handleRankList(); + /* implement the "static create()" method manually */ + CREATE_FUNC(RankListScene); +}; + +#endif /* __RankLisScene_SCENE_H__ */ diff --git a/Classes/Scenes/SelectBackgroundScene.cpp b/Classes/Scenes/SelectBackgroundScene.cpp index 97f0599..6af8972 100644 --- a/Classes/Scenes/SelectBackgroundScene.cpp +++ b/Classes/Scenes/SelectBackgroundScene.cpp @@ -1,6 +1,9 @@ #include "SelectBackgroundScene.h" #include "SimpleAudioEngine.h" #include "ExampleGameScene.h" +#include "../ShareSingleton.h" +#include "InputNameScene.h" +using namespace CocosDenshion; Scene* SelectBackgroundScene::createScene() { @@ -32,48 +35,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, 130)); + + /*选择地图字样*/ + 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 +121,42 @@ bool SelectBackgroundScene::init() /* 高亮被选择的游戏场景 */ void SelectBackgroundScene::bgSelectedCallback(Ref* pSender, int option) { + if (ShareSingleton::GetInstance()->controlVoice) + 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 +167,12 @@ void SelectBackgroundScene::bgSelectedCallback(Ref* pSender, int option) /* 开始游戏 */ void SelectBackgroundScene::startGame(Ref * pSender) { - /* Todo:美工人员请替换这里的转场特效 */ float t = 1.2f; - auto newScene = ExampleGameScene::createScene(); - auto replacesense = CCTransitionPageTurn::create(t, newScene, false); + if (ShareSingleton::GetInstance()->controlVoice) + SimpleAudioEngine::getInstance()->playEffect("music/ClickCamera.wav", false, 1.0f, 0.0f, 1.0f); + ShareSingleton::GetInstance()->selectedBackground = this->selectedBackground; + auto newScene = InputNameScene::createScene(); + 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..751b915 100644 --- a/Classes/Scenes/SelectRoleScene.cpp +++ b/Classes/Scenes/SelectRoleScene.cpp @@ -1,9 +1,12 @@ #include "SelectRoleScene.h" #include "SimpleAudioEngine.h" #include "WelcomeScene.h" +#include "ShareSingleton.h" #include "SelectBackgroundScene.h" #include +using namespace CocosDenshion; + Scene* SelectRoleScene::createScene() { @@ -35,88 +38,108 @@ bool SelectRoleScene::init() /* Todo:美工人员请将这里的图片替换为你选的素材和按你的需要设置位置 */ /* 这里的角色的变量名仅仅是为了基本框架的构建,请在选好角色之后替换这些变量名 */ + /*游戏背景*/ + auto bg = Sprite::create("bg/selectRoleSceneBackground.png"); + bg->setPosition(visibleSize / 2); + addChild(bg, 0); + /* 可选角色1 */ roleItem1 = MenuItemImage::create( - "role1.png", - "role1.png", + "role/role1-Goku.png", + "role/role1-Goku.png", CC_CALLBACK_1(SelectRoleScene::roleSelectedCallback, this, '1')); roleItem1->setPosition(Vec2(400, 500)); /* 可选角色2 */ roleItem2 = MenuItemImage::create( - "role2.png", - "role2.png", + "role/role2-Vegeta.png", + "role/role2-Vegeta.png", CC_CALLBACK_1(SelectRoleScene::roleSelectedCallback, this, '2')); roleItem2->setPosition(Vec2(600, 500)); /* 可选角色3 */ roleItem3 = MenuItemImage::create( - "role3.png", - "role3.png", + "role/role3-Kid_Buu.png", + "role/role3-Kid_Buu.png", CC_CALLBACK_1(SelectRoleScene::roleSelectedCallback, this, '3')); roleItem3->setPosition(Vec2(400, 300)); /* 可选角色4 */ roleItem4 = MenuItemImage::create( - "role4.png", - "role4.png", + "role/role4-Frieza.png", + "role/role4-Frieza.png", CC_CALLBACK_1(SelectRoleScene::roleSelectedCallback, this, '4')); roleItem4->setPosition(Vec2(600, 300)); /* 确定按钮 */ 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->setPosition(Vec2(850, 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->setPosition(Vec2(150, 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/role-1.png"); + auto role2 = Sprite::create("role/role-2.png"); + role1->setPosition(Vec2(850, 500)); + role2->setPosition(Vec2(150, 500)); + addChild(role1, 1); + addChild(role2, 1); + + + /* 当你选择了一个角色之后,将会显示出该角色的大图在左下角或右下角,在此之前该图片是不可见的 */ /* 已选角色1 */ - roleItem1_big = Sprite::create("role1-big.png"); + roleItem1_big = Sprite::create("role/role1-big-Goku.png"); roleItem1_big->setPosition(Vec2(0, 0)); roleItem1_big->setVisible(false); this->addChild(roleItem1_big, 0); - roleItem2_big = Sprite::create("role2-big.png"); + roleItem2_big = Sprite::create("role/role2-big-Vegeta.png"); roleItem2_big->setPosition(Vec2(0, 0)); roleItem2_big->setVisible(false); this->addChild(roleItem2_big, 0); - roleItem3_big = Sprite::create("role3-big.png"); + roleItem3_big = Sprite::create("role/role3-big-Kid_Buu.png"); roleItem3_big->setPosition(Vec2(150, 300)); roleItem3_big->setVisible(false); this->addChild(roleItem3_big, 0); - roleItem4_big = Sprite::create("role4-big.png"); + roleItem4_big = Sprite::create("role/role4-big-Frieza.png"); roleItem4_big->setPosition(Vec2(850, 300)); roleItem4_big->setVisible(false); this->addChild(roleItem4_big, 0); /* P1标签和P2标签:在未选中状态是不可见的 */ - p1Sprite = Sprite::create("p1.png"); - p1Sprite->setPosition(Vec2(400, 500)); + p1Sprite = Sprite::create("role/p1.png"); + p1Sprite->setPosition(Vec2(0, 0)); p1Sprite->setOpacity(200); p1Sprite->setVisible(false); this->addChild(p1Sprite, 2); - p2Sprite = Sprite::create("p2.png"); - p2Sprite->setPosition(Vec2(0, 0)); + p2Sprite = Sprite::create("role/p2.png"); + p2Sprite->setPosition(Vec2(400, 500)); p2Sprite->setOpacity(200); p2Sprite->setVisible(false); this->addChild(p2Sprite, 2); @@ -136,40 +159,69 @@ bool SelectRoleScene::init() void SelectRoleScene::menuBackCallback(Ref* pSender) { float t = 1.2f; + if (ShareSingleton::GetInstance()->controlVoice) + 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) { + if (ShareSingleton::GetInstance()->controlVoice) + SimpleAudioEngine::getInstance()->playEffect("music/ClickCamera.wav", false, 1.0f, 0.0f, 1.0f); + if (!player1Selected) { /* 当前是为player1选择角色 */ invisibleRolesBig(); switch (option) /* 判断选择的是哪一个角色 */ { case '1': p1Sprite->setPosition(400, 500); /* 设置p1标签的位置 */ - roleItem1_big->setPosition(150, 300); /* 设置所选角色的大图的位置 */ + roleItem1_big->setPosition(850, 300); /* 设置所选角色的大图的位置 */ roleItem1_big->setVisible(true); + roleItem2_big->setVisible(false); + roleItem3_big->setVisible(false); + roleItem4_big->setVisible(false); + + /////////////////////////////////////////////// qiuyihao + player1Name = "Goku"; /*记录选择的角色名*/ + alreadySelected = 1; /* 设置已经选择的角色编号,避免另一个玩家选择了同样的角色 */ break; case '2': p1Sprite->setPosition(600, 500); - roleItem2_big->setPosition(150, 300); + roleItem2_big->setPosition(850, 300); + roleItem1_big->setVisible(false); roleItem2_big->setVisible(true); + roleItem3_big->setVisible(false); + roleItem4_big->setVisible(false); + + player1Name = "Vegeta"; alreadySelected = 2; break; case '3': p1Sprite->setPosition(400, 300); - roleItem3_big->setPosition(150, 300); + roleItem3_big->setPosition(850, 300); + roleItem1_big->setVisible(false); + roleItem2_big->setVisible(false); roleItem3_big->setVisible(true); + roleItem4_big->setVisible(false); + + player1Name = "Kid_Buu"; + alreadySelected = 3; break; case '4': p1Sprite->setPosition(600, 300); - roleItem4_big->setPosition(150, 300); + roleItem4_big->setPosition(850, 300); + roleItem1_big->setVisible(false); + roleItem2_big->setVisible(false); + roleItem3_big->setVisible(false); roleItem4_big->setVisible(true); + + player1Name = "Frieza"; + alreadySelected = 4; break; default: @@ -187,23 +239,27 @@ void SelectRoleScene::roleSelectedCallback(Ref* pSender, char option) { case '1': p2Sprite->setPosition(400, 500); /* 设置p2标签的位置 */ - roleItem1_big->setPosition(850, 300); /* 设置所选角色的大图的位置 */ + roleItem1_big->setPosition(150, 300); /* 设置所选角色的大图的位置 */ roleItem1_big->setVisible(true); + player2Name = "Goku"; break; case '2': p2Sprite->setPosition(600, 500); - roleItem2_big->setPosition(850, 300); + roleItem2_big->setPosition(150, 300); roleItem2_big->setVisible(true); + player2Name = "Vegeta"; break; case '3': p2Sprite->setPosition(400, 300); - roleItem3_big->setPosition(850, 300); + roleItem3_big->setPosition(150, 300); roleItem3_big->setVisible(true); + player2Name = "Kid_Buu"; break; case '4': p2Sprite->setPosition(600, 300); - roleItem4_big->setPosition(850, 300); + roleItem4_big->setPosition(150, 300); roleItem4_big->setVisible(true); + player2Name = "Frieza"; break; default: break; @@ -256,25 +312,27 @@ void SelectRoleScene::invisibleRolesBig() void SelectRoleScene::confirmCallback(Ref* pSender, char option) { auto particle = ParticleFlower::create(); + if (ShareSingleton::GetInstance()->controlVoice) + SimpleAudioEngine::getInstance()->playEffect("music/ClickCamera.wav", false, 1.0f, 0.0f, 1.0f); switch (option) { case '1': player1Selected = true; - /* Todo:这里只是我添加的一个简单粒子特效,美工人员请做更好的优化 */ - particle->setScale(3.0f); - particle->setPosition(150,100); - player1ConfirmItem->addChild(particle); - particle->runAction(Sequence::create(DelayTime::create(1.0f), RemoveSelf::create(true), nullptr)); return; case '2': break; default: return; } + + /*将选择好的角色名传入共享单例ShareSingleton */ + ShareSingleton::GetInstance()->player1 = player1Name; + ShareSingleton::GetInstance()->player2 = player2Name; + /* 如果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/SelectRoleScene.h b/Classes/Scenes/SelectRoleScene.h index 8752fd1..8b9da0d 100644 --- a/Classes/Scenes/SelectRoleScene.h +++ b/Classes/Scenes/SelectRoleScene.h @@ -54,6 +54,8 @@ class SelectRoleScene : public cocos2d::Scene /* 已经被选择的角色 */ int alreadySelected = 0; + std::string player1Name, player2Name; + }; #endif 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..48ab256 100644 --- a/Classes/Scenes/WelcomeScene.cpp +++ b/Classes/Scenes/WelcomeScene.cpp @@ -1,6 +1,10 @@ #include "WelcomeScene.h" #include "SimpleAudioEngine.h" - +#include "GameSettingScene.h" +#include "ShareSingleton.h" +#include "OnlineGameScene.h" +#include "RankListScene.h" +using namespace CocosDenshion; USING_NS_CC; Scene* WelcomeScene::createScene() @@ -30,40 +34,102 @@ 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); + + /* 添加对话框*/ + auto welcomeDialogue = Sprite::create("setting/welcome-Dialogue.png"); + welcomeDialogue->setPosition(Vec2(450, 400)); + addChild(welcomeDialogue, 1); + +#pragma endregion + + + +#pragma region 预添加音效和背景音乐 + + auto audio = SimpleAudioEngine::getInstance(); + /*预加载并循环播放背景音乐*/ + if (ShareSingleton::GetInstance()->controlVoice) + audio->playBackgroundMusic("music/WelcomeSceneBgm.mp3", true); + audio->setBackgroundMusicVolume(0.80); - /* Todo:美工人员请在这里添加为WelcomeScene添加UI界面的美化 */ + /*预加载音效*/ + 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(500, 250)); #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, 250)); + +#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(650, 80)); + +#pragma endregion + +#pragma region 排行榜按钮 + + auto rankListItem = MenuItemImage::create( + "button/ranklist-normal.png", + "button/ranklist-selected.png", + CC_CALLBACK_1(WelcomeScene::rankListCallback, this)); + + //rankListItem->setPosition(Vec2(origin.x + visibleSize.width / 2, origin.y + visibleSize.height / 3 - 200)); + rankListItem->setPosition(Vec2(800, 170)); #pragma endregion - auto menu = Menu::create(startItem, closeItem, NULL); +#pragma region 联网按钮 + + auto onlineItem = MenuItemImage::create( + "button/online-normal.png", + "button/online-selected.png", + CC_CALLBACK_1(WelcomeScene::onlineCallback, this)); + + //rankListItem->setPosition(Vec2(origin.x + visibleSize.width / 2, origin.y + visibleSize.height / 3 - 200)); + onlineItem->setPosition(Vec2(500, 170)); + +#pragma endregion + + auto menu = Menu::create(startItem, closeItem, settingItem, rankListItem, onlineItem, NULL); menu->setPosition(Vec2::ZERO); this->addChild(menu, 1); return true; @@ -72,7 +138,9 @@ bool WelcomeScene::init() /* 关闭游戏 */ void WelcomeScene::menuCloseCallback(Ref* pSender) { - Director::getInstance()->end(); + if (ShareSingleton::GetInstance()->controlVoice) + 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 +149,46 @@ void WelcomeScene::menuCloseCallback(Ref* pSender) void WelcomeScene::startGameCallback(Ref* pSender) { - float t = 1.2f; + if (ShareSingleton::GetInstance()->controlVoice) + 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) +{ + if (ShareSingleton::GetInstance()->controlVoice) + 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); + +} + +/* 排行榜调用函数 */ +void WelcomeScene::rankListCallback(Ref * pSender) +{ + SimpleAudioEngine::getInstance()->playEffect("music/ClickCamera.wav", false, 1.0f, 0.0f, 1.0f); + + float t = 0.8f; + auto newScene = RankListScene::createScene(); + auto replacescene = CCTransitionFade::create(t, newScene); + Director::sharedDirector()->replaceScene(replacescene); +} + +void WelcomeScene::onlineCallback(Ref* pSender) { + float t = 0.8f; + auto newScene = OnlineGameScene::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..b1dd170 100644 --- a/Classes/Scenes/WelcomeScene.h +++ b/Classes/Scenes/WelcomeScene.h @@ -28,6 +28,13 @@ class WelcomeScene : public cocos2d::Scene void startGameCallback(Ref * pSender); + void settingGameCallback(Ref* pSender); + + void rankListCallback(Ref* pSender); + + void onlineCallback(Ref* pSender); + + /* implement the "static create()" method manually */ CREATE_FUNC(WelcomeScene); }; diff --git a/Classes/ShareSingleton.cpp b/Classes/ShareSingleton.cpp index c5f27a2..42a27c9 100644 --- a/Classes/ShareSingleton.cpp +++ b/Classes/ShareSingleton.cpp @@ -6,6 +6,8 @@ class ShareSingleton public: bool opponentFlipx = false; + int selectedBackground = 1; + bool controlVoice = true; static ShareSingleton* GetInstance() { diff --git a/Classes/ShareSingleton.h b/Classes/ShareSingleton.h index e2331cb..a437418 100644 --- a/Classes/ShareSingleton.h +++ b/Classes/ShareSingleton.h @@ -11,6 +11,8 @@ **************************************************************************/ #ifndef SHARESINGLETON_H #define SHARESINGLETON_H + +using namespace std; class ShareSingleton { private: @@ -22,6 +24,27 @@ class ShareSingleton return &Instance; } bool opponentFlipx = false; + + /*代表选择地图序号*/ + int selectedBackground = 1; + + /*全局变量,用于确定音效是否需要关闭 qyh*/ + bool controlVoice = true; + + /*全局变量,主要用于确定暂停场景,暂停(继续)图标是否需要变化, + 为真,图标为播放状态,为假,图标为暂停状态*/ + bool controlPause = true; + + /* 两个玩家名字 */ + string user1 = "NONE"; + string user2 = "NONE"; + + /*两个角色名字*/ + string player1 = "NONE"; + string player2 = "NONE"; + + string xmlPath = FileUtils::getInstance()->getWritablePath() + "UserDefault.xml"; + }; #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..d85f75f 100644 --- a/README.md +++ b/README.md @@ -1,165 +1,24 @@ -# Cocos2dxProject Cocos2dx 鏈熸湯椤圭洰 +# Cocos2dxProject Cocos2dx 鏈熸湯椤圭洰 -## 涓 銆侀」鐩垎宸ュ拰鍗犳瘮 +* 鏈鍚庝换鍔★紝鎴鏃ユ湡涓20鍙 -### 锛堜竴锛夊ぇ鑷磋姹 + * 寤鸿豹锛氫笁涓猙ug瑙e喅锛 -| 浠诲姟 | 鍗犳瘮 | 瀹屾垚浜哄憳 | 鏃堕棿 | -| ------------------------------ | --------------- | ---------------------- | ----------------------- | -| 鏈枃妗g殑缂栧啓 | 1% | 閭辨檽瑁 | | -| 寤虹珛鏁翠釜椤圭洰鍩烘湰鐨勭被鏂囦欢鍜屾鏋 | 16% | 閭辨檽瑁 | 6/16-6/18 | -| 绗竴涓簿鐏 | 14% | 閭垫纭 | 6/19-6/23 | -| 缇庡寲鐣岄潰 + 闊充箰 | 16% | 閭卞娴 | 6/19-6/28銆侀」鐩暣涓繃绋 | -| 鍏朵粬绮剧伒鐨勫埗浣 | 15%锛堟瘡浜哄崰5%锛 | 閭卞娴╋紝閭辨檽瑁曪紝鐜嬪仴璞 | 6/24-6/28 | -| 鍚堝苟浠g爜 | 6% | 閭垫纭 | 6/29-7/1 | -| 鍙屼汉瀵规垬 | 7% | 鐜嬪仴璞 | 7/1-7/4 | -| 璁剧疆鎺掕姒 | 7% | 鐜嬪仴璞 | 7/4-7/8 | - - -* 鍏充簬鏃堕棿鐨勫畨鎺掞紝鍏跺疄鍙互浜掔浉鍗忚皟鐒跺悗鎻愭棭寮濮嬬殑锛氭瘮濡傝璁剧疆鎺掕姒滅殑浜猴紝鍙互鍏堟壘鍙屼汉瀵规垬鐨勪汉鎻愪緵寰楀埌鍒嗘暟鐨勬帴鍙o紝鐒跺悗灏卞彲浠ュ厛鍐欏暒锛涘啀姣斿璇村仛绗竴涓簿鐏电殑浜猴紝鍙互鐜板湪灏卞彲浠ユ壘绱犳潗浜嗗晩锛屽暒鍟﹀暒銆 -* 椤哄甫涓鎻愶紝涔熷彲浠ュ悎浣滃畬鎴愶紝鑷繁鍗忚皟浣犱滑鍚堜綔鐨勯儴鍒嗙殑鍗犳瘮灏辫 -* 涓嬮潰鐨勬槸闄勫姞鍔熻兘锛岀偒鎶椤瑰晩鍟婂晩锛岃繖涓氨鑷憡濂嬪媷鍚э紝瑕佸啓鐨勮嚜宸卞啓杩涘幓 - -| 鍔熻兘 | 鍗犳瘮 | 瀹屾垚浜哄憳 | -| ---------------------------------------- | ---- | -------- | -| 浼櫤鑳藉疄鐜颁汉鏈轰簰鎵擄紙鑷冲皯瑕佺湅璧锋潵鏅鸿兘鐐癸級 | 6% | | -| 鑱旂綉瀵规垬锛666锛 | 7% | | -| 鍦烘櫙鐨勭Щ鍔 | 5% | | - -* 鍦烘櫙绉诲姩锛氬氨鏄竴涓ぇ鍦烘櫙鍢涳紝瑙掕壊绉诲姩鐨勬椂鍊欒鑹蹭竴鐩撮兘鏄鍦ㄥ睆骞曠殑涓績锛屽弻浜哄鎵撳彲鑳界敤涓嶄簡锛屽彲鏄汉鏈轰簰鎵撳拰鑱旂綉瀵规垬杩樻槸鍙互鐢ㄧ殑鍢 -* 濡傛灉鍒版渶鍚庨檮鍔犲姛鑳芥病鏃堕棿鍐欑殑璇濓紝灏辨寜姣斾緥鍒嗛厤缁欏熀鏈姹 - -### 锛堜簩锛夎缁嗚姹 - -#### 1. 寤虹珛鏁翠釜椤圭洰鍩烘湰鐨勭被鏂囦欢鍜屾鏋 - -* 宸插畬鎴 - -#### 2. 绗竴涓簿鐏 - -涓囦簨寮澶撮毦锛屾墍浠ユ垜浠渶瑕佹湁涓涓汉娣诲姞绗竴涓簿鐏碉紝鐒跺悗鍏朵粬鐨勪汉鍦ㄨ繖涓汉鐨勪唬鐮佷笂鍐嶅缓绔嬭嚜宸辩殑绮剧伒绫诲嵆鍙紱杩欎釜绫婚渶瑕佺户鎵縋layerSprite绫伙紝涓嬮潰鏄簿鐏电殑浜嬩欢锛屽寘鎷絾涓嶉檺浜庯細 - -* 杩戞敾锛岃繙鏀 -* 宸﹀彸绉诲姩锛屽悜涓婅烦 -* 琚敾鍑 -* 姝讳骸 - -闇瑕佹敞鎰忕殑鏄洜涓哄悗闈㈢殑绮剧伒閮芥槸鍦ㄨ繖涓殑鍩虹涓婂畬鎴愮殑锛屾墍浠ヨ繖涓被鐨勫疄鐜拌鐢ㄥ績鐐癸紝鍙互娣诲姞鏇村鐐妧鐨勪笢瑗匡紝喙戜箾鈼′箾喙戯細鍐插埡锛岄棯閬匡紝钃勫姏锛屽ぇ鎷涖傘傘傘傘傘 - -涓轰簡纭繚浣犺繖閮ㄥ垎鐨勫姛鑳芥槸鍋ュ叏鐨勶紝鐢ㄨ嚜宸卞缓濂界殑涓や釜瀵硅薄浜掓墦鍚с - -#### 3. 缇庡寲鐣岄潰 + 闊充箰 - -濡傛灉绗竴涓樁娈电殑浜轰唬鐮佸畬鎴愮殑姣旇緝濂界殑璇濓紝杩欎竴闃舵鐨勪汉涓昏鐨勪换鍔″氨鏄浛鎹㈢礌鏉愬拰娣诲姞鍦烘櫙鍥剧墖涔嬬被鐨勬搷浣滀簡锛岀浉瀵硅岃█鏄笉鏄浉褰撶畝鍗曞晩锛屽弽姝f垜涓嶅仛銆 -椤哄甫涓鎻愶紝缇庡寲鐣岄潰鍖呮嫭鏁翠釜椤圭洰闃舵鐨勭晫闈㈢編鍖栧拰闊充箰銆 - -#### 4. 鍏朵粬绮剧伒鐨勫埗浣 - -闄や簡鍒朵綔绗竴涓簿鐏电殑浜猴紝鍏朵粬鐨勬瘡涓汉鑷冲皯杩橀渶瑕佸湪绗竴涓簿鐏电殑鍩虹鍦ㄨ繘琛屼慨鏀癸紝鍋氫竴涓嚜宸辩簿鐏碉紝鐩镐俊宸茬粡鏈変簡绗竴浠戒唬鐮侊紝杩欓噷搴旇涓嶆槸寰堥毦鍚с - -#### 5. 鍚堝苟浠g爜 - -濂戒簡锛屾湁浜嗕笂闈㈢殑浠g爜鍐呭锛屾垜浠氨闇瑕佸悎骞朵唬鐮佷簡锛屽悎骞朵唬鐮佸悗闇瑕佸疄鐜帮細 - -- 鍚姩绋嬪簭锛岃繘鍏elcomeScene鐣岄潰锛岀偣鍑诲紑濮嬫父鎴忥紝杩涘叆MenuScene锛涚偣鍑荤粨鏉熸父鎴忥紝缁撴潫绋嬪簭锛 -- 涓婇潰杩涘叆MenuScene涔嬪悗锛屽彲浠ラ夋嫨鐜╁鍜屽満鏅紙杩欐鐪熺殑鍙互閫夊摝锛夛紝鐐瑰嚮纭畾杩涘叆GameScene锛岀偣鍑昏繑鍥炲洖鍒癢elcomeScene -- 涓婇潰杩涘叆GameScene涔嬪悗锛岀偣鍑籛ASD锛屸啈锛屸啇锛屸啋锛孞锛堣繎鏀伙級锛孠锛堣繙鏀伙級锛屼細瀵瑰簲瑙﹀彂PlayerSprite鐨勫搴斿嚱鏁帮紝鍔ㄧ敾甯т細瀵瑰簲鐨勬樉绀猴紝浣嗘槸纰版挒杩樻槸娌℃湁鍝嶅簲鐨勩 -- 涓や釜鍗曚緥绫昏兘姝e父浣跨敤 - -#### 6. 鍙屼汉瀵规墦 - -鐜板湪灏辫瀹炵幇鏁翠釜娓告垙鐨勬渶閲嶈鐨勫姛鑳戒簡锛涗綘闇瑕佸湪鍓嶉潰鐨勫悎骞跺ソ鐨勪唬鐮佷笂锛屽畬鎴愪袱涓鑹插鎵撶殑鍔熻兘锛涗笂闈㈠簲璇ュ凡缁忓熀鏈畬鎴愪簡杩欓儴鍒嗛渶瑕佷娇鐢ㄧ殑鍑芥暟锛岃繖閲岃鍋氱殑涔熷氨鏄鎾炵殑鏃跺欒皟鐢ㄥ搴旂殑鍑芥暟锛屽簲璇ヤ笉鏄緢闅惧惂銆傘傘傘 - -鏆傛椂鐨勮姹傦細 -* 姝讳骸鐨勬鍚庣粨鏉熸父鎴忥紱 -* 杩樻湁璁$畻涓や釜鐜╁鐨勫緱鍒嗭紱 -* 鍊掕鏃讹紱 -* 鍏朵粬涓浜涘熀鏈殑閫昏緫锛屾瘮濡傝濡傛灉涓や釜浜虹珯鐨勫緢杩戜簰鐩告敾鍑伙紝鎵嬫參鐨勫彧鑳借鎵擄紝涓嶈兘涓や釜鍚屾椂閮藉湪鏀诲嚮瀵规柟鍚с - - -#### 7. 璁剧疆鎺掕姒 - -缁堜簬鍟婏紝鎴戜滑鐨勪箣鍓嶅缓绔嬬殑鏁版嵁搴撶被鍙互鐢ㄤ簡锛屼箣鍓嶈繕涓鐩存槸涓涓┖鐨勫崟渚嬬被鍛紝鐜板湪鍙互淇濆瓨浜嗭紝鑷充簬鎺掕姒滄庝箞瀹炵幇锛岃嚜宸卞畾鍚с - -#### 8. 瀹氭湡鍒锋 - -瀹氭湡鍒蜂竴浜涙嚭鏉ワ紝鍙互鎵撳崌mp鍟婏紝杩欎釜鎬偦閫间竴鐐逛篃娌″叧绯荤殑锛岀孩钃漛uf - -## 锛堜笁锛変唬鐮佸拰娉ㄩ噴瑙勮寖 - -杩欐璇峰湪鎸囧畾鏃堕棿瀹屾垚浠g爜鐨勬椂鍊欏悓鏃舵坊鍔犳敞閲婏紝浠g爜娉ㄩ噴瑕佹眰璇峰弬鑰冨熀鏈鏋剁殑浠g爜锛屼竴浜涘熀鏈殑瑕佹眰锛 - -* 浣跨敤/**/娉ㄩ噴 -* 涓鏍峰姛鑳界殑浠g爜鐢╮egion鍦堣捣鏉 -* 绛夌瓑 - -*** - -### 鏇存柊鍐呭锛2018/06/26 - -* 鏈鏂扮増璇蜂笅杞絤aster鍒嗘敮鐨勪唬鐮 - -#### 闄勶細绮剧伒绱犳潗濡備綍璁剧疆锛堣繖閲屽彧鏄垜鐢ㄧ殑鏂规硶锛屽彲鑳芥湁鏇存柟渚跨殑鏂规硶锛夛細 - -* 棣栧厛锛屾壘涓寮犻忔槑鐨刾ng鍥剧墖锛堜篃鍙互鑷繁p锛屼竴鑸敤浜庢父鎴忕礌鏉愮殑绾壊鍥剧墖鐢ㄩ瓟妫抪涓涓嬪氨鍙互浜嗭級锛屽 - -![](http://pic.caigoubao.cc/590732/GridWorld/Kid_Buu2.png) - -* 鐒跺悗锛宲s锛屽彲浠ョ敤鍒囩墖锛堣嚜宸辩櫨搴︽庝箞鐢級锛宲瀹岀殑缁撴灉锛堥渶瑕佹敞鎰忓乏鍙充笉鑳界暀绌虹櫧锛屼笂鍋跺皵鍙互锛堣繖涓瘯涓涓嬪氨鐭ラ亾涓轰粈涔堜簡锛屽洜涓烘槸鎸変腑蹇冨畾浣嶇殑锛夛紝鎬庝箞鍘婚忔槑鐧惧害涓涓嬪氨鐭ラ亾浜嗭級锛 - -![](http://pic.caigoubao.cc/590732/GridWorld/Kid_Buu_output.PNG) - -* 鐒跺悗锛屼笅涓涓蒋浠讹紝TexturePackerGUI锛屽鍏ユ暣涓枃浠跺す锛岀劧鍚庣偣鍑籶ublish sprite sheet锛堝湪涓婇潰鐨勮彍鍗曟爮锛夛紝鐒跺悗灏辨湁浜唒list鏂囦欢銆 - -### 鏇存柊鍐呭锛2018/06/24 - -涓昏璇翠竴涓嬪叧浜庡姩鐢诲抚鐨勪簨锛屽姩鐢讳富瑕佸垎涓轰袱绫伙細鍔ㄤ綔绫诲拰鐗规晥绫汇 - -鎵鏈夊姩鐢诲抚閮藉湪PlayerSprite绫诲垵濮嬪寲锛屽姩浣滅被鍔ㄧ敾鍦≒layerSprite绫婚噷鐢熸垚锛岀壒鏁堢被鍔ㄧ敾鍦‥xampleGameScene锛堟父鎴忎富鐣岄潰锛夌被閲岀敓鎴愩 - -* 娉ㄦ剰 - -1. 琚墦椋炵殑鍔ㄧ敾锛坅ttackAway锛夛細琚墦椋炵殑鍔ㄧ敾鐢变袱涓姩鐢绘瀯鎴愶紝绗竴涓槸鍦ㄧ┖涓鐨勫姩鐢伙紝鍙湁1甯э紝绗簩涓槸钀藉湴鍚庤捣韬殑鍔ㄧ敾锛屾湁澶氬抚锛屽敖閲忔寜鐓ц繖涓ā寮忋 -2. 鐢ㄦ潵鍒濆鍖栧姩浣滅被鍔ㄧ敾鐨勬枃浠讹細"瑙掕壊鍚.png"鍜"瑙掕壊鍚.plist" -3. 鐢ㄦ潵鍒濆鍖栫壒鏁堢被鍔ㄧ敾鐨勬枃浠讹細"瑙掕壊鍚峔_boom.png"鍜"瑙掕壊鍚峗boom.plist" -4. Charactor绫伙細杩欎釜绫绘槸鐢ㄦ潵瀛樺偍涓嶅悓瑙掕壊鍦ㄥ姩鐢诲抚鐨勯夋嫨涓婄殑鏁版嵁鐨勪笉鍚岋紝璇峰湪Charactor鐨勬瀯閫犲嚱鏁伴噷鍔犲叆浣犵殑瑙掕壊鐨勬暟鎹 -5. 娉ㄦ剰鍒濆鍖栧姩鐢诲抚闆嗗悎鏃剁敤鐨勫瓧绗︿覆锛屾瘮濡"Kid\_Buu\_idle\_0%d"锛寊杩欓噷琛ㄧず鐨勬槸榄斾汉甯冩鐨刬dle鍔ㄤ綔锛屼絾鏄繖鍙傜敤浜庝釜浣嶆暟鐨勫抚锛屽綋鍙樻垚鍗佷綅鏁版椂锛屽氨瑕佺敤"Kid\_Buu\_idle\_%d"锛屽洜姝ゅ鏋滀綘鐨勫姩浣滃抚瓒呰繃10锛屽氨瑕佺‘淇滳haractor绫绘湁杩欎釜瀛楃涓茬殑杩斿洖鍑芥暟锛屽叿浣撹鍙傝僽ltimate杩欎釜鍔ㄤ綔 -6. 绫诲彲浠ラ殢鎰忔敼鍔紝鍙淇濊瘉鏁堟灉 -7. plist鍜屽抚鐨勬埅鍙栧拰瀵煎嚭璇稝鏅撹銆 - - - -### 鏇存柊鍐呭锛2018/06/19 - -* 鍩烘湰妗嗘灦宸茬粡寤哄ソ锛屼唬鐮佹枃浠跺拰鍔熻兘锛 - -| 绫诲悕 | 鍔熻兘 | -| --------------------- | -------------------------- | -| AppDelegate | 鈥斺 | -| configuration.h | 閰嶇疆鏂囦欢锛屽瓨鏀句簡绮剧伒鐨勬暟鍊 | -| WelcomeScene | 娓告垙娆㈣繋鐣岄潰 | -| SelectRoleScene | 閫夋嫨娓告垙瑙掕壊鐣岄潰 | -| SelectBackgroundScene | 閫夋嫨娓告垙鑳屾櫙鐣岄潰 | -| ExampleGameScene | 绀轰緥娓告垙鐣岄潰 | -| ExamplePlayerSprite | 娓告垙瑙掕壊绀轰緥绫 | - - -* 宸插畬鎴愮殑鍐呭锛氬幓杩愯涓閬嶅惂锛屼唬鐮佹敞閲婂啓寰楁尯娓呮鐨勶紝鍘荤湅涓涓嬩唬鐮佸惂 - -* 浠g爜鍜屾敞閲婅鑼 - * 杩欐璇峰湪鎸囧畾鏃堕棿瀹屾垚浠g爜鐨勬椂鍊欏悓鏃舵坊鍔犳敞閲婏紝浠g爜娉ㄩ噴瑕佹眰璇峰弬鑰冨熀鏈鏋剁殑浠g爜锛屼竴浜涘熀鏈殑瑕佹眰锛 - * 浣跨敤/**/娉ㄩ噴 - * 涓鏍峰姛鑳界殑浠g爜鐢╮egion鍦堣捣鏉 - * .h鏂囦欢澶村弬鐓ф垜鐨勪唬鐮佹枃浠跺ご娣诲姞娉ㄩ噴 - * 濡傛灉淇敼浜嗕箣鍓嶅埆浜哄啓鐨勪唬鐮佸唴瀹癸紝璇峰湪鏃佽竟娣诲姞娉ㄩ噴璇存槑 - -* 鍙互浣跨敤Visual Studio鐨勪换鍔″垪琛ㄨ鍥炬煡鐪婽odo鐨勫唴瀹癸紝鎴戝湪涓浜涗綘浠渶瑕佸仛鐨勫唴瀹归儴鍒嗙暀浜員odo娉ㄩ噴锛屽挨鍏跺湪浣犱滑鎻愪氦瀹屾垚鐨勪唬鐮佺殑鏃跺欒妫鏌ヤ竴涓嬪睘浜庤嚜宸辩殑todo鍐呭鏈夋病鏈夊畬鎴 - -鏈夐棶棰楡鎴戯紝鍗 + * 涓や釜浜鸿繋闈㈣蛋锛岀劧鍚庝竴涓汉杞悜锛屽彟涓涓汉浼氬崱浣 + * 闆嗘皵鐨勬椂鍊欏鏋渕p涓嶅浣嗘槸鎸夊ぇ鎷涗細鍗′綇 + * 鎺掕姒滅殑璺緞闂锛屽氨鏄墦鍖卐xe鍚嶵A鐢佃剳涓婃病鏈夊叧浜庨」鐩殑璺緞锛岃繖鏍锋帓琛屾涓嶈兘鐪 + * 濂曟旦锛 + * 娣诲姞鎿嶄綔璇存槑 + * 杩欎釜椤甸潰娣诲姞涓涓鏄庡憡璇夌帺瀹惰杈撳叆鐢ㄦ埛鍚嶏細 +![](http://pic.caigoubao.cc/590732/DBTemp/1213.jpg) + * 閭辨檽瑁曪細鑱旂綉瀵规垬鐨勫叆鍙 +* 涓嬮潰鏄疄楠屾姤鍛婄殑鐭冲ⅷ鏂囨。鍏ュ彛锛屾湁绌哄氨鍐欙紝鍚屾牱20鍙峰墠鍐欏畬 +* https://shimo.im/docs/w466eRK84m00f9Ql/ 鐐瑰嚮閾炬帴鏌ョ湅銆岀幇鎿嶆湡鏈」鐩疄楠屾姤鍛娿嶏紝鎴栧鍒堕摼鎺ョ敤鐭冲ⅷ鏂囨。 App 鎵撳紑 +* 褰曞睆锛氬缓璞 diff --git a/Resources/$lucia_2.png b/Resources/$lucia_2.png deleted file mode 100644 index 4bdbb99..0000000 Binary files a/Resources/$lucia_2.png and /dev/null differ diff --git a/Resources/$lucia_dead.png b/Resources/$lucia_dead.png deleted file mode 100644 index 2ffea7c..0000000 Binary files a/Resources/$lucia_dead.png and /dev/null differ diff --git a/Resources/$lucia_forward.png b/Resources/$lucia_forward.png deleted file mode 100644 index 42256d7..0000000 Binary files a/Resources/$lucia_forward.png and /dev/null differ diff --git a/Resources/1.png b/Resources/1.png new file mode 100644 index 0000000..627ae02 Binary files /dev/null and b/Resources/1.png differ diff --git a/Resources/2.png b/Resources/2.png new file mode 100644 index 0000000..40d9853 Binary files /dev/null and b/Resources/2.png differ diff --git a/Resources/3.png b/Resources/3.png new file mode 100644 index 0000000..8db818c Binary files /dev/null and b/Resources/3.png differ 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/Player1Border.png b/Resources/Player1Border.png new file mode 100644 index 0000000..5db4954 Binary files /dev/null and b/Resources/Player1Border.png differ diff --git a/Resources/Player2Border.png b/Resources/Player2Border.png new file mode 100644 index 0000000..93dabd9 Binary files /dev/null and b/Resources/Player2Border.png differ diff --git a/Resources/Vegeta.plist b/Resources/Vegeta.plist new file mode 100644 index 0000000..73e6e67 --- /dev/null +++ b/Resources/Vegeta.plist @@ -0,0 +1,1211 @@ + + + + + frames + + Vegeta_attack_01.png + + aliases + + spriteOffset + {-1,0} + spriteSize + {94,108} + spriteSourceSize + {96,108} + textureRect + {{748,399},{94,108}} + textureRotated + + + Vegeta_attack_02.png + + aliases + + spriteOffset + {0,0} + spriteSize + {128,108} + spriteSourceSize + {128,108} + textureRect + {{1151,1},{128,108}} + textureRotated + + + Vegeta_attack_03.png + + aliases + + spriteOffset + {0,0} + spriteSize + {98,108} + spriteSourceSize + {98,108} + textureRect + {{260,397},{98,108}} + textureRotated + + + Vegeta_attack_04.png + + aliases + + spriteOffset + {0,0} + spriteSize + {90,135} + spriteSourceSize + {90,135} + textureRect + {{1014,1},{90,135}} + textureRotated + + + Vegeta_attack_05.png + + aliases + + spriteOffset + {0,0} + spriteSize + {93,125} + spriteSourceSize + {93,125} + textureRect + {{1399,1},{93,125}} + textureRotated + + + Vegeta_attack_06.png + + aliases + + spriteOffset + {0,0} + spriteSize + {87,107} + spriteSourceSize + {87,107} + textureRect + {{487,408},{87,107}} + textureRotated + + + Vegeta_attack_07.png + + aliases + + spriteOffset + {-1,0} + spriteSize + {77,107} + spriteSourceSize + {79,107} + textureRect + {{968,415},{77,107}} + textureRotated + + + Vegeta_attack_08.png + + aliases + + spriteOffset + {0,0} + spriteSize + {87,102} + spriteSourceSize + {87,102} + textureRect + {{1179,315},{87,102}} + textureRotated + + + Vegeta_attack_09.png + + aliases + + spriteOffset + {0,0} + spriteSize + {101,89} + spriteSourceSize + {101,89} + textureRect + {{1077,370},{101,89}} + textureRotated + + + Vegeta_attack_10.png + + aliases + + spriteOffset + {0,0} + spriteSize + {98,89} + spriteSourceSize + {98,89} + textureRect + {{1283,286},{98,89}} + textureRotated + + + Vegeta_attack_11.png + + aliases + + spriteOffset + {0,-3} + spriteSize + {152,83} + spriteSourceSize + {152,89} + textureRect + {{286,1},{152,83}} + textureRotated + + + Vegeta_attack_12.png + + aliases + + spriteOffset + {0,-2} + spriteSize + {147,85} + spriteSourceSize + {147,89} + textureRect + {{440,1},{147,85}} + textureRotated + + + Vegeta_attack_13.png + + aliases + + spriteOffset + {0,0} + spriteSize + {116,112} + spriteSourceSize + {116,112} + textureRect + {{1281,1},{116,112}} + textureRotated + + + Vegeta_attack_14.png + + aliases + + spriteOffset + {0,0} + spriteSize + {82,108} + spriteSourceSize + {82,108} + textureRect + {{1389,229},{82,108}} + textureRotated + + + Vegeta_attack_15.png + + aliases + + spriteOffset + {0,0} + spriteSize + {102,104} + spriteSourceSize + {102,104} + textureRect + {{76,390},{102,104}} + textureRotated + + + Vegeta_attack_16.png + + aliases + + spriteOffset + {0,0} + spriteSize + {144,104} + spriteSourceSize + {144,104} + textureRect + {{1,1},{144,104}} + textureRotated + + + Vegeta_attack_17.png + + aliases + + spriteOffset + {0,0} + spriteSize + {108,104} + spriteSourceSize + {108,104} + textureRect + {{260,291},{108,104}} + textureRotated + + + Vegeta_charge_01.png + + aliases + + spriteOffset + {0,0} + spriteSize + {79,136} + spriteSourceSize + {79,136} + textureRect + {{876,1},{79,136}} + textureRotated + + + Vegeta_charge_02.png + + aliases + + spriteOffset + {0,0} + spriteSize + {90,128} + spriteSourceSize + {90,128} + textureRect + {{173,106},{90,128}} + textureRotated + + + Vegeta_charge_03.png + + aliases + + spriteOffset + {0,-10} + spriteSize + {65,116} + spriteSourceSize + {65,136} + textureRect + {{833,244},{65,116}} + textureRotated + + + Vegeta_charge_04.png + + aliases + + spriteOffset + {0,-10} + spriteSize + {65,116} + spriteSourceSize + {65,136} + textureRect + {{951,252},{65,116}} + textureRotated + + + Vegeta_defend_01.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,119} + spriteSourceSize + {80,119} + textureRect + {{954,170},{80,119}} + textureRotated + + + Vegeta_die_01.png + + aliases + + spriteOffset + {0,0} + spriteSize + {73,111} + spriteSourceSize + {73,111} + textureRect + {{1,384},{73,111}} + textureRotated + + + Vegeta_die_02.png + + aliases + + spriteOffset + {0,0} + spriteSize + {97,67} + spriteSourceSize + {97,67} + textureRect + {{1208,111},{97,67}} + textureRotated + + + Vegeta_die_03.png + + aliases + + spriteOffset + {0,0} + spriteSize + {131,65} + spriteSourceSize + {131,65} + textureRect + {{106,257},{131,65}} + textureRotated + + + Vegeta_die_04.png + + aliases + + spriteOffset + {0,0} + spriteSize + {87,61} + spriteSourceSize + {87,61} + textureRect + {{645,288},{87,61}} + textureRotated + + + Vegeta_die_05.png + + aliases + + spriteOffset + {0,0} + spriteSize + {129,47} + spriteSourceSize + {129,47} + textureRect + {{1399,96},{129,47}} + textureRotated + + + Vegeta_dodge_01.png + + aliases + + spriteOffset + {0,0} + spriteSize + {74,119} + spriteSourceSize + {74,119} + textureRect + {{710,246},{74,119}} + textureRotated + + + Vegeta_dodge_02.png + + aliases + + spriteOffset + {0,0} + spriteSize + {82,112} + spriteSourceSize + {82,112} + textureRect + {{468,294},{82,112}} + textureRotated + + + Vegeta_fastMove_01.png + + aliases + + spriteOffset + {0,0} + spriteSize + {74,101} + spriteSourceSize + {74,101} + textureRect + {{1501,173},{74,101}} + textureRotated + + + Vegeta_fastMove_02.png + + aliases + + spriteOffset + {0,0} + spriteSize + {121,75} + spriteSourceSize + {121,75} + textureRect + {{722,82},{121,75}} + textureRotated + + + Vegeta_fastMove_03.png + + aliases + + spriteOffset + {0,0} + spriteSize + {121,75} + spriteSourceSize + {121,75} + textureRect + {{845,82},{121,75}} + textureRotated + + + Vegeta_fastMove_04.png + + aliases + + spriteOffset + {0,0} + spriteSize + {121,75} + spriteSourceSize + {121,75} + textureRect + {{968,93},{121,75}} + textureRotated + + + Vegeta_hit_01.png + + aliases + + spriteOffset + {0,0} + spriteSize + {87,115} + spriteSourceSize + {87,115} + textureRect + {{370,408},{87,115}} + textureRotated + + + Vegeta_hit_02.png + + aliases + + spriteOffset + {0,0} + spriteSize + {84,115} + spriteSourceSize + {84,115} + textureRect + {{1091,111},{84,115}} + textureRotated + + + Vegeta_idle_01.png + + aliases + + spriteOffset + {0,0} + spriteSize + {82,110} + spriteSourceSize + {82,110} + textureRect + {{1389,145},{82,110}} + textureRotated + + + Vegeta_idle_02.png + + aliases + + spriteOffset + {0,0} + spriteSize + {84,108} + spriteSourceSize + {84,108} + textureRect + {{1069,284},{84,108}} + textureRotated + + + Vegeta_idle_03.png + + aliases + + spriteOffset + {0,0} + spriteSize + {83,110} + spriteSourceSize + {83,110} + textureRect + {{1277,201},{83,110}} + textureRotated + + + Vegeta_idle_04.png + + aliases + + spriteOffset + {0,0} + spriteSize + {84,110} + spriteSourceSize + {84,110} + textureRect + {{1277,115},{84,110}} + textureRotated + + + Vegeta_jump_01.png + + aliases + + spriteOffset + {0,0} + spriteSize + {72,88} + spriteSourceSize + {72,88} + textureRect + {{1492,328},{72,88}} + textureRotated + + + Vegeta_jump_02.png + + aliases + + spriteOffset + {0,0} + spriteSize + {63,148} + spriteSourceSize + {63,148} + textureRect + {{108,107},{63,148}} + textureRotated + + + Vegeta_jump_03.png + + aliases + + spriteOffset + {0,0} + spriteSize + {65,141} + spriteSourceSize + {65,141} + textureRect + {{436,88},{65,141}} + textureRotated + + + Vegeta_jump_04.png + + aliases + + spriteOffset + {0,0} + spriteSize + {68,108} + spriteSourceSize + {68,108} + textureRect + {{858,425},{68,108}} + textureRotated + + + Vegeta_jump_05.png + + aliases + + spriteOffset + {0,0} + spriteSize + {75,117} + spriteSourceSize + {75,117} + textureRect + {{708,322},{75,117}} + textureRotated + + + Vegeta_jump_06.png + + aliases + + spriteOffset + {0,0} + spriteSize + {59,138} + spriteSourceSize + {59,138} + textureRect + {{400,155},{59,138}} + textureRotated + + + Vegeta_jump_07.png + + aliases + + spriteOffset + {0,0} + spriteSize + {48,148} + spriteSourceSize + {48,148} + textureRect + {{286,86},{48,148}} + textureRotated + + + Vegeta_knockOff.png + + aliases + + spriteOffset + {0,0} + spriteSize + {84,87} + spriteSourceSize + {84,87} + textureRect + {{1245,404},{84,87}} + textureRotated + + + Vegeta_rangedAttack_01.png + + aliases + + spriteOffset + {0,0} + spriteSize + {75,146} + spriteSourceSize + {75,152} + textureRect + {{589,1},{75,146}} + textureRotated + + + Vegeta_rangedAttack_02.png + + aliases + + spriteOffset + {0,0} + spriteSize + {78,133} + spriteSourceSize + {78,133} + textureRect + {{265,136},{78,133}} + textureRotated + + + Vegeta_rangedAttack_03.png + + aliases + + spriteOffset + {1,1} + spriteSize + {105,137} + spriteSourceSize + {107,139} + textureRect + {{1,107},{105,137}} + textureRotated + + + Vegeta_rangedAttack_04.png + + aliases + + spriteOffset + {0,1} + spriteSize + {103,137} + spriteSourceSize + {103,139} + textureRect + {{147,1},{103,137}} + textureRotated + + + Vegeta_rangedAttack_05.png + + aliases + + spriteOffset + {0,0} + spriteSize + {103,136} + spriteSourceSize + {103,136} + textureRect + {{1,246},{103,136}} + textureRotated + + + Vegeta_run_01.png + + aliases + + spriteOffset + {0,0} + spriteSize + {91,117} + spriteSourceSize + {91,117} + textureRect + {{1526,1},{91,117}} + textureRotated + + + Vegeta_run_02.png + + aliases + + spriteOffset + {0,0} + spriteSize + {91,113} + spriteSourceSize + {91,113} + textureRect + {{552,288},{91,113}} + textureRotated + + + Vegeta_run_03.png + + aliases + + spriteOffset + {0,0} + spriteSize + {96,112} + spriteSourceSize + {96,112} + textureRect + {{370,294},{96,112}} + textureRotated + + + Vegeta_run_04.png + + aliases + + spriteOffset + {0,0} + spriteSize + {94,110} + spriteSourceSize + {94,110} + textureRect + {{951,319},{94,110}} + textureRotated + + + Vegeta_run_05.png + + aliases + + spriteOffset + {0,0} + spriteSize + {92,112} + spriteSourceSize + {92,112} + textureRect + {{596,194},{92,112}} + textureRotated + + + Vegeta_run_06.png + + aliases + + spriteOffset + {0,0} + spriteSize + {91,112} + spriteSourceSize + {91,112} + textureRect + {{858,311},{91,112}} + textureRotated + + + Vegeta_ultimate_01.png + + aliases + + spriteOffset + {0,0} + spriteSize + {85,121} + spriteSourceSize + {85,121} + textureRect + {{710,159},{85,121}} + textureRotated + + + Vegeta_ultimate_02.png + + aliases + + spriteOffset + {0,0} + spriteSize + {73,133} + spriteSourceSize + {73,133} + textureRect + {{265,216},{73,133}} + textureRotated + + + Vegeta_ultimate_03.png + + aliases + + spriteOffset + {0,0} + spriteSize + {77,116} + spriteSourceSize + {77,116} + textureRect + {{1530,94},{77,116}} + textureRotated + + + Vegeta_ultimate_04.png + + aliases + + spriteOffset + {0,0} + spriteSize + {83,103} + spriteSourceSize + {83,103} + textureRect + {{1192,210},{83,103}} + textureRotated + + + Vegeta_ultimate_05.png + + aliases + + spriteOffset + {0,0} + spriteSize + {101,96} + spriteSourceSize + {101,96} + textureRect + {{645,399},{101,96}} + textureRotated + + + Vegeta_ultimate_06.png + + aliases + + spriteOffset + {0,0} + spriteSize + {75,91} + spriteSourceSize + {75,91} + textureRect + {{1168,404},{75,91}} + textureRotated + + + Vegeta_ultimate_07.png + + aliases + + spriteOffset + {0,0} + spriteSize + {77,89} + spriteSourceSize + {77,89} + textureRect + {{1499,249},{77,89}} + textureRotated + + + Vegeta_up_01.png + + aliases + + spriteOffset + {0,0} + spriteSize + {131,65} + spriteSourceSize + {131,65} + textureRect + {{589,78},{131,65}} + textureRotated + + + Vegeta_up_02.png + + aliases + + spriteOffset + {0,0} + spriteSize + {87,61} + spriteSourceSize + {87,61} + textureRect + {{1415,388},{87,61}} + textureRotated + + + Vegeta_up_03.png + + aliases + + spriteOffset + {0,0} + spriteSize + {129,47} + spriteSourceSize + {129,47} + textureRect + {{579,145},{129,47}} + textureRotated + + + Vegeta_up_04.png + + aliases + + spriteOffset + {0,0} + spriteSize + {107,73} + spriteSourceSize + {107,73} + textureRect + {{1383,313},{107,73}} + textureRotated + + + Vegeta_up_05.png + + aliases + + spriteOffset + {0,0} + spriteSize + {65,73} + spriteSourceSize + {65,73} + textureRect + {{1478,402},{65,73}} + textureRotated + + + Vegeta_up_06.png + + aliases + + spriteOffset + {0,0} + spriteSize + {61,65} + spriteSourceSize + {61,65} + textureRect + {{531,216},{61,65}} + textureRotated + + + Vegeta_up_07.png + + aliases + + spriteOffset + {0,-2} + spriteSize + {79,59} + spriteSourceSize + {79,63} + textureRect + {{1545,402},{79,59}} + textureRotated + + + Vegeta_up_08.png + + aliases + + spriteOffset + {0,0} + spriteSize + {82,81} + spriteSourceSize + {82,81} + textureRect + {{1331,388},{82,81}} + textureRotated + + + Vegeta_win_01.png + + aliases + + spriteOffset + {0,0} + spriteSize + {83,119} + spriteSourceSize + {83,119} + textureRect + {{833,159},{83,119}} + textureRotated + + + Vegeta_win_02.png + + aliases + + spriteOffset + {0,-2} + spriteSize + {85,115} + spriteSourceSize + {85,119} + textureRect + {{1075,197},{85,115}} + textureRotated + + + Vegeta_win_03.png + + aliases + + spriteOffset + {0,0} + spriteSize + {78,122} + spriteSourceSize + {78,122} + textureRect + {{180,367},{78,122}} + textureRotated + + + Vegeta_win_04.png + + aliases + + spriteOffset + {0,-1} + spriteSize + {76,129} + spriteSourceSize + {76,131} + textureRect + {{400,216},{76,129}} + textureRotated + + + Vegeta_win_05.png + + aliases + + spriteOffset + {0,0} + spriteSize + {79,137} + spriteSourceSize + {79,137} + textureRect + {{737,1},{79,137}} + textureRotated + + + Vegeta_win_06.png + + aliases + + spriteOffset + {0,-1} + spriteSize + {85,129} + spriteSourceSize + {85,131} + textureRect + {{173,236},{85,129}} + textureRotated + + + + metadata + + format + 3 + pixelFormat + RGBA8888 + premultiplyAlpha + + realTextureFileName + Vegeta.png + size + {1647,496} + smartupdate + $TexturePacker:SmartUpdate:d5acae0f685dda366fb5fb368e830f35:50bd77e6a7a19030ae332982cdb2ed88:82f32948b9e977f92aa8b944ab3cfdf3$ + textureFileName + Vegeta.png + + + diff --git a/Resources/Vegeta.png b/Resources/Vegeta.png new file mode 100644 index 0000000..fcd90c2 Binary files /dev/null and b/Resources/Vegeta.png differ diff --git a/Resources/Vegeta_boom.plist b/Resources/Vegeta_boom.plist new file mode 100644 index 0000000..ceda059 --- /dev/null +++ b/Resources/Vegeta_boom.plist @@ -0,0 +1,941 @@ + + + + + frames + + Vegeta_boom_00.png + + aliases + + spriteOffset + {0,0} + spriteSize + {62,56} + spriteSourceSize + {62,56} + textureRect + {{375,1011},{62,56}} + textureRotated + + + Vegeta_boom_01.png + + aliases + + spriteOffset + {0,0} + spriteSize + {62,56} + spriteSourceSize + {62,56} + textureRect + {{365,1073},{62,56}} + textureRotated + + + Vegeta_boom_02.png + + aliases + + spriteOffset + {0,0} + spriteSize + {63,56} + spriteSourceSize + {63,56} + textureRect + {{316,1134},{63,56}} + textureRotated + + + Vegeta_boom_03.png + + aliases + + spriteOffset + {0,0} + spriteSize + {63,56} + spriteSourceSize + {63,56} + textureRect + {{376,953},{63,56}} + textureRotated + + + Vegeta_boom_04.png + + aliases + + spriteOffset + {0,0} + spriteSize + {84,89} + spriteSourceSize + {84,89} + textureRect + {{225,1134},{84,89}} + textureRotated + + + Vegeta_boom_05.png + + aliases + + spriteOffset + {0,0} + spriteSize + {85,101} + spriteSourceSize + {85,101} + textureRect + {{259,433},{85,101}} + textureRotated + + + Vegeta_boom_06.png + + aliases + + spriteOffset + {0,0} + spriteSize + {77,94} + spriteSourceSize + {77,94} + textureRect + {{259,536},{77,94}} + textureRotated + + + Vegeta_boom_07.png + + aliases + + spriteOffset + {0,0} + spriteSize + {76,89} + spriteSourceSize + {76,89} + textureRect + {{355,622},{76,89}} + textureRotated + + + Vegeta_boom_08.png + + aliases + + spriteOffset + {0,0} + spriteSize + {81,104} + spriteSourceSize + {81,104} + textureRect + {{250,249},{81,104}} + textureRotated + + + Vegeta_boom_09.png + + aliases + + spriteOffset + {0,0} + spriteSize + {83,101} + spriteSourceSize + {83,101} + textureRect + {{221,934},{83,101}} + textureRotated + + + Vegeta_boom_10.png + + aliases + + spriteOffset + {0,0} + spriteSize + {88,104} + spriteSourceSize + {88,104} + textureRect + {{119,1134},{88,104}} + textureRotated + + + Vegeta_boom_11.png + + aliases + + spriteOffset + {0,0} + spriteSize + {125,131} + spriteSourceSize + {125,131} + textureRect + {{132,437},{125,131}} + textureRotated + + + Vegeta_boom_12.png + + aliases + + spriteOffset + {0,0} + spriteSize + {120,119} + spriteSourceSize + {120,119} + textureRect + {{122,692},{120,119}} + textureRotated + + + Vegeta_boom_13.png + + aliases + + spriteOffset + {0,0} + spriteSize + {120,121} + spriteSourceSize + {120,121} + textureRect + {{132,570},{120,121}} + textureRotated + + + Vegeta_boom_14.png + + aliases + + spriteOffset + {0,0} + spriteSize + {119,119} + spriteSourceSize + {119,119} + textureRect + {{122,813},{119,119}} + textureRotated + + + Vegeta_boom_15.png + + aliases + + spriteOffset + {0,0} + spriteSize + {72,72} + spriteSourceSize + {72,72} + textureRect + {{418,810},{72,72}} + textureRotated + + + Vegeta_boom_16.png + + aliases + + spriteOffset + {0,0} + spriteSize + {68,67} + spriteSourceSize + {68,67} + textureRect + {{415,884},{68,67}} + textureRotated + + + Vegeta_boom_17.png + + aliases + + spriteOffset + {0,0} + spriteSize + {68,67} + spriteSourceSize + {68,67} + textureRect + {{306,935},{68,67}} + textureRotated + + + Vegeta_boom_18.png + + aliases + + spriteOffset + {0,0} + spriteSize + {67,65} + spriteSourceSize + {67,65} + textureRect + {{308,1004},{67,65}} + textureRotated + + + Vegeta_boom_18_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {247,129} + spriteSourceSize + {249,129} + textureRect + {{1,437},{247,129}} + textureRotated + + + Vegeta_boom_19.png + + aliases + + spriteOffset + {0,0} + spriteSize + {246,137} + spriteSourceSize + {246,137} + textureRect + {{1,298},{246,137}} + textureRotated + + + Vegeta_boom_20.png + + aliases + + spriteOffset + {0,0} + spriteSize + {246,145} + spriteSourceSize + {246,145} + textureRect + {{250,1},{246,145}} + textureRotated + + + Vegeta_boom_21.png + + aliases + + spriteOffset + {1,1} + spriteSize + {247,145} + spriteSourceSize + {249,147} + textureRect + {{1,151},{247,145}} + textureRotated + + + Vegeta_boom_22.png + + aliases + + spriteOffset + {0,-1} + spriteSize + {247,148} + spriteSourceSize + {249,152} + textureRect + {{1,1},{247,148}} + textureRotated + + + Vegeta_boom_23.png + + aliases + + spriteOffset + {0,0} + spriteSize + {246,119} + spriteSourceSize + {246,119} + textureRect + {{1,686},{246,119}} + textureRotated + + + Vegeta_boom_24.png + + aliases + + spriteOffset + {1,0} + spriteSize + {247,116} + spriteSourceSize + {249,116} + textureRect + {{1,934},{247,116}} + textureRotated + + + Vegeta_boom_26.png + + aliases + + spriteOffset + {0,0} + spriteSize + {53,61} + spriteSourceSize + {53,61} + textureRect + {{356,284},{53,61}} + textureRotated + + + Vegeta_boom_27.png + + aliases + + spriteOffset + {0,0} + spriteSize + {61,52} + spriteSourceSize + {61,52} + textureRect + {{429,1124},{61,52}} + textureRotated + + + Vegeta_boom_28.png + + aliases + + spriteOffset + {0,0} + spriteSize + {63,53} + spriteSourceSize + {63,53} + textureRect + {{436,587},{63,53}} + textureRotated + + + Vegeta_boom_29.png + + aliases + + spriteOffset + {0,0} + spriteSize + {61,53} + spriteSourceSize + {61,53} + textureRect + {{429,1069},{61,53}} + textureRotated + + + Vegeta_boom_30.png + + aliases + + spriteOffset + {0,0} + spriteSize + {70,55} + spriteSourceSize + {70,55} + textureRect + {{433,727},{70,55}} + textureRotated + + + Vegeta_boom_31.png + + aliases + + spriteOffset + {-2,0} + spriteSize + {42,53} + spriteSourceSize + {100,93} + textureRect + {{441,953},{42,53}} + textureRotated + + + Vegeta_boom_32.png + + aliases + + spriteOffset + {-4,0} + spriteSize + {56,73} + spriteSourceSize + {96,93} + textureRect + {{433,652},{56,73}} + textureRotated + + + Vegeta_boom_33.png + + aliases + + spriteOffset + {-3,-3} + spriteSize + {62,83} + spriteSourceSize + {92,93} + textureRect + {{333,810},{62,83}} + textureRotated + + + Vegeta_boom_34.png + + aliases + + spriteOffset + {-2,-3} + spriteSize + {69,87} + spriteSourceSize + {97,93} + textureRect + {{244,810},{69,87}} + textureRotated + + + Vegeta_boom_35.png + + aliases + + spriteOffset + {0,-2} + spriteSize + {79,89} + spriteSourceSize + {95,93} + textureRect + {{355,531},{79,89}} + textureRotated + + + Vegeta_boom_36.png + + aliases + + spriteOffset + {-1,-3} + spriteSize + {84,93} + spriteSourceSize + {100,99} + textureRect + {{397,1},{84,93}} + textureRotated + + + Vegeta_boom_37.png + + aliases + + spriteOffset + {-3,-2} + spriteSize + {88,95} + spriteSourceSize + {96,99} + textureRect + {{218,1037},{88,95}} + textureRotated + + + Vegeta_boom_38.png + + aliases + + spriteOffset + {0,-2} + spriteSize + {92,95} + spriteSourceSize + {92,99} + textureRect + {{397,187},{92,95}} + textureRotated + + + Vegeta_boom_39.png + + aliases + + spriteOffset + {0,-2} + spriteSize + {95,95} + spriteSourceSize + {97,99} + textureRect + {{244,713},{95,95}} + textureRotated + + + Vegeta_boom_40.png + + aliases + + spriteOffset + {0,0} + spriteSize + {95,99} + spriteSourceSize + {95,99} + textureRect + {{249,332},{95,99}} + textureRotated + + + Vegeta_boom_41.png + + aliases + + spriteOffset + {0,0} + spriteSize + {100,98} + spriteSourceSize + {100,98} + textureRect + {{119,934},{100,98}} + textureRotated + + + Vegeta_boom_42.png + + aliases + + spriteOffset + {0,0} + spriteSize + {96,98} + spriteSourceSize + {96,98} + textureRect + {{255,615},{96,98}} + textureRotated + + + Vegeta_boom_43.png + + aliases + + spriteOffset + {0,0} + spriteSize + {92,98} + spriteSourceSize + {92,98} + textureRect + {{397,87},{92,98}} + textureRotated + + + Vegeta_boom_44.png + + aliases + + spriteOffset + {0,0} + spriteSize + {97,98} + spriteSourceSize + {97,98} + textureRect + {{119,1034},{97,98}} + textureRotated + + + Vegeta_boom_45.png + + aliases + + spriteOffset + {0,3} + spriteSize + {95,90} + spriteSourceSize + {95,98} + textureRect + {{341,713},{95,90}} + textureRotated + + + Vegeta_boom_46.png + + aliases + + spriteOffset + {-1,2} + spriteSize + {96,90} + spriteSourceSize + {100,94} + textureRect + {{346,347},{96,90}} + textureRotated + + + Vegeta_boom_47.png + + aliases + + spriteOffset + {-1,2} + spriteSize + {94,90} + spriteSourceSize + {96,94} + textureRect + {{346,439},{94,90}} + textureRotated + + + Vegeta_boom_48.png + + aliases + + spriteOffset + {0,0} + spriteSize + {40,33} + spriteSourceSize + {40,33} + textureRect + {{442,489},{40,33}} + textureRotated + + + Vegeta_boom_49.png + + aliases + + spriteOffset + {0,0} + spriteSize + {49,47} + spriteSourceSize + {49,47} + textureRect + {{295,881},{49,47}} + textureRotated + + + Vegeta_boom_50.png + + aliases + + spriteOffset + {0,0} + spriteSize + {59,55} + spriteSourceSize + {59,55} + textureRect + {{308,1073},{59,55}} + textureRotated + + + Vegeta_boom_51.png + + aliases + + spriteOffset + {0,0} + spriteSize + {61,57} + spriteSourceSize + {61,57} + textureRect + {{433,284},{61,57}} + textureRotated + + + Vegeta_boom_52.png + + aliases + + spriteOffset + {0,0} + spriteSize + {69,59} + spriteSourceSize + {69,59} + textureRect + {{344,874},{69,59}} + textureRotated + + + Vegeta_boom_53.png + + aliases + + spriteOffset + {0,0} + spriteSize + {26,26} + spriteSourceSize + {26,26} + textureRect + {{356,249},{26,26}} + textureRotated + + + Vegeta_boom_54.png + + aliases + + spriteOffset + {0,0} + spriteSize + {38,38} + spriteSourceSize + {38,38} + textureRect + {{1,1183},{38,38}} + textureRotated + + + Vegeta_boom_55.png + + aliases + + spriteOffset + {0,0} + spriteSize + {44,44} + spriteSourceSize + {44,44} + textureRect + {{428,1178},{44,44}} + textureRotated + + + Vegeta_boom_56.png + + aliases + + spriteOffset + {0,0} + spriteSize + {46,46} + spriteSourceSize + {46,46} + textureRect + {{444,347},{46,46}} + textureRotated + + + Vegeta_boom_57.png + + aliases + + spriteOffset + {0,0} + spriteSize + {48,48} + spriteSourceSize + {48,48} + textureRect + {{442,439},{48,48}} + textureRotated + + + Vegeta_boom_58.png + + aliases + + spriteOffset + {0,0} + spriteSize + {50,50} + spriteSourceSize + {50,50} + textureRect + {{243,881},{50,50}} + textureRotated + + + Vegeta_boom_59.png + + aliases + + spriteOffset + {0,0} + spriteSize + {52,52} + spriteSourceSize + {52,52} + textureRect + {{374,1131},{52,52}} + textureRotated + + + Vegeta_boom_60.png + + aliases + + spriteOffset + {0,0} + spriteSize + {54,54} + spriteSourceSize + {54,54} + textureRect + {{436,531},{54,54}} + textureRotated + + + + metadata + + format + 3 + pixelFormat + RGBA8888 + premultiplyAlpha + + realTextureFileName + Vegeta_boom.png + size + {491,1223} + smartupdate + $TexturePacker:SmartUpdate:4db65b1b0e247c06b9604c4420144726:1722435f3ed6cd38f3e5083b0aaae56c:aa0b60fde775aad212136bfd8e1ae4ff$ + textureFileName + Vegeta_boom.png + + + diff --git a/Resources/Vegeta_boom.png b/Resources/Vegeta_boom.png new file mode 100644 index 0000000..5135acf Binary files /dev/null and b/Resources/Vegeta_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/bar.png b/Resources/bar.png deleted file mode 100644 index 911b438..0000000 Binary files a/Resources/bar.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..e62861e 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..1c0c7d9 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..b3fdcc8 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..6eb72c4 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/bg1.jpg b/Resources/bg1.jpg deleted file mode 100644 index 079aec7..0000000 Binary files a/Resources/bg1.jpg and /dev/null differ diff --git a/Resources/bg2.jpg b/Resources/bg2.jpg deleted file mode 100644 index 762b776..0000000 Binary files a/Resources/bg2.jpg and /dev/null differ diff --git a/Resources/bg3.jpg b/Resources/bg3.jpg deleted file mode 100644 index c454bd8..0000000 Binary files a/Resources/bg3.jpg and /dev/null differ diff --git a/Resources/bg4.jpg b/Resources/bg4.jpg deleted file mode 100644 index 7b80120..0000000 Binary files a/Resources/bg4.jpg and /dev/null 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/online-normal.png b/Resources/button/online-normal.png new file mode 100644 index 0000000..eac2788 Binary files /dev/null and b/Resources/button/online-normal.png differ diff --git a/Resources/button/online-selected.png b/Resources/button/online-selected.png new file mode 100644 index 0000000..ae6bbe3 Binary files /dev/null and b/Resources/button/online-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/ranklist-normal.png b/Resources/button/ranklist-normal.png new file mode 100644 index 0000000..7a9f930 Binary files /dev/null and b/Resources/button/ranklist-normal.png differ diff --git a/Resources/button/ranklist-selected.png b/Resources/button/ranklist-selected.png new file mode 100644 index 0000000..c85560c Binary files /dev/null and b/Resources/button/ranklist-selected.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/exampleBackground.png b/Resources/exampleBackground.png deleted file mode 100644 index cdd4061..0000000 Binary files a/Resources/exampleBackground.png and /dev/null differ diff --git a/Resources/explosion.png b/Resources/explosion.png new file mode 100644 index 0000000..abe9d9c Binary files /dev/null and b/Resources/explosion.png differ diff --git a/Resources/fonts/comicsansms.ttf b/Resources/fonts/comicsansms.ttf new file mode 100644 index 0000000..d17e1be Binary files /dev/null and b/Resources/fonts/comicsansms.ttf 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/gameOver.png b/Resources/gameOver.png new file mode 100644 index 0000000..9597adb Binary files /dev/null and b/Resources/gameOver.png differ diff --git a/Resources/go.png b/Resources/go.png new file mode 100644 index 0000000..c7ba591 Binary files /dev/null and b/Resources/go.png differ diff --git a/Resources/green.png b/Resources/green.png new file mode 100644 index 0000000..18bd736 Binary files /dev/null and b/Resources/green.png differ diff --git a/Resources/hp-new.png b/Resources/hp-new.png new file mode 100644 index 0000000..c7a05a7 Binary files /dev/null and b/Resources/hp-new.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/mp-new.png b/Resources/mp-new.png new file mode 100644 index 0000000..f4bcc8c Binary files /dev/null and b/Resources/mp-new.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/music/explore.wav b/Resources/music/explore.wav new file mode 100644 index 0000000..981feb0 Binary files /dev/null and b/Resources/music/explore.wav differ diff --git a/Resources/p1.png b/Resources/p1.png deleted file mode 100644 index 3f8179a..0000000 Binary files a/Resources/p1.png and /dev/null differ diff --git a/Resources/p2.png b/Resources/p2.png deleted file mode 100644 index 10489f8..0000000 Binary files a/Resources/p2.png and /dev/null differ diff --git a/Resources/physicplayerForFrieza.png b/Resources/physicplayerForFrieza.png new file mode 100644 index 0000000..164a94b Binary files /dev/null and b/Resources/physicplayerForFrieza.png differ diff --git a/Resources/role/Frieza-icon.png b/Resources/role/Frieza-icon.png new file mode 100644 index 0000000..e5ae48f Binary files /dev/null and b/Resources/role/Frieza-icon.png differ diff --git a/Resources/role/Goku-icon.png b/Resources/role/Goku-icon.png new file mode 100644 index 0000000..c187ce7 Binary files /dev/null and b/Resources/role/Goku-icon.png differ diff --git a/Resources/role/Kid_Buu-icon.png b/Resources/role/Kid_Buu-icon.png new file mode 100644 index 0000000..e194cde Binary files /dev/null and b/Resources/role/Kid_Buu-icon.png differ diff --git a/Resources/role/Vegeta-icon.png b/Resources/role/Vegeta-icon.png new file mode 100644 index 0000000..ffad183 Binary files /dev/null and b/Resources/role/Vegeta-icon.png differ diff --git a/Resources/role/p1.png b/Resources/role/p1.png new file mode 100644 index 0000000..8399ab8 Binary files /dev/null and b/Resources/role/p1.png differ diff --git a/Resources/role/p2.png b/Resources/role/p2.png new file mode 100644 index 0000000..2279e99 Binary files /dev/null and b/Resources/role/p2.png differ diff --git a/Resources/role/role-1.png b/Resources/role/role-1.png new file mode 100644 index 0000000..c6bb7c5 Binary files /dev/null and b/Resources/role/role-1.png differ diff --git a/Resources/role/role-2.png b/Resources/role/role-2.png new file mode 100644 index 0000000..99975ab Binary files /dev/null and b/Resources/role/role-2.png differ diff --git a/Resources/role/role1-Goku.png b/Resources/role/role1-Goku.png new file mode 100644 index 0000000..bd65fd6 Binary files /dev/null and b/Resources/role/role1-Goku.png differ diff --git a/Resources/role/role1-big-Goku.png b/Resources/role/role1-big-Goku.png new file mode 100644 index 0000000..db5b0ab Binary files /dev/null and b/Resources/role/role1-big-Goku.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-Vegeta.png b/Resources/role/role2-Vegeta.png new file mode 100644 index 0000000..9b92a3f Binary files /dev/null and b/Resources/role/role2-Vegeta.png differ diff --git a/Resources/role/role2-big-Vegeta.png b/Resources/role/role2-big-Vegeta.png new file mode 100644 index 0000000..7111a52 Binary files /dev/null and b/Resources/role/role2-big-Vegeta.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/role/role3-Kid_Buu.png b/Resources/role/role3-Kid_Buu.png new file mode 100644 index 0000000..b0cfb3b Binary files /dev/null and b/Resources/role/role3-Kid_Buu.png differ diff --git a/Resources/role/role3-big-Kid_Buu.png b/Resources/role/role3-big-Kid_Buu.png new file mode 100644 index 0000000..ee90666 Binary files /dev/null and b/Resources/role/role3-big-Kid_Buu.png differ diff --git a/Resources/role/role4-Frieza.png b/Resources/role/role4-Frieza.png new file mode 100644 index 0000000..253de2f Binary files /dev/null and b/Resources/role/role4-Frieza.png differ diff --git a/Resources/role/role4-big-Frieza.png b/Resources/role/role4-big-Frieza.png new file mode 100644 index 0000000..857b6b0 Binary files /dev/null and b/Resources/role/role4-big-Frieza.png differ diff --git a/Resources/role1-big.png b/Resources/role1-big.png deleted file mode 100644 index 324c667..0000000 Binary files a/Resources/role1-big.png and /dev/null differ diff --git a/Resources/role1.png b/Resources/role1.png deleted file mode 100644 index 340d73d..0000000 Binary files a/Resources/role1.png and /dev/null differ diff --git a/Resources/role2-big.png b/Resources/role2-big.png deleted file mode 100644 index 13bd595..0000000 Binary files a/Resources/role2-big.png and /dev/null differ diff --git a/Resources/role2.png b/Resources/role2.png deleted file mode 100644 index 2a10a57..0000000 Binary files a/Resources/role2.png and /dev/null differ diff --git a/Resources/role3-big.png b/Resources/role3-big.png deleted file mode 100644 index e315e74..0000000 Binary files a/Resources/role3-big.png and /dev/null differ diff --git a/Resources/role3.png b/Resources/role3.png deleted file mode 100644 index 2631f43..0000000 Binary files a/Resources/role3.png and /dev/null differ diff --git a/Resources/role4-big.png b/Resources/role4-big.png deleted file mode 100644 index c959ab4..0000000 Binary files a/Resources/role4-big.png and /dev/null differ diff --git a/Resources/role4.png b/Resources/role4.png deleted file mode 100644 index b96ae66..0000000 Binary files a/Resources/role4.png and /dev/null differ diff --git a/Resources/round1.png b/Resources/round1.png new file mode 100644 index 0000000..bdb6bc2 Binary files /dev/null and b/Resources/round1.png differ diff --git a/Resources/round2.png b/Resources/round2.png new file mode 100644 index 0000000..d2f90c4 Binary files /dev/null and b/Resources/round2.png differ diff --git a/Resources/round3.png b/Resources/round3.png new file mode 100644 index 0000000..d7a5fcb Binary files /dev/null and b/Resources/round3.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