Есть такое задание:| Цитата |
Разработать мидлет, рисующий на дисплее мобильного телефона объекты - дугу и картинку (имеется в виду вывод изображения из файла).
При движении объектов при достижении границы экрана объекты появляется с противоположной стороны экрана.
При однократном нажатии на клавиши 1 и 3, объекты должны двигаться вправо. При повторном нажатии на клавиши 1 и 3 объекты останавливаются.
При однократном нажатии на клавишу 6 объект дуга должен изменить цвет, при повторном нажатии цвет объекта должен восстановиться.
При однократном нажатии на клавишу RIGHT информация об объекте "изображение" должна выводиться в верхней строке экрана, при повторном нажатии – в нижней.
Для работы с объектами создать отдельный поток.
|
У меня проблемы начались при обработки событий. Но для начала покажу, что имеется:
Main.java
| Код |
package lab1; import javax.microedition.lcdui.*; import javax.microedition.midlet.*;
public class Main extends MIDlet implements CommandListener { private Command exitMidlet = new Command ("Выход", Command.EXIT, 0); public DrawImg di;
public void startApp() { di = new DrawImg(); di.start(); di.addCommand(exitMidlet); di.setCommandListener(this); Display.getDisplay(this).setCurrent(di); }
public void pauseApp() {} public void destroyApp(boolean unconditional) { di.stop(); } public void commandAction(Command c, Displayable d) { if (c == exitMidlet) { destroyApp(false); notifyDestroyed(); } } }
|
DrawArc.java
| Код |
package lab1; import javax.microedition.lcdui.*;
public class DrawArc extends Canvas implements Runnable { public boolean logic; public Graphics g; int positionXarc = 15; // координаты для дуги int positionYarc = 225; int endX = getWidth(); // ширина экрана эмулятора = 210
public DrawArc() { super(); }
public void start() { logic = true; // т.к. ДА, то запускаем цикл Thread t = new Thread(this); t.start(); }
public void stop() { logic = false; // остановка метода start }
public void run() { while (logic) // бесконечный цикл { if (positionXarc > endX) // если вышли за края экрана { positionXarc = 0; // обнуляем позицию объекта } positionXarc ++; // увеличиваем позицию на 1 repaint(); // обновляем экран try { Thread.sleep(20); } // останавливаем цикл на 20 мск catch (java.lang.InterruptedException ie) {} } }
public void paint(Graphics g) { int x = g.getClipWidth(); int y = g.getClipHeight(); g.setColor(0xffffff); // задаем белый цвет фона g.fillRect(0, 0, y, y); // назначаем перерисовку всему экрану g.setColor(0xff00ff); // задаем малиновый цвет для дуги g.drawArc(positionXarc,positionYarc,80,80,30,180); // рисуем контур дуги }
public void keyPressed(int keyCode) { switch(keyCode) { case Canvas.KEY_NUM1: // запускаем циклическое движение дуги break; case Canvas.KEY_NUM6: // при нажатии на кнопку 6 должен меняться цвет дуги на черный //g.setColor(0x000000); // задаем черный цвет для дуги break; default: break; } } public void keyRepeated(int keyCode) // нажали второй раз клавишу { switch(keyCode) { case Canvas.KEY_NUM1: // движение дуги останавливается break; case Canvas.KEY_NUM6: //при повторном нажатии на кнопку 6 цвет дуги должнен восстановится //g.setColor(0xff00ff); // задаем малиновый цвет для дуги break; //case Canvas.KEY_NUM6: //при повторном нажатии на кнопку 6 дуга должна возвратится на первоначальное место //g.drawArc(positionX,positionY,80,80,30,180); //break; default: break; } } }
|
DrawImg.java
| Код |
package lab1; import javax.microedition.lcdui.*;
public class DrawImg extends Canvas implements Runnable { public boolean logic; private Image image; int positionXimg = 160; // координаты для image int positionYimg = 160; int endX = getWidth(); // ширина экрана эмулятора = 210
public DrawImg() { try {image = Image.createImage("/img.png");} catch (java.io.IOException ioe) {System.out.println(ioe.getMessage());} }
public void start() { logic = true; // т.к. ДА, то запускаем цикл Thread t = new Thread(this); t.start(); }
public void stop() { logic = false; // остановка метода start }
public void run() { while (logic) // бесконечный цикл { if (positionXimg > endX) // если вышли за края экрана { positionXimg = 0; // обнуляем позицию объекта } repaint(); // обновляем экран try { Thread.sleep(20); } // останавливаем цикл на 20 мск catch (java.lang.InterruptedException ie) {} } }
public void paint(Graphics g) { int x = g.getClipWidth(); int y = g.getClipHeight(); g.setColor(0xffffff); // задаем белый цвет фона g.fillRect(0, 0, y, y); // назначаем перерисовку всему экрану g.drawImage(image, positionXimg, positionYimg, 0); }
public void keyPressed(int keyCode) // нажали первый раз клавишу { switch(keyCode) { case Canvas.KEY_NUM3: // запускаем циклическое движение image break; case Canvas.RIGHT: // вывод информации о координатах объекта image в верхней строке экрана break; default: break; } }
public void keyRepeated(int keyCode) // нажали второй раз клавишу { switch(keyCode) { case Canvas.KEY_NUM3: // движение объекта image останавливается break; case Canvas.RIGHT: // вывод информации о координатах объекта image в нижней строке экрана break; default: break; } } }
|
Теперь подробнее о том, что не получается:
1. у меня в двух классах описано создание объектов для вывода на экран дуги и изображения и обработчики клавиш. Как мне в классе Main заставить одновременно выводить на экран и дугу и изображение? Потому что, как у меня сейчас сделано, выводится либо то, либо это. Создать два потока, я так понимаю, не вариант, т.к. на экран все равно будет выведен один. Как вариант - создание объектов дуги и изображение запихнуть в одни класс, но это не красиво.
2. При нажатии на клавишу моб. телефона надо запускать цикл, который перемещает все время объект по экрану телефона. Но вот:
| Код |
public void keyPressed(int keyCode) // нажали первый раз клавишу { switch(keyCode) { case Canvas.KEY_NUM3: while (logic) // бесконечный цикл { if (positionXimg > endX) // если вышли за края экрана { positionXimg = 0; // обнуляем позицию объекта } repaint(); // обновляем экран try { Thread.sleep(20); } // останавливаем цикл на 20 мск catch (java.lang.InterruptedException ie) {} } break;
default: break; } }
|
не работает (это в том случае, что в методе Run ничего не прописано. А вот если вписать в Run этот цикл, то, понятно, что все заработает).
Соответственно, от моих недознаний, я не могу нормально обрабатывать и другие клавишы.
Я на 90% уверен, что вообще не так, как я начал делать, надо обрабатывать нажатие клавиш и производить необходимые действия над объектами при нажатии.
Подскажите, пожалуйста, как правильно сделать, чтобы заработало. Буду благодарен.
ЗЫ: матчать хромает из-за малой практики. Стараюсь осваивать материал на конкретных примерах.
Это сообщение отредактировал(а) bncom - 5.12.2009, 16:26