Модераторы: javastic, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Графика Canvas и обработка клавишных событий 
:(
    Опции темы
bncom
  Дата 5.12.2009, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 2.11.2005

Репутация: нет
Всего: 1



Есть такое задание:

Цитата

Разработать мидлет,  рисующий на дисплее мобильного телефона объекты - дугу и картинку (имеется в виду вывод изображения из файла).

При движении объектов при достижении границы экрана объекты появляется с противоположной стороны экрана.

При однократном нажатии  на клавиши 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
--------------------
"Мы никогда не живем, мы лишь надеемся, что будем жить." Вольтер 
PM MAIL   Вверх
math64
Дата 7.12.2009, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



В обработчике keypressed() нельзя делать цикл - можно установить флажок moveArc или moveImg и двигать в run().
В paint() рисовать оба объекта - дугу и картинку, класс extends Canvas должен быть один.
Можно использовать GameCanvas и спрайты.
Для дуги и картинки можно создать отдельные классы, но они будут не канва, а спрайты.
PM   Вверх
bncom
Дата 7.12.2009, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 2.11.2005

Репутация: нет
Всего: 1



Цитата(math64 @  7.12.2009,  09:01 Найти цитируемый пост)
можно установить флажок moveArc или moveImg и двигать в run().
что за флажки такие? И как это должно быть реализовано? Было бы неплохо на примере...

--------------------
"Мы никогда не живем, мы лишь надеемся, что будем жить." Вольтер 
PM MAIL   Вверх
eugine_s
Дата 7.12.2009, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 14.11.2007
Где: Киев

Репутация: 17
Всего: 17



Цитата(bncom @  7.12.2009,  17:32 Найти цитируемый пост)
что за флажки такие?

Что-нибудь типа вот такого:
Код

void run() {

while(running) {

if (moveArc) {
//двигай дугу
// xa = xa + dx; (например)
}

if (moveImg) {
//двигай картинку
// xi = xi + dx;
}

}

void keyPressed(int keyCode) {

// тут, в зависимости от нажатой кнопки изменяешь значения moveArc, moveImg

}

}

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

  • FAQ раздела лежит здесь!
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java ME (J2ME) | Следующая тема »


 




[ Время генерации скрипта: 0.0758 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.