ГлавнаяРегистрацияСтатистикаФорум
Навигация
Вход на сайт
Логин
Пароль
 
Фразы
skripach
Dj, Gamer, Беларусь, Свислочь

Компьютер создан в помощь человеку, а не человек в помощь компьютеру!



Наши проекты
project5
project5


Опрос на сайте

Age Of Empires 3
Larry: Love For Sail
Shadowalker
Lost Planet: Trag Zero
UFO: Aftershock
Sims 2: Castaway
Spiderwick
Nowhere


Популярные статьи
» High Speed 3D (от Apetrus) - Информация по игре
» Поздравляем )rayman('а с 16-летием!
» Postal (от Ministry of Fun)
» 3D Спецназ: Операция «Арктика» (от NET Lizard)
» Need for Speed: Undercover (от Electronic Arts)
» Galaxy On Fire 2 – Весь фото/видео материал по и ...
» Chronicles of Inotia: Legend of Feanor (для iPhone)
» Zombie Infection (от Gameloft) - Трейлер (35,7mb)
» С Наступающим Новым Годом!
» Zen Pinball: Inferno (от ZEN Studios) [iPhone]

Архив новостей
Январь 2009 (6)
Декабрь 2008 (35)
Ноябрь 2008 (69)
Октябрь 2008 (36)
Сентябрь 2008 (33)
Август 2008 (30)
Июль 2008 (37)
Июнь 2008 (50)
Май 2008 (37)
Апрель 2008 (42)
Март 2008 (49)
Февраль 2008 (41)
Январь 2008 (31)
Декабрь 2007 (39)
Ноябрь 2007 (25)
Октябрь 2007 (32)
Сентябрь 2007 (31)
Август 2007 (18)

Статистика

Главная страница » Статьи » Программирование » Реализация графического меню. Часть 1 (Программирование на J2me)
Реализация графического меню. Часть 1 (Программирование на J2me) Статьи » Программирование
В прошлом подавляющее большинство игр для телефонов использовали меню на основе форм - базового интерфейса телефона. Эти "менюшки" смотрелись убого и явно выбивались из игрового дизайна. Сейчас требования к играм существенно возросли, и пользователи требуют интересных графических решений. В этой статье я хочу рассказать, как можно реализовать графическое меню на основе Сanvas.

Класс Canvas является абстрактным. Чтобы его использовать, вы должны организовать его подклассы. Ваш конкретный подкласс описывает новый компонент с поведением по обработке команд и событий и с помощью класса Graphics определяет свой собственный внешний вид.

Для начала давайте посмотрим как выглядит типичный Canvas:


import javax.microedition.lcdui.*;

public class MyCanvas extends Canvas implements Runnable {

private static boolean running;

public MyCanvas() { // Конструктор
}

public void run(){
     try {
       while (running) {
        //Главный игровой цикл
       }
     }
     catch(InterruptedException ie) { System.out.println(ie.toString()); }
}
protected void paint(Graphics g){ /* code */ }

synchronized void start() {
    running = true;
}

synchronized void stop() {
    running = false;
}

public void keyPressed(int keyCode) { /* code */ }

}


Создадим класс GMenu. Он осуществляет все те же функции, что и приведенный выше код.


import javax.microedition.lcdui.*;

public class GMenu extends Canvas implements Runnable {

    private static boolean running;

    /* Меню */
    private String mString[] = {
        "Новая игра","Опции", "Авторы", "Выход"};

    private int xPos; // X координата пункта меню
    private int yPos; // Y координата пункта меню
    private int widthMenu; // Ширина пункта меню
    private int heightMenu; // Высота пункта меню
    private int spaceMenu; // Расстояние между пунктами меню
    private int index; // Индекс текущего пункта меню

    /* Экран */
    private int width; // Ширина экрана
    private int height; // Высота экрана

public GMenu() {
/*
Без вызова super() ваши экземпляры
Canvas не смогут действовать как настоящие Canvas. Они не будут
отображаться правильно, они не будут отрисовываться должным образом и они
не смогут обрабатывать события.
*/
     super();

     /* Экран */
     width = getWidth(); //Определяем ширину экрана
     height = getHeight(); //Определяем высоту экрана

     /* Меню */
     spaceMenu = height/8; // Устанавливаем расстояние между пунктами меню (Ширина экрана / 8)

     xPos = width/2; // Устанавливаем Y координату пункта меню (Ширина экрана / 2)
     yPos = height/8; // Устанавливаем Y координату пункта меню (Ширина экрана / 8)

     widthMenu = 80;  //Устанавливаем ширину пункта меню
     heightMenu = 20; //Устанавливаем высоту пункта меню

     index = 0;
}

public void run(){
     try {
       while (running) {
        Thread.sleep(20L);
       }
     }
     catch(InterruptedException ie) { System.out.println(ie.toString()); }
}

protected void paint(Graphics g){
      g.setColor(255, 255, 255); // Задаем цвет (Белый)
      g.fillRect(0, 0, getWidth(), getHeight()); // Очистка экрана

      g.setColor(0, 0, 0); //Задаем цвет (Черный)

      for(int i=0; i<mString.length; i++){ // Рисуем все пункты меню
            g.drawRect(xPos - widthMenu/2, yPos + spaceMenu * i, widthMenu, heightMenu);
      g.drawString(mString[i], xPos, yPos + spaceMenu * i, g.TOP | g.HCENTER);
      }

      g.setColor(255, 0, 0); // Задаем цвет (Красный)
      g.drawRect(xPos - widthMenu/2, yPos + spaceMenu * index, widthMenu, heightMenu); // Рисуем прямоугольник
    
      repaint(); //Перерисовываем изменения
}

synchronized void start() {
    running = true;
    Thread thread = new Thread(this); //Создаем новый поток
        thread.start();
}

synchronized void stop() {
    running = false;
}

public void keyPressed(int KeyCode) {
      switch(KeyCode){
       case -2: // Вверх (Up)
          if(index < mString.length - 1)
            index++;
          break;

       case -1: // Вниз (Down)
              if(index > 0)
            index--;
          break;

       case -5: // Огонь (Fire)
          //
          break;
          
      }

}

}


В следующих статьях мы реализуем поддержку изображений и дополним функциональность нашего меню.

Скачать исходный код к статье (WTK) Вы не можете скачивать файлы с нашего сервера
 
Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь. Мы рекомендуем Вам зарегистрироваться либо зайти на сайт под своим именем.

Другие новости по теме:

  • Отображаем картинку (Программирование на J2me)
  • Взлом Tanks Mobile
  • Hello, World! (Программирование на J2me)
  • EvilTale Mobile MMORPG от TimeZero
  • С чего начать? (Программирование на J2me)


  • #1 написал: UbeiBobra (20 января 2008 12:34)
    Хм.... а почему вы не выложили код Menu.java? Приходится качать проэкт и тупо компилить его... Кому это нужно??


    ___________________________
    #2 написал: SlaDER (22 января 2008 13:05)
    Думаю, если человек "дорос до Canvas", то он знает основы J2me. Кроме того в самых первых статьях все описано. Исходник выложен для тех кому не хочется разбираться в коде и он хочет увидеть сразу результат.


    ___________________________
    Юзербар (userbar)
    #3 написал: UbeiBobra (22 января 2008 16:19)
    Вот ЭТО можно было всунуть в статью?
    import javax.microedition.midlet.*;
    import javax.microedition.lcdui.*;

    public class Menu extends MIDlet implements CommandListener
    {
    // ----------------------------------------------------------------
    Command e = new Command("Выход", Command.EXIT, 0);
    public GMenu gm;
    // ----------------------------------------------------------------
    public void startApp(){
    try{
    gm = new GMenu();
    gm.start();
    gm.addCommand(e);
    gm.setCommandListener(this);
    Display.getDisplay(this).setCurrent(gm);
    }catch(Exception ex){}
    }
    // ----------------------------------------------------------------
    public void pauseApp() {}
    // ----------------------------------------------------------------
    public void destroyApp(boolean unconditional) {
    if(gm!=null) gm.stop();}
    // ----------------------------------------------------------------
    public void commandAction(Command c, Displayable d)
    {
    if(c==e)
    {
    destroyApp(false);
    notifyDestroyed();
    }
    }
    // ----------------------------------------------------------------
    }


    ___________________________
    #4 написал: W0LF (28 января 2008 10:42)
    Что это за рекурсивный метод paint?? зачем так делать?

    Учитывая то, что это всего-лишь меню - я бы отрисовывал экран только после изменения какого-то в меню. зачем все время впустую ганять перерисовку?


    ___________________________
    #5 написал: SlaDER (28 января 2008 10:49)
    WOLF это просто пример, что такое Canvas и для чего его можно использовать. А меню это просто пример. Да я с тобой согласен, что можно сделать перерисовку экрана в данном случаи при нажатии на кнопки.


    ___________________________
    Юзербар (userbar)
    #6 написал: протим (1 марта 2008 20:31)
    от SlaDER еще раз такую чушь увижу и в бан.


    ___________________________
    #7 написал: Джакс (27 марта 2008 18:36)
    А продолжение када? lol Требую продолжения!!! bully


    ___________________________
    Юзербар (userbar)
    #8 написал: SlaDER (28 марта 2008 12:35)
    Будет щас время есть, буду дописывать продолжение.


    ___________________________
    Юзербар (userbar)
    Информация
    Посетители, находящиеся в группе Гости, не могут оставлять комментарии в данной новости.
    Главная страница | Регистрация | Добавить новость | Новое на сайте | Статистика | Форум Copyright © 2007 - 2008. Alibom.net All Rights Reserved | Дизайнер: SlaDER