Download presentation
Presentation is loading. Please wait.
1
RMS (Record Management System)
Lecture #5
2
강의 목차 javax.microedition.rms 패키지 RMS API 개요 RMS 프로그래밍 개요
RandomPlayer 게임 Mobile Programming
3
javax.microedition.rms 패키지 (1)
RMS(Record Management System) MIDP에서는 MIDlet이 데이터를 영속적으로 저장하고 재사용하는 방법 제공 MIDlet 어플리케이션 간의 데이터 공유 가능 주요 Interface RecordComparator - 두 개의 레코드를 비교하기 위한 comparator 을 정의 RecordEnumeration - 양방향의 소통가능한 레코드 emumerator를 표시 RecordFilter - 어플리케이션에 정의된 내용과 레코드의 내용을 체 크하기 위한 내용을 정의 RecordListener - 레코드 스토어에 레코드들이 추가,삭제,변경 되는 이벤트를 처리 Mobile Programming
4
javax.microedition.rms 패키지 (2)
주요 클래스 클래스 기능 RecordStore 클래스 레코드 저장소를 나타내는 클래스로서 관련 기능들을 제공해 준다. 레코드 저장소는 여러 개의 MIDlet를 수행할 때 영속성을 유지하는 레코드들의 콜렉션으로 구성된다. 클래스 기능 InvalidRecordIDException 잘못된 레코드 ID를 사용하여 작업이 완료되지 못했을 때 발생하는 예외 RecordStoreException 레코드 저장 연산 시에 발생할 수 있는 일반적인 예외 RecordStoreFullException 레코드 저장 시스템 스토리지가 꽉차서 더 이상 레코드를 저장할 수 없을 때 발생하는 예외 RecordStoreNotFoundException 레코드 저장소를 찾을 수 없어 레코드를 저장할 수 없을 때 발생하는 예외 RecordStoreNotOpenException 닫혀진 레코드 저장소에 대한 작업을 하려고 할 경우에 발생하는 예외 Mobile Programming
5
RecordFilter 인터페이스 (1) 주어진 레코드들 중에서 관심있는 레코드들을 걸러내기 위해 사용하는 인터페이스
RecordFilter 인터페이스의 matches() 메소드에서 반환한 결과가 참(true)인 레코드만 가져온다. 메소드 기능 boolean matches(byte[] candidate) 주어진 후보자 레코드가 필터링 되어 가져오기 위한 레코드이면 true 값을 반환해 주고, 그렇지 않고 가져올 필요가 없는 레코드이면 false 값을 반환하도록 구현해 준다. Mobile Programming
6
RecordFilter 인터페이스 (2) 예:
public boolean matches(byte[] candidate) throws IllegalArgumentException { // If no filter set, nothing can match it. if (this.playerNameFilter == null) { return false; } ByteArrayInputStream bais = new ByteArrayInputStream(candidate); DataInputStream inputStream = new DataInputStream(bais); String name = null; try { int score = inputStream.readInt(); name = inputStream.readUTF(); … … 중략 … … return( this.playerNameFilter.equals(name) ); Mobile Programming
7
RecordComparator 인터페이스 (1)
여러 개의 레코드 중에서 원하는 레코드들만을 필터링하여 가져올 때, 레코드들간의 우선순위를 나타내기 위한 비교자를 정의 두 개의 레코드를 비교하여 오름차순 또는 내림차순으로 순서대로 레코드를 정렬할 수 있다. int compare(byte[] rec1, byte[] rec2) : 레코드들을 검색 또는 정렬하기 위해 레코드들을 비교할 때 compare() 메소드가 호출된다 compare() 메소드를 구현할 때 현재 비교되는 두 개의 레코드의 순서를 나타내기 위해 PRECEDES, EQUIVALENT, FOLLOWS 값 중 하나를 반환해 주어야 한다. static int EQUIVALENT : 비교되는 두 개의 레코드의 검색 또는 정렬 순서가 같다는 것 static int FOLLOWS : 정렬 순서가 첫번째 매개변수가 두번째 레코드보다 뒤라는 것 static int PRECEDES : 정렬 순서가 첫번째 매개변수가 두번째 레코드보다 앞이라는 것 Mobile Programming
8
RecordComparator 인터페이스 (2)
예: public int compare(byte[] rec1, byte[] rec2) { … … 중략 … … // Sort by score if (score1 < score2) { return RecordComparator.PRECEDES; } else if (score1 > score2) { return RecordComparator.FOLLOWS; } else { return RecordComparator.EQUIVALENT; } O R 내림차순 : if (score1 > score2) { return RecordComparator.PRECEDES; } else if (score1 < score2) { return RecordComparator.FOLLOWS; } Mobile Programming
9
RecordEnumeration 인터페이스(1)
레코드 저장소에 저장되어 있는 레코드들을 가져와 어플리케이션에서 사용할 수 있도록 해 주는 기능들을 정의 어플리케이션에서 필요로 하는 레코드들만을 필터링하여 가져오면서 우선순위에 따라 순서대로 가져올 수 있도록 해 준다. RecordEnumeration re = recordStore.enumerateRecords(filter, comparator, true); recordStore.enumerateRecords() 메소드를 호출할 때 keepUpdated 매개변수의 값을 true 값으로 지정 레코드 저장소에 대한 특정 레코드의 변경/추가/삭제 등의 이벤트에 적절하게 대처할 수 있도록 지정 Mobile Programming
10
RecordEnumeration 인터페이스(2)
메소드 기능 void destroy( ) RecordEnumeration 객체에서 사용되고 있는 내부 자원들을 해제한다. boolean hasNextElement( ) 정방향(next)으로 레코드들을 가져올 때, 다음 레코드가 더 존재하는지 여부를 리턴해 준다. 만약, 정방향으로 가져올 수 있는 레코드가 존재하면 true 값이 리턴된다. boolean hasPreviousElement( ) 역방향(previous)으로 레코드들을 가져올 때, 이전 레코드가 더 존재하는지 여부를 리턴해 준다. 만약, 역방향으로 가져올 수 있는 레코드가 존재하면 true 값이 리턴된다. boolean isKeptUpdated( ) 레코드 저장소 내에서 레코드의 변경/추가/삭제 등의 이벤트가 발생할 때, 현재 RecordEnumeration 객체 내에서 유지하고 있는 레코드들의 인덱스에 반영하는지 여부를 true 또는 false 값으로 리턴해 준다. void keepUpdated(boolean keepUpdated) 레코드 저장소 내에서 레코드의 변경/추가/삭제 등의 이벤트가 발생할 때, 현재 RecordEnumeration 객체 내에서 유지하고 있는 레코드들의 인덱스에 반영할지 여부를 true 또는 false 값으로 설정한다. byte[] nextRecord( ) RecordEnumeration 객체 내에서 유지하고 있는 레코드들을 정방향으로 순서대로 하나씩 가져올 때, 다음 순서에 해당하는 레코드를 가져온다. int nextRecordId( ) RecordEnumeration 객체 내에서 유지하고 있는 레코드들을 정방향으로 순서대로 하나씩 가져올 때, 다음 순서에 해당하는 레코드의 레코드 아이디를 가져온다. int numRecords( ) RecordEnumeration 객체 내에서 유지하고 있는 레코드들의 개수를 리턴해 준다. byte[] previousRecord( ) RecordEnumeration 객체 내에서 유지하고 있는 레코드들을 역방향으로 순서대로 하나씩 가져올 때, 다음 순서에 해당하는 레코드를 가져온다. int previousRecordId( ) RecordEnumeration 객체 내에서 유지하고 있는 레코드들을 역방향으로 순서대로 하나씩 가져올 때, 다음 순서에 해당하는 레코드의 레코드 아이디를 가져온다. void rebuild( ) RecordEnumeration 객체 내에서 유지하고 있는 레코드 저장소에 있는 최신의 레코드 셋을 반영하기 위해 레코드 인덱스를 다시 생성한다. void reset( ) RecordEnumeration 객체 내의 레코드 인덱스가 생성되었을 때와 똑같은 상태로 레코드 인덱스를 리셋. Mobile Programming
11
RecordEnumeration 인터페이스(3)
public class RMSGameScores implements RecordFilter, RecordComparator { private RecordStore recordStore = null; public RMSGameScores( ) { try { recordStore = RecordStore.openRecordStore("scores", true); } catch (RecordStoreException rse) { System.out.println(rse); rse.printStackTrace( ); } } public boolean matches(byte[] candidate) throws IllegalArgumentException { } public int compare(byte[] rec1, byte[] rec2) { } private void printScores( ) { try { RecordEnumeration re = recordStore.enumerateRecords(null, this, true); while(re.hasNextElement( )) { int id = re.nextRecordId( ); ByteArrayInputStream bais = new ByteArrayInputStream( recordStore.getRecord(id) ); Mobile Programming
12
RecordListener 인터페이스 레코드 저장소에서 발생하는 레코드의 변경/추가/삭제 등의 이벤트를 처리하는 이벤트 리스너
void recordAdded(RecordStore recordStore, int recordId) : 주어진 레코드 저장소에서 주어진 아이디에 해당하는 레코드가 추가되었을 때 발생하는 이벤트를 잡아 처리하기 위한 이벤트 핸들러 void recordChanged(RecordStore recordStore, int recordId) : 주어진 레코드 저장소에서 주어진 아이디에 해당하는 레코드가 변경되었을 때 발생하는 이벤트를 잡아 처리하기 위한 이벤트 핸들러 void recordDeleted(RecordStore recordStore, int recordId) : 주어진 레코드 저장소에서 주어진 아이디에 해당하는 레코드가 삭제되었을 때 발생하는 이벤트를 잡아 처리하기 위한 이벤트 핸들러 Mobile Programming
13
RecordStore 클래스 레코드 저장소를 나타내는 클래스로서 관련 기능을 제공
레코드 저장소는 MIDlet에서 직접 접근할 수 없는 플랫폼 독립적인 위치에 생성 레코드 저장소 이름은 대소문자를 구분하고 유니코드 문자 32자 까지의 조합으로 구성 레코드 저장소는 가장 마지막으로 변경된 시간을 타임 스탬프 값으로 갖는다. 레코드 저장소 내에서 생성된 첫번째 레코드의 레코드 아이디 값은 1이다. 그 다음부터 해당 레코드 저장소(RecordStore)에 추가되는 각 레코드의 레코드 아이디는 1씩 증가 Mobile Programming
14
RMS 프로그래밍 개요 (1) RMS를 사용하기 위한 기본적인 작업 레코드 저장소 생성 데어터 추가 데어터 가져오기
레코드 저장소 닫기 레코드 저장소 삭제 Mobile Programming
15
RMS 프로그래밍 개요 (2) 레코드 저장소 생성 레코드 저장소에 데이터 추가
RecordStore recordStore = RecordStore.openRecordStore("Test", true); 레코드 저장소에 데이터 추가 // 게임의 점수와 사용자의 아이디를 byte 배열로 저장하기 위해 // ByteArrayOutputStream 객체와 DataOutputStream 객체를 생성 한 후… … … 중략 … … // ByteArrayOutputStream 객체에 출력된 레코드 데이터를 // byte 배열로 변환한다. byte[] b = baos.toByteArray(); try { // 레코드 저장소에 byte 배열 b에 저장되어 있는 레코드를 추가한다. recordStore.addRecord(b, 0, b.length); } catch(RecordStoreException rse) { System.out.println(rse); rse.printStackTrace(); } Mobile Programming
16
RMS 프로그래밍 개요 (3) 레코드 저장소의 데이터 가져오기 try {
RecordEnumeration re = recordStore.enumerateRecords(null, this, true); while(re.hasNextElement()) { int id = re.nextRecordId(); ByteArrayInputStream bais = new ByteArrayInputStream(recordStore.getRecord(id)); DataInputStream inputStream = new DataInputStream(bais); int score = inputStream.readInt(); String playerName = inputStream.readUTF(); System.out.println(playerName + " = " + score); … … 중략 … … Mobile Programming
17
RMS 프로그래밍 개요 (4) 레코드 저장소 닫기 레코드 저장소 삭제 try {
recordStore.closeRecordStore(); } catch(RecordStoreException rse) { System.out.println(rse); rse.printStackTrace(); } try { RecordStore.deleteRecordStore(RECORD_STORE); } catch(RecordStoreException rse) { System.out.println(rse); rse.printStackTrace(); } Mobile Programming
18
RandomPlayer 게임 (1) 사용자 아이디를 이용하여 로그인 한 후 자신의 점수를 랜덤하게 생성하여 최고 점수를 얻는 게임 시 작 BACK 게임 진행 종 료 저장(점수, 아이디) 최고점 YES NO Mobile Programming
19
RandomPlayer 게임 (2) "게임하기" "자기 점수 보기" "전체 점수 보기" "자기 점수 삭제" "전체 점수 삭제"
게임을 시작한다. 한 판은 횟수에 제한없이 랜덤하게 점수를 생성할 수 있으며, 게임을 마치기 위해서 ‘Back’ 명령을 선택하면 된다. 지금까지 랜덤하게 생성하여 얻은 최고 점수가 RandomPlayer 게임을 위한 레코드 저장소에 저장된다. "자기 점수 보기" 레코드 저장소에 있는 레코드(점수, 사용자 아이디) 중에서 현재 로그인한 사용자 아이디로 저장된 레코드를 가져와 새로운 스크린으로 보여준다. "전체 점수 보기" 레코드 저장소에 있는 모든 레코드를 가져와 새로운 스크린으로 보여준다. "자기 점수 삭제" 레코드 저장소에 있는 레코드(점수, 사용자 아이디) 중에서 현재 로그인한 사용자 아이디로 저장된 레코드를 레코드 저장소로부터 삭제한다. "전체 점수 삭제" 레코드 저장소에 있는 모든 레코드를 삭제한다. Mobile Programming
20
RandomPlayer 게임 (3) 게임 메뉴 화면과 각 메뉴를 선택하여 나타나는 스크린 Mobile Programming
21
RandomPlayer 게임 (4) RMSTest RecordFilter RecordComparator
CommandListener 메소드 기능 public boolean matches(byte[] candidate) RecordFilter 인터페이스에서 정의하고 있는 필터 메소드를 구현한 것이다. "자기 점수 보기" 또는 "자기 점수 삭제"를 위한 RecordEnumeration 객체를 생성할 때, 자기 이름에 해당하는 레코드만 필터링하기 위해 사용된다. public int compare(byte[] rec1, byte[] rec2) RecordComparator 인터페이스에서 정의하고 있는 비교자 메소드를 구현한 것이다. "자기 점수 보기" 또는 "전체 점수 보기"를 위한 RecordEnumeration 객체를 생성할 때 레코드들을 순서대로 가져오기 위해 사용된다. public void commandAction(Command cmd, Displayable disp) CommandListener 인터페이스에서 정의하는 메소드를 구현한 것이다. 커멘드 이벤트에 대한 액션을 처리하는 부분으로서 각 스크린에 등록되어 있는 명령을 선택할 때 발생하는 이벤트를 처리하기 위한 이벤트 핸들러이다. Mobile Programming
22
RandomPlayer 게임 (5) RMSTest Mobile Programming 메소드 기능
public void randomPlay( ) 이 게임은 정수를 랜덤하게 생성하여 점수를 얻는 게임이다. 이 때, 자신이 원하는 점수를 레코드 저장소에 저장할 수 있다. 먼저, 점수를 위한 정수를 랜덤하게 생성 public void addScore( ) 게임에서 얻은 최고 점수를 레코드 저장소에 저장한다. public void resetScore( ) 레코드 저장소 내의 모든 레코드를 지워 레코드 저장소를 리셋한다. public void deleteScore( ) 자신의 모든 점수를 레코드 저장소에서 삭제한다. public void clearShowScreen( ) 점수 보여주기 스크린의 내용을 모두 지운다. public void showScoreHelper(RecordEnumeration re) "자기 점수 보기", "전체 점수 보기" 등을 위한 RecordEnumeration 객체를 매개변수로 받아 RecordEnumeration 객체 내에 있는 모든 레코드를 showScreen 스크린 Form 컴포넌트에 추가한다. public void showScore( ) 자신의 점수를 보여준다. public void showScoreAll( ) 전체 점수를 보여준다. public RMSTest( ) 객체 생성자 public void startApp( ) JAM이 MIDlet을 실행할 때 호출한다. public void pauseApp( ) MIDlet을 일시 정지시킬 때 호출한다. public void destroyApp (boolean unconditional) MIDlet을 정지 시킬 때 호출한다. 열려있는 레코드 저장소를 닫아 준다. public void showAlert(String title, String msg) 메시지 창을 띄워 메시지를 보여준다. Mobile Programming
23
RandomPlayer 게임 (6) RandomPlayer 게임의 실행 화면 Mobile Programming
24
RandomPlayer 게임 (7) Display 객체와 명령 컴포넌트 생성 330 // 현재의 디스플레이를 얻는다.
// 현재의 디스플레이를 얻는다. display = Display.getDisplay(this); 332 // ""로그인"" 스크린에서 사용할 명령을 생성한다. ok = new Command(""OK"", Command.OK, 0); 335 // ""게임 메뉴"" 스크린에서 사용할 명령을 생성한다. sel = new Command(""OK"", Command.OK, 0); exit = new Command(""Exit"", Command.EXIT, 0); 339 // ""게임하기"" 스크린에서 사용할 명령을 생성한다. play = new Command(""Play"", Command.SCREEN, 0); 342 // ""자기 점수 보기"", ""자기 점수 삭제"", ""전체 점수 보기"", ""전체 점수 삭제"" 등의 // 스크린에서 사용할 명령을 생성한다. back = new Command(""Back"", Command.BACK, 0); del = new Command(""Del"", Command.SCREEN, 0); Mobile Programming
25
RandomPlayer 게임 (8) 화면 전환 컴포넌트 350 public void startApp( ) {
// ""게임 메뉴"" 리스트를 보여주는 List 컴포넌트를 생성한다. // List가 Choice를 구현하므로, List.IMPLICIT과 Choice.IMPLICIT는 같다. // List(String title, int listType, String[] stringElements, Image[] imageElements) menuList = new List(""Random Player:"", List.IMPLICIT, menuTitles, null); 355 …………….. 중략 ……………….. // ""로그인"" UI 스크린이 보이도록 한다 display.setCurrent(loginScreen); } …………………… 중략 ……………………………… } else if(cmd == ok) { // 'OK' 명령은 ""로그인"" 스크인에 등록된 명령이다. // 따라서, ""로그인"" UI에 등록된 사용자 아이디가 // 입력되었을 경우에만 ""게임 메뉴"" 스크린으로 전환한다. String name = nameField.getString( ); if(name.length( ) > 0) { nameItem.setText(name); menuList.setTitle(name); Mobile Programming
26
RandomPlayer 게임 (9) 화면 전환 컴포넌트 (계속)
// 사용자 아이디가 입력되었으면 ""게임 메뉴"" 스크린으로 전환 display.setCurrent(menuList); } else { // 사용자 아이디가 입력되지 않았을 경우 // Alert 창을 띄워 에러 메시지를 보여준다. showAlert(""Empty ID"", ""Please,\n Insert your ID""); } } else if(cmd == play) { …………………………. 중략 …………………………. 503 } Mobile Programming
27
RandomPlayer 게임 (10) “게임 메뉴” List 컴포넌트에서 발생한 이벤트 처리
public void commandAction(Command cmd, Displayable disp) { …………… 중략 ……………. } else if((cmd == sel)||(disp == menuList)) { // List 컴포넌트에서 선택된 항목의 Alert 데모에 해당하는 // Alert 컴포넌트를 현재 스크린으로 설정한다. int index = menuList.getSelectedIndex( ); 469 System.out.println(""index: ""+index); 470 // display.setCurrent(alerts[index]); switch(index) { case 0: // ""게임하기"" // 현재, 진행할 게임을 위해 점수와 최고점수를 초기화 score = 0; highScore = 0; 476 // ""게임하기"" 스크린의 UI 역시 초기화 한다. scoreItem.setText(""""+score); highScoreItem.setText(""""+highScore); // ""게임하기"" 스크린으로 현재 스크린을 전환 display.setCurrent(playScreen); Mobile Programming
28
RandomPlayer 게임 (11) “게임 메뉴” List 컴포넌트에서 발생한 이벤트 처리 (계속) 483 break;
case 1: // ""자기 점수 보기"" showScore( ); break; case 2: // ""전체 점수 보기"" showScoreAll( ); break; case 3: // ""자기 점수 삭제"" deleteScore( ); // 진행 상황을 보여주기 위해 Alert 창을 띄움 showAlert(""Delete"", ""Clear\n\nyour scores...""); break; case 4: // ""전체 점수 삭제"" resetScore( ); // 진행 상황을 보여주기 위해 Alert 창을 띄움 showAlert(""Delete All"", ""Clear\n\nall scores...""); break; } 501 Mobile Programming
29
RandomPlayer 게임 (12) 사용자 인터페이스 구성 317 public RMSTest( ) {
…………… 중략 …………… // ""로그인"" 스크린에서 사용할 명령을 생성한다. ok = new Command(""OK"", Command.OK, 0); 335 // ""게임 메뉴"" 스크린에서 사용할 명령을 생성한다. sel = new Command(""OK"", Command.OK, 0); exit = new Command(""Exit"", Command.EXIT, 0); /* startApp( ) : JAM이 MIDlet을 실행할 때 호출한다. */ public void startApp( ) { // ""로그인"" UI 스크린 생성 loginScreen = new Form(""Login...""); nameField = new TextField(""ID: "", """", 10, TextField.ANY); loginScreen.append(nameField); // 애플리케이션 시작시 ""로그인"" UI 스크린이 보이도록 한다 display.setCurrent(loginScreen); } Mobile Programming
30
RandomPlayer 게임 (13) loginScreen에서 발생하는 사용자 입력 처리
public void startApp( ) { …………… 중략 …………… // ""로그인"" UI 스크린 생성 loginScreen = new Form(""Login...""); nameField = new TextField(""ID: "", """", 10, TextField.ANY); loginScreen.append(nameField); public void commandAction(Command cmd, Displayable disp) { if(cmd == exit) { destroyApp(false); notifyDestroyed( ); } else if(cmd == ok) { // 'OK' 명령은 ""로그인"" 스크인에 등록된 명령이다. // 따라서, ""로그인"" UI에 등록된 사용자 아이디가 // 입력되었을 경우에만 ""게임 메뉴"" 스크린으로 전환한다. Mobile Programming
31
RandomPlayer 게임 (14) loginScreen에서 발생하는 사용자 입력 처리 (계속)
String name = nameField.getString( ); if(name.length( ) > 0) { nameItem.setText(name); menuList.setTitle(name); 440 // 사용자 아이디가 입력되었으면 ""게임 메뉴"" 스크린으로 전환 display.setCurrent(menuList); } else { // 사용자 아이디가 입력되지 않았을 경우 // Alert 창을 띄워 에러 메시지를 보여준다. showAlert(""Empty ID"", ""Please,\n Insert your ID""); } } else if(cmd == play) { Mobile Programming
32
RandomPlayer 게임 (15) 메시지 출력을 위한 Alert 컴포넌트 생성
public void showAlert(String title, String msg) { Alert alert = new Alert(title, msg, null, AlertType.INFO); alert.setTimeout(5000); display.setCurrent(alert); Mobile Programming
33
RandomPlayer 게임 (16) 로그인 및 게임 메뉴 Mobile Programming
34
RandomPlayer 게임 (17) 게임 메뉴 리스트 구성 317 public RMSTest( ) {
…………… 중략 …………… // ""게임 메뉴"" 스크린에서 사용할 명령을 생성한다. sel = new Command(""OK"", Command.OK, 0); exit = new Command(""Exit"", Command.EXIT, 0); 347 } public void startApp( ) { // ""게임 메뉴"" 리스트를 보여주는 List 컴포넌트를 생성한다. // List가 Choice를 구현하므로, List.IMPLICIT과 Choice.IMPLICIT는 같다. // List(String title, int listType, String[] stringElements, Image[] imageElements) menuList = new List(""Random Player:"", List.IMPLICIT, menuTitles, null); …………… 하략 …………… 393 } Mobile Programming
35
RandomPlayer 게임 (18) 이벤트 핸들링 350 public void startApp( ) {
…………… 중략 …………… // List 컴포넌트에 명령과 이벤트 핸들러를 등록한다. menuList.addCommand(exit); menuList.addCommand(sel); menuList.setCommandListener(this); public void commandAction(Command cmd, Displayable disp) { if(cmd == exit) { destroyApp(false); notifyDestroyed( ); } else if(cmd == ok) { } else if((cmd == sel)||(disp == menuList)) { // List 컴포넌트에서 선택된 항목의 Alert 데모에 해당하는 // Alert 컴포넌트를 현재 스크린으로 설정한다. int index = menuList.getSelectedIndex( ); 469 System.out.println(""index: ""+index); 470 // display.setCurrent(alerts[index]); switch(index) { Mobile Programming
36
RandomPlayer 게임 (19) 게임 하기 Mobile Programming
37
RandomPlayer 게임 (20) RMSTest( ) 객체 생성자와 startApp( ) 메소드 내에서의 사용자 인터페이스
public RMSTest( ) { …………… 중략 …………… // ""게임하기"" 스크린에서 사용할 명령을 생성한다. play = new Command(""Play"", Command.SCREEN, 0); 342 // ""자기 점수 보기"", ""자기 점수 삭제"", ""전체 점수 보기"", ""전체 점수 삭제"" 등의 // 스크린에서 사용할 명령을 생성한다. back = new Command(""Back"", Command.BACK, 0); del = new Command(""Del"", Command.SCREEN, 0); } public void startApp( ) { // ""게임하기"" UI 스크린 생성 playScreen = new Form(""Let's Play""); 372 nameItem = new StringItem(""ID: "", """"); scoreItem = new StringItem(""Score: "", ""0""); highScoreItem = new StringItem(""Hi-Score: "", ""0""); 376 playScreen.append(nameItem); playScreen.append(scoreItem); playScreen.append(highScoreItem); Mobile Programming
38
RandomPlayer 게임 (21) 컴포넌트의 자동 전환
public void commandAction(Command cmd, Displayable disp) { …………… 중략 …………… } else if(cmd == play) { // 'Play' 명령은 '게임하기' 스크인에 등록된 명령이다. // '게임하기' 스크인에서 'Play' 명령을 선택하면 게임 진행. // 여기서, 게임이란 랜덤하게 점수를 생성하는 것으로 한다. randomPlay( ); } else if(cmd == back) { Mobile Programming
39
RandomPlayer 게임 (22) ramdomPlay() 메소드 130 public void randomPlay( ) {
score = random.nextInt( ); if(score < 0) { // 생성한 값이 음수이면 양수로 변환해 준다. score = -score; } // 생성한 점수를 0~999 사이의 값을 만든다. score = score % 1000; // 1000으로 나눈 나머지 if(score > highScore) { // 현재까지 얻은 최고 점수보다 크면 최고 점수로 등록 highScore = score; } // 현재 점수와 최고 점수를 playScreen 상의 해당 컴포넌트에 표시 scoreItem.setText(""""+score); highScoreItem.setText(""""+highScore); 145 // 현재, 게임에서 얻은 점수를 Alert 창을 띄워 보여준다. showAlert(""Play..."", ""Random Player:\n\nSocre: ""+score); } Mobile Programming
40
RandomPlayer 게임 (23) “게임 메뉴” 스크린 전환
public void commandAction(Command cmd, Displayable disp) { …………… 중략 …………… } else if(cmd == back) { // 만약, ""게임하기"" 스크린에서 'Back' 명령를 선택했을 경우, // 현재까지 얻은 점수 중에서 제일 높은 점수를 레코드 저장소에 저장 if((disp == playScreen)&&(highScore > 0)) { addScore( ); } 459 // ""게임하기"", ""자기 점수 보기"", ""전체 점수 보기"" Form 스크린에서 // 'Back' 명령을 선택했을 경우, ""게임 메뉴"" 스크린으로 이동 display.setCurrent(menuList); } else if(cmd == del) { Mobile Programming
41
RandomPlayer 게임 (24) 전체 점수 보기 Mobile Programming
42
RandomPlayer 게임 (25) showScreen 컴포넌트를 생성하고 화면을 구성
public RMSTest( ) { …………… 중략 …………… // ""자기 점수 보기"", ""자기 점수 삭제"", ""전체 점수 보기"", // 스크린에서 사용할 명령을 생성한다. back = new Command(""Back"", Command.BACK, 0); del = new Command(""Del"", Command.SCREEN, 0); } 348 /* startApp( ) : JAM이 MIDlet을 실행할 때 호출한다. */ public void startApp( ) { // ""자기 점수 보기"" 및 ""전체 점수 보기"" UI 스크린 생성 showScreen = new Form(""Rank...""); 387 showScreen.addCommand(back); showScreen.setCommandListener(this); Mobile Programming
43
RandomPlayer 게임 (26) "자기 점수 보기"와 "전체 점수 보기"
public void commandAction(Command cmd, Displayable disp) { …………… 중략 …………… } else if((cmd == sel)||(disp == menuList)) { // List 컴포넌트에서 선택된 항목의 Alert 데모에 해당하는 // Alert 컴포넌트를 현재 스크린으로 설정한다. int index = menuList.getSelectedIndex( ); 469 System.out.println(""index: ""+index); case 1: // ""자기 점수 보기"" showScore( ); break; case 2: // ""전체 점수 보기"" showScoreAll( ); break; } } 503 } Mobile Programming
44
RandomPlayer 게임 (27) "자기/전체 점수삭제" Mobile Programming
45
RandomPlayer 게임 (28) 점수 삭제
public void commandAction(Command cmd, Displayable disp) { …………… 중략 …………… } else if((cmd == sel)||(disp == menuList)) { // List 컴포넌트에서 선택된 항목의 Alert 데모에 해당하는 // Alert 컴포넌트를 현재 스크린으로 설정한다. int index = menuList.getSelectedIndex( ); 469 System.out.println(""index: ""+index); 470 // display.setCurrent(alerts[index]); switch(index) { case 3: // ""자기 점수 삭제"" deleteScore( ); // 진행 상황을 보여주기 위해 Alert 창을 띄움 showAlert(""Delete"", ""Clear\n\nyour scores...""); break; case 4: // ""전체 점수 삭제"" resetScore( ); // 진행 상황을 보여주기 위해 Alert 창을 띄움 showAlert(""Delete All"", ""Clear\n\nall scores...""); break; } } } 503 } Mobile Programming
46
RandomPlayer 게임 (29) resetScore( )메소드를 이용한 "전체 점수 삭제"
public void resetScore( ) { // 레코드 저장소 내의 모든 레코드를 삭제하기 위해 다음과 같이 한다. // 열려있는 레코드 저장소를 닫는다. // 닫혀있는 레코드 저장소를 삭제한다. // 레코드 저장소를 열면서 새롭게 생성하도록 한다. try { recordStore.closeRecordStore( ); recordStore.deleteRecordStore(RECORD_STORE); recordStore = RecordStore.openRecordStore(RECORD_STORE, true); } catch(RecordStoreException rse) { System.out.println(rse); rse.printStackTrace( ); } } Mobile Programming
47
RandomPlayer 게임 (30) 점수 삭제
public void commandAction(Command cmd, Displayable disp) { …………… 중략 …………… } else if((cmd == sel)||(disp == menuList)) { // List 컴포넌트에서 선택된 항목의 Alert 데모에 해당하는 // Alert 컴포넌트를 현재 스크린으로 설정한다. int index = menuList.getSelectedIndex( ); 469 System.out.println(""index: ""+index); 470 // display.setCurrent(alerts[index]); switch(index) { case 3: // ""자기 점수 삭제"" deleteScore( ); // 진행 상황을 보여주기 위해 Alert 창을 띄움 showAlert(""Delete"", ""Clear\n\nyour scores...""); break; case 4: // ""전체 점수 삭제"" resetScore( ); // 진행 상황을 보여주기 위해 Alert 창을 띄움 showAlert(""Delete All"", ""Clear\n\nall scores...""); break; } } } 503 } Mobile Programming
48
RandomPlayer 게임 (31) 레코드 저장소 열고 닫기 317 public RMSTest( ) { 318 try {
// RECORD_STORE 레코드 저장소를 연다. //만약, 레코드 저장소가 없다면 새로 생성한다. recordStore = RecordStore.openRecordStore(RECORD_STORE, true); } catch(RecordStoreException rse) { System.out.println(rse); rse.printStackTrace( ); } …………… 중략 …………… public void destroyApp (boolean unconditional) { try { // 열려있는 레코드 저장소를 닫아 준다. recordStore.closeRecordStore( ); } catch(RecordStoreException rse) { System.out.println(rse); rse.printStackTrace( ); } } public void commandAction(Command cmd, Displayable disp) { if(cmd == exit) { destroyApp(false); notifyDestroyed( ); } else if(cmd == ok) { Mobile Programming
Similar presentations