Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Как написать фейерверк?


Автор: Niakita 19.4.2013, 10:03
Столкнулся вот с таким кодом:

Код

#include "stdafx.h"
#include "TestWidget.h"

TestWidget::TestWidget(const std::string& name_)
    : Widget(name_) 
{
    Init();
}

TestWidget::TestWidget(const string& name_, Xml::TiXmlElement* xmlElement) 
    : Widget(name_)
    , _curTex(0)
    , _smoothTex(NULL)
    , _timer(0)
    , _timeScale(1)
    , _angle(0)
    , _eff(NULL)
{
    Init();
}

void TestWidget::Init()
{
    _textures.push_back(Core::resourceManager.getTexture("btnStart_Text"));
    _textures.push_back(Core::resourceManager.getTexture("Circle"));
    _smoothTex = new SmoothTextureChanger(_textures[0]);
    _curTex = 0;
    _angle = 0;
}

TestWidget::~TestWidget()
{
}

void TestWidget::Draw() 
{
    IPoint mouse_pos = Core::mainInput.GetMousePos();

    // матричные преобразования кладутся в стек, поэтому выполняться будут снизу вверх
    Render::device.PushMatrix();
    Render::device.MatrixTranslate(math::Vector3(mouse_pos.x + 0.f, mouse_pos.y + 0.f, 0));    // - 3ее действие. Задаём экранные координаты (в этой точке будет стоять точка, относительно которой поворачивали)
    Render::device.MatrixRotate(math::Vector3(0, 0, 1), _angle);                // - 2ое действие. Поворачиваем.
    _smoothTex->Draw(IPoint(-50, -50));                                            // - 1ое действие. задаём точку, относительно которой будем вращать (совмещаем с центром координат)
    Render::device.PopMatrix();

    Render::device.SetTexturing(false);
    Render::device.SetCurrentColor(Color(255,128,0,255));
    Render::DrawRect(700, 0, 100, 100);
    Render::device.SetTexturing(true);


    // отрисовываем все эффекты, которые положили в контейнер (Update для контейнера вызывать не нужно)
    _effCont.Draw(); // контейнер с рыбкой и эффектами брызг




    Render::BindFont("arial");
    Render::PrintString(720, 20, utils::lexical_cast(mouse_pos.x) + " " + utils::lexical_cast(mouse_pos.y));

}

void TestWidget::Update(float dt)
{
    _smoothTex->Update(dt);
}

void TestWidget::MouseDoubleClick(const IPoint &mouse_pos)
{
    MouseDown(mouse_pos);
}

bool TestWidget::MouseDown(const IPoint &mouse_pos)
{
    if (Core::mainInput.GetMouseRightButton())
    {
        // Создаём шлейф за мышкой по клику
        _eff = _effCont.AddEffect("Iskra");
        _eff->posX = mouse_pos.x + 0.f;
        _eff->posY = mouse_pos.y + 0.f;
        _eff->Reset();
        _angle += 25;
    }
    else
    {
        // эффект завершается самостоятельно, не надо за ним следить и создавать переменную в классе
        ParticleEffect *eff = _effCont.AddEffect("FindItem2");
        eff->posX = mouse_pos.x + 0.f;
        eff->posY = mouse_pos.y + 0.f;
        eff->Reset();

        _curTex++;
        if (_curTex >= (int)_textures.size())
        {
            _curTex = 0;
        }
        _smoothTex->SetTexture(_textures[_curTex]);
    }
    return false;    
}

void TestWidget::MouseMove(const IPoint &mouse_pos)
{
    if (_eff)
    {
        // Если эффект создан, то двигаем его вслед за мышкой
        _eff->posX = mouse_pos.x + 0.f;
        _eff->posY = mouse_pos.y + 0.f;
    }
}

void TestWidget::MouseUp(const IPoint &mouse_pos)
{
    if (_eff)
    {
        // Если эффект создан, то при отпускании мыши завершаем его.
        _eff->Finish();
        _eff = NULL;
    }
}

void TestWidget::AcceptMessage(const Message& message)
{
    if (message.getPublisher() == "KeyPress") 
    {
        int code = utils::lexical_cast<int>(message.getData());
        if (code < 0) return;
        if (code == 'a') 
        {        
        }
    }
}



Нужно написать фейерверк.
Подскажите книги которые стоит почитать. (желательно для начинающих)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)