Пишем на Java

Темы о Java и ее разновидностях типа J2me
Phantom
Обсуждатель
Сообщения: 179
Зарегистрирован: Сб янв 05, 2008 12:01 pm
Контактная информация:

Re: Пишем на Java

Сообщение Phantom » Вс авг 17, 2008 6:10 am

А как лучше связывать меж собой классы? Вот, например, пишу я класс, который будет делать что-то специфичное, например, отрисовывать по очереди несколько заставок вначале игры (ну там типа копирайты, реклама и т. п.). И я хочу использовать этот класс во всех своих мидлетах, которые я ещё когда-то потом буду писать. Чтобы этот класс мог отрисовывать по канвасу, нужно ему передать Graphics из класса, в котором находится основная часть программы (или можно как-то иначе?). Если я напишу в этом своём классе ссылку (ну или как это правильно назвать?) на Graphics основного класса, то мой класс будет работать только при условии, что во всех моих будущих мидлетах основной класс будет иметь такое же название. Так вот я хочу спросить, как обычно делают в таких ситуациях? Может сделать в классе метод инициализации и при его вызове передавать Graphics туда?

P.S: Надеюсь, не слишком запутано написал ;)
- - -
Добавил позднее:
О! А ведь Graphics можно использовать, когда наследование ои Канваса произведено? Или нет? Если да, то я просто могу сделать это в своём классе? Дело в том, что я ща пишу на джаве, но отталкиваюсь от классов Мидлет Паскаля =) Просто я взял откомпилировал в мидлет паскале Хэллоу ворлд, а потом декомпилировал полученные два класса и теперь пишу на их основе. Просто в этих классах уже всё сделано для того, чтобы париться меньше нужно было, можно сразу кодить то, что хочешь и не разбираться в наследовании и т. п. Там сразу определена куча переменных на все случаи жизни =) Например, там сразу стоит обработчик нажатий клавиш, то есть имею ввиду, там в переменную пишется код клавиши. Даже если мне в приложении вообще клавиши не нужны =) В будущем, конечно, разберусь во всём этом и уберу то, что не использую, но пока могу удалить что-нибудь нужное. Но прогресс всё таки есть, начинаю по-тихоньку врубаться в ООП =)

Аватара пользователя
blackstrip
Админ
Сообщения: 1176
Зарегистрирован: Ср янв 02, 2008 1:42 pm
Откуда: Подольск
Контактная информация:

Re: Пишем на Java

Сообщение blackstrip » Вс авг 17, 2008 6:08 pm

ну ты передавай Graphics экранный, или если хочешь Graphics от любого Image в процедуру как параметр.

А процедуру уже делай работающую с переданным графиксом:

public void Procedura(Graphics g) {
...
}

Phantom
Обсуждатель
Сообщения: 179
Зарегистрирован: Сб янв 05, 2008 12:01 pm
Контактная информация:

Re: Пишем на Java

Сообщение Phantom » Вс авг 17, 2008 6:55 pm

Так я пока так и делал. Просто может Графикс передать в класс и там его в переменной сохранить? Может так лучше сделать, чем постоянно его передавать в качестве параметра процедуры?

Аватара пользователя
blackstrip
Админ
Сообщения: 1176
Зарегистрирован: Ср янв 02, 2008 1:42 pm
Откуда: Подольск
Контактная информация:

Re: Пишем на Java

Сообщение blackstrip » Ср авг 20, 2008 11:48 am

Ну если от Image то еще наверна можно. А экранный графикс - я бы рисковать не стал, вдруг он динамический, и при каждом вызове paint может быть теоретически отличен от предыдущего графикса, переданного в предыдущей перерисовке paint. мало ли как ява машина работает. Неспроста же оно именно передается в paint, а не просто тупо существует какой нить ScreenGraphics, в который можно было отрисовывать в любом месте проги (кстати мож это было бы и удобнее, чем рисование тока в paint-е) =)

Phantom
Обсуждатель
Сообщения: 179
Зарегистрирован: Сб янв 05, 2008 12:01 pm
Контактная информация:

Re: Пишем на Java

Сообщение Phantom » Ср авг 20, 2008 1:43 pm

Вот напридумывали всякой херни... гг...
А можно как-нибудь сделать наследование сразу от нескольких классов?

Phantom
Обсуждатель
Сообщения: 179
Зарегистрирован: Сб янв 05, 2008 12:01 pm
Контактная информация:

Re: Пишем на Java

Сообщение Phantom » Пт авг 22, 2008 1:15 am

Кстати, думал над твоим постом, но так и не понял. Во-первых, я думал, что отрисовывается в канвасе, а не в графиксе. И что значит графикс от Image и экранный графикс? На счёт канваса я что-то читал, типа их два можно юзать. Гэйм канвас и обыкновенный. Их можно оба использовать, второй в качестве буфера. Например, чтобы исключить мерцание во время выполнения какой-нибудь игры. Ну а с графиксом-то вроде всё просто. Или, ты хочешь сказать, что я могу создать две (или более) переменных Графикс, одной присвоить один шрифт, один цвет и т. п., а другой переменной другие шрифт и цвет. А потом вызывать, например, drawString от одной переменной и от другой и результаты будут разные? Я не пробовал так делать, но мне кажется, что просто напросто создадутся две параллельные переменные. Меняем что-то в одной, автоматом будет меняться и в другой. То есть переменная в данном случае как бы рулит графиксом, но сколько бы ни было переменных, графикс-то один. Разве не так?

Аватара пользователя
blackstrip
Админ
Сообщения: 1176
Зарегистрирован: Ср янв 02, 2008 1:42 pm
Откуда: Подольск
Контактная информация:

Re: Пишем на Java

Сообщение blackstrip » Сб авг 23, 2008 12:07 am

Ну када у тя вообще на экране displayable графическое (типа канвас), то у тя при перерисовке экрана в обязательно-присутствующую процедуру paint передает объект типа Graphics. Это экранный графикс.

Например я когда то ради интереса пробовал сделать так:
Мутишь Image Kartinka например. И в процедуре отрисовки проги (я на паинткаде экспериментировал) где было Graphics g в параметрах делаешь например Graphics gg (вместо Graphics g), а в теле процедуры в самом начале объявляешь Graphics g и присваиваешь ему графикс Image-a Kartinka. Получается (без особых исправлений дополнительных) что вся процедура рисует все не на экранный графикс (который теперь gg), а в g - графикс от имейджа Kartinka. И к конце процедуры у тя есть полная копия экрана, только в рисунке. Отсюда польза такая:
1) Ты можешь в конце процедуры paint просто этот готовый рисунок Kartinka выкинуть на экран, и как бы для отрисовки проги все будет как раньше (пользователю также все будет видно на экране как раньше).
2) НО у тя по окончании есть ПОЛНАЯ КОПИЯ текущего экрана в объекте типа Image - ты можешь ее достать поточечно, и например УЗНАТЬ цвет любой точки экрана как бы =) Или ты можешь сохранить этот рисунок в файл (или поточечно с помощью процедуры своей, или юзать готовые из MIDP2 процедуры сохранения в bmp, я тока вот подзабыл толи эти готовые есть во всех мобилах, толи тока в сименсах). Заметь просто так ты бы никогда не мог узнать цвет точки экрана или сохранить экран в файл =) так что это такая хитрость как получить экран в файл. Удобно, т.к. только твоя прога рисует чото на экран пока она работает+) Если б кто нить еще отрисовывал, то тада бы ты через paint мог только свое рисование перехватить, но не чужое. Но на мобилах ява однозадачная простая. поэтому все что на экране - то и в image получается.

Phantom
Обсуждатель
Сообщения: 179
Зарегистрирован: Сб янв 05, 2008 12:01 pm
Контактная информация:

Re: Пишем на Java

Сообщение Phantom » Сб авг 23, 2008 1:29 am

На http://boolean.name/ есть либа для мидлет паскаля для копирования экрана в буфер. Я сам не юзал, но смотрел исходник. Уже не помню, но вроде там не так как-то сделано. У них ваще форум рульный =) И людей умных много. Мне кажется, это лучший форум для програмистов на джава. Да и по мидлет пискалю там есть ВСЁ. Больше, чем на официальном сайте. Там только по исходникам либ всяческих для мидлет паскаля (исходники-то на джаве чистой) можно джаву изучить =) Собственно, я так и делаю. Так проще =)

Joy
Новичок
Сообщения: 2
Зарегистрирован: Вс дек 07, 2008 3:11 am

Re: Пишем на Java

Сообщение Joy » Вс дек 07, 2008 3:51 am

Здрасте всем ~~
Знач зачтрял на кокой-то фигне с канвасом, точнее с отрисовкой этого самого канваса на сименсе с65/сх65.
Знач ситуация такая:
-------

Код: Выделить всё

...
public void startApp()  {
    d = Display.getDisplay(this);
    x = new Code();   
    x.Disp(d); 
   }
...
-------
import javax.microedition.lcdui.*;

public class Code extends Canvas
{

public Display display;
int Y = 0;
int X = 0;
    
public Code() 
{
setFullScreenMode(true);
}

public void Disp(Display d)
{
display = d;
d.setCurrent(this);
}

public void paint(Graphics g)
{
 
g.setColor(0xffffff);
g.fillRect(0, 0,130,130);
g.setColor(0xff0000);

    
for (int i = 0; i < 10; i++) 
    {
    
    g.drawString(Integer.toString(X), 0, Y, Graphics.TOP|Graphics.LEFT); 
    X += 1;
    Y += 15;
    
    }
}
   
public final void keyPressed(int i)
{switch(i)
{   
 case Canvas.KEY_NUM6: Y = 0; repaint();break;
}}}
--------
По идее сначала должен нарисоваться белый квадрат, а потом нарисоваться строки.
На всех приличных телефонах так и происходит.
Но только не на сименсе.
На нем сначала рисуются строки, а потом белый квадрат.
Это происходит только при первом запуске мидлета, но потом все рисуется нормально, при нажатии на клавишу.
Проблема маленькая, но ппц она меня задолбала, и мне крайне нужно понять почему это происходит, и как это исправить...
Хелп ми.

Аватара пользователя
blackstrip
Админ
Сообщения: 1176
Зарегистрирован: Ср янв 02, 2008 1:42 pm
Откуда: Подольск
Контактная информация:

Re: Пишем на Java

Сообщение blackstrip » Вс дек 07, 2008 4:52 pm

Ну если сименс не хочет - заставь его =)

Нечто такое я бы попробовал

Код: Выделить всё

...
public void startApp()  {
    d = Display.getDisplay(this);
    x = new Code();   
    x.Disp(d); 
   }
...
-------
import javax.microedition.lcdui.*;

public class Code extends Canvas
{

public Display display;
int Y = 0;
int X = 0;
boolean UgeBilo = false;
    
public Code() 
{
setFullScreenMode(true);
}

public void Disp(Display d)
{
display = d;
d.setCurrent(this);
repaint();
serviceRepaints();
UgeBilo = true;//все, по идее первая перерисовка прошла, мона флаг выставлять
repaint();//говорим что пора уже перерисовываться
serviceRepaints();//причем мордой тыкаем - насильно заставляем перерисоваться прям щас
}

public void paint(Graphics g)
{

if (UgeBilo) {

g.setColor(0xffffff);
g.fillRect(0, 0,130,130);
g.setColor(0xff0000);

    
for (int i = 0; i < 10; i++) 
    {
    
    g.drawString(Integer.toString(X), 0, Y, Graphics.TOP|Graphics.LEFT); 
    X += 1;
    Y += 15;
    
    }

} //от проверки UjeBilo

}
   
public final void keyPressed(int i)
{switch(i)
{   
case Canvas.KEY_NUM6: Y = 0; repaint();break;
}}}

мож получится. главное чтоб после d.setCurrent(this); и заставляний явы перерисовать экран прошла прорисовка до того как UjeBilo станет true =) мож придется какую нить задержку поставить еще

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 11 гостей