Translate

2015년 2월 23일 월요일

[리뷰][서적] 실전 안드로이드 4 게임 개발



실전 안드로이드 4 게임 개발 - 6점
J. F. DiMarzio 지음, 박수현.김세연 옮김/길벗

위의 서적을 보면서 실습을 좀 따라해봤다.
내가 OpenGL을 처음 접해서 그런건지..
아니면 설명이 너무 간단해서인지는 잘 모르겠지만 1/3 정도 본 지금의 시점에서 이해하기가 힘이든다;;
책의 예제를 따라하면서 작업을 했는데 실행이 안되는 문제도 있었고..
초보들에게는 예제가 틀리면 정말 치명적인데 개선된 버전의 서적이 다시 나오지 않는것이 많이 아쉽다.

소스 다운로드 페이지 (바로 다운로드)




아래는 책을 따라하면서 발생한 문제들을 집어봤다.
(예제의 소스의 굵은 글씨가 엉터리로 되어있는 부분이 있지만 그런 부분의 문제가 아니라 처음 접하는 사람이 책만으로는 해결하기 힘든 문제들이 있었다.)



1. chapter_04(환경그리기) 예제 실행 시 아래와 같은 오류가 나며 프로그램이 종료된다.


D/AndroidRuntime( 4344): Shutting down VM
V/AudioFlinger(  312): presentationComplete() mPresentationCompleteFrames 660480 framesWritten 654720
E/AndroidRuntime( 4344): FATAL EXCEPTION: main
E/AndroidRuntime( 4344): Process: com.example.myapp, PID: 4344
E/AndroidRuntime( 4344): java.lang.RuntimeException: Unable to resume activity {com.example.myapp/com.example.myapp.SFGame}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.opengl.GLSurfaceView$GLThread.onResume()' on a null object reference
E/AndroidRuntime( 4344): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2798)
E/AndroidRuntime( 4344): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2827)
E/AndroidRuntime( 4344): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2258)
E/AndroidRuntime( 4344): at android.app.ActivityThread.access$800(ActivityThread.java:142)
E/AndroidRuntime( 4344): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1203)
E/AndroidRuntime( 4344): at android.os.Handler.dispatchMessage(Handler.java:102)
E/AndroidRuntime( 4344): at android.os.Looper.loop(Looper.java:136)
E/AndroidRuntime( 4344): at android.app.ActivityThread.main(ActivityThread.java:5120)
E/AndroidRuntime( 4344): at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime( 4344): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)
E/AndroidRuntime( 4344): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608)
E/AndroidRuntime( 4344): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.opengl.GLSurfaceView$GLThread.onResume()' on a null object reference
E/AndroidRuntime( 4344): at android.opengl.GLSurfaceView.onResume(GLSurfaceView.java:561)
E/AndroidRuntime( 4344): at com.example.myapp.SFGame.onResume(SFGame.java:23)
E/AndroidRuntime( 4344): at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1192)
E/AndroidRuntime( 4344): at android.app.Activity.performResume(Activity.java:5354)
E/AndroidRuntime( 4344): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2788)
E/AndroidRuntime( 4344): ... 10 more
V/AudioFlinger(  312): presentationComplete() mPresentationCompleteFrames 660480 framesWritten 654720
W/ActivityManager(  997):   Force finishing activity com.example.myapp/.SFGame
D/ActivityManager(  997): setFocusedStack: mFocusedStack=ActivityStack{674731d0 stackId=3, 17 tasks}
V/ActivityManager(  997): Moving to PAUSING: ActivityRecord{662a8930 u0 com.example.myapp/.SFGame t105 f}
W/ActivityManager(  997):   Force finishing activity com.example.myapp/.SFMainMenu
D/ActivityManager(  997): setFocusedStack: mFocusedStack=ActivityStack{674731d0 stackId=3, 17 tasks}
V/ActivityManager(  997): Moving to FINISHING: ActivityRecord{662defc8 u0 com.example.myapp/.SFMainMenu t105 f}
D/ActivityManager(  997): allPausedActivitiesComplete: r=ActivityRecord{662a8930 u0 com.example.myapp/.SFGame t105 f} state=PAUSING
V/ActivityManager(  997): resumeTopActivityLocked: Skip resume: some activity pausing.





원인
책에서 소스의 일부가 빠져있었다. 아래와 같이 소스의 빠진 부분을 채워넣으니 정상적으로 작동을 했다.

package com.example.myapp;

import android.content.Context;
import android.opengl.GLSurfaceView;

/**
 * Created by 1004lucifer on 15. 2. 22.
 */
public class SFGameView extends GLSurfaceView {

    private SFGameRenderer renderer;

    public SFGameView(Context context) {
        super(context);
        renderer = new SFGameRenderer();
        this.setRenderer(renderer);
    }
}






2. chapter_04(환경그리기) - p166 에서 앱 구동 시 움직이는 배경이 나오지 않는다.

p186 까지 소스를 따라하면 그때는 배경이 나오는 것을 확인 할 수 있다.
아래의 내용은 뒷페이지에서 나온다.

SFGameRenderer.java
@Override
public void onDrawFrame(GL10 gl) {
  gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
  scrollBackground1(gl);
}



댓글 없음 :

댓글 쓰기