Propriedades de um Objeto

Introdução:
Algo básico - porém essencial - que todo maker usuário do MMF2 deve saber é que TODOS os objetos do programa possuem propriedades próprias. Todos. Podem ser desde propriedades rotulianas até exclusivas dele. Saber manuseá-las apropriadamente é indispensável para uma boa aplicação do objeto em si. Infelizmente, é inviável pra mim explicar todas as propriedades de todos os objetos existentes (até porque qualquer um pode criar novas extensões, ou seja, é um número que cresce constantemente). Devido à isso, estudaremos agora apenas as propriedades de um Active Object: indiscutivelmente, um dos principais objetos desse programa, e aquele que possui o maior número de propriedades comuns a vários outros. Analogamente, seria como estudar "Seno, Cosseno e Tangente" para depois aprender a calcular seus valores em uma circunferência.

Sendo assim, fica por sua conta aprender sobre as propriedades exclusiva dos demais objetos que precisar usar. Mas não se preocupe; na maioria dos casos, é possível achar na internet tutoriais que explicam isoladamente o funcionamento deles (isso quando ele já não vem acompanhado de tutoriais).

Mais uma coisa... essa aula será extensa em demasia. Recomendo que leia tudo com atenção, mas não precisa decorar o que cada propriedade faz. O importante é ter uma visão geral de onde configurar cada coisa, e voltar aqui eventualmente se tiver alguma dúvida. Caso tenha um mínimo conhecimento em inglês, é possível que já saiba o que a maioria faz sem nunca ter usado. E mesmo as que não sabe, basta essa pequena explicação um pouco mais detalhada para que aprenda e não esqueça mais. ;)


Display Options:
São as propriedades de exibição daquele objeto. É aqui onde você define vários detalhes sobre seu aspecto visual: se ele terá ou não transições ao ser criado ou destruído (e se tiver, quais); se ele é ou não visível; ou até mesmo se efeitos serão aplicados a ele. As propriedades aqui são divididas em Background options (Opções do Plano de Fundo), Ink Effect (Efeito Tinta) e Transitions (Transições).

Visible at start: Visível ao começar. O nome é autoexplicativo: se for marcada, o objeto será visível ao iniciar o frame; se desmarcada, será invisível. Claro, isso é apenas como ele estará ao INICIAR o frame. A visibilidade de um objeto pode ser ser alterada através de eventos. Inclusive com um Start of Frame > Make this object visible/invisibile, dessa forma invalidando o que foi marcado, e dando mais importância ao que foi determinado nos eventos. Eu sempre a desmarco para fazer detectores de colisão, bem mais prático do que recorrer à eventos.

Background Options -- Save background: Salvar plano de fundo. Essa é uma propriedade interessante. Se marcada, o plano de fundo original do frame será "preservado", ou seja, não sofrerá alterações. Contudo, caso a opção seja desmarcada, aquele objeto terá a cada instante o quadro o atual de sua animação sendo carimbado na mesma posição onde se encontra (se ele tiver animação, claro). Caso ele se encontre parado, naturalmente, isso não poderá ser percebido. Contudo, se você alterar a posição do objeto durante a execução do frame (qualquer coisa vale, até colocar um movimento qualquer), perceberá facilmente que, na posição exata onde o objeto se encontrava anteriormente, está reproduzido o quadro da animação rodado no instante antes do objeto mudar sua posição. Ou seja, o plano de fundo já não estará mais "preservado".

Background Options -- Wipe with color: Esfregar com a cor. Esta opção só pode ser marcada se a Save the background estiver desmarcada. Ela faz com que não seja carimbado o quadro da animação do objeto, mas sim um quadrado de cor sólida do mesmo tamanho dele. Claro, é possível escolher a cor do preenchimento.

Ink Effect -- Transparent: Transparente. Ao ser desmarcada, desliga a transparência da animação. O que deveria ser transparente nos quadros da animação é substituído por preenchimento preto. Se marcada, liga a transparência.

Ink Effect -- Ink Effect: Efeito tinta. Opção onde se escolher um efeito para utilizar no objeto. Não falarei muito sobre eles nesta aula porque não convém, mas, se possível, teste todos para ver o que faz cada um. Quem utiliza programas de edição de imagem já deve ter uma ideia dos efeitos produzidos (belo trocadilho, hem?!). Se bem aplicados, podem resultar em bonitos efeitos especiais para seus jogos ou programinhas.

Ink Effect -- Coefficient: Coeficiente. Essa opção é referente à anterior. Só é habilitada quando o efeito escolhido na propriedade Ink Effect pode ter a intensidade controlada por um coeficiente, como é o caso do Semi-transparent. Se puder, é nessa opção que esse coeficiente é escolhido.

Ink Effect -- Anti-aliasing: Anti-aliasing. Se for marcada, essa opção ativa o anti-aliasing para aquele objeto. Se desmarcada, não ativa. Basicamente, anti-aliasing é a suavização dos pixels de maneira automática. Mais informações, vide Google.

Transitions -- Fade In: Transição de entrada. Aqui você seleciona a transição de criação do objeto. Se optar por não colocar transição, deixe em None.

Transitions -- Fade Out: Transição de saída. Aqui você seleciona a transição de destruição do objeto. Se optar por não colocar transição, deixe em None.

Size / Position:
Nesta aba, ficam as propriedades que dizem respeito ao tamanho, posição e ângulo do objeto. Ela divide as propriedades em três categorias: Position (Posição), Size (Tamanho) e Rotation (Rotação).

Position -- X: X. Posição horizontal do objeto ao começar o frame. É simplesmente onde ele fica horizontalmente ao começar frame, sendo estabelecido através de valores, e não do "Arrasta e Solta".

Position -- Y: Y. Posição vertical do objeto ao começar o frame. Assim como na opção anterior, é apenas a posição inicial do objeto, estabelecida através de números.

Size -- Width: Largura. Largura do objeto; pode ser mudada através das propriedades dele, usando valores. É bem útil para quando se quer um valor exato na largura (por exemplo, para definir um fundo com toda a largura do frame), e não simplesmente redimensionar sem saber o quanto você está aumentando ou diminuindo. A forma como funciona varia de objeto para objeto; enquanto no Active Object, faz com que a própria animação seja redimensionada, em outros, como Quick Backdrop, faz com que uma certa imagem se repita durante toda a área ocupada. Dizer que a própria animação é redimensionada significa que se você aumentar um sprite com as dimensões 32x32 (LARGURAxALTURA) para 64x64, quando for editar sua animação no programa, ele terá realmente o tamanho 64x64. Mas não se preocupe, pois mesmo que haja perda de qualidade durante o redimensionamento, é possível voltar ao tamanho e qualidade original apenas colocando os valores originais.

Size -- Height: Altura. Altura do objeto; assim como a largura, também pode ser alterada através das propriedades do objeto, e funciona exatamente da mesma forma: servindo para quando se quer definir um valor exato para a altura.

Rotation -- Angle: Ângulo. Aqui você pode definir o ângulo do objeto. Lembrando: os ângulos crescem no sentido anti-horário, e diminuem no sentido horário.

Movement:
É nessa aba que se escolhe o movimento do objeto, e o configura. Não explicarei sobre essas propriedades agora, porque ela merece ser estudada individualmente devido à sua importância, principalmente para iniciantes na ferramenta. Mas isto será abordado em aulas futuras. Apenas uma observação: tanto o movimento como sua configuração podem ser mudados também através de eventos. Embora seja bem menos prático, é útil caso seja necessário fazer alguma alteração em determinado ponto do frame.

RunTime Options:
Opções de execução; estão relacionadas às características práticas daquele objeto. Estão divididas em cinco categorias: Create Options (Opções de Criação), Scrolling Options (Opções de Rolagem), Collisions (Colisões), Memory Options (Opções de Memória) e Automatic Rotation (Rotação Automática).

Create Options -- Create at start: Criar ao iniciar. Deixe esta opção marcada para que o objeto seja criado ao iniciar o frame. Se a desmarcar, ele não será criado, e será necessário fazê-lo através de eventos. É útil para objetos que não tem finalidade no começo do frame. Mais fácil desmarcar do que usar o clássico Start of Frame > Destroy como muitos fazem.

Scrolling Options -- Follow the frame: Seguir o quadro. Essa opção determina se o objeto terá posição absoluta ou relativa ao frame. Se marcada, ele terá posição absoluta: aquele objeto sempre ocupará a posição pertencente a ele, sem depender de mais nada. Se desmarcá-la, sua posição será relativa ao frame, ou seja, ele sempre terá aquela posição onde foi colocado inicialmente, independentemente do quanto a tela se mova.

Consideremos que a posição de um objeto é relativa ao frame (opção desmarcada). Se tal objeto se encontrar sem movimento no ponto (100, 100), não importa o quanto a tela se mova, ele permanecerá na posição (100, 100) em relação ao frame. Se ele se estiver 100px abaixo da área inicial do frame (área visível inicial do frame, do tamanho da janela da aplicação, e delimitada por linhas tracejadas), não importa o quanto o jogador caia e a tela o siga, ele sempre estará 100px abaixo da área visível. Se esse mesmo objeto, 100px abaixo da área inicial tivesse posição absoluta, quando o personagem descesse 100px, ele conseguiria ver o objeto. Acho que deu pra entender né? É como uma HUD (aquelas barrinhas que contém o HP, MP e vidas): ela é posicionada no topo da tela, e o jogador pode andar quanto quiser, sendo seguido pela tela, mas a HUD continuará lá, sempre no topo da tela.

Scrolling Options -- Destroy object if it too far from frame: Destruir objeto se estiver muito distante do frame. Uma opçãozinha bem prática para poupar memória. Ela destrói o objeto se ele sair muito da área do frame. Tenha em mente que a área do frame é aquela branca, que aparece (ou pode aparecer) na aplicação. A área cinza não faz parte do frame, e, portanto, é considerada fora dele. Ou seja, sair do frame significaria ir para aquela área cinza. Lembrando que os objetos colocados lá existem, funcionam e ocupam memória! Apenas não são visíveis para o jogador. Mas enfim, qual a utilidade dessa opção? Vamos supôr que você crie o objeto de uma bala. Como a bala irá sempre para frente (a não ser que algo a destrua no caminho) ela eventualmente sairá da área do frame. A partir daí, ela já não tem mais utilidade. Porém, como já expliquei, ela continuará funcionando (indo pra frente) e ocupando memória. Mas se marcarmos esta opção, ela será destruída ao se distanciar muito da área do frame, assim, evitando consumo de CPU inútil.

Scrolling Options -- Inactivate it if too far from window: Inativar se estiver muito longe da janela. Se essa opção for marcada, um objeto é inativado quando se distanciar muito da área visível pela janela, ocupando, assim, menos memória.

Collisions -- Use fine detection: Usar detecção refinada. Uma opção bem útil. Se marcada, as partes transparentes do objeto não sofrerão colisões. Porém, se desmarcada, a área transparente poderá colidir com outros objetos, assim como qualquer outra cor. Por exemplo se utilizarmos o sprite padrão do Active Object (o mesmo que introduz esta aula) com essa opção marcada, a parte transparente será ignorada, e a colisão só ocorrerá quando um pixel de outra cor encostar com o outro objeto. Porém, se ela for desmarcada, a colisão acontecerá antes de um pixel colorido encostar no outro objeto: será quando a parte transparente encostar. Ou seja, área colidível deixará de ser o losango para virar um quadrado.

Memory Options -- Global Object: Objeto Global. Se marcada, transforma o objeto em um Objeto Global. Isso faz com que ele seja reconhecido nos Global Events (Eventos Globais, isto é, servem para toda a aplicação). Não se preocupe, pois isto será explicado melhor em aulas futuras.

Memory Options -- Load on call: Carregar por meio de chamado. Se a opção for marcada, faz com que o objeto só seja chamado à aplicação quando necessário. Dessa forma, o tempo de espera para iniciar o frame é reduzido, uma vez que ele carregará mais rápido, criando menos objetos de imediato. Entretanto, marcá-la pode ocasionar pequenas travadinhas no jogo, pois a aplicação terá de criar o objeto de última hora. Mantendo-a desmarcada, ele será criado assim que começar o frame.

Automatic Rotations -- Enabled: Habilitado. Ativá-la fará com que o ângulo do objeto mude de acordo com a direção assumida por ele. É uma solução prática para não ser necessário fazer várias animações para cada direção. Essa opção muda o ângulo da animação do objeto na direção "virado para a direita". Mesmo que exista uma animação na direção "virado para a esquerda", ele apenas ignorará sua existência e mudará o ângulo da "virada para direita". Além disso, ele não altera o ângulo baseado em outras direções; se não houver uma animação para a direção "virado para a direita", ele agirá como se a opção estivesse desmarcada.

Values:
Gerenciamento das variáveis internas do objeto. Possui duas categorias: Alterable Values (Variáveis Numéricas) e Alterable Strings (Variáveis Textuais).

Nesta aba, é possível renomear as vinte e seis primeiras variáveis numéricas e textuais, nomeadas por padrão com Alterable Value ou Alterable String (dependendo do tipo de variável), precedido por uma letra de A-Z. Também pode-se fazer a definição de seus respectivos valores.

Para nomear uma variável, basta clica no botão New de sua devida categoria (se for uma variável numérica, clique no botão da categoria Alterable Values, e vice-versa) e então dar um duplo-clique sobre o nome padrão. Os nomes das variáveis não podem começar com um número, conter sinais de pontuação ou ser homônimo de uma expressão do MMF2 (tais como Abs ou Len). Para mudar o valor inicial da variável, apenas clique no atual valor inicial dela e altere.

Tenha em mente de que elas devem ser adicionadas à lista em sequencia. Ou seja, você não pode nomear a variável B se não tiver adicionado na lista aA, assim como adicionar a B é pré-requisito para adicionar e nomear a C. Não que você precise definir nomes próprios e valores para cada uma delas, mas é necessário que elas estejam presentes na lista da propriedade. Embora eu não consiga entender a diferença entre utilizar a última variável ou a primeira, se ambas estiverem livres.

Events:
Também não irei entrar em detalhes nesta aba, pois é outra que requer atenção especial. Tenha em mente que ela tem como função gerenciar os Qualifiers (Qualificadores) e Behaviors (Comportamentos) do objeto.

Para adicionar um Qualifier, clique no espaço em branco ao lado da respectiva propriedade, e então no botão Edit. Abrir-se-á, então, uma janelinha onde você poderá gerenciá-los. No botão Add, você adiciona um novo qualificador, e em Delete, remove um qualificador selecionado.

Se quiser adicionar um Behavior, clique no botão New, localizado na categoria de mesmo nome. Dessa forma, um novo Behavior será criado com o nome Behavior #N, sendo N a numeração daquele Behavior. Para editá-lo, basta clicar nas reticências ao lado dele e depois no botão Edit.

About:
Aba universal, presente em todos os objetos. É nela que você muda seu nome e ícone, vê seu respectivo Arquivo de Ajuda e encontra as informações básicas sobre ele, se houver (quem criou, site oficial etc). Vamos nos focar aqui apenas nas duas propriedades relevantes, e que podemos alterar: Name e Icon.

Name: Nome. Nessa opção você renomeia o objeto. Dar um nome próprio para os objetos, que os identifiquem facilmente, é questão de organização, e por mais que isso pareça irrelevante, é essencial para todo projeto. Falta de organização pode acabar deixando o source confuso, o que pode causar MUITA dor de cabeça para o programador. Falo por experiência própria.

Icon: Ícone. Opção onde se define o ícone do objeto. Bastante útil para encontrá-lo no Event Editor caso hajam muitos objetos com ícones iguais ou parecidos.

As propriedades desta aba podem parecer bobagem, mas acreditem em mim, são algumas das mais importantes do objeto. É verdade que não possuem uso real no desenvolvimento, mas é essencial manter seu projeto organizado sempre, pois você nunca sabe o que pode acontecer. É mais comum do que se imagina programadores se perderem em suas próprias "linhas de código".

Finalizando:
Essa aula foi grandinha, é verdade, mas considero-a muito importante. É essencial que você conheça as propriedades básicas dos objetos no MMF2, e quanto antes aprender isso, melhor. Repise-se, você NÃO PRECISA decorar todas as funções de todas as propriedades. Basta ter uma visão geral de onde configurar cada coisa. Se precisar, não tem problema voltar nesta aula pra lembrar alguma coisa. Isso você aprende com o uso.

Bem, e é isso. Espero que tenham gostado \^o^/
Abraços.