2009-12-29 4 views
2

저는 현재 J2ME을 배우려고하고 4 개의 게임을 연결하려고합니다 (여러분 중 일부는 '4 행'으로 알 수 있습니다). 나는 화를 내고있는 한 가지를 제외하고는 게임의 모든 측면을 더 많거나 적게했습니다! 이것은 물론 사용자로부터 텍스트를 가져 오는 것입니다!j2me 캔버스를 사용하여 사용자로부터 어떻게 입력합니까? 이게 가능한가?

게임의 두 플레이어 모드의 경우 각 플레이어가 자신의 이름을 입력 할 수있게하려고합니다. 메인 미들 렛을 사용하지 않는 텍스트 입력 예제를 찾기 위해 고심하고 있습니다.

예를 들어 java2x.com의 예제는 단일 미드 렛 (클래스 또는 캔버스 또는 기타 없음) 만 사용합니다.

내 응용 프로그램의 주 미들 릿 시작 방법은 단순히 메인 메뉴 클래스 열립니다 로선 :

package midlet; 

import javax.microedition.midlet.*; 
import javax.microedition.lcdui.*; 
import view.*; 

public class Main extends MIDlet { 
    public void startApp() { 
     MainMenu mm = new MainMenu(); 
     showScreen(mm); 
    } 

    public static void showScreen(Displayable screen) { 
     Display.getDisplay(instance).setCurrent(screen); 
    } 

    public void pauseApp() { 
    } 

    public static void quitApp() { 
     instance.notifyDestroyed(); 
    } 

    public void destroyApp(boolean unconditional) { 
    } 
} 

메인 메뉴 클래스는 다음과 같다을 : 두 플레이어 게임을 선택

package view; 

    import javax.microedition.lcdui.*; 
    import lang.*; 
    import model.*; 
    import midlet.Main; 

    public class MainMenu extends List implements CommandListener { 

     private Command ok = new Command(StringDefs.currDefs.getString("TEXT_OK"), Command.OK, 1); 

     public MainMenu() { 
      super(StringDefs.currDefs.getString("TEXT_TITLE"), List.IMPLICIT); 
      // we we add in the menu items 
      append(StringDefs.currDefs.getString("TEXT_PLAY1"), null); 
      append(StringDefs.currDefs.getString("TEXT_PLAY2"), null); 
      append(StringDefs.currDefs.getString("TEXT_HIGHSCORETABLE"), null); 
      append(StringDefs.currDefs.getString("TEXT_HELP"), null); 
      append(StringDefs.currDefs.getString("TEXT_QUIT"), null); 
      this.addCommand(ok); 
      this.setCommandListener(this); 
     } 

     public void commandAction(Command c, Displayable d) { 
      if (c == ok) { 
       int selectedItem = this.getSelectedIndex(); 
       if (selectedItem != -1) { 
        switch (selectedItem) { 
         case 0: 
          GameBoard gameBoard = new model.GameBoard(); 
          GameCanvasOnePlayer board = new GameCanvasOnePlayer(gameBoard); 
          Main.showScreen(board); 
          break; 
         case 1: 
          GameBoard gameBoardTwo = new model.GameBoard(); 
          GameCanvasTwoPlayer GameCanvasTwoPlayer = new GameCanvasTwoPlayer(gameBoardTwo); 
          Main.showScreen(GameCanvasTwoPlayer); 
          break; 
         case 2: 
          HighScores hc = new HighScores(); 
          midlet.Main.showScreen(hc); 
          break; 
         case 3: 
          Help he = new Help(); 
          midlet.Main.showScreen(he); 
          break; 
         case 4: 
          QuitConfirmation qc = new QuitConfirmation(); 
          midlet.Main.showScreen(qc); 
          break 
        } 
       } 
      } 
     } 
    } 

(위의 스위치에서 case 1)이 메뉴에서 나는 플레이어 이름을 모두 가져올 수 있도록 두 개의 텍스트 상자를 표시하고 싶습니다.

이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 캔버스로도 가능합니까? 그리고 내가 관련있는 예를 찾거나 도움이 될만한 것을 발견 할 수 있습니까?

답변

3

다음 중 하나를 수행 할 수 있습니다 : 1. 사용자가 (전체 화면 걸립니다) 2. 사용할 내가 오래 전에 처음부터 작성한 텍스트 박스 컨트롤 인 못생긴 Textbox에서 자신의 입력을 입력해야합니다 here 나는 해결책을 가지고

alt text

+0

고마워요! 솔루션을 빠르게 살펴 본 결과 작동해야합니다! 그러나 Ruibm이 말한 것처럼 나는 다양한 유형의 전화 키보드 뒤에 모든 로직을 구현해야만한다고 말했습니다. 이 문제를 해결할 수 없다면 사용해야 할 수도 있습니다! 감사! – Exile

+1

게임의 경우 어쩌면이 사람과 같은 방식으로 입력 할 수 있습니다. http://devlinslab.blogspot.com/2007/11/handling-text-input-for-character-or.html –

1

정말 끈적한 상황입니다. 기본적으로 당신은 J2ME의 입력 텍스트 위젯을 사용해야 할 것입니다 (그런데 그것은 끔찍한 것처럼 보입니다). 그렇지 않으면 다양한 유형의 전화 키보드 뒤에 모든 로직을 구현해야하므로 결국 사전에 액세스 할 수 없게됩니다 ... 캔버스는 기본적으로 텍스트 입력이 아닌 키 입력 만 캡처합니다. ..

죄송합니다.

+0

흠 그다지 크지는 않지만 나는 알고 있기를 바랄뿐입니다! 당신은 어떤 조언을해도 대단히 감사합니다. 그래서 모든 J2ME 텍스트 입력이 midlets를 통해 이루어 집니까? – Exile

+1

예, 그렇습니다. J2ME의 API를 확장 한 BlackBerry를 사용 중이라면 사용자 정의 컨트롤을 사용할 수 있었지만 J2ME에서는 입력 된 텍스트 화면을 연 다음 입력 된 텍스트를 검색해야합니다. – rui

+2

Re : "J2ME의 입력 텍스트 위젯 (그건 끔찍한 것 같습니다)". 기기 자체의 UI가 어떻게 나타나는지에 따라 모든 기기에서 다르게 보일 것입니다. 특정 장치에 대해 끔찍한 것처럼 보이는지 여부는 보는 사람의 눈에 달려 있습니다. 자신의 앱의 UI에는 맞지 않을 수도 있지만 사용자가 전화 UI에서 익숙한 것입니다. – funkybro

2

:이 같은 (3 텍스트 필드 표시)을 보인다! 음.

내가 주 미들 릿을 사용하지 않고 양식을 만들 수 있습니다

:

다음 메인 클래스가 (내 프로젝트에 많은처럼) midlet라는 소스 패키지의 일부입니다

package midlet; 

import javax.microedition.midlet.*; 
import javax.microedition.lcdui.*; 
import view.*; 

public class Main extends MIDlet { 
    private static UsernameForm unameForm=new UsernameForm(); 
    private static MIDlet instance; 
    public void startApp() { 
     instance=this; 
     showScreen(unameForm); // show user name form 

    } 

    public static String getUsername1() { 
     return(unameForm.getUsername1()); 
    } 

    public static String getUsername2() { 
     return(unameForm.getUsername2()); 
    } 

    public void pauseApp() { 
    } 

    public static void showScreen(Displayable d) { 
     Display.getDisplay(instance).setCurrent(d); // show next screen 

    } 

    public void destroyApp(boolean unconditional) { 
    } 
} 

의 다음 비트 코드라는 소스 패키지의 일부 view 인 사용자 이름 양식 클래스입니다 : D의 쉬운 방법이없는 것처럼

package view; 

import javax.microedition.lcdui.*; 

public class UsernameForm extends Form implements CommandListener { 
    private String username1=""; 
    private String username2=""; 
    private TextField tfUsername1=new javax.microedition.lcdui.TextField("User 1","User1",40,TextField.ANY); 
    private TextField tfUsername2=new javax.microedition.lcdui.TextField("User 2","User2",40,TextField.ANY); 
    private Command cmdOK=new Command("OK",Command.OK,1); 
    public UsernameForm() { 
     super("User details"); 
     append(tfUsername1); 
     append(tfUsername2); 
     addCommand(cmdOK); 
     setCommandListener(this); 
    } 

public void commandAction(Command cmd,Displayable d) { 
    if (cmd==cmdOK) { 
     this.setUsername1(tfUsername1.getString()); 
     this.setUsername2(tfUsername2.getString()); 
     // TO DO, GO TO NEXT SCREEN 
    } 
} 

/** 
* @return the username1 
*/ 
public String getUsername1() { 
    return username1; 
} 

/** 
* @param username1 the username1 to set 
*/ 
public void setUsername1(String username1) { 
    this.username1 = username1; 
} 

/** 
* @return the username2 
*/ 
public String getUsername2() { 
    return username2; 
} 

/** 
* @param username2 the username2 to set 
*/ 
public void setUsername2(String username2) { 
    this.username2 = username2; 
} 
} 

그래서 보인다 canvases를 사용하여 그것을 작성하면, 나는 그들이 장치를 무엇이든 작동해야하기 때문에 대신에 "못생긴 폼"을 사용하는 것이 낫다고 생각합니다.

1

여기서 사용자 지정 항목을 구현해야합니다. 사용자/플레이어가 CustomItem에 자신의 이름을 입력 할 수있는 캔버스 부분을 확장하고 customItems 미리 정의 된 추상 메서드를 구현하기 만하면됩니다 , 그리고 키 스트로크 (Key Strokes)를위한 메소드를 작성하면 노키아 포럼에서 볼 수있다. 그들은 꽤 잘 설명했다. Nokia 포럼을 확인하십시오.