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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Урок по созданию графического меню 
:(
    Опции темы
Samuil
  Дата 16.7.2006, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


в(Job)ываю
**


Профиль
Группа: Участник
Сообщений: 705
Регистрация: 26.4.2006
Где: Uzbekistan.Tashke nt

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



Hi All!!!
Многие сталкиваются при написании игр на проблемму с меню(решенить эту проблемму можно решить двумя способами: 1)Создание с помощью высокоуровнего интерфейса 2)Создание с помощью низкоуровнего интерфейса).

Вот решил написать урок по созданию графического меню с помощью класса низкоуровнего интерфейса.
В коде выложенны два класса Menu (MIDlet) и класс mendraw (Canvas), В классе mendraw в методе paint() , рисуется 3 прямоуголика, когда переменная индекс равна номеру прямоугольника то прямоугольник заливается указанным цветом! А вот и код:

Код

import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;

public class Menu extends MIDlet {

  private Display display;
  mendraw m = new mendraw(); //Создание подкласса mendraw
  int index = 1; // Индекс выделенной кнопочки
  int heightScreen, widthScreen; // Берут разрешение экрана
  int xPosition = 50; // Позиция "x" рисования меню
  int yPosition = 30; // Позиция "y" рисования меню

  public void startApp() {
    display = Display.getDisplay(this);
    display.setCurrent(m); // Сразу после загрузки мидлета переходит на класс mendraw
  }

  public void pauseApp() {}

  public void destroyApp(boolean _boolean) {}

  class mendraw extends Canvas { //Вот и сам класс mendraw

    public void paint(Graphics g) {
      heightScreen = g.getClipHeight(); //Определяем высоту окна
      widthScreen = g.getClipWidth(); //Определяем ширину окна

      g.setColor(255, 255, 255); // Задаем цвет прямоугольника
      g.fillRect(0, 0, 300, 300); //Заливаем прямоугольник

      g.setColor(0, 0, 0); //Задаем цвет прямоугольников меню
      g.drawRect(20, yPosition, 60, 20); // Рисуем первое меню
      g.drawRect(20, yPosition + 30, 60, 20); //Рисуем второе меню
      g.drawRect(20, yPosition + 60, 60, 20); //Рисуем третье меню

      g.setColor(0, 0, 0);
      g.drawString("Menu", xPosition, yPosition + 2, g.TOP | g.HCENTER); // Рисуем первую строку меню
      g.drawString("Menu", xPosition, yPosition + 30 + 2, g.TOP | g.HCENTER); // Рисуем второю строку меню
      g.drawString("Menu", xPosition, yPosition + 60 + 2, g.TOP | g.HCENTER); // Рисуем третью строку меню

      if (index == 1) { // Если индекс равен 1
        g.setColor(0, 0, 100);
        g.fillRect(20, yPosition, 60, 20); //Заливаем прямоугольник №1
        g.setColor(255, 255, 255);
        g.drawString("Menu", xPosition, yPosition, g.TOP | g.HCENTER); // Рисуем первую строку меню
      }
      if (index == 2) { // Если индекс равен 2
        g.setColor(0, 0, 100);
        g.fillRect(20, yPosition + 30, 60, 20); //Заливаем прямоугольник№2
        g.setColor(255, 255, 255);
        g.drawString("Menu", xPosition, yPosition + 30, g.TOP | g.HCENTER); // Рисуем первую строку меню
      }

      if (index == 3) { // Если индекс равен 3
        g.setColor(0, 0, 100);
        g.fillRect(20, yPosition + 60, 60, 20); //Заливаем прямоугольник №3
        g.setColor(255, 255, 255);
        g.drawString("Menu", xPosition, yPosition + 60, g.TOP | g.HCENTER); // Рисуем первую строку меню

      }
    }

    public void keyPressed(int KeyCode) {
      int press = KeyCode; //Заносим в переменную код нажатой кнопки

      if (press == -5) { //Усли нажата кнопка OK
        System.out.println("Вы нажали на кнопочку: " + index);
      }

      if (press == -2) { //Усли нажата кнопка DOWN
        if (index > 2) {
          index = 1;
        }
        else {
          index++; // Перемещаем прямоугольники вниз
        }
        repaint(); //Прорисовываем изменения
      }
      if (press == -1) { //Усли нажата кнопка UP
        if (index < 2) {
          index = 3;
        }
        else {
          index--; // Перемещаем прямоугольники вверх
        }
        repaint(); //Прорисовываем изменения
      }
    }
  }
}

Вместо прямоугольников Вы можете всавлять свои картинки, рисовать овалы, строки и многое другое! Все зависит от Вашего воображения!
Оцените пожалуйста урок.

 


--------------------
Выбор уже сделан, остается его только осознать   
smile    smile 
      smile  

user posted image
PM MAIL ICQ   Вверх
BackUp
Дата 16.7.2006, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Привет, интересная темка, а пример  с картинками можешь дать? 
PM MAIL   Вверх
Samuil
Дата 16.7.2006, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


в(Job)ываю
**


Профиль
Группа: Участник
Сообщений: 705
Регистрация: 26.4.2006
Где: Uzbekistan.Tashke nt

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



Да просто пишешь: 
try{
Image img=Image.createImage("...");
}catch(IOException e){}

public void paint(Graphics g){
g.drawImage(img,x,y,0);
}
И все! Вот у тебя картинка! правда надо в методе KeyPressed() указать про прорисовку рисунка! 


--------------------
Выбор уже сделан, остается его только осознать   
smile    smile 
      smile  

user posted image
PM MAIL ICQ   Вверх
Samuil
Дата 16.7.2006, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


в(Job)ываю
**


Профиль
Группа: Участник
Сообщений: 705
Регистрация: 26.4.2006
Где: Uzbekistan.Tashke nt

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



BackUp, А тема то как? Понравилась? 


--------------------
Выбор уже сделан, остается его только осознать   
smile    smile 
      smile  

user posted image
PM MAIL ICQ   Вверх
Zamuta
Дата 18.7.2006, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Юзайте J2MEPolish, реально красивого меню с нуля тяжело написать, хотя никто не запрещает. Сам давно пользуюсь J2MEPolish очень нравится........советую..... Давно пора развивать эту тему........ 


--------------------
Thank you opensource.
PM MAIL ICQ   Вверх
W0LF
Дата 18.7.2006, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

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



А разве он не платный? бесплатный он только для freeware... 


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
Samuil
Дата 18.7.2006, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


в(Job)ываю
**


Профиль
Группа: Участник
Сообщений: 705
Регистрация: 26.4.2006
Где: Uzbekistan.Tashke nt

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



Привет! Ну я всего лишь примерчик привел как легко создать графическое меню, а все остальное зависит от вашего воображения! smile  Так что можете дополнять и улучшать smile  


--------------------
Выбор уже сделан, остается его только осознать   
smile    smile 
      smile  

user posted image
PM MAIL ICQ   Вверх
02077461
Дата 26.7.2006, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Тема интересная, но реализация, откровенно, слабая.
Меню не гибкое, объект не инкапсулирован. А что делать, если тебе надо в RunTime изменить меню?. 
Понятно, что это простой пример, однако он далеко не лучший. 
P.S. не мешало бы еще узнать о name conversion от разработчиков.  

Это сообщение отредактировал(а) 02077461 - 26.7.2006, 10:07
PM   Вверх
Samuil
Дата 26.7.2006, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


в(Job)ываю
**


Профиль
Группа: Участник
Сообщений: 705
Регистрация: 26.4.2006
Где: Uzbekistan.Tashke nt

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



02077461
Цитата

Тема интересная, но реализация, откровенно, слабая.

Но я и не пытался создать крутое меню с крутой реалицацие smile , Просто мне самому нужно было создать красивое меню и я решил что для начинающих это было бы интересно smile  


--------------------
Выбор уже сделан, остается его только осознать   
smile    smile 
      smile  

user posted image
PM MAIL ICQ   Вверх
02077461
Дата 26.7.2006, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Нет, как раз таки это не должно быть интересно. Думаю, что со мной согласяться, что лучше учиться на хороших примерах, нежели на быстрых реализациях.
Не претендую на хороший пример, однако хочу показать как я решал подобную задачу. Прошу не судить строго, это было давно, и подходил сгаряча, без этапа проектирования.
Код

package com.canvas.source.visiel.menu;

import java.util.Vector;

import javax.microedition.lcdui.Graphics;

import com.canvas.source.interfaces.GView;
import com.canvas.source.util.GRectangle;

public class GMenu extends GView implements GMenuListener, Runnable{
    private Vector items;
    private GMenuItem lastRes = null;
    private int currentIndex = 0;
    private Vector menuListener;
    private int itemCount = 0;
    
    private String title = "";
    
    private int bgColor = 0x00000000;
    private int fgColor = 0X00FFFFFF;
    
//     ***********************************************************************
    public GMenu(String title, int x1, int y1, int x2, int y2){
        super(x1,y1,x2,y2);
        this.title = title;
    }
//     ***********************************************************************
    public GMenu(String title){
        super();
        this.title = title;
    }
//     ***********************************************************************
    public GMenuItem createItem(String text, String command){
        GMenuItem item = new GMenuItem(text, command); 
        addItem(item);
        return item;
    }
//     ***********************************************************************
    public GMenuItem createItem(String text){
        GMenuItem item = new GMenuItem(text); 
        addItem(item);
        return item;
    }
//     ***********************************************************************
    protected void init(){
        super.init();
        menuListener = new Vector();
        items = new Vector();
    }
//     ***********************************************************************
    public void hideMenu(){
        setVisible(false);
    }
//     ***********************************************************************
    public void run(){
        // TODO to make it runnable to be able to scroll the titles;
        while (true)
            if (isVisible){
                // do something
            }
    }
//     ***********************************************************************
    public int showMenu(Graphics g, GRectangle r){
        setVisible(true);
        int c = g.getColor();
        g.setColor(bgColor);
        g.fillRect(r.getX(), r.getY(), r.getWidth() , itemCount*15 + 20);//r.getHeight());
        g.setColor(fgColor);
        GMenuItem item;
        GRectangle rect = new GRectangle(0,0,0,0);
        g.drawString(title, r.getX() + 10, r.getY(), 0);
        for (int i=0; i<itemCount; i++){
            item = (GMenuItem)items.elementAt(i);
            rect.set(r.getX()+3, r.getY()+17+i*15, r.getWidth()-6, 14);
            item.drawSelf(g,rect, i==currentIndex);
        }
        g.setColor(c);
        return items.indexOf(lastRes);
    }
//     ***********************************************************************
    public void paint(Graphics g, GRectangle r){
        showMenu(g, r);
    }
//     ***********************************************************************
    public int getChoise(){
        return items.indexOf(lastRes);
    }
//     ***********************************************************************
    public String getChoiseCommand(){
        if (lastRes == null) return "";
        return lastRes.getCommand();
    }
//     ***********************************************************************
    public void deleteItem(int n){
        items.removeElementAt(n);
        countItems();
    }
//     ***********************************************************************
    public void deleteItem(Object o){
        items.removeElement(o);
        countItems();
    }
//     ***********************************************************************
    public void addItem(GMenuItem i){
        items.addElement(i);
        countItems();
    }
//     ***********************************************************************
    private int countItems(){
        itemCount = items.size();
        return itemCount;
    }
//     ***********************************************************************
    public void down(){
        if (currentIndex<itemCount-1) currentIndex++;
        else currentIndex = 0;
        fireMenuListeners(DOWN);
    }
//     ***********************************************************************
    public void up(){
        if (currentIndex>0) currentIndex--;
        else currentIndex = itemCount-1;
        fireMenuListeners(UP);
    }
//     ***********************************************************************
    public void left(){
//        if (currentIndex>0) currentIndex--;
//        else currentIndex = itemCount;
        fireMenuListeners(LEFT);
    }
//     ***********************************************************************
    public void right(){
        GMenuItem item = (GMenuItem)items.elementAt(currentIndex);
        if (item.hasSub()) item.showSubmenu();
        fireMenuListeners(RIGHT);
    }
//     ***********************************************************************
    public void select(){
        setVisible(false);
        lastRes = getItem(getCurrentIndex());
        fireMenuListeners(SELECT);
    }
//     ***********************************************************************
    public String getTitle() {
        return title;
    }
//     ***********************************************************************
    public void addMenuListener(GMenuListener ml) {
        menuListener.addElement(ml);
    }
//     ***********************************************************************
    public void setTitle(String title) {
        this.title = title;
    }
//     ***********************************************************************
    private void fireMenuListeners(int e){
        for (int i=0; i<menuListener.size(); i++){
            ((GMenuListener)menuListener.elementAt(i)).menuEvent(e);
        }    
    }
//     ***********************************************************************
    public void menuEvent(int e){
        fireMenuListeners(e);
    }
//     ***********************************************************************
    public int getItemsCount(){
        return items.size();
    }
//     ***********************************************************************
    public int getCurrentIndex() {
        return currentIndex;
    }
//     ***********************************************************************
    public void setCurrentIndex(int currentIndex) {
        this.currentIndex = currentIndex;
    }
//     ***********************************************************************
    public GMenuItem getItem(int i) {
        return (GMenuItem)items.elementAt(i);
    }
//     ***********************************************************************
}



MenuItem
Код

package com.canvas.source.visiel.menu;

import javax.microedition.lcdui.Graphics;
import com.canvas.source.util.GRectangle;

public class GMenuItem{
    private String command;
    private GMenu subMenu;
    private String text;
    private GItemInner inner;
    
    private int activeBgColor = 0x00C0C0C0;
    private int activeFgColor = 0x00FFFFFF;
    
    private int passiveBgColor = 0x0050FFA0;
    private int passiveFgColor = 0x00FFFFFF;
    
//     ***********************************************************************
    public GMenuItem(String t, String c){
        text = t;
        command = c;
    }
//     ***********************************************************************
    public GMenuItem(String t){
        text = t;
        command = t;
    }
//     ***********************************************************************
    public void init(){
        subMenu = new GMenu(command);
    }
//     ***********************************************************************
    public boolean hasSub(){
        return subMenu.getItemsCount()>0;
    }
//     ***********************************************************************
    public String getCommand() {
        return command;
    }
//     ***********************************************************************
    public void setCommand(String command) {
        this.command = command;
    }
//     ***********************************************************************
    public void drawSelf(Graphics g, GRectangle r, boolean active){
        int c = g.getColor();
        if (active){
            // do some changes;
        }
        g.setColor(active?activeBgColor:passiveBgColor);
        g.fillRect(r.getX(),r.getY(),r.getWidth(),r.getHeight());

        g.setColor(active?activeFgColor:passiveFgColor);
        g.drawString(getText(), r.getX()+3, r.getY(), 0);
        g.setColor(c);
        //TODO make it drow itself on the menu (this will better!!!) may be;
    }
//     ***********************************************************************
    public int showSubmenu(){
        return 0;
    }
//     ***********************************************************************
    public GItemInner getInner() {
        return inner;
    }
//     ***********************************************************************
    public void setInner(GItemInner inner) {
        this.inner = inner;
    }
//     ***********************************************************************
    public String getText() {
        return text;
    }
//     ***********************************************************************
    public void setText(String text) {
        this.text = text;
    }
//     ***********************************************************************
}


К остальному относитесь как к черному ящику. Да пусть не пугает вас обилие геттеров и сеттеров. 
Хотя, конечно же, было бы лучше создать интерфейс типа GPaintable и реализовывать его и в GMenu и в GMenuItem, но, как я уже сказал, было это давно. Теперь можно было бы и исправить. 

Это сообщение отредактировал(а) 02077461 - 26.7.2006, 12:08
PM   Вверх
Samuil
Дата 26.7.2006, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


в(Job)ываю
**


Профиль
Группа: Участник
Сообщений: 705
Регистрация: 26.4.2006
Где: Uzbekistan.Tashke nt

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



Сейчас откомпилю посмотрю  smile  


--------------------
Выбор уже сделан, остается его только осознать   
smile    smile 
      smile  

user posted image
PM MAIL ICQ   Вверх
02077461
Дата 26.7.2006, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Для компиляции, боюсь, тебе придеться многое менять.
Главное -- посмотри на идею. 
PM   Вверх
W0LF
Дата 26.7.2006, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

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



Цитата

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

А чего ж тогда сам так строго судишь новичков? 


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
Samuil
Дата 26.7.2006, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


в(Job)ываю
**


Профиль
Группа: Участник
Сообщений: 705
Регистрация: 26.4.2006
Где: Uzbekistan.Tashke nt

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



Да ладно вам ребят, Вы лучше туториал зацените smile  


--------------------
Выбор уже сделан, остается его только осознать   
smile    smile 
      smile  

user posted image
PM MAIL ICQ   Вверх
02077461
Дата 27.7.2006, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Сужу не новичков, а подход.
Как можешь видеть, код мой нуждаеться в некоторой доработке, но я показал метод. И если кто нибудь, например Samuil, доведет его до ума, и выложит здесь вычещенный код, буду весьма рад. Подчеркиваю: я не сужу реализацию, я лишь выразил свое мнение о методе. Кто не согласен с ним, пусть выскажет и приведет свой метод, главное не переходить на личности. 
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса

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

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


 




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


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

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