libgdx의 texture atlas test 완료.

실력없는 목수가 연장탓 한다는 것을 새삼 깨닳은 하루였다.

자세한건 추후에 업로드 예정. 바쁘니깐..;;


신고

앱의 구성의 특징 상 화면전환이 필수이고, 데이터전달과 처리가 필수적이다.

만일 액티비티를 여러개 생성해서 구성할 시, 코드의 중복사용이 커지고, 메모리누수 문제도 커지고(이전의 액티비티를 죽이면 되긴 하겠지만), 데이터의 전달이 번거롭다(외부파일에 저장한 후 로드하는 방식으로 하면 되려나?).

그래서 시작액티비티, 메인 액티비티, 결과 액티비티정도의 세개의 액티비티만 생성하고, 뷰만 전환하는 방향으로 하였다.

그래서 일단 뷰를 생성하고 그 뷰의 버튼으로 새로운 뷰를 로드하는 기능을 우선적으로 구현해보기로 하였다.

임의로 시작 액티비티의 코드라 부르겠다. 버튼을 누르면 메인 액티비티를 인텐트로 불러온다.



다음은 메인 액티비티에 관련된 코드이다.


디버그를 하기 위해 btnpluse1 (스펠이 틀렸네..;;)이라는 버튼을 클릭하면 fire라는 int변수가 증가하는 디버그용 코드를 작성해보았다.

하지만 실행해보니 null point 에러가 발생.

시작 액티비티. 진행하세요 버튼을 누르면 다음 화면이 떠야하는데..

 null point error 발생.


해당 버튼의 참조주소도 분명 R.java에 기록되어있다.

이것 때문에, 쪽팔리긴 하지만, 설 연휴 3일동안 고민하였다. 사실, 프로그래밍을 어디서 배워본 적도 없고, 객체지향은 또 처음인데다가 안드로이드OS를 쓰니 이해가 잘 안되었으리라..  

그래서 뷰체인지 방식으로 새로운 뷰의 버튼을 사용할 수 없다는 괴랄한 생각까지 하였으나, 연휴가 끝나기 3시간전에 불연듯 책을 읽다가 실마리가 보였다.

setContentView(R.layout.main)은 main.xml을 전개하여 '객체'를 전달한다는것.

나는 그 전까지 솔직히 뷰객체는 OS에서 자동으로 생성해주고 관리하는줄 알았다.

더욱이 setContentView에는 new 연산자가 보이지 않았다.

그래서 객체를 생성해주는 코드인지 몰랐던 것이다.

객체의 인스턴스도 생성도 하지 않고, 그 객체의 버튼의 id를 참조하려고 하다보니 에러가 발생한 것이다.

위의 코드를, 새로운 뷰가 생성된 후에 그 뷰의 버튼객체를 정의하고 리스너를 돌려주는 코드로 수정하니..

화면이 뜬다. 버튼을 눌러보면..



의도한 대로, 버튼을 누를 때 마다 fire변수의 값이 증가하는 것을 볼 수 있다.


이제, 기획한 대로 코드를 작성하고, 뷰를 xml을 이용하여 꾸밀 차례다.



 
신고


이와 같은 구도로 간단한 마인드 테스트 앱을 시험삼아 만들어보기로 하였다.

우선 간단한 프로그램으로 안드로이드에 대한 이해를 하고, 아웃풋을 만들어 자신감을 가지고 실행력을 가속시키기 위함이다.

앱 구성은 아주 간단하게 만들 수 있는(근데 그것도 삽질하고 앉았다..;;) 마인드테스트 앱이고, 약간의 흥미를 부추기기 위하여 재밌게 읽고 본 소설과 영화인 percy jackson 시리즈의 등장인물과 비교하는 것을 의로도 하였다.


신고
*callback code


package exam.handleEvent;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.*;
import android.widget.*;



public class HandleEventActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        View vw = new MyView(this);
        
        setContentView(R.layout.main);
        //setContentView(vw);
        
    }
    
    protected class MyView extends View{
    public MyView(Context context){
    super(context);
    }
    }
    public boolean onTouchEvent(MotionEvent mevent){
    super.onTouchEvent(mevent);
    if (mevent.getAction() == MotionEvent.ACTION_DOWN){
    Toast.makeText(HandleEventActivity.this,"Touch event received", Toast.LENGTH_SHORT).show();
    return true;
    }
    return false;
    }
  
}





*listener code



package exam.fruit1;

import android.app.Activity;
import android.os.Bundle;
import android.view.*;
import android.widget.*;

public class Fruit1Activity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
  
        View vm = new View(this);
        vm.setOnTouchListener(TouchListener);
       // setContentView(vm);  
        setContentView(R.layout.main);
    }
    class TouchListenerClass implements View.OnTouchListener{
    public boolean onTouch(View v, MotionEvent event){
    if (event.getAction() == MotionEvent.ACTION_DOWN){
    Toast.makeText(Fruit1Activity.this,"Touch Event Received", Toast.LENGTH_SHORT).show();
    return true;
    }
    return false;
    }
    }
    TouchListenerClass TouchListener = new TouchListenerClass();
}



기능은 두 코드가 같다. 터치 이벤트가 발생하면 toast창을 띄우는 코드이다.

 결과에서의 차이는 발견되지 않는다. 

하지만 이상한 점은, setContentView를 View속성의 인스턴스를 매개변수로 하면 두 코드 모두 동일하게 되지만,

레이아웃 XML파일의 주소(R.layout.main)를 매개변수로 하면, listener쪽의 코드는 이상동작 한다.(toast가 뜨지 않는다.)

이유는 아직 모른다. 더 검토해볼 가치가 있어보인다. 


신고

'android' 카테고리의 다른 글

callback과 listener의 차이  (2) 2011.12.28

개인적인 한계를 시험하는 부분이기도 하고, 수익원의 추가를 위함이기도 하며, 스스로의 지적 호기심과 성취감에 대한 도전이기도 하다.

기한은 아웃풋 시점까지 2012년 1월부로, 6개월을 목표로 삼았다.(디버깅기간 제외)

1인 제작을 기본 틀로 하여, 또 현업에 종사하고, 다른 공부들도 병행하는 상황으로는 무척 촉박한 시점임이 분명하다.

그래서 확실한 진행 프로세스를 가지고 진행상황을 항상 숙지, 기록할 필요가 있다.



게임 컨셉은 기술적으로 구현이 용이한 비주얼 나블 계열의 오컬트게임이다.

기술적 구현은 용이하지만, 그만큼 시나리오나 그래픽 작업이 번거로워지리라 예상된다. 그리고 완성도를 요하는 BGM이나 오프닝, 엔딩곡은, 지인이나 모집을 통한 외주로 진행할 가능성도 있으리라 예상한다.

6개월이 넘어버리면, OS의 버전업이라던가 개발기간을 따져보았을 때 효율이 떨어지므로 프로젝트를 폐기할 가능성도 있지만, 공부의 의미가 크기때문에 폐기하지 않는 방향으로 한다.

어느정도의 아웃풋이 나오기 전 까지는 본 프로젝트의 정보는 비공개를 원칙으로 하고, 제품 발매 전까지는 게임에 대한 소개 위주로 포스팅 될것이다.



신고

'project A(game 제작) > 기획' 카테고리의 다른 글

안드로이드 게임 제작 결정  (1) 2011.12.24


티스토리 툴바