motofan logo
       
> 

реализация Canvas под E398, вопрос однако

0x45455844
сообщение 6.5.2005, 22:22


Интересующийся
**

Группа: Пользователи
Сообщений: 39
Регистрация: 7.4.2005
Пользователь №: 40 280
Модель телефона: Siemens SX1

Рейтинг: 1.5



привет.
задумал сделать свой морской бой для E398, Vxxx на весь экран
отдельной версией... в nokia для этого вместо Canvas используется другой класс FullCanvas,
позволяющий рисовать на всем экране...а как в моторлах? подскажите... скачал SDK, похожего
класса пока не нашел, есть GameScreen, но про рисование на всем экране ничего не сказано.
помогите разобраца?
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
treilor
сообщение 7.5.2005, 5:06


Интересующийся
**

Группа: Пользователи
Сообщений: 93
Регистрация: 14.4.2005
Из: Казань
Пользователь №: 40 720
Модель телефона: V360
Прошивка: много букв

Рейтинг: 8



Для полноэкранного рисования в мотороле используется обычный Canvas, только для него надо вызвать setFullScreenMode(true) перед началом рисования, чтобы пропала полоска внизу. А верхнюю полоску убрать нельзя, т.к. спецификация midp 2.0 не позволяет.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
0x45455844
сообщение 8.5.2005, 9:27


Интересующийся
**

Группа: Пользователи
Сообщений: 39
Регистрация: 7.4.2005
Пользователь №: 40 280
Модель телефона: Siemens SX1

Рейтинг: 1.5



я делаю setFullScreenMode(true) и убрал реализацию интерфейса CommandListener, т.е. вообще не использую команды, однако при рисовании белая строка внизу осталась, хотя на ней ничего и не нарисовано (запускаю на эмуляторе E398).

и еще, я проверил что коды софткнопок на E398 - 21 и 23, но их обработка почему-то не работает :-/
как обработать софт кнопки? делаю так:

protected void keyPressed(int KeyCode){
if(KeyCode==21){
// мои действия
}
}
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
0x45455844
сообщение 8.5.2005, 9:49


Интересующийся
**

Группа: Пользователи
Сообщений: 39
Регистрация: 7.4.2005
Пользователь №: 40 280
Модель телефона: Siemens SX1

Рейтинг: 1.5



да, и еще, возможно как то настроить remote debug для JBuilder на эмуляторе от MotorolaSDK ?
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
0x45455844
сообщение 8.5.2005, 12:09


Интересующийся
**

Группа: Пользователи
Сообщений: 39
Регистрация: 7.4.2005
Пользователь №: 40 280
Модель телефона: Siemens SX1

Рейтинг: 1.5



выяснил... KeyCode обрабатывается, но не создается Dusplayable :(

пишу так:
Код

 protected void keyPressed(int KeyCode){
   if(KeyCode==softkey.softKey1){
     // вот тут не срабатывает создание
     new Menu(applic,this,game);
   }else{
     // обработка других кнопок
     game.keyPressed(KeyCode, this.getGameAction(KeyCode));
   }
 }


на эмуляторе Е398 не работает, а на эмуляторе К700 всё без проблем... в чем же дело?
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
0x45455844
сообщение 8.5.2005, 13:11


Интересующийся
**

Группа: Пользователи
Сообщений: 39
Регистрация: 7.4.2005
Пользователь №: 40 280
Модель телефона: Siemens SX1

Рейтинг: 1.5



даже больше скажу... если проверка идет на код софтклавиши - то не рабоатет. а если проверка на любую нормальную кнопку- то все ОК.

вот так не работает
Код

   if(KeyCode==21){
     new Menu(applic, this, game);      
   }else{
     game.keyPressed(KeyCode, this.getGameAction(KeyCode));      
   }


а так работает

Код

   if(KeyCode==Canvas.KEY_NUM0){
     new Menu(applic, this, game);      
   }else{
     game.keyPressed(KeyCode, this.getGameAction(KeyCode));      
   }


почему??? делая System.out.print() обнаружил, что и в первом случае конструктор Menu вызывается и там все происходит, но ничего не появляется на экране... активным Displayable остается текущий Canvas:(

зы: в конструкторе Menu идет установка setCurrent(this); если возникнет вопрос где.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
0x45455844
сообщение 8.5.2005, 20:43


Интересующийся
**

Группа: Пользователи
Сообщений: 39
Регистрация: 7.4.2005
Пользователь №: 40 280
Модель телефона: Siemens SX1

Рейтинг: 1.5



что никто не знает?...:(
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
treilor
сообщение 9.5.2005, 5:27


Интересующийся
**

Группа: Пользователи
Сообщений: 93
Регистрация: 14.4.2005
Из: Казань
Пользователь №: 40 720
Модель телефона: V360
Прошивка: много букв

Рейтинг: 8



Цитата(0x45455844 @ Воскресенье, 8 Май 2005, 13:49)
да, и еще, возможно как то настроить remote debug для JBuilder на эмуляторе от MotorolaSDK ?
*


Нельзя, эмулятор MotoSDK не поддерживает отладку. Можно через kdwp отлаживать прямо с телефона в remote debug JBuilderX'а. Короче, если есть вопросы, пиши
Цитата(0x45455844 @ Воскресенье, 8 Май 2005, 17:11)
даже больше скажу... если проверка идет на код софтклавиши - то не рабоатет. а если проверка на любую нормальную кнопку- то все ОК.
*


Тоже с этим столкнулся, но решения не нашел
Цитата(0x45455844 @ Воскресенье, 8 Май 2005, 17:11)
в конструкторе Menu идет установка setCurrent(this)
*


А может где-то следом идет другой setCurrent(...), который перебивает предыдущий? Там же вызовы setCurrent() не очередуются и не гарантируется установка текущего Displayable сразу после вызова
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
0x45455844
сообщение 9.5.2005, 8:05


Интересующийся
**

Группа: Пользователи
Сообщений: 39
Регистрация: 7.4.2005
Пользователь №: 40 280
Модель телефона: Siemens SX1

Рейтинг: 1.5



Цитата(treilor @ Понедельник, 9 Май 2005, 8:27)
Нельзя, эмулятор MotoSDK не поддерживает отладку. Можно через kdwp отлаживать прямо с телефона в remote debug JBuilderX'а. Короче, если есть вопросы, пиши

Тоже с этим столкнулся, но решения не нашел

А может где-то следом идет другой setCurrent(...), который перебивает предыдущий? Там же вызовы setCurrent() не очередуются и не гарантируется установка текущего Displayable сразу после вызова
*



да реального девайса щас нет чтобы устроить дебаг....

то что решения нет это странно, на реальном устройстве тоже так? неужели глюк реализации MIDP, ведь на SE все работает OK. setCurrent в порядке, на SE работает идеально
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
0x45455844
сообщение 10.5.2005, 5:48


Интересующийся
**

Группа: Пользователи
Сообщений: 39
Регистрация: 7.4.2005
Пользователь №: 40 280
Модель телефона: Siemens SX1

Рейтинг: 1.5



ну что ж...тогда моторолы отдыхают, спец. версий для них не будет в виду повышеной глючности и непредсказуемости :)))
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
xx-xx-xx
сообщение 10.5.2005, 7:10


Интересующийся
**

Группа: Пользователи
Сообщений: 96
Регистрация: 9.8.2004
Из: Запоріжжя , Україна
Пользователь №: 9 433
Модель телефона: v600-украли, N3230
Прошивка: TRIPLETS_G_0B.09.72R

Рейтинг: 14



0x45455844,

У тебя код код софтклавиши 21 , а нужно -21

для E398/с650/с380:

Меню: -23
Левая софт: -21
Правая софт: -22
Вызов: -10
1..9: 49..57
*: 42
0: 48
#: 35

Джойстик:
вверх: -1
вниз: -6
влево: -2
вправо: -5
нажать: -20



Для v600/v500/v300 :

Меню: 23
Левая софт: 21
Правая софт: 22
Вызов: -10
1..9: 49..57
*: 42
0: 48
#: 35

Джойстик:
вверх: 1
вниз: 6
влево: 2
вправо: 5
нажать: 20
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
0x45455844
сообщение 10.5.2005, 8:19


Интересующийся
**

Группа: Пользователи
Сообщений: 39
Регистрация: 7.4.2005
Пользователь №: 40 280
Модель телефона: Siemens SX1

Рейтинг: 1.5



спасибо, но вопрос не в этом.

на эмуляторе Е398 и V600 с помошью System.out.print я выяснил, что софт кнопка обрабатывается нормально, исполнение всего кода происходит, но не создается и не устанавливается Displayable (см вставки кода выше).
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
pilot6
сообщение 11.5.2005, 12:50


Новичок
*

Группа: Пользователи
Сообщений: 14
Регистрация: 16.3.2005
Пользователь №: 38 907
Модель телефона: Motorola RAZR2 V8

Рейтинг: 17.5



0x45455844,

С setcurrent на моторах слезы просто. Что ты там устанавливаешь current? Не знаю как на Сименсах, на Моторах как и положено по спецификации, setCurrent в очередь не ставятся и забивают один другой. getCurrent обновляется довольно медленно. Но если писать код в соответствии со спецификацией MIDP, никаких проблем не возникает.


А текущий Canvas остается потому, что ты делаешь что-то типа setCurrent(getCurrent) и попадаешь в предыдущий Canvas.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
treilor
сообщение 11.5.2005, 14:45


Интересующийся
**

Группа: Пользователи
Сообщений: 93
Регистрация: 14.4.2005
Из: Казань
Пользователь №: 40 720
Модель телефона: V360
Прошивка: много букв

Рейтинг: 8



pilot6,
о чем я и говорил. drink_drunks;
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
0x45455844
сообщение 11.5.2005, 17:54


Интересующийся
**

Группа: Пользователи
Сообщений: 39
Регистрация: 7.4.2005
Пользователь №: 40 280
Модель телефона: Siemens SX1

Рейтинг: 1.5



раз уж пошли такие дела приведу код:

класс мидлета
Код

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.util.*;
//----------------------------------------------------------------------------------------------------------------------
public class AmazingBricks extends MIDlet {
 MCanvas mc;
 Stack history; // стек экранов
//----------------------------------------------------------------------------------------------------------------------
 public AmazingBricks() {
   super();
   mc=null;
   history=new Stack();
 }
//----------------------------------------------------------------------------------------------------------------------
 public void startApp() {
   if(mc==null){
     mc=new MCanvas(this);
   }
 }
//----------------------------------------------------------------------------------------------------------------------
 public void setScreen(Displayable d){
   Display.getDisplay(this).setCurrent(d);
 }
//----------------------------------------------------------------------------------------------------------------------
 public void pauseApp() {
 }
//----------------------------------------------------------------------------------------------------------------------
 public void destroyApp(boolean unconditional) {
 }
//----------------------------------------------------------------------------------------------------------------------
 public void quitApp() {
   destroyApp(true);
   notifyDestroyed();
 }
//----------------------------------------------------------------------------------------------------------------------
}


вызывающий класс MCanvas.java
Код

import javax.microedition.lcdui.*;

//----------------------------------------------------------------------------------------------------------------------
public class MCanvas extends Canvas implements GameDisp {
 AmazingBricks app;
 Image imBuffer; //  на случай реализации doublebuffering
 Graphics grBuffer; // графический буфер на тот же случай

 TheGame game;
//----------------------------------------------------------------------------------------------------------------------
 public void redraw(){
   this.repaint();
 }
//----------------------------------------------------------------------------------------------------------------------
 public MCanvas(AmazingBricks _app) {
   super();
   app=_app;

   game=new TheGame(this,app);

   setFullScreenMode(true);

   game.screenWidth=getWidth();
   game.screenHeight=getHeight()+17;

   //for doublebuffering
   try{
     if(!isDoubleBuffered()){
         imBuffer = Image.createImage(game.screenWidth, game.screenHeight);
         grBuffer = imBuffer.getGraphics();
     }
   }catch(Exception e){
     e.printStackTrace();
   }

   app.setScreen(this); // тут устанавливается главный Canvas
 }
//----------------------------------------------------------------------------------------------------------------------
 protected void paint(Graphics g) {
   Graphics g1 = g;
   if(!isDoubleBuffered())
     g = grBuffer;

   game.paint(g);

   // drawing menu softkey hint
   g.setColor(game.settings.C_text);
   int h=g.getFont().getHeight();
   int w=g.getFont().stringWidth("'0' - Menu");
   g.drawString("'0' - Menu",game.screenWidth-2-w,game.screenHeight-h-2,Graphics.TOP|Graphics.LEFT);

   if(!isDoubleBuffered())
     g1.drawImage(imBuffer, 0, 0, Graphics.TOP|Graphics.LEFT);
 }
//----------------------------------------------------------------------------------------------------------------------
 protected void keyPressed(int KeyCode){
   if(KeyCode==21){
     game.keyPressed(Canvas.KEY_POUND,getGameAction(Canvas.KEY_POUND)); // пауза
     new Menu(app,this,game); // создаем меню и передаем ему параметры
   }else{
     game.keyPressed(KeyCode, getGameAction(KeyCode));
   }
 }
//----------------------------------------------------------------------------------------------------------------------
 protected void keyReleased(int KeyCode){
   game.keyReleased(KeyCode,getGameAction(KeyCode));
 }
//----------------------------------------------------------------------------------------------------------------------
}



класс Munu.java
Код

import javax.microedition.lcdui.*;

//------------------------------------------------------------------------------
public class Menu extends List implements CommandListener{
 AmazingBricks app;
 TheGame g;
//------------------------------------------------------------------------------
 public Menu(AmazingBricks _app,Displayable parent,TheGame _g) {
   super("Menu", List.IMPLICIT);
   app=_app;
   g=_g;
     setCommandListener(this);
     addCommand(new Command("Select", Command.OK, 1));
     addCommand(new Command("Back", Command.CANCEL, 2));

     append("Start", null);
     append("HiScore",null);
     append("Help",null);
     append("Exit", null);

     app.history.push(parent);
     app.setScreen(this);
 }
//------------------------------------------------------------------------------
 public void commandAction(Command command, Displayable displayable) {
   if (command == List.SELECT_COMMAND || command.getLabel() == "Select") {
     switch (getSelectedIndex()) {
       case 0: // START
         g.startGame();
         ((GameDisp)g.disp).redraw();
         app.setScreen( (Displayable) app.history.pop());
         break;
       case 1: // Hiscore
         HiScore hs=new HiScore(5);
         new ViewHiscore(app,this,hs);
         break;
       case 2: // Help
         new ShowText(app,this,"Help 0.3"," help text ");
         break;
       case 3: // Exit
         app.quitApp();
     }
   }else if(command.getLabel()=="Back"){
     app.setScreen( (Displayable) app.history.pop());
   }
 }
//------------------------------------------------------------------------------
}



как видете нигде не вызывается конструкция setCurrent(getCurrent).
также если вместо кода 21 поставить например Canvas.KEY_NUM0 (пока я так сделал)
то ведь сразу все работает отлично.

что на это скажете?
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
treilor
сообщение 11.5.2005, 22:22


Интересующийся
**

Группа: Пользователи
Сообщений: 93
Регистрация: 14.4.2005
Из: Казань
Пользователь №: 40 720
Модель телефона: V360
Прошивка: много букв

Рейтинг: 8



0x45455844,
[OFF]ты-б лучше листинг в файлик и сюда прикрепил[/OFF]
дело не в вызове контрукции setCurrent(getCurrent), а в том, что если ты где-то вызвал setCurrent(), то не факт что изменения произойдут сразу, т.е. не мгновенно. Время, через которое это произойдет зависит от реализации jvm. Так вот, если вызвать setCurrent() второй раз, до того, как предыдущий вызов этой функции произвел изменения, то Displayable, который устанавливался первым вызовом, ты не увидишь, а увидишь тот, что ты пытался установить вторым вызовом.

А с софт-клавишами, имхо, косяк мотороловской реализации. Это, имхо, связано с тем, что клавиши эти же участвуют в подаче комманд, поэтому к ним "особое отношение" ;).
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
pilot6
сообщение 12.5.2005, 5:53


Новичок
*

Группа: Пользователи
Сообщений: 14
Регистрация: 16.3.2005
Пользователь №: 38 907
Модель телефона: Motorola RAZR2 V8

Рейтинг: 17.5



0x45455844,

Есть конструкция setCurrent(d)

Весь вопрос в том, что в момент вызова из себя представляет d. Совершенно не факт, что это то, что нужно.
Для того, чтобы определить что именно отображается на экране, есть метод isShown()
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
0x45455844
сообщение 12.5.2005, 7:05


Интересующийся
**

Группа: Пользователи
Сообщений: 39
Регистрация: 7.4.2005
Пользователь №: 40 280
Модель телефона: Siemens SX1

Рейтинг: 1.5



treilor,
эту архтректуру я прекрасно знаю, спасибо.

pilot6,
я понимаю все происходит у меня так: на момент ожидания установлен MCanvas, при нажатии на софт-кнопку создается Menu и в его конструкторе вызывается 1 раз app.setScreen(this); где [/b]this[b] в конструкторе Menu содержит обьект Menu соотв. после этого никаких setScreen не вызывается, поэтому перебить текущий setCurrent нечем т.к. в Menu после конструктора тоже режим ожидания

если бы был косяк в конструкции, то по кнопке "0" тоже бы не работало... ведь отличия 21 от Canvas.KEY_NUM0 только в значении константы
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
pilot6
сообщение 12.5.2005, 7:33


Новичок
*

Группа: Пользователи
Сообщений: 14
Регистрация: 16.3.2005
Пользователь №: 38 907
Модель телефона: Motorola RAZR2 V8

Рейтинг: 17.5



0x45455844,

Разобраться во всех тонкостях сразу не могу. Но я, например, никогда не использую коды клавиш для софткнопок.
Для этого Commands есть.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
0x45455844
сообщение 12.5.2005, 7:51


Интересующийся
**

Группа: Пользователи
Сообщений: 39
Регистрация: 7.4.2005
Пользователь №: 40 280
Модель телефона: Siemens SX1

Рейтинг: 1.5



pilot6,
если использовать Commands то не получишь полный экран для рисования, т.к. появляется отрисовка софт-кнопок внизу... имхо нужно попробовать обрабатывать не keyPressed а keyReleased, поковыряю еще:)...

будут идеи, пишите
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
0x45455844
сообщение 12.5.2005, 8:08


Интересующийся
**

Группа: Пользователи
Сообщений: 39
Регистрация: 7.4.2005
Пользователь №: 40 280
Модель телефона: Siemens SX1

Рейтинг: 1.5



ДАА! ну не ёлки-палки!...... как я зол на моторолы за это...откуда такой глюк?!
оказывается нужно обрабатывать не нажатие а отпускание софт-кнопки... теперь все работает:) побежал переделывать:)
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
pilot6
сообщение 12.5.2005, 8:48


Новичок
*

Группа: Пользователи
Сообщений: 14
Регистрация: 16.3.2005
Пользователь №: 38 907
Модель телефона: Motorola RAZR2 V8

Рейтинг: 17.5



0x45455844,

Во как!! Это ценное открытие.:-) Серьезно. Буду иметь в виду. Моторольная ява вообще вещь загадочная. пока методом тыка не обнаружишь что-то не догадаешься.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
grafmoto
сообщение 12.5.2005, 12:15


ЯваМотоКодер
********

Группа: Почётные мотофаны
Сообщений: 2 003
Регистрация: 15.10.2004
Из: Северодвинск
Пользователь №: 16 752
Модель телефона: iPhone 3Gs
Прошивка: iOS 6.1.3

Рейтинг: 703



...уфф...
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
0x45455844
сообщение 12.5.2005, 20:50


Интересующийся
**

Группа: Пользователи
Сообщений: 39
Регистрация: 7.4.2005
Пользователь №: 40 280
Модель телефона: Siemens SX1

Рейтинг: 1.5



grafmoto,
уфф? простите?
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
реализация Canvas под E398, вопрос однако · Разработка Java-приложений · Forum
 

Ответ в темуСоздание новой темы
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 14.6.2025, 19:53

Форум живёт: