모바일 프로그래밍_중간발표2

Download Report

Transcript 모바일 프로그래밍_중간발표2

JNI 와 NDK의 사용목적 및 기타 게임 프로그램
전병우
이종민

Engine
 Multi-Platform
 Engine 설명
▪ Interface
▪ Function

Game
 Game Concept
 Game Flow
 Game 기획

JNI & NDK
 Break Limitation of NDK
 JNI, NDK


Sound
Sensor
Windows
Linux
Engine
Symbian
Mac
Palm
Windows
Interface
Linux
Engine
Symbian
Mac
Palm
Windows
Interface
Linux
Function
Engine
Symbian
Mac
Palm
Interface
Function
• 외부 노출
• 외부 노출
• Platform
Dependant
• Platform
Independent
Mark2Core
Update
Mark2Graphic
Render
Event
Mark2Render
System
Main.cpp
Android
Mark2Core
Update
Mark2Graphic
Render
Main.cpp
Windows
Event
Mark2Render
System
Windows
Mobile
Java
Android
NDK
Activity.Java
OpenGL ES
main
Main.cpp
Windows
DirectX
C++
OpenGL
Windows
Mobile
WinMain
DirectMobile
OpenGL ES
C++
JNI, NDK
Android
Java
NDK
Activity.Java
OpenGL ES
main
Main.cpp
Windows
DirectX
C++
OpenGL
Windows
Mobile
WinMain
DirectMobile
OpenGL ES
C++
int APIENTRY WinMain()
{
MApplication app(MApplication::RENDERSYSTEM_DIRECTMOBILEFIXED);
MWidget* pMainWidget = MNEW Galaxy3();
app.exec();
return 0;
}
int APIENTRY WinMain()
{
MApplication app(MApplication::RENDERSYSTEM_DIRECTX9);
MWidget* pMainWidget = MNEW Galaxy3();
app.exec();
return 0;
}
void init(const char* apkPath)
{
pApp = MNEW MApplication(MApplication::RENDERSYSTEM_OPENGLES);
pMainWidget = MNEW Galaxy3;
}
bool update()
{
bool bRunning = true;
pApp->FrameStart();
bRunning = pApp->FrameUpdate();
pApp->FrameEnd();
pApp->MessagePump();
return bRunning;
}
Instance
Archieve
Load Picture
XML Parser
Mark2Core
Fixed Point
Delegate
Main.cpp
Sound
3D Object
Wrap Renderer
Widget System
Message
System
Mark2Graphic
Mark2Render
System
이중 충돌
std::map<String, MObject*>
Filename
MObject*
Filename
MObject*
Filename
MObject*
First Use
Destroyer
Constructor
Reference--
Reference++
Release
http://www.nih.at/libzip/
Mesh
Zip
Sound
User
Interface
Etc
http://www.libpng.org/pub/png/libpng.html
http://www.ijg.org/
RGB888
ARGB8888
Raw Image
ColorConvert
RGBA8888
RGB565
http://www.grinninglizard.com/tinyxml/
XMLFile
XMLMeshLoader
XMLAnimationLoader
Fixed Point
• Opengl ES 1.1
• Direct Mobile
Floating
Point
• Opengl ES 2.0
• DirectX
• Opengl
http://en.wikipedia.org/wiki/Signals_and_slots
http://en.wikipedia.org/wiki/Delegate_(.NET)
http://en.wikipedia.org/wiki/Observer_pattern
http://www.codeproject.com/KB/cpp/fd.aspx
JaeWook Choi
Media
Manager
Audio
Manager
MSound Warpper
Windows
Mobile
Windows
Android
3D Object
XML
3ds Max
Plugin
XMLParser
3D Object
Animation
XML
Mark2Graphic
Mark2RenderSystem
Create
Texture
Create
Light
Create
Material
Begin
Scene
End
Scene
MessagePump
Present
WarpRenderer
Mark2RenderSystem
DirectX
DirectMobile
Fixed
Float
Opengl
Opengl ES
Android
Windows
Mobile
S P A C E
R A I L
Start Game
Credit
Exit Game
GameWindow
Title
StartGame
Menu
Credit
Background
Star
ExitGame
Widget
2DWidget
2DWidget
2DWidget
2DWidget
3DWidget
2DWidget
Click~!
S P A C E
R A I L
Start Game
Credit
Exit Game
Compare
UI Rect &
ClickPosition
Message
Pumping
GameWindow
Title
StartGame
Menu
Credit
Background
Star
ExitGame
WidgetSystem
Pop Event
MessageSystem
Push Event
Windows
Message
Proc
Windows
Mobile
Message
Proc
Android
Activity
Event
CallBack
Windows
Mobile
IOS
Windows
Phone 7
Symbian
Android
Palm
세종대학교
28
Windows
Mobile
IOS
Windows
Phone 7
Symbian
Android
Palm
세종대학교
29
스카이로드
남극탐험
Speed
100 AU
카메라와 캐릭터를 고정시켜 조작감 극대화
My Records
1. 2009/11/04
2. 2009/11/04
3. 2009/11/04
4. 2009/11/04
5. 2009/11/04
200012
200012
200012
200012
200012
Windows
Bac
k
Space Rail
Play Game
My Records
Options
Information
Information
Exit
Help
Credits
Option
Bac
k
Bac
k
Back선택
Help
Help
~~~~~~~~~~~
~~~~~~~````
~~~~~~~~```
~~~~~~~~```
~~~~~~~~```
Bac
How to Play?
~~~~~~~````
~~~~~~~~```
~~~~~~~~```
~~~~~~~~```
Bac
k
k
Back 선택
Credits
Bac
k
Back 선택
Back
Back
Galaxy
화면 선택
Play Game
My Records
Options
행성 선택
Information
Exit
Speed
100 AU
조건 1)
조건 2)
조건 3)
Play
Back
분명한 Goal
End
현재위치
시작점
점프 스킬 사용
무제한으로 점프 스킬을 사용할 수 있다.
미사일 발사
가속
일반 이동
부스터 크기 최대
부스터 조금 발사
이동 동작
파란미사일 발사체 생
성
점프 불가
점프 2배
감속
공중 동작
가스 분출구 봉쇄
보조 날개 생성
부스터 방출 없음
이동 속도
속도가 빨라질 수록 맵 내려오는 속도가 증가한다.
이동 방향
기본적으로 한 칸씩 좌우 이동이 가능하다.
미사일 발사
1칸당 1발
발사된 미사일과 NPC 충돌 시 사망
발사선 밟고 점프시 공중 발사
점프 2배
좌우로 2칸 이동
정면으로 2칸 이동
속도 상승
상승 속도 = 최도 속도 * 2
입장 시 급격한 상승(정상 속도부터)
퇴장 시 급격한 하강(정상 속도로)
무적
밟고 있는 동안 무적
미사일
발사
속도 상
승
무적
점프 2배
일반 이동
게임 시작 - 최고 속도 도달 2초
좌우 점프 – 1칸 이동
정면 점프 - 1칸 이동
점프 불가
점프 불가능(통제 불가)
속도 하강
상승 속도 = 최도 속도 * (1/2)
입장 시 급격한 하강(정상 속도부터)
퇴장 시 급격한 상승(정상 속도로)
추락
시작 위치로 이동
일반 이
동
속도 하
강
점프 불
가
추락
Enemy 1
Enemy 1
Enemy 3
Enemy 4
Enemy 5
좌우로 이동
(끝까지 이동)
플레이어를 향해 돌진
등장 시
좌로 3칸 이동 후
정리 우로 3칸
M을 그리며 점프 이동
미사일 발사
이동 속도
이동 속도
이동 속도
이동 속도
이동 속도
좌, 우 이동 칸 수
점프 후 정지 시간
이동 후 정지 시간
이동 후 정지 시간
Enemy 3 움직임
+
미사일 발사(턴 전)
-1-
-1-1-
-1-
-1-
-1-
A Type(고정)
-1-
-1-
B-1f Type
C-1f Type(빠른 좌회전)
D-1F Type
E-1F Type (빠른 좌회전)
B-1s Type
C-1s Type(느린 좌회전)
D-1s Type
E-1F Type (느린 좌회전)
C-2f Type(빠른 우회전)
D-2f Type
E-1F Type (빠른 우회전)
C-2s Type(느린 우회전)
D-2s Type
E-1F Type (느린 우회전)
-1F - Type
-1-
G - Type
JAVA
Java Native
Interface
C++
C - DynamicLink
Native Development Kit
Java Native
Interface
Cross-Compiler
Dalvik
Software Development Kit
JAVA
Java Native Interface
Dynamic Link
Static Link
Static Link
Android.mk
Android.mk
Native Development Kit
C Code
Cygwin
Windows
Dynamic Link
Android.mk
libc
C++
libm
NDK
Libegl
libz
http://www.crystax.net/android/ndk-r4.php
C++
Exception
CrystaX
STL
RTTI
static {
}
C++로 만들어둔
Library들 로드
System.loadLibrary("Mark2Core");
System.loadLibrary("Mark2Graphic");
//System.loadLibrary("Mark2RenderSystem_GLES");
System.loadLibrary("Makkolli");
Java  C 로 통하
는 함수 정의
public native void nativeInit(String apkPath);
public native void nativeUpdate();
public native void nativeMousePush(int nX, int nY);
public native void nativeMouseRelease(int nX, int nY);
class MakkolliRenderer implements GLSurfaceView.Renderer {
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
m_SpaceRailAct.nativeInit(apkFilePath);
}
public void onDrawFrame(GL10 gl) {
m_SpaceRailAct.nativeUpdate();
}
}class MakkolliGLview extends GLSurfaceView {
}
Java  C 로의 실
질적인 함수 호출
public boolean onTouchEvent(final MotionEvent event){
switch( event.getAction() )
{
case MotionEvent.ACTION_DOWN:
m_SpaceRailAct.nativeMousePush((int)event.getX(), (int)event.getY());
break;
case MotionEvent.ACTION_UP:
m_SpaceRailAct.nativeMouseRelease((int)event.getX(), (int)event.getY());
break;
}
return true;
}
Java  C Interface
에서 C 함수 정의
자동 생성
ndk-build 를 이용
한 C코드 컴파일
Android.mk
include $(CLEAR_VARS)
MARK2CORE = \
Mark2Core.cpp \
………..
../jni_tools.cpp
LOCAL_C_INCLUDES :=
LOCAL_MODULE := Mark2Core
LOCAL_SRC_FILES := $(MARK2CORE)
LOCAL_CFLAGS := -DANDROID_NDK -DMARK2CORE_EXPORTS
LOCAL_CPP_EXTENSION := .cpp
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -ldl -llog -lz
LOCAL_STATIC_LIBRARIES := libjpeglib libpnglib libzlib libtinyxml libzip
include $(BUILD_SHARED_LIBRARY)
자동으로 생성된
Java  C
Interface 함수
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
JNIEXPORT void JNICALL Java_makkolli_spacerail_SpaceRailActivity_nativeInit
(JNIEnv *, jobject, jstring);
JNIEXPORT void JNICALL Java_makkolli_spacerail_SpaceRailActivity_nativeUpdate
(JNIEnv *, jobject);
JNIEXPORT void JNICALL Java_makkolli_spacerail_SpaceRailActivity_nativeMousePush
(JNIEnv *, jobject, jint, jint);
JNIEXPORT void JNICALL
Java_makkolli_spacerail_SpaceRailActivity_nativeMouseRelease
(JNIEnv *, jobject, jint, jint);
#include <jni.h>
C  Java 함수 정
#include "Mark2Core/Mark2Core.h"
#define CB_CLASS "makkolli/spacerail/SpaceRailActivity“
의
#define CB_CLASS_MSG_CB "OnMessage"
#define CB_CLASS_MSG_SIG "(Ljava/lang/String;I)V“
#define CB_CLASS_PLAYSOUND_CB "OnPlaySound"
#define CB_CLASS_PLAYSOUND_SIG "(Ljava/lang/String;)V“
#define CB_CLASS_STOPSOUND_CB "OnStopSound"
#define CB_CLASS_STOPSOUND_SIG "(Ljava/lang/String;)V“
#define CB_CLASS_PLAYLOOPSOUND_CB "OnPlayLoopSound"
#define CB_CLASS_PLAYLOOPSOUND_SIG "(Ljava/lang/String;)V“
#define CB_CLASS_PLAYEFFECTSOUND_CB "OnPlayEffectSound"
#define CB_CLASS_PLAYEFFECTSOUND_SIG "(Ljava/lang/String;)V“
#define CB_CLASS_STOPEFFECTSOUND_CB "OnStopEffectSound"
#define CB_CLASS_STOPEFFECTSOUND_SIG "(Ljava/lang/String;)V“
void MARK2CORE_API jni_PlayEffectSound(const char* strMusicName);
void MARK2CORE_API jni_StopEffectSound(const char* strMusicName);
void MARK2CORE_API jni_PlaySound(const char* strMusicName);
void MARK2CORE_API jni_PlayLoopSound(const char* strMusicName);
void MARK2CORE_API jni_StopSound(const char* strMusicName);
void MARK2CORE_API jni_OutputString(const char* strOutputString);
void MARK2CORE_API jni_Init(JNIEnv *env);
void MARK2CORE_API jni_OutputString(const char* strOutputString)
{
JNIEnv *env;
g_VM->AttachCurrentThread(&env, NULL);
jclass jNativesCls;
jNativesCls = env->FindClass(CB_CLASS);
C  JAVA 로의
실질적인 함수 호
출
jmethodID jni_Method;
if (! jni_Method ) {
// Get aref to the static method:jni.Natives.OnMessage
jni_Method = env->GetStaticMethodID(jNativesCls, CB_CLASS_MSG_CB, CB_CLASS_MSG_SIG);
}
if (jni_Method) {
// Call method
env->CallStaticVoidMethod(jNativesCls, jni_Method, env->NewStringUTF(strOutputString), (jint) 2 );
}
}
PlaySound
MediaManager
StopSound
Java Native
Interface
AudioManager
PlayEffect
StopEffect
nativePush
Activity
Java Native
Interface
nativeRelease
nativeAccelerometer
mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
mAccSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mSensorManager.registerListener(this, mAccSensor, SensorManager.SENSOR_DELAY_GAME);
public void onSensorChanged(SensorEvent event) {
Sensor sensor = event.sensor;
if (sensor.getType() == Sensor.TYPE_ACCELEROMETER)
{
nativeAccelerometer(event.values[1], event.values[0], event.values[2]);
}
}
Q&A