Как получить информацию от пользователя, использующего холсты 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 ответа

Решение

Вы можете: 1. Сделать так, чтобы пользователь вводил свои данные в уродливом текстовом поле (занимающем весь экран) 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:

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 (который, кстати, выглядит ужасно). Если вы этого не сделаете, вам в конечном итоге придется реализовать всю логику, лежащую в основе различных типов телефонных клавиатур, и у вас не будет доступа к словарю... В основном ваш холст будет захватывать только нажатия клавиш, а не ввод текста...

Сожалею.

Другие вопросы по тегам