Как получить информацию от пользователя, использующего холсты j2me? это вообще возможно?
В настоящее время я пытаюсь выучить 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
}
}
}
}
}
Когда в этом меню выбрана игра для двух игроков (случай 1 в вышеприведенном переключателе), я бы хотел, чтобы появилось два текстовых поля, чтобы я мог получить имена обоих игроков и сохранить их.
Что было бы лучшим способом добиться этого? это возможно даже с холстами? И знаете ли вы, где я могу найти соответствующий пример или хотя бы что-то, что может помочь?
4 ответа
У меня есть решение! ну вроде.
Я могу создать форму, не используя основной мидлет:
Следующий основной класс является частью пакета с исходным кодом 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
:
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;
}
}
Похоже, что нет простого способа сделать это с помощью холстов, я думаю, что лучше использовать "некрасивые формы", поскольку они должны работать на любом устройстве.
Здесь вам нужно реализовать пользовательские элементы, все, что вам нужно сделать, - это расширить часть холста, где пользователь / игрок должен ввести свое имя в CustomItems, реализовать предопределенные абстрактные методы customItems и метод write для нажатия клавиш и это доступно на форуме Nokia. Они объяснили это довольно хорошо. Проверьте форум Nokia.
Это действительно неприятная ситуация. В основном вам нужно будет использовать виджет ввода текста J2ME (который, кстати, выглядит ужасно). Если вы этого не сделаете, вам в конечном итоге придется реализовать всю логику, лежащую в основе различных типов телефонных клавиатур, и у вас не будет доступа к словарю... В основном ваш холст будет захватывать только нажатия клавиш, а не ввод текста...
Сожалею.