Vamos começar a aprender desde o início do código HelloWorld.
Então, como a janela do HelloWorld é exibida? Temos que encontrar o programa de entrada, é claro, a função principal. A seguir está o diretório do projeto HelloWorld:
abra main.cpp, existem 2 linhas de código, a entrada real é Classes \ AppDelegate.cpp
AppDelegate.cpp
Existe um applicationDidFinishLaunching()
método nele: este é o ponto de entrada real do programa (também é o ponto de entrada da plataforma cruzada. Por favor, procure como os cocos cruzam a plataforma). Interprete o código:
1. Defina um diretor quando entrar.
// initialize director
auto director = Director::getInstance();
O papel desse diretor é muito poderoso; na verdade, é o mesmo que o diretor na realidade. Todas as cenas, atores, origens, músicas, etc. a serem executadas precisam ser controladas pelo diretor. Então, em seguida, o diretor fez muitas coisas, optei por escrever principalmente:
2. director->setDisplayStats(true);
Defina se é necessário exibir o quadro do jogo e outras informações de depuração. (Ou seja, as informações digitais no canto inferior esquerdo da tela HelloWorld)
3. director->setAnimationInterval(1.0f / 60);
Defina a taxa de quadros do jogo, 60 quadros por segundo. Qual é a taxa de quadros? De fato, o mundo do jogo muda constantemente de imagem para imagem, o que faz as pessoas sentirem a ilusão de animação. Em seguida, cada imagem é um quadro, então essa configuração é que 60 imagens podem ser trocadas em 1 segundo.
4. director->setContentScaleFactor();
Defina a resolução. Haverá várias ramificações para determinar o tamanho da mídia que você deseja exibir e a resolução pode ser definida de maneira diferente. Isso é inteligente?
5. Faça auto scene = HelloWorld::createScene();
uma instância da cena HelloWorld. Todos os tipos de fotos, menus, etiquetas etc. na nossa tela do HelloWorld são gerados aqui.
6. O director->runWithScene(scene);
comentário é muito claro e é executado. É o diretor que faz o HelloWorld funcionar!
O tamanho do formulário padrão aumenta e a exibição do formulário é relativamente pequena, então como aumentamos o formulário? Basta modificar este local:
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) || (CC_TARGET_PLATFORM == CC_PLATFORM_MAC) || (CC_TARGET_PLATFORM == CC_PLATFORM_LINUX)
glview = GLViewImpl::createWithRect("HelloWorld", cocos2d::Rect(0, 0, designResolutionSize.width, designResolutionSize.height));
Ctrl + F5 para executá-lo, a janela é maior e a resolução mais alta? Então é conveniente adicionar algo a ele e assisti-lo mais tarde.
HelloWorldScene.cpp
Em seguida, fui ao mundo da tela do HelloWorld.
No AppDelegate, sabemos que o HelloWorld é gerado usando o método createScene ().
Scene* HelloWorld::createScene()
{
return HelloWorld::create();
}
Em seguida, a HelloWorld::create();
execução é uma função macro no HelloWorldScene.h.
Sua definição é esta: (platform / CCPlatformMacros.h)
#define CREATE_FUNC(__TYPE__) \
static __TYPE__* create() \
{ \
__TYPE__ *pRet = new(std::nothrow) __TYPE__(); \
if (pRet && pRet->init()) \
{ \
pRet->autorelease(); \
return pRet; \
} \
else \
{ \
delete pRet; \
pRet = nullptr; \
return nullptr; \
} \
}
Simplificando, a função macro é substituir o parâmetro __TYPE__ pelo valor que você passa no momento da compilação. Aqui está o HelloWorld. Então, ao compilar, é o seguinte código compilado:
static HelloWorld* create()
{
HelloWorld *pRet = new(std::nothrow) HelloWorld();
if (pRet && pRet->init())
{
pRet->autorelease();
return pRet;
}
else
{
delete pRet;
pRet = nullptr;
return nullptr;
}
}
Portanto, o que é feito em create () é definir uma instância do HelloWorld e executar sua função de inicialização pRet->init()
.
Ok, vamos ao método Init () do HelloWorld:
1. Chame o método de inicialização da classe pai, porque o HelloWorldScene herda da Scene.
bool HelloWorld::init()
{
//////////////////////////////
// 1. super init first
if ( !Scene::init() )
{
return false;
}
......
}
2. Adicionado um botão Fechar ( MenuItemImage::create
). Este é o ícone no canto inferior direito da tela.
Normalmente, CloseNormal.png é exibido e, quando o mouse termina, CloseSelected.png é exibido. (As imagens e outros arquivos no projeto estão na pasta Recurso.)
/////////////////////////////
// 2. add a menu item with "X" image, which is clicked to quit the program
// you may modify it.
// add a "close" icon to exit the progress. it's an autorelease object
auto closeItem = MenuItemImage::create(
"CloseNormal.png",
"CloseSelected.png",
CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));
if (closeItem == nullptr ||
closeItem->getContentSize().width <= 0 ||
closeItem->getContentSize().height <= 0)
{
problemLoading("'CloseNormal.png' and 'CloseSelected.png'");
}
else
{
float x = origin.x + visibleSize.width - closeItem->getContentSize().width/2;
float y = origin.y + closeItem->getContentSize().height/2;
closeItem->setPosition(Vec2(x,y));
}
// create menu, it's an autorelease object
auto menu = Menu::create(closeItem, NULL);
menu->setPosition(Vec2::ZERO);
this->addChild(menu, 1);
Depois disso, uma função de retorno de chamada foi definida para CC_CALLBACK_1(HelloWorld::menuCloseCallback, this)
realizar a ação de clicar no botão (fechar o programa).
Em seguida, defina a posição desse botão closeItem->setPosition(Vec2(x,y));
no canto inferior direito.
Por fim, adicione este menu à cena HelloWorld:this->addChild(menu, 1);
Resuma o fluxo de adição de controles:
a) Instale um controle XXX::create()
, defina a imagem nele, defina a função de retorno de chamada com ações
b. Defina a posição de exibição setPosition()
. Calcule você mesmo
c. Adicione à cenathis->addChild()
3. O código a seguir é relativamente fácil de entender: adicionado um Label e um sprite.
O rótulo mostra o HelloWorld. O elfo mostra o ícone do elfo cocos.
Estes são os processos mencionados acima.
// add a label shows "Hello World"
// create and initialize a label
auto label = Label::createWithTTF("Hello World", "fonts/Marker Felt.ttf", 24);
if (label == nullptr)
{
problemLoading("'fonts/Marker Felt.ttf'");
}
else
{
// position the label on the center of the screen
label->setPosition(Vec2(origin.x + visibleSize.width/2,
origin.y + visibleSize.height - label->getContentSize().height));
// add the label as a child to this layer
this->addChild(label, 1);
}
// add "HelloWorld" splash screen"
auto sprite = Sprite::create("HelloWorld.png");
if (sprite == nullptr)
{
problemLoading("'HelloWorld.png'");
}
else
{
// position the sprite on the center of the screen
sprite->setPosition(Vec2(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));
// add the sprite as a child to this layer
this->addChild(sprite, 0);
}
O acima é o processo de criação e exibição da tela HelloWorld.
Em seguida, podemos consultar a documentação oficial para o uso dos vários controles acima :
você pode inserir, por exemplo, Label na barra de pesquisa, pode encontrar uma introdução ao Label: A
documentação acima é apenas um documento de descrição simples, registros detalhados de uso da API, Você também deve consultar a documentação da API :
O fim