forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   JAVA Micro Edition (http://forum.boolean.name/forumdisplay.php?f=52)
-   -   Помогите переназначить обработчик событий другому классу (http://forum.boolean.name/showthread.php?t=15158)

SoboLEFF 20.07.2011 21:40

Помогите переназначить обработчик событий другому классу
 
Подскажите как переназначить обработчик событий (.setCommandListener) с класса "a" на класс "b" нажатием на клавишу FIRE (в коде класса "a" обозначена как /* ??? */).

Мейн класс BC:

Код:

import java.io.IOException;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;

public class BC extends MIDlet implements CommandListener{

    Command okCMD = new Command("Выбор", Command.EXIT, 0);
    Command exitCMD = new Command("Выход", Command.EXIT, 9);
    a beginGameMenu;
    b Game;
    static Display disp;
    static Image begin;
    static Image tank0green;
    static Image tank0yellow;

    public void startApp() {
        try {
            begin = Image.createImage("/img/begin.png");
            tank0yellow = Image.createImage("/img/tank0yellow.png");
            tank0green = Image.createImage("/img/tank0green.png");
        } catch (IOException ex) {}
        beginGameMenu = new a();
        Game = new b();
        beginGameMenu.start();
        Game.start();
        beginGameMenu.addCommand(exitCMD);
        beginGameMenu.setCommandListener(this);
        disp = Display.getDisplay(this);
        disp.setCurrent(beginGameMenu);
    }

    public void pauseApp() {}

    public void destroyApp(boolean unconditional) {
        if(beginGameMenu != null) beginGameMenu.stop();
        if(Game != null) Game.stop();
        begin = null;
        tank0green = null;
        tank0yellow = null;
    }

    public void commandAction(Command command, Displayable displayable) {     
        if(command == exitCMD)
        {
            destroyApp(false);
            notifyDestroyed();
        }
    }
}

Класс "a":

Код:

import javax.microedition.lcdui.*;

public class a extends Canvas implements Runnable {

    boolean exit;
    int beginImagePos;
    int cycle;
    int menuPos;
    int yImageMenuPos;
    int yImageMenuPosBack;
    int key;

    public a(){
        super();
    }

    public void start() {
        Thread thread = new Thread(this);
        thread.start();
        exit = true;
        beginImagePos = 224;
        cycle = 0;
        menuPos = 1;
    }

    public void stop() {
        exit = false;
    }

    public void run() {
        while(exit){
            if(beginImagePos >= 0) {beginImagePos = beginImagePos - 2;}
            cycle();
            menuPos();
            repaint();
            try {
                Thread.sleep(50);
            } catch (InterruptedException ex) {}
        }
    }

    public void paint(Graphics graph) {
        graph.setClip(0, 0, 255, 223);
        if(beginImagePos >= 0) {graph.drawImage(BC.begin, 0, beginImagePos, 0);}
        else {
            graph.setColor(0, 0, 0);
            graph.fillRect(65, yImageMenuPosBack, 13, 13);
            graph.drawImage(Image.createImage(BC.tank0yellow, cycle, 13, 13, 13, 0),
                    65, yImageMenuPos, 0);
        }
    }

    public void keyPressed(int keyCode) {
        key = getGameAction(keyCode);
        if (beginImagePos < 0) {
            switch (key) {
                case Canvas.UP:
                    if(menuPos > 1) {--menuPos;}
                    else {menuPos = 3;}
                    break;
                case Canvas.DOWN:
                    if(menuPos < 3) {++menuPos;}
                    else {menuPos = 1;}
                    break;
                case Canvas.FIRE:
                    /* ??? */
                    break;
            }
        }else {if (key != 0) {beginImagePos = 2;}}
    }

    private void cycle() {
        if (cycle == 0) {cycle = 13;}
        else {cycle = 0;}
    }

    private void menuPos() {
        if (menuPos == 1) {yImageMenuPosBack = yImageMenuPos; yImageMenuPos = 124;}
        if (menuPos == 2) {yImageMenuPosBack = yImageMenuPos; yImageMenuPos = 140;}
        if (menuPos == 3) {yImageMenuPosBack = yImageMenuPos; yImageMenuPos = 156;}
    }
}

Класс "b":

Код:

import javax.microedition.lcdui.*;

public class b extends Canvas implements Runnable{

    boolean exit;

    public b() {super();}

    public void start() {
        Thread thread = new Thread(this);
        thread.start();
        exit = true;
    }

    public void stop() {exit = false;}

    public void run() {
        while(exit) {
            repaint();
            try {
                Thread.sleep(50);
            } catch (InterruptedException ex) {}
        }
    }

    public void paint(Graphics graph) {}

    public void keyPressed(int keyCode) {}
}


Жека 21.07.2011 07:09

Ответ: Помогите переназначить обработчик событий другому классу
 
Это учебный пример в целях тренировки или для практических целей надо? Ты скажи что хочешь получить, а то сдаётся мне что можно иначе получить результат.:)

SoboLEFF 21.07.2011 08:35

Ответ: Помогите переназначить обработчик событий другому классу
 
Эм... Я пытаюсь научиться программировать на java ME. А не понятно мне вот что, в классе ВС обработчик комманд назначил на класс а (beginGameMenu.setCommandListener(this); ), а из него на прямую назначить обработчик на класс b не получается. Знаю способ переключения через комманду (Command okCmd), но это не то, хотелось бы через нажатие клавиши FIRE (Canvas.FIRE)

SoboLEFF 21.07.2011 09:02

Ответ: Помогите переназначить обработчик событий другому классу
 
Проще говоря, надо чтобы при нажатии на центр джойстика переключался экран с одого канваса класса а на канвас класса b. Как переключить экран я знаю:

Класс ВС:

Код:

...
static a beginGameMenu;
static b Game;
...

Класс а:

Код:

...
case Canvas.FERE:
    BC.disp.setCurrent(BC.Game);
    break;
...

но на комманды он не хочет реагировать.

SoboLEFF 21.07.2011 09:17

Ответ: Помогите переназначить обработчик событий другому классу
 
ОМГ, меня осенило. Скадите, можно ли сразу назначить обработчик комманд нескольким классам вот так:

Код:

...
beginGameMenu.setCommandListener(this);
Game.setCommandListener(this);
...


Жека 21.07.2011 14:30

Ответ: Помогите переназначить обработчик событий другому классу
 
Можно нескольким (попробуй). Имена классов а и b - изврат! Как будто декомпиленный код у тебя. Делать отдельные канвасы для менюшек - тоже изврат!:)
Можно обойтись одним канвасом, но рисовать разное в зависимости от состояния.
Код:

private static final int STATE_GAME = 1;
private static final int STATE_MENU_MAIN = 2;
....
private static int state = STATE_GAME;
....
//----------------------
//в функции paint()
select(state) {
  case STATE_GAME:
    drawGame(g);
    break;
  case STATE_MENU_MAIN:
    drawMenuMain(g);
    break;
  ............
}



Часовой пояс GMT +4, время: 15:39.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot