Notice
Recent Posts
Recent Comments
Link
관리 메뉴

설.현.아빠

[안드로이]신세리아 님이 작성하신 안드로이드 입문자를 위한 메모 본문

안드로이드/Etc.

[안드로이]신세리아 님이 작성하신 안드로이드 입문자를 위한 메모

설.현.아빠 2011. 2. 23. 08:09




입문자들이 한번씩 쭉~~읽어보면 도움이 될만한 내용들이 많이 있다. ㅋ



1.위젯의 목록과 사용법

-기본사항-


#1.android:layout_width="~"는 해당 위젯의 폭, 즉 좌우길이를 결정한다.

android:layout_height="~"는 해당 위젯의 높이, 즉 위아래길이를 결정한다.

이 두 위젯의 ""값은 fill_parent 또는 wrap_content를 쓸 수 있는데, fill_parent는 부모위젯을

최대한 가득 채우는 것이고, wrap_content는 해당 위젯이 필요한 최소범위만 채우는 것이다.


#2.자바 코드에서 불러와 사용할 위젯에는 다음과같은 형식으로 id를 지정해 사용한다.

android:id="@+id/~"


#3.@은 at을 뜻하는 의미로 프로젝트내의 파일을 가리킨다. 예를들어 @drawable/~ 의 경우 drawable폴더에 있는 ~ 파일을 말한다

그리고 위의 id에서 @+id/~의 의미는, id를 저장하는 경로(R.java)에 새롭게 추가한다 라고 생각할 수 있다. 따라서 xml에서 그

아이디를 불러올때는 + 를 빼고 @id/~ 로 사용한다


#4.xml에서 특정 기능이나 속성을 사용할지 안할지를 결정하는 곳에는 그 값으로 true 또는 false를 입력한다.


#5.이러한 위젯들도 모두다 각각 객체이다. 비록 xml에서 정의를 했더라도, 똑같이 java에서 다룰 수가 있다.

findViewById를 이용해 xml의 위젯을 java로 넘겨받은뒤, 해당 객체에 이미 정의되어 있는 메서드를 불러와 사용할 수 있다.

예) TextView v=(TextView)findViewById(R.id.~)

v.setText("이런식으로 여기에다가 TextView에 보일 문자를 설정할 수 있다.");


#6.위젯에는 각각 리스너를 달아서 위젯에대한 입력을 처리할 수 있다. 그것을 이용해 버튼을 누르면 화면이 바뀐다거나 또는

체크박스에 체크를 하면 설정이 바뀐다는 등의 처리를 할 수 있다. 

그 방법은 view클래스에 등록되어있는 여러개의 리스너 중 ex)setOnClickListener 적절한 리스너를 하나를 달아서 특정 이벤트에대한 콜백메서드로 입력을 처리할 수 있다. 

버튼클릭에대한 엑티비티 불러오기의 예)

View Button = this.findViewById(R.id.button); //xml의 버튼위젯을 자바의 View인스턴스와 연결해준다

Button.setOnClickListener(this); //View인스턴스를 통해 View메서드중 클릭에대한 리스너를 버튼에 달아준다


public void onClick(View v){ //그러한 리스너는 다음과 같은 콜백메서드를 이벤트 작동시 자동 호출한다

switch(v.getId()){ //switch문에다 전달받은 버튼의 아이디를 v.getId();로 불러온다

case R.id.about_button: //전달받은것에대해 case문으로 분기한다

Intent i= new Intent(this, startgamesetting.class); //다음은 7번을 참조하여 다른클레스를 불러온다

startActivity(i);

break;


#7.다른클래스를 불러오는 방법

Intent i= new Intent(this, startgamesetting.class);//Intent 인스턴스를 선언한다음 불러올 클래스를 새로운 Intent객체로 전달해준다

startActivity(i); //startActivity();메서드로 인텐트를 실행, 즉 엑티비티를 실행한다


#8.유용하나 단축키들 

코딩을 하다가 특정 메서드나 클래스를 import 없이 사용할 경우 오류가 뜬다. 이럴때는 Ctrl+Shift+O 를 누르면 자동으로 필요한 것들이 import 된다. 또는 오류 아이콘을 클릭하여 그에대한 오류를 아주 편리하게 처리할 수도 있다.


코딩을 하다가 새로 필요한 프로젝트나 폴더, Android XML파일,Class 등을 새로 만들때는 Ctrl+N을 하거나 디렉토리 창에 오른쪽버튼을 클릭해서 New를 사용하면된다. (일반 XML이 아니라 Android로하면 기본사항이 입력되서 좋다!)


코딩을 하다가 새로운 메서드를 오버라이드하거나 생성자 등을 새로 사용하고 싶으면, 해당 객체의 바디부분에 커서를 두고

Ctrl+Shift+S를 하여 필요한 항목을 사용하면된다.


에뮬레이터에서 Ctrl+F11을 누르면 에뮬레이터를 90도 회전시킬 수 있다.


그리고 Ctrl+Space 를 하면 자동완성 기능을 사용할 수 있다. 다만 이때는 꼭 내가 쓰려던 것인지 꼼꼼이 확인해보고 쓸것


#9.자바에는 여러가지 종류의 콜백함수가 있다. 콜백함수란 특정 조건에서 자동으로 발생하는 메서드인데 대표적인예로 

Activity 클래스의 onCreate(엑티비티시작시 자동호출)가 있다.


특히 on~  이 달린 메서드는 거의다 콜백함수인것 같다. 물론 무조건 on이 붙어야만 콜백함수 인것은 아닌것 같다.

그래서 즉, 콜백함수란 일종의 자동감지&호출 장치라고 생각하자


특히 이러한 콜백메서드는 그 메서드가 들어있는 인터페이스를 구현하거나, 클래스를 확장하여 해당 메서드를 오버라이드, 또는 호출하여

사용할 수 있다. 그에대한 예는 바로 다음이다.

onCreate나 onKeyDown 같은 경우는 Activity를 확장하여 사용하는 콜백함수이고,

onClickListener의 경우는 OnClickListetner를 구현한뒤 오버라이드하여 사용하는 콜백함수이다.



#10.안드로이드 공식홈페이지의 레퍼런스, 가이드(칸드로이드에서 번역함) 그리고 네이버에 검색하기등을 확실히 잘 참조하자

특히 거기서도 android.app.Activity, android.view.View 

등을 집중해서 잘 찾아보자



#11.AndroidManifest.xml 은 모든 엑티비티를 관리하는 곳이다. 그러므로 따라서 새로운 엑티비티를 선언한 뒤에는 AndroidManifest.xml에반드시 엑티비티를 선언해주어야 한다. 그 방법은 다음과 같다.

<activity android:name=".startgamesetting"/>

그리고 또한 AndroidManifest.xml 파일은 엑티비티 간의 테마를 설정해 줄 수도 있다.

android:theme="@android:style/Theme.Dialog"

이러한 문장을 위에서처럼 했던 엑티비티 선언에 추가시켜주면 된다.


#12.XML에서는 모든 엘리먼트(구성요소)들을 < >으로 구분하며, 반드시 하나의 < > 이 끝나면 </ > 으로 "끝 경계" 를 구분해주어야 한다!

이러한 </ >는 끝 경계로, 어디까지가 해당 엘리먼트(위젯)의 영역인지를 구분해준다. 그리고 이러한 "끝 경계"는 간단히 줄여 < />으로 할수 있다. 

그러한 축약에대한 예)

<Button ~~~~~~~~~~~~> </Button> 를 

<Button ~~~~~~~~~~~/> 으로 간단히 줄일 수 있다.


#13.XML에서는 여러종류의 파일들을 최대한 분류해서 관리한다. 예를 들자면 그림파일은 drawable 폴더들에 모아서 관리하고, 레이아웃관련 파일은 layout파일에 모아서 관리한다. 특히 중요한 사항이 있는데, layout-land 폴더는 특별히 가로로 회전시켰을때 호출되는 레이아웃이 저장된다. 중요한 것은 layout에서 쓰였던 것과 똑같은 이름의 파일을 써야만 가로모드에서 대신 쓰인다는 것이다. 


또한 참고로 내부적으로 xml에 쓰이는 컬러들은 color.xml에, 또 모든 문자열들은 strings.xml에 모아서 관리를 한다. 이렇게 하는 이유는 xml에쓰이는 모든 문자열들이나 컬러를 한곳에 모아 관리함으로써 수정시 하나하나 찾아다닐 필요없이 수정 할 수 있기 때문이다. 따라서 모든 문자열들을 strings.xml에 모아서 string으로 선언하고, 다시 선언된 그것의 이름을 달아, 다른 xml의위젯에서 호출하는 방식으로 안드로이드는 되어있다.

예)     <string name="new_game_label">New Game</string>

이것처럼 스트링에 new_game_label 이름을 달아주고, New Game 문자열을 저장시켜놓는다. 그리고 실제 호출할때는

android:text="@string/new_game_label" 로 string에 있는 new_game_label 스트링을 참조하라 이런식으로 되어있다.


그리고 보통 해당 위젯의 문자열은 다음과 같은 접미사를 통일시켜 간단히 사용할 수 있게 되어있다.


settings 위젯의 타이틀에 보이는 문자열 -> settings_title

settings 위젯의 겉부분에 보이는 문자열 -> settings_label

settings 위젯의 실행시에 보이는 문자열 -> settings_text


#14.만일 에러가 갑자기 미친듯 많이 생기면 그것은 분명 }의 미스나 ;의 미스일 확률이 높다!


#15.activity 란 보이는 창 하나의 단위로, 클래스에다가 Activity를 확장하면 된다.

그리고 반드시 AndroidManifest.xml에 등록해주어야 하는점에 주의해야한다.


#16.참고로 어플리케이션의 이름을 바꾸고 싶으면 역시 string.xml 에서 app_name을 수정해주면 된다. 


#17.자바코드에서의 위젯과 XML상에서의 위젯은 서로 완전히 동등하다! 다만 구현부분을 분리해놨을뿐이다!

그래서 XML에 있는 위젯을 자바로 읽어들여 사용할 수도 있고, 반대로 자바에서 선언한 위젯을 XML에서 읽어 사용할 수도 있다!



---안드로이드에는 다음과 같은 여러개의 위젯이 있다. 잘보고 사용할것----



-FrameLayout : 아무것도 없는 완전한 백지 레이아웃이다. 그림을 그리는 곳에 주로쓰인다.


-LinearLayout : 일자로 내려오는 형식의 레이아웃이다. 가장 간단한 레이아웃이다.

android:


-AbsoluteLayout : 정확한 절대좌표(왼쪽상단이 0,0)을 기준으로 레이아웃하는것,그러나 단말기마다의 크기가 다르단 점때문에 deprecated 되었다


-RelativeLayout : 위젯들의 서로간에 상대적인 위치를 정하여 정리하는 레이아웃. 매우 유용하다.


-TableLayout : 위젯들을 말그대로 표로 행,렬에대해 정리하는 레이아웃. 매우 유용하다.

TableRow : TableLayout을 사용할때, 한 행(가로줄)을 구분해주는 객체이다. 한마디로 TableLayout은 이 TableRow없이는 사용이 불가능하다

그 사용법은 다른 위젯들의 포함관계처럼 다음과 같이하면된다.

예)

<TableLayout

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:stretchColumns="1">

<TableRow>

//위젯들을 입력

</TableRow>


<TableRow>

//위젯들을 입력

</TableRow>

</TableLayout>





-TextView : 텍스트를 화면에 출력해주는 위젯이다.

android:text="~"에다가 위젯에 보여줄 텍스트를 적는다.

android:typeface="~"에다가 사용할 글꼴을 지정할 수 있다

android:textStyle="~"에다가 글꼴의 스타일(굵게, 기울임)을 정할 수 있다

android:textColor="~"에다가 글꼴의 색을 지정할 수 있다. 그값은 빨간색-> #FF0000 처럼 쓸 수 있다.(자세힌X)

자바에서는 setText("~"); 로 화면에 보여질 문자를 설정할 수 있다.


-EditText : 텍스트를 입력받을 수 있는 위젯이다.(TextView를 상속받아, TextView의 속성을 모두 사용할 수 있다)

android:singleLine="~"는 엔터를 쳤을경우 계속 여러줄을 입력받을지, 다음 위젯으로 넘어가게되면서 한줄만 입력 받을지를 정한다.

android:capitalzie="~"는 첫 글자를 무조건 대문자로 자동 변경할지를 정한다.

android:autoText="~"는 자동 철자 교정기능을 사용할지를 정한다

android:digits="~"는 ~에다가 지정한 문자들만을 입력받을 수 있게 한다.

android:numeric="~"는 숫자만 입력받을 수 있게 하는 속성이다

android:password="~"는 입력되는 글자를 모두 ***으로 표현되게 설정한다

android:phoneNmber="~"는 전화번호를 입력받을 수 있게 설정한다. 이처럼 특정 형태를 입력받고 싶다면 InputMethod를 구현하고

android:inputMethod="~"으로 설정할 수 있다고 한다.


-Button : 클릭에의한 입력이 가능한 버튼이다.(TextView를 상속받아, TextView의 속성을 모두 사용할 수 있다)


-ImageButton : 단지 이미지가 달려있는 버튼이다.


-ImageView : 간단하게 고정되어 있을 배경화면과 같은 이미지를 보여주는 위젯이다.

android:src="@drawable/~"에다가 보여주고 싶은 이미지파일의 이름을 적는다. (참고로 @은 at을 뜻한다) 

android:adjustViewBounds="~"는 해당 이미지의 크기가 부모보다 클 경우, 그 비율을 유지하며 출력할지 안할지를 지정한다


-CheckBox : 각각에 체크를 할 수 있는 말그대로 체크박스를 만든다. (TextView를 상속받아, TextView의 속성을 모두 사용할 수 있다)

자바에서는 isChecked()메서드로 체크박스에 체크되었는지 확인할 수 있고

setChecked()메서드로 체크박스의 체크상태를 직접 설정할 수 있다.

toggle()메서드로는 체크상태를 간단히 변경할 수 있다.

그리고 자바에서 OnCheckedChangeListener를 등록한뒤 OnCheckedChanged 메서드를 이용해 체크박스의 상태변경을 이벤트(콜백)로 받아 처리할 수 있다.


-menu : 메뉴를 사용할 때 쓴다


-item : 메뉴 내의 항목을 만들 때 쓴다 (간단히 메뉴 뒷부분에 레이아웃 하듯이 쓰기만하면 저절로 포함 됨)







--------------------메서드와 콜백함수에대한 정리-----------------------

Activity.setContentView(); 전달받은 레이아웃 또는 View 를 화면에 출력해준다.


















--------------------------------------------------------//좋은사이트


16. http://blog.naver.com/wizytale?Redirect=Log&logNo=90078101898

여기에가면 기초 게임만드는법이 미친듯 잘 설명되어있음!

http://blog.naver.com/laborercode?Redirect=Log&logNo=120059519926

여기에는 매우 간단히 키입력과 출력을 설명해줌!

http://blog.naver.com/ryuvsken?Redirect=Log&logNo=91051744

여기에도 키입력과 터치에대한 내용이 있는데 보다 자세하고 좋음!

http://mainia.tistory.com/476

여기에도 게임만드는거에대한 대략적인게 포함

http://rsequence.com/android_blog/node/8

여기엔 노트패드를 만드는 예제를 써놓음

http://www.hellomylove.co.kr/archive/20091116

에는 그 핼로안드로이드에서 수도쿠만드는 예제를 잘풀어써놓음

http://blog.naver.com/neo__one?Redirect=Log&logNo=90073270931

여기도좋음





--------------------게임에 관한 정리--------------------//나중에 좀더 제대로 다시정리


이미지 띠우는법

(헐미친, 리소스에는 대문자를 쓰면 안된다!)


이미지를 띄우는 방법은 2가지가 있다.

첫번째는 레이아웃을 이용하여 ImageView를 사용하는 것이고

두번째는 자바코드에서 이미지를 불러와 사용하는 것이다.


그러나 첫번째는 복잡한 이미지처리나 작은 이미지에는 맞지않아 배경화면

정도로만 사용이 가능한 것 같다. 그리고 그방법은 매우간단하므로 두번째를 적겠다.


두번째 방법은 다음과 같다. 우선 

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.Canvas;

를 해야한다.


이미지는 항상 켄버스에 임시로 이미지를 그린뒤에 onDraw 콜백 매소드 또는 서피스뷰의 서피스홀더

등을 사용한다.


일단 다음과 같이 캔버스를 만든다

Bitmap b=bitmap.createBitmap(x,y,~~~);

Canvas c=new Canvas(b);

그럼 이 켄버스에는 현재 비트맵이 그려져 있다.

그럼 우리는 이제 View.onDraw() 나 SurfaceHolder.lockCanvas() 를 통해 원하는 캔버스를 불러온다.



protected void onDraw(Cansvas canvas)

Resources res=getContext().getResources();




Bitmap b = BitmapFactory.decodeResource(res, R.drawable.파일명);


protected void doDraw(){

casvas.drawBitmap(b,x,y,null);

}















제대로된 움직이는 이미지를 불러오려면 SurfaceView를 써야만한다.

이것은 3D나 슈팅 게임처럼 주로 그래픽을 보여주는데 쓰이는 View인데,

Surface(보이는화면?)은 SurfaceHolder로 조작한다


이때 이 SurfaceHolder는 다음과 같은 Callback(아마도 자동으로 실행되는 것을 말하는듯)

surfaceCreate

surfaceChanged

surfaceDestroyed

메소드가 제공된다고 한다.


그리고 안드로이드는 더블버퍼링을 제공하여

lockCanvas로 예비그림을 그리고, unlockCanvasAndPost로 화면에 표시한단다.


이것은 뛰어난 효율을 가지고 있으므로 ImageView를 몇배 능가하는 속도를 가진다


즉, 움직이는 그림을 그리려면


SurfaceView 에서 lockCanvas로 예비Canvas에 이미지를 넣고

unlockCanvasAndPost로 화면에 복사해주는 동작을 반복하는 것이다.



--자 시작이다!--


일단 다음을 임포트한다


import android.content.Context;

import android.util.AttributeSet;

import android.view.SurfaceHolder;

import android.view.SurfaceView;

import android.view.SurfaceHolder.Callback;


그리고 그림을 그릴때는 주로 완전한 공백인 FrameLayout을 사용한다.

그다음엔 게임화면을 관리할 엑티비티를 만들고, SurfaceView를 상속받도록 한다.

그리고나서 그 엑티비티의 오류가뜬 x를 눌러 생성자를 추가해준뒤, main.xml로 와서 다음 형식으로 설피스뷰를 추가해준다!


<Game.DefenseGame(src다음폴더명).GameView

android:id="@+id/gameview"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent" />


(xml에서 자바로 뿐만아니라 자바에서 xml로도 뷰를 추가할 수 있다!)



그리고나서 엑티비티에 Callback 인터페이스를 구현해준다. 그러면 아마또 오류가뜰텐데 그것은 콜백함수를

구현해 달라는 요청이다. 원하는대로 구현 해주자!

그러면 결국 확장받은 SurfaceView는 화면을 그리는 역할을하고, Callback은 자동감지&호출의 역할을 하게되는것이다


그다음 SurfaceHolder 의 인스턴스에게 getHolder();로 홀더를 만들고,

this 연산자로 해당 엑티비티를 넘겨준다


SurfaceHolder holder=getHolder();

holder.addCallback(this);


이렇게 해주면 해당 엑티비티는 Surface의 변화를 콜백으로인해 감지할 수 있다.


SurfaceView가 Surface에 접근할때는 SurfaceHolder를 경유한다고 한다.

이 SurfaceHolder는 SurfaceHolder.Callback인터페이스를 포함하는데,

Surface(화면)이 변경될때 surfaceChanged surfaceCreated surfacedestroyed 가 호출된다


(안드로이드의 화면은 320*480 인듯)

그다음 크기가 320*480인 비트맵 파일을 drawable리소스에 추가해준다.

(참고로 이것은 꼭 비트맵이어야함)

그다음 게임뷰 엑티비티의 내부에 그림을 계속 움지겨줄 Img쓰레드 클레스를 하나 만든다.




그다음 import android.graphics.Bitmap; 을 해주고

클레스의 인스턴스 맴버로 

private Bitmap mImgback;

private SurfaceHolder mSurfaceHolder;

을 추가해준다


즉,

class ImgThread extends Thread {

private Bitmap mImgback;

private SurfaceHolder mSurfaceHolder;

}


인 것이다.


그다음 import android.content.Context;

import android.content.res.Resources;

을 해줘서 리소스를 불러올 수 있게한다.



그다음


public void run() {

// TODO Auto-generated method stub

while(true){

Canvas canvas = null;

try{

canvas = mSurfaceHolder.lockCanvas(null);

synchronized (mSurfaceHolder) {

canvas.drawBitmap(mImgBack, 0,0,null);

sleep(100);

}

}catch(InterruptedException e){

e.printStackTrace();

}finally{

if(canvas !=null){

mSurfaceHolder.unlockCanvasAndPost(canvas);

}

}

}


을친다.


run메서드는 쓰레드가 생성고 start를 시키면 멀티스레도써 실제호출되는 메서드이다.

즉, 이부분에다가 게임 루프코드를 시켜주면 되는것이다.


그리고 중요한거는 다음 세줄이다


canvas = mSurfaceHolder.lockCanvas(null);


canvas.drawBitmap(mImgBack, 0,0,null);


mSurfaceHolder.unlockCanvasAndPost(canvas);


1번은 예비켄버스에 설피스 홀더를 연결시키는 것이고, 2번은 리소스를 캔버스에 그리는 것이고,

3번은 그것을 화면에 빠르게 복사하는 것이다.


그다음 다음을 GameView생성자 위에 써서 쓰레드 선언을 한다


private ImgThread thread;

그다음 생성자 내부에 쓰레드 객체를 추가해준다


thread = new ImgThread(holder,context);


그다음 surfaceCreate 콜백 함수에서 thread.start();로 쓰레드를

활성화 시켜준다. 그러면 run() 메소드가 작동하면서 그림이 계속 바뀌는 쓰레드가 돌아간다.

(즉, 기존의 쓰레드와 방금 만든 쓰레드 2개가 동시에 돌아가는 것, 즉 이것이 바로 멀티쓰레드이다!)


그리고 마지막으로

surfaceDestroyed 콜백함수에 쓰레드 제거를 해주어야한다.

그렇지 않으면 쓰레드가 프로그램 종료로 중지되었을때 그것을 처리해주지않아 오류가생긴다


boolean retry =true;

while(retry){

try{

thread.join();

retry=false;

}catch(InterruptedException e){

}

}


이때 join()은 쓰레드가 종료되기를 기다려주는 거라는데 잘모르겠다



이렇게하면 일단 배경은잘뜬다. 그다음은 움직이는 녀석을 추가해보자.

적당히 두개의 그림을 만들고 png로 저장시킨다.


import android.graphics.drawable.Drawable;



을 해주자.

그다음 ImgThread의 맴버변수 부분에 다음을 추가해주자

private SurfaceHolder mSurfaceHolder;

private Drawable mManImage[]=new Drawable[2];


그리고 ImgThread 의 아랫부분에

mManImage[0]=res.getDrawable(R.drawable.test1);

mManImage[1]=res.getDrawable(R.drawable.test2);

을 추가한다.


그리고


synchronized 의 sleep 윗부분에 

mManImage[cnt%2].setBounds(125, 300, 125+70, 300+120);

mManImage[cnt%2].draw(canvas);

을 추가한다

음. 비트맵 파일은 객체인스턴스를 Bitmap을써야하고

png는 Drawable 을 쓰는 듯 하다. 


그리고 리소스와 인스턴스를 연결할때 비트맵은

인스턴스=BitmapFactory.decodeResources(res,R.drawable.아이디);

를쓰지만 png는

인스턴스=res.getDrawable(R.drawable.아이디);

를 쓴다


그리고 비트맵은 실제로 그릴때(더블버퍼링이라) 위에서 설명한


(둘다 canvas = mSurfaceHolder.lockCanvas(null); 이 된상태에서)


canvas.drawBitmap(mImgBack, 0,0,null);


mSurfaceHolder.unlockCanvasAndPost(canvas);


의 3단계를 거치고


png는 


mManImage[cnt%2].setBounds(125, 300, 125+70, 300+120);

mManImage[cnt%2].draw(canvas);

를 거친다.(cnt%2는 단지 1,2왔다갔다하게하려고)


이때 setBounds는 그림이 출력되는 위치를 설정하는것이고, draw 로 케넙스에 그리는 것이다.













키입력 받는법


GameView 에대고 컨트롤 쉬프트 s를해서 onKeyDown 메서드를 오버라이드한다

(인설트 위치는 편한대로 지정) 앞으로는 메서드를 이런식으로 해준다-훨씬편하므로

//이것도 마찬가지로 콜백함수로, 키가 눌리면 자동 발생한다


여기에 다음 코드를 추가해준다


if (keyCode==KeyEvent.KEYCODE_DPAD_LEFT)

thread.setXpos(-10);

else if (keyCode==KeyEvent.KEYCODE_DPAD_RIGHT)

thread.setXpos(10);

else if (keyCode==KeyEvent.KEYCODE_DPAD_UP)

thread.setYpos(-10);

else if (keyCode==KeyEvent.KEYCODE_DPAD_DOWN)

thread.setYpos(10);


//이것은 앞으로 두고두고 쓰일듯!!

//또는 이것도 괜찮은듯

public boolean onKeyDown(int keyCode, KeyEvent event) {

      // TODO Auto-generated method stub

      super.onKeyDown(keyCode, event);

      switch(keyCode)

      {

      case KeyEvent.KEYCODE_DPAD_LEFT:

            ingame.MoveLeft();

            break;

      case KeyEvent.KEYCODE_DPAD_RIGHT:

            ingame.MoveRight();

            break;

      case KeyEvent.KEYCODE_DPAD_UP:

            ingame.MoveUp();

            break;

      case KeyEvent.KEYCODE_DPAD_DOWN:

            ingame.MoveDown();

            break;

      }

      return true; //true가 아닐시 모든입력이 무효가된다네?

}





먼저 ImgThread 멤버로 다음을 추가해주자.

private int xpos,ypos;


그다음 setXpos와 setYpos 메서드를 thread에 추가해주자



void setXpos(int val){

xpos+=val;

}

void setYpos(int val){

ypos+=val;

}


그다음 실제그림이 움직일 수 있게 다음을 수정해주자


mManImage[cnt%2].setBounds(125+xpos, 300+ypos, 125+70+xpos, 300+120+ypos);

//여기서 알 수 있듯이, 해당 좌표는 왼쪽위 좌표와 오른쪽아래 좌표이다


그리고 마지막으로 GameView에다가 


setFocusable(true);

을추가한다.

그 이유는 키보드의 입력은 해당 뷰가 Focus 될때만 입력이

읽혀지기때문에 포커스를 강제적으로 게임뷰에 주기위해서이다.



-----

터치로 움직이기


일단 onTouchEvent메소드를 오버라이드한다(컨트롤 쉬프트 S로)


그다음 onTouchEvent메소드에 다음 세줄을 추가한다

thread.setX((int)event.getX());

thread.setY((int)event.getY());

int touchAction=event.getAction();


//참고로 event.getX(); 메소드는 터치이벤트시 그 X좌표를 float 형태로 리턴하는메서드다


그리고이제 thread 클래스에 당연 setX와 setY를 추가해주자


void setX(int val){

xpos=val-35;

}

void setY(int val){

ypos=val-35;

}


return super.onTouchEvent(event); 을 return true; 로바꿔준다 (안그럼 터치를 사용할수없다)

Comments