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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Канва на весь экран. Как такое реализовать? 
:(
    Опции темы
Dancer
Дата 17.5.2005, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



я так думаю это будет решение всех проблем. setFullScreenMode(boolean mode) это стандартный метод для Canvas. Кнопки софтварные самому придётся писать и обрабатывать. Этим методом нельзя закрасить статус бар. Так что извиняйте smile
Думаю, простенький код этому сможет помочь.
в классе наследуемом от Canvas делаю вызов this.setFullScreenMode(true) что означает, что моя канва всегда будет на весь экран, не включая статус бар.

Код

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

public class Gradient extends MIDlet {
    Display disp = Display.getDisplay(this);
    GradientCanvas grad = new GradientCanvas(0xff00ff,0xff0000,300,500);

    protected void startApp() throws MIDletStateChangeException {
        disp.setCurrent(grad);
    }

    protected void pauseApp() {
    }

    protected void destroyApp(boolean b) throws MIDletStateChangeException {
    }
}

class GradientCanvas extends Canvas {
    int[] interp;
    int color1;
    int color2;
    int width;
    int height;

    GradientCanvas(int color1, int color2, int width, int height){
        this.color1 = color1;
        this.color2 = color2;
        this.width = width;
        this.height = height;
        this.setFullScreenMode(true);
        
        int a1 = (color1 >> 24) & 0xff;
        int r1 = (color1 >> 16) & 0xff;
        int g1 = (color1 >>  8) & 0xff;
        int b1 = (color1) & 0xff;
        int da = ((color2 >> 24) & 0xff) - a1;
        int dr = ((color2 >> 16) & 0xff) - r1;
        int dg = ((color2 >>  8) & 0xff) - g1;
        int db = ((color2) & 0xff) - b1;
        interp = new int[257];
        for (int i = 0; i <= 256; i++) {
            int rgb =
            (((int) (a1 + da * i / 256)) << 24) |
            (((int) (r1 + dr * i / 256)) << 16) |
            (((int) (g1 + dg * i / 256)) <<  8) |
            (((int) (b1 + db * i / 256))      );
            interp[i] = rgb;
        }

    }
    public void paint(Graphics g){
        int x=100;
        int y=100;
        int r1 = 50;//y
        int r2 = 100;//x

        for(int i=0;i<height;i++) {
            g.setColor(interp[interp.length*i/height]);
            g.drawLine(0,i,width,i);
        }
    }

    int[] getInterpArray() {
        return interp;
    }
    void printInterpArray() {
        for(int i=0;i<interp.length;i++) {
            System.out.println("interp["+i+"]= "+interp[i]);
        }
    }
}



Спасибо за внимание, Андрюха



--------------------
У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! smile
PM MAIL   Вверх
Nemesis
Дата 4.6.2005, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата

Status bar нельзя будет зарисовать. Soft key bar можно, используя Canvas (только не сможем тогда CommandListener использовать). Придёся свой листенер писать, то есть слушать кнопки через KeyPressed и делать свои обработки.
Например сделай заливку Canvas каким либо цветом. В цикле перебери с 0 до пусть будет 128, увидишь результат )


Зачем говорить, что приложения в полный экран встречаются редко? Их уйма на самом деле. Любая нормальная игра показывается во весь экран и заливает всю область. И дело не в модели телефона. А реально нужен АПИ, вот где его можно найти... Это уже друой вопрос. А насчет этого:

Цитата

Я запрашиваю getWidth() и getHeight() и мне возвращается резултат: 128x128 точек, т.е.
32 точки сжираются этими строчками.


довольно странно, поскольку функции,т.е. методы класса Display возвращают истинные размеры экрана без всяких "урезок". Быть может ты все-таки использовал getClipHeight() и getClipWidth() ?
--------------------
PM MAIL   Вверх
javastic
Дата 6.6.2005, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1214
Регистрация: 18.3.2005
Где: St.Petersburg

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



Nemesis нет именно getWidth() и getHeight(), вот поэтому для меня это и стало удивительно smile


--------------------
01101010 01100001 01110110 01100001 01110011 01110100 01101001 01100011
scjp, mcp 
PM MAIL WWW ICQ   Вверх
Nemesis
Дата 6.6.2005, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Да, действительно, для полного экрана достаточно вызвать метод setFullScreenMode(true) и экран переводится в полноэкранку. CommandListener новый писать не нужно, клавиши итак обрабатываются, просто нажимая какую-либо функциональную клавишу выпадает список меню с нужными действиями. По поводу getWidth() и getHeight() даже не знаю smile У меня вообще в приложении непонятный баг, может кто-нибудь сталкивался?

На эмуляторе программа работает прекрасно, все хорошо и без глюка, но вот стоит перенести на реальный телефон приложение и появляется след:

Приложение работает в графическом режиме, скажем бегает там мячик, нажимаю клавишу с информацией о телефоне и
- на эмуляторе все в порядке, т.е. экран перерисовывается и выводится инфа в Form в виде StringItem.
- на телефоне задний(графика) экран не перерисоваля и инфа выводится поверх этого дела, но ! стоит нажать клавишу вверх smile и экран перерисовывается и информация нормально рисуется в новом чистом Form`е.
В чем здесь может быть ошибка? Кому интересно, могу код показать. Но хотелось бы разрешить эту проблему. Может быть дело в телефоне? Ведь эмулятор нормально работает, причем тестил на достаточном кол-ве эмуляторов( где-то на 6-ти).
--------------------
PM MAIL   Вверх
javastic
Дата 7.6.2005, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1214
Регистрация: 18.3.2005
Где: St.Petersburg

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



Давай, запости код, я думаю кому-то будет интересно.


--------------------
01101010 01100001 01110110 01100001 01110011 01110100 01101001 01100011
scjp, mcp 
PM MAIL WWW ICQ   Вверх
Nemesis
Дата 7.6.2005, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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

Код

package Graph;

/*
 * Main.java
 *
 * Created on 29 Май 2005 г., 19:23
 */

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
/**
 *
 * @author  Nemesis
 * @version
 */
public class Main extends MIDlet implements CommandListener
{
    private Command exitMidlet = new Command("Выход", Command.EXIT,0);
    private Command backButton = new Command("Назад", Command.BACK,1);
    private Command showInfo   = new Command("Инфо",  Command.SCREEN,0);
    private Form info;
    private Draw dr;
    
    private Display curdispl;
   
    public Main()
    {
        curdispl = Display.getDisplay(this);         
    }
    
    public void startApp()     
    {
        try
        {
            dr = new Draw();
            dr.start();
            dr.addCommand(exitMidlet);
            dr.addCommand(showInfo);
            dr.setCommandListener(this);
            
            curdispl.setCurrent(dr);
        }
        catch(java.io.IOException zxz)
        {
            destroyApp(false);
            notifyDestroyed();
        }
    }
    
    public void pauseApp(){}
    
    public void destroyApp(boolean unconditional)
    {
        if( dr!=null) dr.stop();
    }
    
    public void commandAction(Command c, Displayable d)
    {
        if(c==exitMidlet)
        {
            destroyApp(false);
            notifyDestroyed();
        }
        
        if(c==showInfo)
        {
            
            Integer numcol= new Integer(Display.getDisplay(this).numColors());
            
            String textstr=
            "Ширина = "+dr.x.toString()
            +"\nВысота = "+dr.y.toString()            
            +"\nЦветов = "+numcol.toString();
            
            info = new Form("Информация");
            StringItem text = new StringItem("Инфо:\n",textstr);
            info.append(text);
            info.addCommand(backButton);
            info.setCommandListener(this);
            curdispl.setCurrent(info);
        }
        
        if(c==backButton)
        {
            curdispl.setCurrent(dr);
        }
    }
}

//----------------------------------------------------------------------------------------------------------------

package Graph;

/*
 * Draw.java
 *
 * Created on 29 Май 2005 г., 19:59
 */

import java.io.*;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;

/**
 *
 * @author  Nemesis
 * @version
 */

public class Draw  extends GameCanvas implements Runnable
{
    private TiledLayer fonPole; // Фон экрана
    private LayerManager lm;
    private SpriteObject ball;   // можно опустить
    boolean z;        
    
    public Integer x,y;
    
    public Draw() throws IOException
    {
        super(true); 
        
        fonPole = Fon();
        lm = new LayerManager();                
        lm.append(fonPole);
        
        Image im = Image.createImage("/Graph/Src/bol.png");
        ball = new SpriteObject(im, 23, 23);        
        ball.setPosition(getWidth()/2, getHeight()/2);
        ball.defineReferencePixel(ball.getWidth()/2, ball.getHeight()/2);
        
        lm.append(ball);        
        
        x = new Integer(0);
        y = new Integer(0);
        
        this.setFullScreenMode(true);
    }
    
    public void start()
    {
        z = true;
        Thread t = new Thread(this);
        t.start();
    }
    
    public TiledLayer Fon() throws IOException
    {
        Image im = Image.createImage("/Graph/Src/fon.png");
        TiledLayer tmp = new TiledLayer(21,13,im,16,16);
      
        int[] pole = 
        {            
        2, 2, 2, 7, 1, 1, 1, 2, 2, 2, 7, 1, 1, 1, 2, 2, 2, 7, 1, 1, 1,
    2, 2, 2, 1, 2, 2, 7, 2, 2, 2, 1, 2, 2, 7, 2, 2, 2, 1, 2, 2, 7,
    2, 7, 1, 6, 2, 2, 1, 2, 7, 1, 6, 2, 2, 1, 2, 7, 1, 6, 2, 2, 1,
    2, 1, 2, 2, 2, 2, 1, 2, 1, 2, 2, 2, 2, 1, 2, 1, 2, 2, 2, 2, 1,
    2, 1,12, 1, 1, 8, 5, 2, 1,12, 1, 1, 8, 5, 2, 1,12, 1, 1, 8, 5,
    2, 1, 7, 6, 2, 1, 2, 2, 1, 2, 2, 1, 7, 6, 2, 1, 2, 2, 1, 2, 2,
    2, 1, 6, 7, 1, 6, 7, 1, 6, 2, 2, 1, 6, 7, 1, 6, 7, 1, 6, 2, 2,
    2, 10,2, 1, 2, 2, 1, 2, 2, 2, 2, 10,2, 1, 2, 2, 1, 2, 2, 2, 2,
    2, 2, 2, 5, 1, 8, 5, 1, 1, 8, 2, 2, 2, 5, 1, 8, 5, 1, 1, 8, 2,
    2, 2, 2, 2, 2, 1, 1, 1, 1, 6, 2, 2, 2, 2, 2, 1, 1, 1, 1, 6, 2,
        2, 1,12, 1, 1, 8, 5, 2, 1,12, 1, 1, 8, 5, 2, 1,12, 1, 1, 8, 5,
        2, 10,2, 1, 2, 2, 1, 2, 2, 2, 2, 10,2, 1, 2, 2, 1, 2, 2, 2, 2,
        2, 2, 2, 1, 2, 2, 7, 2, 2, 2, 1, 2, 2, 7, 2, 2, 2, 1, 2, 2, 7
        };
        
        for(int i=0; i<13; i++)
            for(int j=0; j<21; j++)
                tmp.setCell(j, i, pole[21*i+j]);
            
        return tmp;
    }
    
    public void stop(){z = false;}
    
    public void run() 
    {
        Graphics g = getGraphics();
        while(z)
        {            
            inputKey();
            
            init(g);
            
            try{ Thread.sleep(20);}
            catch(java.lang.InterruptedException zxz){}
        }
    }
    

/* Здесь особо можно не вникать, просто происходит управление и остановка по мере приближения к концу экрана. А также передвижение самого мяча, если фон полностью прокручен(для того,чтобы можно было попасть в угол экрана, так мяч всегда в центре и движется только задник)*/
    private void inputKey()
    {
        int keyState = getKeyStates();
        
        if((keyState & LEFT_PRESSED) != 0 ) 
        {
            if(fonPole.getX()<0 && ball.getX()<getWidth()/2)
                fonPole.move(5,0);
            else
            {
                if(ball.getX()>0)
                    ball.move_left();
            }          
        }
        if((keyState & RIGHT_PRESSED) != 0 ) 
        {
            if((fonPole.getX()>-fonPole.getWidth()+getWidth()) && ball.getX()>getWidth()/2)
                fonPole.move(-5,0);
            else
            {
                if(ball.getX()<getWidth()-ball.getWidth())
                    ball.move_right();
            }
        }
        if((keyState & UP_PRESSED) != 0 ) 
        {
            if(fonPole.getY()<0 && ball.getY()<getHeight()/2)
                fonPole.move(0,5);
            else
            {
                if(ball.getY()>0)
                    ball.move_up();
            }
        }
        if((keyState & DOWN_PRESSED) != 0 )
        {
            if((fonPole.getY()>-fonPole.getHeight()+getHeight()) && ball.getY()>getHeight()/2)
                fonPole.move(0,-5);
            else
            {
                if(ball.getY()<getHeight()-ball.getHeight())
                ball.move_down();
            }
        }
    }
    
    private void init(Graphics g)
    {
        x = new Integer(g.getClipWidth());
        y = new Integer(g.getClipHeight());
        g.setColor(0xffffff);
        g.fillRect(0,0,getWidth(),getHeight());
        lm.paint(g,0,0);
        flushGraphics();
    }
    
    private void collide()
    {
        if(ball.collidesWith(fonPole, true))
        {
            
        }
    }
    
}



Надеюсь код понятен,если что, распишу все.
--------------------
PM MAIL   Вверх
Zandr
Дата 29.6.2005, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Мдя, ребята, setFullScreenMode() это конечно хорошо, только в спецификации MIDP1.0 его еще нет... Так что делайте две канвы (под MIDP1 и MIDP2) с конструкторами по умолчанию. Выносите методы, которые вызываются извне, в интерфейс, добавляйте, что эти Canvas implements ваш интерфейс, а в мидлете (или где вы создаете вашу канву) создавайте ее ч-з:
Код

Class canvasClass;
if (midpVer >= 2) {
  canvasClass = Class.forName( "mygame.myFullscreenCanvas");
} else {
  canvasClass = Class.forName( "mygame.myStandartCanvas");
}
MyCanvas canvas = (MyCanvas) canvasClass.newInstance();

Можно даже без интерфейса обойтись. Просто пишется MyCanvas и MyFullScreenCanvas (которая наследует от MyCanvas и делает вызовы к setFullScreen.....). А в приложении определяется MIDP и по результату загружается нужный класс канвы, с помощью которого создается инстанс, который потом кастится в MyCanvas. Извне естественно fullScreenMode менять нельзя, только из MyFullScreenCanvas.
PM MAIL   Вверх
NickTo
Дата 3.8.2005, 11:21 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











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

       //XXX Fullscreen for MIDP 2.0
        this.setFullScreenMode(true);
 

  Вверх
javastic
Дата 8.8.2005, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1214
Регистрация: 18.3.2005
Где: St.Petersburg

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



Nikolka52 мы не поддерживаем и не приветствуем взлом чужих программ, Мы пытаемся делать их сами.

М
 
Просьба болше не писать о взломе в этом форуме.



--------------------
01101010 01100001 01110110 01100001 01110011 01110100 01101001 01100011
scjp, mcp 
PM MAIL WWW ICQ   Вверх
Steeller
Дата 14.9.2005, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Канва на весь экран реализуется сугубо под каждую платформу отдельно. Например, в Нокии вместо Canvas используется FullCanvas
public class Game
extends FullCanvas
implements Runnable {...
И т.д.
Добавлено @ 16:11
При этом нужно обязательно подключить специфичную библиотеку. Для Нокии, опять же:
import com.nokia.mid.ui.*;

Это сообщение отредактировал(а) Steeller - 14.9.2005, 16:12
PM MAIL   Вверх
W0LF
Дата 9.2.2006, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


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

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



блин, а что такое не работает в MIDP2 (ну для к500i точно работатет):
Код

setFullScreenMode(boolean mode) 

???


упс. вторую страницу не дочитал smile
с первым MIDP повозиться надо


Это сообщение отредактировал(а) W0LF - 9.2.2006, 19:30


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
Ответ в темуСоздание новой темы Создание опроса

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

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


 




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


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

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