Você está na página 1de 46

Adaptacin de videojuegos en dispositivos mviles

INSTITUTO TECNOLOGICO DE CULIACAN

PROYECTO
Adaptacin de videojuegos en dispositivos mviles

CARRERA
Ingeniera en Sistemas Computacionales

SEMESTRE
10
ALUMNO
Christian Jair Lindor Valdez
NO. DE CONTROL
07170663

ASESOR INTERNO Y REVISORES


M.C. Martn Leonardo Nevrez Rivas
Dr. Ramn Zatarain Cabada
M.C. Gloria Ekaterine Peralta Peuri
ASESOR EXTERNO
Daniel Melchor
1

Adaptacin de videojuegos en dispositivos mviles


Culiacn, Sinaloa, Junio del 2012
DATOS GENERALES DE LA EMPRESA

Nombre o Razn Social


Gameloft S de R.L de C.V.
Domicilio
Callejon Chinesca y Av. Juarez No. 70 Col. Zona Centro CP 21100.
Mexicali, Baja California.
Telfono
686 552-36-11
Personas encargadas
Lic. Viktor Manuel Campos Villa - Director Administrativo
Daniel Melchor Coordinador

Adaptacin de videojuegos en dispositivos mviles

ANTECEDENTES DE LA EMPRESA
La historia comienza mucho antes de los inicios de la compaa. En 1985, cinco hermanos
nacidos en la Bretaa francesa fundaron dos empresas: la corporacin Guillemot y Ubisoft. Cinco aos
despus, los hermanos Michel y Gerard crearon los dos primeros estudios de produccin de Ubisoft,
uno en Francia y otro en Rumana. Fue justo en aquella poca cuando naci Rayman, el famoso hroe
que luch por derrotar al malvado Mr. Dark.
No pas mucho tiempo para que Ubisoft se convirtira en una de las compaas ms grandes del
sector de los videojuegos en el mundo, produciendo algunos de los mejores ttulos para consolas y PC.
A finales de la dcada de los 90, Michel Guillemot, responsable de los estudios Ubisoft, observ
el crecimiento y expansin del mercado de los telfonos mviles en todo el mundo y pens en la opcin
de descargar juegos online para estos dispositivos, convirtindolos as en consolas porttiles.
Se trataba de todo un nuevo universo por explorar, que sobrepasara los 50 millones de
jugadores ya ganados como clientes y, en un plazo aproximado de diez aos, conquistara a miles de
millones de jugadores ocasionales por todo el mundo.
Guillemot quera demostrar que la gente estaba dispuesta a jugar en sus telfonos celulares si
los ttulos ofrecidos presentaban buena calidad y bajos precios. Incluso, los jugadores ocasionales
comenzaran a pedir una mayor calidad y diversidad de juegos, sin tener que actualizar sus dispositivos.
Por esto, sera necesario crear ttulos nicos que se pudiesen jugar en cada uno de los centenares de
telfonos mviles disponibles en aquel momento

ndice
3

Adaptacin de videojuegos en dispositivos mviles

Tabla de contenido
1.

Introduccin.....................................................................3

2.

Justificacin......................................................................4

3.

Objetivos..........................................................................5

4.

Caracterizacin del rea en la que se participo...................5

5.

Problema a resolver..........................................................6

6.

Alcances y limitaciones.....................................................6

7.

Fundamento terico..........................................................7

8.

Procedimiento y descripcin de las actividades realizadas.14

9.

Resultados.....................................................................44

7.1 Herramientas utilizadas.........................................................7


7.2 Consulta de fuentes de informacin.....................................10
7.3 Apoyo de las materias cursadas al elaborar el proyecto de residencias
.................................................................................................12
7.4 Conceptos bsicos del proyecto...........................................12
8.1 Agregando soporte para la OEM Bar en Kindle Fire...............14
8.3 Implementacin de la WelcomeScreen..................................19
Para mayor un mayor detalle se incluye el cdigo. (ver anexo A).............36
8.3 Agregando al videojuego la capacidad de utilizar efectos Post-Process
.................................................................................................36

10.

Conclusiones.................................................................44

11.

Bibliografa..................................................................45

Adaptacin de videojuegos en dispositivos mviles


1. Introduccin
El presente proyecto llamado adaptacin de videojuegos en dispositivos mviles pretende llevar
videojuegos que han sido diseados originalmente para ejecutarse en el sistema operativo iOS a
dispositivos que utilicen Android.

Los lenguajes utilizados para desarrollar en estas plataformas son diferentes, por lo que es
necesario que el cdigo sea transformado de un lenguaje a otro. En iOS se programa en Objective C en
conjunto con C++ y en Android se utiliza Java en conjunto con C++.

Las tareas de forma general a realizar para permitir la adaptacin son las siguientes:

Llevar el cdigo de Objective C a Java


Adaptar los recursos(Musica, Graficos) de iOS a Android

2. Justificacin
Gameloft es una empresa internacional dedicada a desarrollar videojuegos para dispositivos
mviles con un gran repertorio de videojuegos que actualmente estn funcionando en dispositivos con
Java y iOS, Con el objetivo de tener acceso a un mayor mercado se necesita llevar los videojuegos
desde una plataforma a otra.

Adaptacin de videojuegos en dispositivos mviles


3. Objetivos
Adaptar videojuegos que actualmente se encuentran funcionando en iOS a Android,
consiguiendo un comportamiento lo ms fiel posible a la versin original.
4. Caracterizacin del rea en la que se participo
El proyecto fue realizado en Gameloft S de RL de C.V, empresa que se dedica a crear y adaptar
videojuegos para dispositivos mviles. Tiene su sede central en Francia y cuenta con oficinas alrededor
de todo el mundo. Dentro de Mxico se encuentra ubicada en Mexicali, Baja California. El proyecto se
realizo en el departamento de Publishing.

Publishing es una rea en la que se desarrollan proyectos de los que se toma directamente la
fuente de iOS y se comienza a adaptar desde cero, no hay adaptaciones previas de el videojuegos. Se le
integran caractersticas equivalentes para Android de algunas caracteristicas como :

InApBilling: Capacidad de realizar compras dentro de la misma aplicacin


IGP: Acceder a otros videojuegos dentro del mismo
Ads: Publicidad dentro del videojuego
Installer: Es el instalador para la plataforma Android
WelcomeScreen: Es una pantalla de bienvenida que debe mostrarse una vez iniciado el

videojuego que permite mostrar algunos anuncios.


OEM Bar: Es una barra que debe mostrase bajo ciertas circunstancias en la parte inferior del
juego y permite salir de la aplicacin.

5. Problema a resolver
El proyecto cuenta con diferentes tipos de problemas, a continuacin se ordenan los problemas
a resolver de mayor a menor importancia:
6

Adaptacin de videojuegos en dispositivos mviles

Amazon tiene una tableta llamada Kindle Fire que tiene instalada una versin modificada de
Android y para aceptar una aplicacin solicita que el videjuego muestre un men al inferior de

la pantalla que incluye botones para salir.


Los videojuegos mas recientes al ser lanzados deben mostrar una ventana llamada
WelcomeScreen que permite mostrar algunos anuncios y llevar al usuario a algunas partes

especificas del videojuego, como pueden ser la tienda o el men principal.


Las nuevas guias de Gameloft solicitan que los juegos incluyan la capacidad de tener efectos
de PostProcess.

6. Alcances y limitaciones
El proyecto abarcar la adaptacin del videojuego a la plataforma Android, el juego debe
comportarse igual que en iOS.

No se incluir algn tipo de contenido extra ni se modificara el diseo del videojuego, se


limitara a hacer el comportamiento de el videojuego sea el mismo en ambas plataformas.

7. Fundamento terico
7.1 Herramientas utilizadas
Se utilizaron un conjunto e herramientas y tecnologas para realizar el proyecto, a continuacin
se algunas de ellas:
7

Adaptacin de videojuegos en dispositivos mviles

Visual C++ 2010 Express


Microsoft Visual C++ 2010 es un potente Entorno de Desarrollo Integrado (IDE) que asegura
cdigo de calidad durante todo el ciclo de vida de la aplicacin, desde el diseo hasta la
implementacin.

Microsoft Visual C++ incluye conjunto de herramientas que los desarrolladores de Windows en
cualquier nivel pueden utilizar para crear aplicaciones personalizadas mediante configuracin bsica y
experta. Visual C++ es un lenguaje eficaz que est diseado para darle control profundo y detallado al
crear aplicaciones nativas de Windows. (Microsoft Corporation, 2010)

Java
Java es una plataforma que consiste de interfaces de programacin de aplicaciones(API) y una
Java virtual machine(JVM).

Los programas en Java son interpretados por otro programa llamado Java VM. Esto significa
que cualquier computadora con la JVM instalada puede correr cualquier programa en Java. (Pawlan,
1999)
Android
Android es la plataforma mvil mas popular en le mundo. Android te da la una plataforma de
clase mundial para crear tus aplicaciones y videojuegos para usuarios de Android, tambin incluye un
Market para distruirlas de forma instantnea.

Adaptacin de videojuegos en dispositivos mviles


Android te provee de un nico modelo que te permite desarrollar tu aplicacin y alcanzar
milonens de usuarios a travs de diferentes dispositivos, desde telfonos a tabletas.

Android tambin incluye herramientas para crear aplicaciones que se vean espectacular y tomen
ventaja de la aceleracin por hardware disponibles en cada dispositivo. El adapta la interfaz grafica de
tu aplicacin automticamente de la forma que luzca lo mejor posible en cada dispositivo al mismo
tiempo que te deja tanto control como tu quieras sobre la interfaz grafica entre diferentes dispositivos.

Entre las herramientas disponibles para Android se encuentra un entorno de desarrollo integrado
para Java con caractersticas avanzadas para el desarrollo, depuracin y empaquetado de las
aplicaciones. Usando el entorno de desarrollo puedes crear dispositivos virtuales que emulan cualquier
configuracin de hardware. (Google, 2012)
Android SDK
Android SDK son las siglas de Android Software Development Kit. Es un kit de desarrollo con
el que podremos desde desarrollar aplicaciones hasta ejecutar un emulador del sistema android en la
version que queramos. Cabe decir que es imprescindible para efectuar acciones como el desbloqueo del
arranque o utilizar el controlador adb. (Google, 2012)
OpenGL
OpenGL es una API independiente de la plataforma para el procesamiento de grficos en 3D.
Una gran ventaja de utilizar OpenGL es que es un estndar de la industria. Otros entornos en 3D tienen
caractersticas similares pero son especficos de sistemas Windows.

Adaptacin de videojuegos en dispositivos mviles


OpenGL incluye funciones relacionadas con texto que son atendidas por OpenGL Utility
Toolki(GLUT), el cual provee una forma interfaz sencilla para controlar ventanas y gestionar eventos
de entrada por el usuario.

OpenGL tiene dos propsitos esenciales:

Ocultar la complejidad de la interfaz con las diferentes tarjetas grficas, presentando al

programador una API nica y uniforme.


Ocultar las diferentes capacidades de las diversas plataformas hardware, requiriendo que todas
las implementaciones soporten la funcionalidad completa de OpenGL (utilizando emulacin
software si fuese necesario).

El funcionamiento bsico de OpenGL consiste en aceptar primitivas tales como puntos, lneas y
polgonos, y convertirlas en pxeles. Este proceso es realizado por una pipeline grfica conocida como
Mquina de estados de OpenGL.8 La mayor parte de los comandos de OpenGL bien emiten primitivas
a la pipeline grfica o bien configuran cmo la pipeline procesa dichas primitivas. Hasta la aparicin de
la versin 2.0 cada etapa de la pipeline ejecutaba una funcin prefijada, resultando poco configurable
(Buss, 2003)

OpenGL Shading Lanugage


OpenGL Shading Lenguage incluye dos lenguajes relacionados. Esos lenguajes son usados
para crear shaders para procesadores programables que cumplen las especificaciones de OpenGL.
10

Adaptacin de videojuegos en dispositivos mviles

Vertex Processor: Es una unidad programable que trabaja con los vrtices y sus datos
asociados. Las unidades son programadas usando OpenGL Shading Language para ser
ejecutado en este procesador, el resultado es llamado Vertex Shader.

Fragment Processor: Es una unidad programable que trabaja con los valores de los fragmentos y
sus datos asociados. Las unidades son programadas usando OpenGL Shading Language y son
ejecutados en este procesador. Cuando un un Fragment Shader es compilado y enlazado se
obtiene como resultado un Fragmetn Shader. (Kessenich, 2006)

7.2 Consulta de fuentes de informacin


Algunas de las principales fuentes de informacin que se utilizaron para avanzar en el proyecto
son las siguientes:

Stack Overflow

11

Adaptacin de videojuegos en dispositivos mviles


Imprescindible para todo programador de cualquier lenguaje de programacin. Es un sitio de
internet gratuito que permite hacer preguntas y que sea la misma comunidad desarrolladora
(diseadores, programadores, analistas, etc.) la que contesta esas dudas. Acerca del proyecto se
resolvieron gran parte de problemas o dudas que la misma documentacin de Android no haca o no
dejaban en claro, por ejemplo manejo de base de datos, uso de barras de progreso, declaraciones de
nuevos componentes, etc.

GPU Gems
Es una coleccin de artculos bastante interesante que cubren aspectos prcticos de tcnicas de
procesador de grficos en tiempo real. Incluye tutoriales comprensibles, ejemplos de cdigo y demos.
Inicialmente se venda como exclusivamente como libro en formato fsico pero en la actualidad se
puede encontrar en formato electrnico de forma totalmente gratuita.

Gameloft DP
Gameloft DP es un sitio nuevo en el que los desarrolladores de todo el mundo que trabajan en
Gameloft pueden compartir su conocimiento con otros estudios. Incluye documentacin de las
herramientas internas de la empresa y tutoriales muy interesantes.

7.3 Apoyo de las materias cursadas al elaborar el proyecto de residencias


La materia cursadas que mas tiles fueron al realizar el proyecto de residencias fueron
Programacin Orientada a Objetos y Graficacin.

12

Adaptacin de videojuegos en dispositivos mviles


Programacin Orientada a Objetos
La cantidad de cdigo dentro del proyecto es demasiada, por lo que llegar a una comprensin y
poder agregar y quitar funcionalidad se requiere un solido conocimiento de programacin orientada a
objetos.

Graficacin
Una parte del proyecto consta de trabajar con procesamiento de imgenes en 3D, mejorar la
calidad de los colores que se ven en los dispositivos, de tal forma que se vean iguales en diferentes
pantallas. Esta materia ayudo aportando conceptos que serian tiles al momento de trabajar con
OpenGL y OpenGL Shading Language.

7.4 Conceptos bsicos del proyecto

Shader

13

Adaptacin de videojuegos en dispositivos mviles


Programa que se ejecuta en la tarjeta grafica y permite realizar efectos sobre la imagen que se

enva a la pantalla.
Textura
Es un espacio de memoria que se utiliza para representar una imagen.

Frame Buffer Object(FBO)


Marco de trabajo sobre el cual se dibuja, incluye una texutra para el color y una
para la profundidad.
Java Native Interface
JNI define la forma en que el cdigo manejado escrito en Java puede interactuar con cdigo
nativo(escrito en C/C++). El objetivo de realizar esto es el rendimiento y control de bajo nivel

al que tiene acceso una aplicacin nativa.


Activity
Las actividades son tareas que el usuario puede realizar. La mayora de las actividades
interacta con el usuario, la clase Activity crea la ventana en la que se situan los elementos de

la interfaz grafica.
View
Una View expone una interfaz grafica que interacta con el usuario, como puede ser un botn o

un campo de texto.
AndroidManifest.xml
Toda aplicacin en Android debe tener el archivo AndroidManifest.xml en el directorio raz.
Este archivo contiene informacin esencial de la aplicacin que el sistema Android debe
conocer antes de que la aplicacin pueda ser ejecutada. Algunas cosas que incluye el manifest
son:
Nombre del paquete de Java
Describe los componentes de la aplicacin
Declara los permisos necesarios para ejecutar la aplicacin
La mnima versin de la API de Android que requiere la aplicacin

14

Adaptacin de videojuegos en dispositivos mviles


8. Procedimiento y descripcin de las actividades realizadas
8.1 Agregando soporte para la OEM Bar en Kindle Fire
Kindle Fire cuenta con una men color negro que ocupa una altura de 20 pixeles en la parte
inferior de la pantalla. La OEM Bar permite al usuario salir de la aplicacin regresar un paso atrs.
La primera actividad a realizar fue la capacidad de mostrar u ocultar la OEM Bar en la tableta
Kindle Fire. La OEM Bar ya se encuentra implementada de fabrica e incluye y esta es mostrada u
ocultada de acuerdo a banderas que pueden ser activadas o desactivada por cualquier aplicacin.

Anlisis y Diseo
Kindle Fire cuenta con dos modos de ejecutar una aplicacin, el modo Full-Screen y el modo
Super-Full-Screen. Cuando

se utiliza el modo Full-Screen la aplicacin tiene a su disposicin

1024x580 pixeles y en modo Super-Full-Screen se dispone de 1024x600 pixeles. Al usarse el modo


Super-Full-Screen se logra ocultando la OEM Bar, pero las reglas de Amazon especifican que la OEM
Bar debe mostrase en el men de la aplicacin o en un lugar de rpido acceso Los pasos necesarios
pueden observarse en la Figura 1.

15

Adaptacin de videojuegos en dispositivos mviles

Declaracin
de cadenas

Declaracin
de permisos

Codificacin
en Java

Exponer la
funcionalida
d con JNI

Figura 1

Declarando cadenas
El archivo strings.xml es un archivo con formato en XML que declara cadenas de texto que
pueden ser utilizadas dentro de la aplicacin. La implementacin es la siguiente:
<string name="noSoftKeyLabel">set AMAZON_FLAG_NOSOFTKEYS</string>
<string name="noSoftKeyDescription">Allow a app display full screen in
window</string>

Declaracin de permisos
Es necesario solicitar un permiso para poder controlar el comportamiento de la OEM Bar. Los
permisos deben ser especificados en el archivo AndroidManifest.xml . La implementacin es la
siguiente:
#if USE_FULLSCREEN_NOSOFTKEY
<uses-permission
android:name="com.amazon.permission.SET_FLAG_NOSOFTKEYS"
16

Adaptacin de videojuegos en dispositivos mviles


android:description="@string/noSoftKeyDescription"
android:protectionLevel="normal"
android:label="@string/noSoftKeyLabel"/>
#endif
Codificacin en Java
La codificacin se realiza en el lenguaje de programacin Java. Se dos mtodos que agregan o
eliminan unas banderas a la vista principal. Kindle Fire reconoce cuando se han altera el estado de las
banderas y muestra u oculta la OEM Bar segn sea el caso.
#if FULLSCREENTOGGLE
public static final int AMAZON_FLAG_NOSOFTKEYS = 0x80000000;
private static final int FLAG_SUPER_FULLSCREEN =
AMAZON_FLAG_NOSOFTKEYS |
WindowManager.LayoutParams.FLAG_FULLSCREEN;
#endif
#if FULLSCREENTOGGLE
public static void FullScreenToggleHideBar()
{
m_sInstance.runOnUiThread(new Runnable()
{
@Override
public void run()
{
17

Adaptacin de videojuegos en dispositivos mviles


m_sInstance.getWindow().addFlags(FLAG_SUPER_FULLSCREEN);

m_sInstance.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_N
OT_FULLSCREEN);
}
});
}
public static void FullScreenToggleShowBar()
{
mThis.runOnUiThread(new Runnable()
{
@Override
public void run()
{
m_sInstance.getWindow().clearFlags(FLAG_SUPER_FULLSCREEN);

m_sInstance.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCRE
EN);
}
});
}
#endif
18

Adaptacin de videojuegos en dispositivos mviles


Exponer la funcionalidad con JNI
Los videojuegos estn programados en su mayor parte en C++, por lo que se requiere exponer
los dos mtodos anterior definidos con el fin de ocultar o mostrar la OEM Bar cuando el videojuego
entre al men principal. Se necesitan utilizar JNI para declarar el acceso a estos mtodos.
#if FULLSCREENTOGGLE
static jmethodID mFullScreenToggleHideBar;
static jmethodID mFullScreenToggleShowBar;
#endif
#if FULLSCREENTOGGLE
void nativeFullScreenToggleHideBar();
void nativeFullScreenToggleShowBar();
#endif
#if FULLSCREENTOGGLE
mFullScreenToggleHideBar = (*env)->GetStaticMethodID (env,mClassGame,
"FullScreenToggleHideBar", "()V");
mFullScreenToggleShowBar = (*env)->GetStaticMethodID (env,mClassGame,
"FullScreenToggleShowBar", "()V");
#endif
#if FULLSCREENTOGGLE
void nativeFullScreenToggleHideBar()
{
(*mEnv)->CallStaticVoidMethod(mEnv, mClassGame,mFullScreenToggleHideBar);
19

Adaptacin de videojuegos en dispositivos mviles


}
void nativeFullScreenToggleShowBar()
{
(*mEnv)->CallStaticVoidMethod(mEnv, mClassGame,mFullScreenToggleShowBar);
}
#endif
en C
#if FULLSCREENTOGGLE
extern "C" void nativeFullScreenToggleShowBar();
extern "C" void nativeFullScreenToggleHideBar();
#endif

8.3 Implementacin de la WelcomeScreen


La WelcomeScreen es una ventana que debe permitir mostrar contenido en HTML descargado
desde una direccin web de Gameloft. Cada dispositivo y videojuego debe mostrar informacin
diferente por lo que se deben enviar algunos parmetros con el fin de obtener la correspondiente para
dicho dispositivo y videojuego.

20

Adaptacin de videojuegos en dispositivos mviles


El formato de la direccin web debe contener datos como:

Identificador del videojuego: Son 4 letras que identifican el videojuego


Pas: Desde el que se accede
Lenguaje: Idioma que tiene configurado el dispositivo
UDID: Identificador nico del dispositivo
Firmware: La versin
Tipo: Si el dispositivo es un Android o iOS

Se pretende realizar una implementacin genrica que pueda ser reutilizado en ms de un


videojuego. La forma de comunicar el sitio web y la aplicacin es mediante enlaces en HTML que
permiten ejecutar comandos especficos en el videojuego. Los comandos validos son:

Play: Lanza un videojuego instalado.


Link: Carga otro sitio.
Exit: Cierra la WelcomeScreen.
Goto: Es enviado al videojuego, se utiliza para redirigir a partes dentro del videojuego, como a

la tienda o al men.
Market: Abre el Market y muestra un videojuego que permite su descarga.
vnd.youtube: Descarga y muestra un video de YouTube.

Codificacin de la WelcomeScreen
SplashScreenActivity.java.
package APP_PACKAGE;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import android.app.Activity;
import android.content.Context;
21

Adaptacin de videojuegos en dispositivos mviles


import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.graphics.Bitmap;
import android.net.Uri;
import android.net.wifi.WifiManager;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings.Secure;
import android.telephony.TelephonyManager;
import android.view.Display;
import android.view.View;
import android.view.WindowManager;
import android.webkit.WebSettings.*;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.RelativeLayout;
import android.media.AudioManager; //BUG FIX FOR 5028761, AGSB 16/05/2012
import APP_PACKAGE.GLUtils.SUtils;
public class SplashScreenActivity extends Activity
{
public static int
currentLanguage = 0;
public static boolean gIsRunning = false;
private Display
public static
public static
static int
static int
static int
static int

display;
RelativeLayout mView;
WebView mWebView;
SCR_W = 800;
SCR_H = 480;
webHeight;
webWidth;

public String
K_LINK_TOPDEALS_TEMPLATE =
"http://ingameads.gameloft.com/redir/ads/splashscreen_view.php?
from=FROM&country=COUNTRY&lg=LANG&udid=UDIDPHONE&d=DEVICE&f=F
IRMWARE&game_ver=VERSION&type=android";
public String
K_LINK_TOPDEALS = "";
public static String [] TXT_IGP_LANGUAGES =
{
"EN",
22

Adaptacin de videojuegos en dispositivos mviles


"FR",
"DE",
"IT",
"SP",
"JP",
"KR",
"CN",
"BR",
"RU"
};
public SplashScreenActivity()
{
SUtils.setContext((Context)this);
}
@Override
public void onDestroy()
{
DBG("SPLASH_SCREEN", "********* onDestroy(): activity finished
********");
super.onDestroy();
}
// is the WS closed by the user?
//
case 1: The user closes the WS pressing exit button. In this case we do not
need do nothing special.
// case 2: An interrupt closes the WS, in this case the textures must be reloaded to
prevent black screen on relaunch.
static boolean userExit = false;
@Override
protected void onPause()
{
DBG("TAG", "Entre OnPause");
if(GL2JNILib.m_view == null) return;
if(!userExit) // Reload textures if there is a hardware interrupt
GL2JNILib.nativeResetActiveInAppBilling();
if(!GL2JNILib.nativeIsActiveInAppBilling())
{
#if USE_NATIVE_FIELD_TEXT
if(GL2JNILib.WrapperKeyboard!=null)
GL2JNILib.WrapperKeyboard.onPause();
#endif //#if USE_NATIVE_FIELD_TEXT
23

Adaptacin de videojuegos en dispositivos mviles

GL2JNILib.stateChanged(false);
// Pause framework
GL2JNILib.m_view.onPause(); // ihr fix bug 4596944
}
/// Dismiiss Popop Dialog
if(GL2JNILib.dialogPopup != null)
{
GL2JNILib.dialogPopup.dismiss();
}
closeSplash();
super.onPause();
}
@Override
protected void onResume()
{
GL2JNILib.setWSState(2); // Fix And: 4752673 [Music from game
triggers in Lock screen]
super.onResume();
}
@Override
public void onCreate(Bundle icicle)
{
super.onCreate(icicle);
if (CLASS_NAME.m_sInstance == null)
{
closeSplash();
return;
}
Intent sender = getIntent();
int lang = 0;
if (sender.getExtras() != null)
{
lang = sender.getExtras().getInt("language");
}
else
{
lang = currentLanguage;
24

Adaptacin de videojuegos en dispositivos mviles


}
if(lang < 0 || lang > TXT_IGP_LANGUAGES.length)
lang = 0;
display = ((WindowManager)
getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
SCR_H = display.getHeight();
SCR_W = display.getWidth();
mView = new RelativeLayout(this);
mWebView = new WebView(this);
mWebView.setHorizontalScrollBarEnabled(false);
mWebView.setVerticalScrollBarEnabled(false);
mWebView.setBackgroundColor(0);
mWebView.setInitialScale(100);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings().setAppCacheEnabled(false);
mWebView.getSettings().setSupportZoom (false);
mWebView.getSettings().setBuiltInZoomControls(false);
mWebView.getSettings().setLoadWithOverviewMode(true);
mWebView.getSettings().setUseWideViewPort(true);
//mWebView.getSettings().setDefaultZoom(ZoomDensity.FAR);
//
//mWebView.getSettings().setLayoutAlgorithm(LayoutAlgorithm.SINGLE
_COLUMN);
//mWebView.setInitialScale(1);
mWebView.setWebViewClient(new glWebViewClient());
webWidth = (int)(0.8 * SCR_W);
webHeight = (int)(0.9 * SCR_H);
RelativeLayout.LayoutParams lp = new
RelativeLayout.LayoutParams(webWidth, webHeight);
lp.addRule(RelativeLayout.CENTER_IN_PARENT);
mView.addView(mWebView, lp);
setContentView(mView);
final int lg = lang;
new Thread(new Runnable()
{
25

Adaptacin de videojuegos en dispositivos mviles


public void run()
{
startSplash(lg, GGC_GAME_CODE);
}
}).start();
gIsRunning = true;
// Set orientation
this.setRequestedOrientation(GL2JNILib.sOldOrientationType);
setVolumeControlStream(AudioManager.STREAM_MUSIC); //BUG FIX
FOR 5028761, AGSB 16/05/2012
}
void startSplash(int lang, String game_code)
{
currentLanguage = lang;
String UDID = getUniqueID();
// Some prototype device can't get device id, and return null.
if(UDID == null)
{
UDID = "GLOFT_EMU_001";
}
DBG("SPLASH_SCREEN", "UDID = " + UDID);
String country = java.util.Locale.getDefault().getCountry();
DBG("SPLASH_SCREEN","device settings detected..3");
String deviceType = Build.MANUFACTURER+"_"+Build.MODEL;
String deviceFW = Build.VERSION.RELEASE;
K_LINK_TOPDEALS = K_LINK_TOPDEALS_TEMPLATE;
K_LINK_TOPDEALS = K_LINK_TOPDEALS.replace("VERSION",
GAME_VERSION_NAME);
K_LINK_TOPDEALS = K_LINK_TOPDEALS.replace("LANG",
TXT_IGP_LANGUAGES[currentLanguage]);
K_LINK_TOPDEALS = K_LINK_TOPDEALS.replace("COUNTRY",
country);
K_LINK_TOPDEALS = K_LINK_TOPDEALS.replace("FROM",
game_code);
K_LINK_TOPDEALS = K_LINK_TOPDEALS.replace("DEVICE",
deviceType);
K_LINK_TOPDEALS = K_LINK_TOPDEALS.replace("FIRMWARE",
deviceFW);
26

Adaptacin de videojuegos en dispositivos mviles


K_LINK_TOPDEALS = K_LINK_TOPDEALS.replace("UDIDPHONE",
UDID);
K_LINK_TOPDEALS = K_LINK_TOPDEALS + "&width=" +
(webWidth - 10);
K_LINK_TOPDEALS = K_LINK_TOPDEALS.replaceAll(" ", "");
String response = getHttpResponse(K_LINK_TOPDEALS + "&check=1");
DBG("SPLASH_SCREEN","response: " + response);
if (response != null)
{
if (response.equals("1"))
mWebView.loadUrl(K_LINK_TOPDEALS);
else
{
userExit = true; //BUG FIX FOR 5051486, AGSB
23/05/2012
closeSplash();
}
}
else
{
userExit = true; //BUG FIX FOR 5051486, AGSB 23/05/2012
closeSplash();
}
}
void closeSplash()
{
try
{
SplashScreenActivity.gIsRunning = false;
finish();
//Intent intent = new Intent(SplashScreenActivity.this,
CLASS_NAME.class);
//startActivity(intent);
mView.removeView(mWebView);
} catch (Exception e)
{
DBG_EXCEPTION(e);
}
}
27

Adaptacin de videojuegos en dispositivos mviles

@Override
public void onBackPressed()
{
closeSplash();
}
private void startYoutube(String url)
{
// default youtube app
Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
List<ResolveInfo> list = getPackageManager().queryIntentActivities(i,
PackageManager.MATCH_DEFAULT_ONLY);
if (list.size() == 0)
{
// default youtube app not present or doesn't conform to the standard
we know
// use the web browser
i = new Intent(Intent.ACTION_VIEW,
Uri.parse("http://www.youtube.com/watch?v=" + url.replace("vnd.youtube:", "")));
}
startActivity(i);
}
#if USE_MARKET_INSTALLER
private void startMarketAppication(String url)
{
Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
List<ResolveInfo> list = getPackageManager().queryIntentActivities(i,
PackageManager.MATCH_DEFAULT_ONLY);
if (list.size() == 0)
{
// default market app not present or doesn't conform to the standard
we know
// use the web browser
i = new Intent(Intent.ACTION_VIEW,
Uri.parse("http://market.android.com/" + url.replace("market://", "")));
}
startActivity(i);
}
#endif
28

Adaptacin de videojuegos en dispositivos mviles


public void LaunchPackage(String url)
{
try
{
Intent intent = new Intent(Intent.ACTION_MAIN);
PackageManager manager = getPackageManager();
intent = manager.getLaunchIntentForPackage(url);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
startActivity(intent);
}
catch (Exception e)
{
DBG_EXCEPTION(e);
}
}
private class glWebViewClient extends WebViewClient
{
boolean hasError = false;
public void OpenBrowser(String url)
{
if(url == null || url.length() <= 0)
return;
try
{
Intent intent = new Intent(Intent.ACTION_VIEW,
Uri.parse(url));
startActivity(intent);
}
catch (Exception e)
{
DBG_EXCEPTION(e);
}
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
{
DBG("SPLASH_SCREEN", "***************
shouldOverrideUrlLoading()********************");
DBG("SPLASH_SCREEN", "*************** url: " + url + "
********************");
userExit = true;
29

Adaptacin de videojuegos en dispositivos mviles


if(url.startsWith("play:"))
{
LaunchPackage(url.replace("play:", ""));
finish();
return true;
}
if(url.startsWith("link:"))
{
OpenBrowser(url.replace("link:", ""));
finish();
return true;
}
if (url.startsWith("exit:"))
{
closeSplash();
return true;
}
if(url.startsWith("goto:"))
{
// This calls the method
//
public void splashScreenFunc(String name)
// from the game's main activity class (CLASS_NAME)
// Make sure to implement it.
try
{
CLASS_NAME.m_sInstance.splashScreenFunc(url.replace("goto:", ""));
}
catch(Exception e)
{
DBG_EXCEPTION(e);
DBG("SPLASH_SCREEN",
"************************* \n ****** FAILED TO CALL METHOD
splashScreenFunc FROM CLASS_NAME. IS IT IMPLEMENTED? **********");
}
finish();
return true;
}

if(url.startsWith("http://ingameads.gameloft.com/redir/ads/splashscreen_click.php"))
30

Adaptacin de videojuegos en dispositivos mviles


{
view.loadUrl(url);
return true;
}
#if USE_MARKET_INSTALLER
if(url.startsWith("market://"))
{
startMarketAppication(url);
finish();
}
else
#else
if(url.startsWith("http://ingameads.gameloft.com/redir/?from") &&
url.indexOf("ctg=PLAY") == -1)
{
#if USE_HEP_IGP_PORTAL
String[] paramStrings = url.split("&");
String newUrl = paramStrings[0];
for(int i = 1; i < paramStrings.length; i++)
{
if(paramStrings[i].startsWith("op="))
{
#if USE_HEP_EXT_IGPINFO
newUrl = newUrl + "&op=" + IGPPortal;
#else
newUrl = newUrl + "&op=" +
GGC_GAME_OPERATOR;
#endif //USE_HEP_EXT_IGPINFO
}
else
newUrl = newUrl + ("&"+paramStrings[i]);
}
url = newUrl;
#endif //USE_HEP_IGP_PORTAL
view.loadUrl(url);
finish();
return true;
}
else
#endif
if (url.startsWith("vnd.youtube:"))
{
startYoutube(url);
31

Adaptacin de videojuegos en dispositivos mviles


}
else
{
#if IGP_SKT
if((url.indexOf("SKTMARKET")== -1)||
(url.indexOf("gameinformation")!= -1)||(url.indexOf("index.php")!= -1)) // Open link
without containing SKTMARKET
#endif
{
//view.loadUrl(url);
OpenBrowser(url);
}
}
return true;
}
boolean timeout = true;
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon)
{
DBG("SPLASH_SCREEN", "***************
onPageStarted()********************");
DBG("SPLASH_SCREEN", "*************** url: " + url + "
********************");
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(timeout)
{
userExit = true;
closeSplash();
}
}
}).start();
}
@Override
public void onPageFinished(WebView view, String url)
32

Adaptacin de videojuegos en dispositivos mviles


{
DBG("SPLASH_SCREEN", "***************
onPageFinished()********************");
DBG("SPLASH_SCREEN", "*************** url: " + url + "
********************");
if (hasError)
{
DBG("SPLASH_SCREEN", "*************** hasError
********************");
userExit = true;
closeSplash();
}
hasError = false;
timeout = false;
}
@Override
public void onReceivedError (WebView view, int errorCode, String
description, String failingUrl)
{
hasError = true;
userExit = true;
DBG("SPLASH_SCREEN", "***************onReceivedError:
***************" + description);
}
};
public String getHttpResponse(String RequestUrl)
{
String response_text = null;
BufferedReader stream_in = null;
try
{
HttpClient client= new DefaultHttpClient();
HttpGet request = new HttpGet(RequestUrl);
HttpResponse response = client.execute(request);
stream_in = new BufferedReader (new
InputStreamReader(response.getEntity().getContent()));
StringBuffer buffer = new StringBuffer("");
String line = "";
while ((line = stream_in.readLine()) != null)
{
buffer.append(line);
33

Adaptacin de videojuegos en dispositivos mviles


}
stream_in.close();
response_text = buffer.toString();
} catch (Exception e) {
DBG_EXCEPTION(e);
}
finally
{
if (stream_in != null)
{
try
{
stream_in.close();
}
catch (Exception e) {
DBG_EXCEPTION(e);
}
}
}
return response_text;
}
public String getUniqueID()
{
String deviceID = null;
/* For commercial phones, using the IMEI */
deviceID = getIMEI();
if(deviceID != null)
return deviceID;
//* For Android 2.3 and above, using SERIAL */
deviceID = getSerial();
if(deviceID != null)
return deviceID;
/* Some other devices have SERIAL, try to read it */
deviceID = getSerialNo();
if(deviceID != null)
return deviceID;
/* Final solution, try to use Mac address */
deviceID = getMac();
if(deviceID != null)
return deviceID;
34

Adaptacin de videojuegos en dispositivos mviles

// /* If device has ANDROID_ID, use it */


deviceID = getAndroidID();
if(deviceID != null)
return deviceID;
return deviceID;
}
public String getIMEI()
{
String Imei = null;
try
{
TelephonyManager deviceInfo =
(TelephonyManager)this.getApplicationContext().getSystemService(Context.TELEPHON
Y_SERVICE);
Imei = deviceInfo.getDeviceId();
if (Imei.length() > 0)
return Imei;
}
catch (Exception e) {}
return null;
}
public String getSerial()
{
String serial = null;
#if !BUILD_FOR_FIRMWARE_1_6
if(Build.VERSION.SDK_INT >=
Build.VERSION_CODES.GINGERBREAD)
{
serial = android.os.Build.SERIAL;
}
#endif
if (serial != "unknown")
return serial;
return null;
}
public String getSerialNo()
{
String serial = null;
35

Adaptacin de videojuegos en dispositivos mviles


try
{
Class<?> c = Class.forName("android.os.SystemProperties");
java.lang.reflect.Method get = c.getMethod("get", String.class);
serial = (String) get.invoke(c, "ro.serialno");
if(serial.length() > 0 && serial != "unknown")
return serial;
} catch (Exception e) {}
return null;
}
public String getAndroidID()
{
String AndroidID = null;
AndroidID =
Secure.getString(this.getApplicationContext().getContentResolver(),
Secure.ANDROID_ID);
if(AndroidID.length() > 0)
return AndroidID;
return null;
}
public String getMac()
{
try{
String mac = null;
WifiManager wifiMgr =
(WifiManager)this.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
mac = wifiMgr.getConnectionInfo().getMacAddress();
if (mac != null && mac.length() > 0)
return mac.replaceAll(":","");
} catch (Exception e) {

return null;
}
}

En la Figura 2 se puede ver la WelcomeScreen en funcionamiento en el videojuego The Oregon


Trail disponible para iOS y Android.
36

Adaptacin de videojuegos en dispositivos mviles

Figura 2
Para mayor un mayor detalle se incluye el cdigo. (ver anexo A)

8.3 Agregando al videojuego la capacidad de utilizar efectos Post-Process

37

Adaptacin de videojuegos en dispositivos mviles


Los efectos de Post-Process permiten agregar al videojuego Shaders que permiten modificar los
colores del videojuego, con esto se pueden lograr diferentes efectos como utilizar desplegar todo en
escala a grises y hacer algunas correcciones de color, incrementar contraste, reducir iluminacin, etc.
Los pasos necesarios para implementarlos se pueden observar en la Figura 3.

Genera
r un
FBO

Dibujar
en la
textura

Activar
el
Shader

Dibujar
la
textura

Figura 3
Generar un FBO
Un FBO es el marco de trabajo en el que se dibuja, incluye texturas para representar el color y
la profundidad. La idea principal es crear un nuevo FBO que no se dibuje en pantalla y dibujar sobre el,
despus dibujarlo en pantalla aplicando el Shader.
RenderManager.cpp
#ifdef POST_PROCESS
// Lindor - Post process effect
extern const char *ccVShader;
extern const char *ccFShader;
// Frame buffer
GLuint fbo, fbo_texture, rbo_depth;
GLuint vbo_fbo_vertices;
38

Adaptacin de videojuegos en dispositivos mviles


GLuint program_postproc = 0, attribute_v_coord_postproc, uniform_fbo_texture;
GLuint vs,fs;
#endif
#ifdef POST_PROCESS
/* Texture */
glActiveTexture(GL_TEXTURE0);
glGenTextures(1, &fbo_texture);
glBindTexture(GL_TEXTURE_2D, fbo_texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,
GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, g_screenWidth,
g_screenHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glBindTexture(GL_TEXTURE_2D, 0);

/* Depth buffer */
glGenRenderbuffers(1, &rbo_depth);
glBindRenderbuffer(GL_RENDERBUFFER, rbo_depth);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16,
g_screenWidth, g_screenHeight);
39

Adaptacin de videojuegos en dispositivos mviles


glBindRenderbuffer(GL_RENDERBUFFER, 0);

/* Framebuffer to link everything together */


glGenFramebuffers(1, &fbo);
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
GL_TEXTURE_2D, fbo_texture, 0);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
GL_RENDERBUFFER, rbo_depth);
GLint status;
if ((status = glCheckFramebufferStatus(GL_FRAMEBUFFER)) !=
GL_FRAMEBUFFER_COMPLETE) {
TRACE("glCheckFramebufferStatus: error %p", status);
return;
}
glBindFramebuffer(GL_FRAMEBUFFER, 0);

GLfloat fbo_vertices[] = {
-1, -1,
1, -1,
-1, 1,
1, 1,
};
40

Adaptacin de videojuegos en dispositivos mviles


glGenBuffers(1, &vbo_fbo_vertices);
glBindBuffer(GL_ARRAY_BUFFER, vbo_fbo_vertices);
glBufferData(GL_ARRAY_BUFFER, sizeof(fbo_vertices), fbo_vertices,
GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);

if ((vs = create_shader(ccVShader, GL_VERTEX_SHADER)) == 0) return;


if ((fs = create_shader(ccFShader, GL_FRAGMENT_SHADER)) == 0) return;
GLint link_ok, validate_ok;
program_postproc = glCreateProgram();
glAttachShader(program_postproc, vs);
glAttachShader(program_postproc, fs);
glLinkProgram(program_postproc);
glGetProgramiv(program_postproc, GL_LINK_STATUS, &link_ok);

if (!link_ok) {
TRACE("glLinkProgram:");
return;
}
glValidateProgram(program_postproc);
glGetProgramiv(program_postproc, GL_VALIDATE_STATUS, &validate_ok);
if (!validate_ok) {
TRACE("glValidateProgram:");
41

Adaptacin de videojuegos en dispositivos mviles


}
char *attribute_name = "v_coord";
attribute_v_coord_postproc = glGetAttribLocation(program_postproc, attribute_name);
if (attribute_v_coord_postproc == -1) {
TRACE("Could not bind attribute %s\n", attribute_name);
return;
}
char *uniform_name = "sTexture"; // Texture sampler2D
uniform_fbo_texture = glGetUniformLocation(program_postproc, uniform_name);
if (uniform_fbo_texture == -1) {
TRACE("Could not bind uniform %s\n", uniform_name);
return;
}
//}
#endif

Dibujar en la textura
Una vez creado el FBO se activa para que lo que se dibuje a continuacin no sea mostrado en
pantalla, realizando todas las operaciones slo en memoria.
42

Adaptacin de videojuegos en dispositivos mviles


RenderManager.cpp
void RenderManager::BeginScene()
{
#ifdef POST_PROCESS
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
#endif
// Dibujando
}
Activando el Shader
Una vez dibujado fuera de pantalla, se activa el FBO principal para poder dibujar en pantalla y
se activa el Shader a aplicar.
RenderManager.cpp
#ifdef POST_PROCESS
glBindFramebuffer(GL_FRAMEBUFFER, 0); // Activando FBO principal
glClearColor(0.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glUseProgram(program_postproc);

// Activando Shader

glBindTexture(GL_TEXTURE_2D, fbo_texture);
glUniform1i(uniform_fbo_texture, 0);
Dibujar la textura
El ultimo paso es dibujar la textura en la que dibujamos fuera de pantalla para aplicarle el
efecto.
43

Adaptacin de videojuegos en dispositivos mviles


RenderManager.cpp
glEnableVertexAttribArray(attribute_v_coord_postproc);
glBindBuffer(GL_ARRAY_BUFFER, vbo_fbo_vertices);
glVertexAttribPointer(
attribute_v_coord_postproc, // attribute
2,

// number of elements per vertex, here (x,y)

GL_FLOAT,

// the type of each element

GL_FALSE,

//

0,

// extra data between each position

// offset of first element

);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glDisableVertexAttribArray(attribute_v_coord_postproc);
glBindBuffer(GL_ARRAY_BUFFER, 0);
Para mayor detalle se incluye el cdigo. (ver anexo B)

9. Resultados
Como resultados se obtuvo un videojuego que corre en Android y cumple con los requisitos
necesarios. El videjuego funciona en Android y tiene implementadas las mismas caractersticas que su
equivalente en iOS.

44

Adaptacin de videojuegos en dispositivos mviles


10. Conclusiones
Realizar la adaptacin de un videojuego de una plataforma a otra es una tarea que requiere
esfuerzo y dedicacin. Es importante tener una comunicacin efectiva con los dems personas que
trabajan en el proyecto para garantizar que no se hace el mismo trabajo dos veces y ayudarse
mutuamente.

11.

Bibliografa

Buss, S. R. (2003). 3D Computer Graphics. San Diego, California: Cambridge University Press.
Google. (2012). Android, la plataforma mvil mas popular en el mundo. Obtenido de Developers:
http://developer.android.com/about/index.html
Kessenich, J. (2006). OpenGL. Obtenido de OpenGL:
http://www.opengl.org/registry/doc/GLSLangSpec.Full.1.20.8.pdf
45

Adaptacin de videojuegos en dispositivos mviles

Microsoft Corporation. (2010). Visual Studio. Obtenido de Los productos de Visual Studio 2010:
http://www.microsoft.com/visualstudio/es-es/products
Pawlan, M. (Marzo de 1999). Essentials of the Java Programming Language. Obtenido de oracle:
http://www.oracle.com/technetwork/java/index-138747.html

46

Você também pode gostar