2

我目前正在尝试学习 J2ME 并构建一个四人连接游戏(你们中的一些人可能知道这是“连续四人”)。除了一件让我发疯的事情之外,我或多或少地让我的游戏的所有方面都发挥了作用!这当然是从用户那里获取文本!

对于游戏的两人模式,我希望能够让每个玩家输入他们的名字。我正在努力寻找一个不使用主 Midlet 的文本输入的工作示例。

例如java2x.com上的示例只使用一个 midlet(没有类或画布或任何东西)。

就目前而言,我的应用程序的主要 midlet 启动方法只是打开一个主菜单类:

    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

4 回答 4

3

您可以: 1. 让用户在一个丑陋的文本框(占据整个屏幕)中输入他的输入 2. 使用我很久以前从头开始编写的文本框控件,它可以在此处获得 ,看起来像这样(3显示的文本字段):

替代文字

于 2009-12-29T19:42:12.810 回答
2

我有办法!好吧。

我可以在不使用主 midlet 的情况下创建表单:

以下主类是名为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;
}
}

所以看起来使用画布没有简单的方法,我认为我最好使用“丑陋的形式”,因为它们应该适用于任何设备。

于 2009-12-31T17:15:38.847 回答
1

这是一个非常棘手的情况。基本上您将需要使用 J2ME 的输入文本小部件(顺便说一下,这看起来很糟糕)。如果不这样做,您最终将不得不实现不同类型电话键盘背后的所有逻辑,并且您将无法访问字典……您的画布基本上只会捕获击键,而不是文本输入。 ..

对不起。

于 2009-12-29T15:59:46.367 回答
1

在这里你需要,实现自定义Item,你需要做的就是将画布中希望用户/玩家输入他/她的名字的部分扩展到CustomItems,并实现customItems预定义的抽象方法,并编写方法用于 Key Strokes,可在诺基亚论坛中找到。他们解释得很好。查看诺基亚论坛。

于 2012-02-17T05:57:43.007 回答