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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разворот картинки, Image.createImage() 
V
    Опции темы
eugine_s
Дата 1.6.2008, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



valerchi,  ты уж извини за прямоту, но этот код - ужасный.

Лучше отложи куда-нибудь подальше этот код и начни с "чистого листа".

Возьми какой-нибудь пример хороший.

Ошибки:
1. Никаких тяжелых действий в startApp(). Можно с этим много "горя" получить в будущем.
2.
Зачем 19-ть (или 18-ть) раз выполнять вот такое:
// получить ссылку на менеджер дисплея
    d = Display.getDisplay(this);
// создать объект графика
    Ggraph graph = new Ggraph();

3.  Зачем:
    // вывести график на экран
    d.setCurrent(graph);

достаточно один раз сделать такое, а потом graph.repaint(); (возможно graph.serviceRepaint() перед repaint() вызвать)

4. g.fillRect(255, 255, 255, 255); - это какой ты прямоугольник зарисовываешь?

5. (Основное) Где картинки загруженные в массив? Они ведь в у тебя опять перед отрисовкой загружаются.




PM MAIL   Вверх
eugine_s
Дата 1.6.2008, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Почитай вот тут много полезный статей про j2me

По твоему вопросу там есть     *  Пишем игру для телефона. (Части 1 - 6)


PM MAIL   Вверх
valerchi
Дата 6.6.2008, 01:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Спасибо, вроде всё нормально.
Смотри, что у меня получилось. И самое главное - работает на эмуляторе и на телефоне.
Теперь, хотелось бы добавить команду "Back", чтобы программу можнобыло "запустить в обратную сторону".  Как это можно сделать?


Код

import javax.microedition.lcdui.*;
import javax.microedition.midlet.MIDlet;
import java.io.IOException;
public class Glaz extends MIDlet {
public Display d;
private int x=0;
private int y;
private Image mas[];  
public void destroyApp(boolean destroy){notifyDestroyed();}
public void pauseApp() {}
public void startApp() {
mas = new Image[15];
try {    
     for (x = 0; x < 15; x++) {
          mas[x] = Image.createImage("/" + Integer.toString(x+1) + ".png");
     }}
     catch (IOException ioe) {
    }
// получить ссылку на менеджер дисплея
    d = Display.getDisplay(this);
// создать объект графика
    Ggraph graph = new Ggraph();
x=0;
// вывести график на экран
    d.setCurrent(graph);
for (x=-1; x<14; ++x)
{
y=1;
while(y>0){
y++;
if (y==400000)y=-1 ;}
graph.repaint(); 
}
}
private class Ggraph extends Canvas {
public void paint(Graphics g) {
// Очистить экран (закрасить белым).
g.setColor(0xffffff);
g.fillRect(0, 0, 255, 255);
 g.drawImage(mas[x], 90, 100, g.HCENTER | g.VCENTER);
}}}

PM MAIL   Вверх
Dummy
Дата 6.6.2008, 01:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

g.fillRect(0, 0, 255, 255);


стоит заменить на

Код

g.fillRect(0, 0, getWidth(), getHeight());


Цитата(valerchi @  6.6.2008,  01:22 Найти цитируемый пост)
Теперь, хотелось бы добавить команду "Back", чтобы программу можнобыло "запустить в обратную сторону"

Это что - картинки, что ли, в обратном направлении пролистывать?

PM MAIL   Вверх
eugine_s
Дата 6.6.2008, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(valerchi @  6.6.2008,  01:22 Найти цитируемый пост)
Спасибо, вроде всё нормально.

Все равно в startApp куча всего осталось - плохая манера.

Вот, переделал немного + добавил в два направления анимация

Код


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

public class Glaz extends MIDlet {

    public Display d;
    private Ggraph graph;
    public static Glaz _midlet;

    public void destroyApp(boolean destroy) {
        notifyDestroyed();
    }

    public void pauseApp() {
    }

    public void startApp() {
        graph = new Ggraph();
        graph.start();
        d = Display.getDisplay(this);
        d.setCurrent(graph);
        _midlet = this;
    }

    private class Ggraph extends Canvas implements Runnable, CommandListener {

        private int currentImage = 0; //текущий кадр анимации
        private Image mas[];
        private final int IMAGE_COUNT = 15; //всего кадров анимации
        private boolean running; 
        private Command changeCommand, exitCommand;
        private boolean animationNormal; // флаг - направления анимации.
        private long timer;
        private final int timeShowImage = 200; //время отображения каждого кадра в милисекундах.

        public Ggraph() {
            changeCommand = new Command("Change", Command.OK, 0);
            exitCommand = new Command("Exit", Command.EXIT, 1);
            addCommand(changeCommand);
            addCommand(exitCommand);
            setCommandListener(this);


            mas = new Image[IMAGE_COUNT];
            try {
                for (int i = 0; i < IMAGE_COUNT; i++) {
                    mas[i] = Image.createImage("/" + Integer.toString(i + 1) + ".png");
                }
            } catch (IOException ioe) {
                System.out.println("Error loadint image: " + ioe);
            }
            animationNormal = true;
        }

        public void start() {
            running = true;
            if (animationNormal) {
                currentImage = 0;
            } else {
                currentImage = IMAGE_COUNT - 1;
            }
            Thread t = new Thread(this);
            t.start();
        }

        public void stop() {
            running = false;
        }

        public void run() {
            timer = System.currentTimeMillis();
            while (running) {
                if (System.currentTimeMillis() - timer > timeShowImage) {
                    if (animationNormal) {
                        currentImage++;
                        if (currentImage >= IMAGE_COUNT) {
                            currentImage = 0;
                        }
                    } else {
                        currentImage--;
                        if (currentImage < 0) {
                            currentImage = IMAGE_COUNT - 1;
                        }
                    }
                    timer = System.currentTimeMillis();
                    repaint();
                    System.out.println("currentImage = " + currentImage);
                }
            }
        }

        public void paint(Graphics g) {
            g.setColor(0xffffff);
            g.fillRect(0, 0, getWidth(), getHeight());
            if (mas[currentImage] != null) {
                g.drawImage(mas[currentImage], 90, 100, g.HCENTER | g.VCENTER);
            }
        }

        public void commandAction(Command c, Displayable d) {
            if (c == changeCommand) {
                animationNormal = !animationNormal;
            } else if (c == exitCommand) {
                stop();
                _midlet.destroyApp(true);
            }
        }
    }
}




PM MAIL   Вверх
Dummy
Дата 6.6.2008, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



По большому счету, подход с вычитыванием картинок в конструкторе вряд ли лучше.

Тяжеловесность startApp() крайне нежелательна, согласен, т. к. при долгом startApp() у AMS элементарно может возникнуть желание прибить повисший (по ее мнению) в функции-триггере мидлет. Но. В случае, если мы в startApp() схлопочем RuntimeException, по крайней мере будет вызван destroyApp() для нашего мидлета, так что мы сможем обработать эту ситуацию. Скорее всего, смерть мидлета предотвратить мы не сможем (MIDP гласит, что в таком случае мидлет должен быть терминирован). Но, как минимум, закроем ту часть ресурсов, которую мы успешно захватили до получения Exception в startApp(), и  покажем предсмертное сообщение пользователю .

В случае же, когда мы получаем проблемы в конструкторе, обработка исключительной ситуации целиком отдается на откуп AMS. Она, конечно, может покажет более-менее содержательное сообщение, в конечном итоге даже освободит ресурсы, захваченные нами и не освобожденные. Но ситуация получится намного более брутальная и рискованная.

В этом примере такого не получится - просто стартуем без картинок (что само по себе не очень хорошо, но для такого быстрого примера вполне нормально). Но в общем случае - сами понимаете...

Поэтому, видимо, лучшим решением будет запуск в startApp() отдельного потока приложения, внутри которого будут и картинки из джара выниматься, и все отрисовки вызываться.
PM MAIL   Вверх
valerchi
Дата 7.6.2008, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Дело в том, что ты меня не совсем понял. Я хотел сделать так, чтобы нажал кнопку - глаз открылся, и так открытым остался. Потом нажал другую кнопку, - программа пошла в другую сторону, то есть глаз закрылся, а у тебя получается бесконечный цикл, - тое сть глаз всё время моргает.
PM MAIL   Вверх
eugine_s
Дата 8.6.2008, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Дело в том, что:
1. Из того что ты написал было не понятно что ты хотел получить

2. Из того что я написал, очень просто получается, то что тебе нужно, нужно то изменить 3-4 строчки кода.

Вот это 
Код

                  if (animationNormal) {
                        currentImage++;
                        if (currentImage >= IMAGE_COUNT) {
                            currentImage = 0;
                        }
                    } else {
                        currentImage--;
                        if (currentImage < 0) {
                            currentImage = IMAGE_COUNT - 1;
                        }
                    }


Изменить на вот это:

Код

                  if (animationNormal) {
                        currentImage++;
                        if (currentImage >= IMAGE_COUNT) {
                            currentImage = IMAGE_COUNT - 1;
                        }
                    } else {
                        currentImage--;
                        if (currentImage < 0) {
                            currentImage =0;
                        }
                    }


Т.е. изменения заключаются только в том, чтобы не начинать цикл анимации с самого начала (конца).

Конечно, можно улучшить программу: какие-то флаги выставлять, чтобы анимацию не выполняло, чтобы лучше работало.... но уже можешь сам над улучшениями поработать.

Да, кстати, то что написал Dummy по поводу инициализации картинок НЕ в конструкторе - правильное и если бы я писал для себя, то так и сделал бы (+ возможно добавил бы метод, который освобождал все эти ресурсы).
PM MAIL   Вверх
valerchi
Дата 12.6.2008, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Большое спасибо. Всё работает. 
А можно добавить какую-то надпись вверху, типа бегущей строки? Или сюда невозможно добавить?
PM MAIL   Вверх
valerchi
Дата 12.6.2008, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Вообще, посоветуйте какую- нибудь литературу по j2me программированию.
Я пользуюсь самоучителем Буткевича.
PM MAIL   Вверх
Dummy
Дата 12.6.2008, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

А можно добавить какую-то надпись вверху, типа бегущей строки? Или сюда невозможно добавить? 


См. документацию по Displayable.setTicker(). Ticker - это и есть бегущая строка. Уж не знаю, где она появится - сверху или снизу, - зависит от реализации. В принципе, если надо строго вверху, свою реализацию написать тоже не сложно. По аналогии с анимацией злосчастного глаза)))
PM MAIL   Вверх
valerchi
Дата 13.6.2008, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Сделал так. На эмуляторе строка идёт, а на телефоне - нет.
Телефон у меня SonyEricsson w810i.
Вчём может быть проблемма?


Код

....
private String str = "бегущая строка"; 
private Ticker ticker = new Ticker(str); 


        public Ggraph() {



setTicker(ticker) ; setCommandListener(this); 

......

PM MAIL   Вверх
valerchi
Дата 14.6.2008, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Шустрый, объясни в чём причина?
Бегущая строка на эмуляторе идёт, а на телефоне - нет.
PM MAIL   Вверх
valerchi
Дата 16.6.2008, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Загрузил этот код в SonyEricsson K790i, там бегущая строка видна. И получилась другая проблемма:
картинка уменьшилась и показывается не в середине экрана, а в левом верхнем углу. 
Не знаете, в чём может быть проблемма?
Как её показать на всех телефонах по середине и не меняя размера? 
PM MAIL   Вверх
eugine_s
Дата 16.6.2008, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(valerchi @  16.6.2008,  17:19 Найти цитируемый пост)
Как её показать на всех телефонах по середине и не меняя размера?  


Вместо Form использовать Canvas.

В 99,999% проектов, если есть анимация то будет использовать Canvas для ее отображения 

PM MAIL   Вверх
Страницы: (5) Все 1 2 [3] 4 5 
Ответ в темуСоздание новой темы Создание опроса

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

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


 




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


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

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