20 de dezembro de 2018

Godot Engine - Criando um módulo customizado para o android

Em algum momento você via precisar criar um módulo customizado na Godot Engine para alguma plataforma (como android ou IOS). 

Como exemplo de um módulo customizado teríamos um módulo para a apresentação de anúncios (ads), como o Admob, Chartboost, ou Heyzap. Isso é necessário pois o módulo de ads não faz parte do núcleo do Godot.



Propaganda é o sustento do desenvolvedor de jogos


Para demonstrar a criação de um módulo para o android na Godot Engine, vamos criar um módulo simples que obtém as informações do aparelho celular e retorna o resultado em um Dictionary. Vamos chamar o módulo de device_info.

A seguinte estrutura de arquivos/pastas é necessária para a criação do módulo:

  • device_info
    • SCub
    • register_types.h
    • register_types.cpp
    • config.py
    • android
      • DeviceInfo.java


Pasta device_info

É a pasta raiz do projeto, que vai ser copiada para a pasta modules do projeto do Godot. 


Arquivo SCub

Arquivo a ser utilizado pelo Scons para a compilação do módulo. 


1
2
3
4
5
Import('env')

sources = [
           'register_types.cpp'
           ]


Arquivo register_types.h

Utilizado para registrar o módulo na Engine

1
2
void register_device_info();
void unregister_device_info();


Arquivo register_types.cpp

Implementação do .h

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#include "register_types.h"
#include "object_type_db.h"
#include "core/globals.h"
#include "ios/src/device_info.h"

void register_device_info() {
    Globals::get_singleton()->add_singleton(Globals::Singleton("DeviceInfo", memnew(DeviceInfo)));
}

void unregister_device_info() {
}


Arquivo config.py

Arquivo a ser utilizado pelo Scons

1
2
3
4
5
6
7
def can_build(plat):
 return plat=="android"

def configure(env):
 if (env['platform'] == 'android'):
  env.android_add_java_dir("android")
  env.disable_module()


Arquivo DeviceInfo.java

Arquivo com a implementação do módulo para o android.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package org.godotengine.godot;

import java.util.HashMap;

import android.app.Activity;

import android.util.Log;

import android.os.Build;

public class DeviceInfo extends Godot.SingletonBase
{

 private Activity activity;

 static public Godot.SingletonBase initialize(Activity p_activity)
 {
  return new DeviceInfo(p_activity);
 }
 
 public DeviceInfo(Activity p_activity)
 {
  /*
   * Registrando os métodos que serão exportados para o GDscript  
   */
  registerClass("DeviceInfo", new String[]
  {
   "get_info_array"
  });
  activity = p_activity;
  
 }

 /**
  * Implementação do método para obter as informações do dispositivo
  */
 public org.godotengine.godot.Dictionary get_info_array()
 {
  org.godotengine.godot.Dictionary info = new org.godotengine.godot.Dictionary();
  info.put("MANUFACTURER", Build.MANUFACTURER);
  info.put("MODEL", Build.MODEL);
  info.put("PRODUCT", Build.PRODUCT);
  info.put("BRAND", Build.BRAND);
  info.put("DEVICE", Build.DEVICE);

  Log.d("godot", "get_info_array");

  return info;
 }
}


Para compilar o módulo criado, basta seguir as instruções do artigo Compilando a Godot para android - utilizando o Linux.


A animação a seguir apresenta a utilização do módulo criado.




No próximo artigo vamos criar um projeto no Godot demonstrando a utilização do módulo.