Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java ME (J2ME) > Вывод GameCanvas на дисплей


Автор: Димончик 19.1.2011, 22:35
Всем привет. 

Canvas понятно как выводить, а от GameCanvas - нет... Подскажите пожалуйста!
Нигде не могу найти образец GameCanvas - а, нигде вообще, вот уже 5 чесов сижу и уже прям  - немогу...
В офыцыальной доке SUN - Примеров я тоже не нашол, да мне всего то пару строчек кода нужно где то гнлянуть, не надо там кучу переменных писать или ещо чего-нибудь вообщем... Подскажите, пожалуйста...
Сам  по себе Canvas - был бы отличны, еслибы не то, что обработка клавиш происходит после рисования или наоборот - перед, а мне нужно чтобы можно было опросить клавиши в любую милисекунду. я слишал ето возможно на GameCanvas????


package g;

import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Graphics;

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


public class c3d extends MIDlet {
  
    public Display dis;//ссылка на дисплей
   
    public c3d(){

    dis=Display.getDisplay(this);

    }


    public void startApp() {

       gc canvasss=new gc();
        dis.setCurrent(canvasss);
     
    }

    public void pauseApp() {
    }

    public void destroyApp(boolean unconditional) {
    }


  class gc extends GameCanvas {
       public gc() {
        super(true);
     }

            public void peint (Graphics g){
               g.setColor(234,23,106);
               g.drawString("gerger",0,0,g.LEFT|g.TOP);
            repaint();
            }
  }





}



Подскажите пожалуйста, как правильно написать GameCanvas и как узнавать о нажатиях клавиш в любое время, а не тогда когда 
чтото нарисуется, как в Canvas. Пожалуйста пожалуйста, помогите, плиз, если вам, конечно, не жалко 1 минуты на написание...


Автор: math64 20.1.2011, 08:35
Примеры есть в самом SDK, например example.pushpuzzle.PushPuzzleCanvas.

Автор: GenaNa 23.1.2011, 02:43
flushGraphics(); вместо paint();

Перед flushGraphics() нужно получить "графику"
Код

Graphics g = getGraphics();


Repaint вызивает метод paint() обычного canvas.
Так что вызывать repaint в paint-e не надо.
В GameCanvas для вывода нарисованого используют flushGraphics();
Хотя можно перекрыть и paint(), для чего его нужно описать отдельно
Код

public void paint(Graphics g){
// функции рисования
}


Кстати, у тебя там peint

Я бы вообще вынес класс gc в отдельный файл gc.java:
Код

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

class gc extends GameCanvas implements Runnable{

Graphics g;                  //"графика"
MIDlet midlet;             //управляющий мидлет
Thread thread;            // отдельный поток, в котором все будет исполнятся
boolean isRunning = false; // признак работы потока
boolean isChanged = true; // условие  перерисовки

//конструктор класса
public gc(MIDlet mid, Display display){// в параметрах передаем управляющий мидлет и дисплей
     super(false);
     midlet = mid;    //делаем управляющий мидлет глобальной переменной
     g = getGraphics(); // получаем графику
     setFullScreenMode(true); //полноэкранный режим
     thread = new Thread(this); //создаем поток
     display.setCurrent(this); //выводим самих себя (gc) на дисплей
     thread.start(); //запускаем поток
}

//этот метод выполняется при старте потока
public void run(){
    while(isRunning){//пока верно
       //если рисуем впервые или рисунок нужно перерисовать
      if(isChanged){
          //все рисуется в буфер
          g.setColor(234,23,106);
          g.drawString("gerger",0,0,g.LEFT|g.TOP);
          //буфер копируется на gcanvas
          flushGraphics();
          isChanged = false;//рисунок не нужно перерисовывать
      }
      
       //пробуем остановить поток на 100 милисекунд
       try{
                thread.sleep(100);
       }catch(Exception e){
          //
       }
   }
   // если не isRunning - вызываем завершающий метод управляющего мидлета
   midlet.exit();
}

//обработка нажатий клавиш
public void keyPressed(int keyCode){
    //синхронизируем с нашим потоком
    synchronized(this){
        switch(keyCode){
            //в зависимости от нажатой кнопки выполняем действие
            case -7:
                //если код кнопки -7 сбрасываем признак продолжения потока, см. run()
                isRunning = false;
            break;
        }
        //если нажата любая кнопка, перерисуем экран
        isChanged = true;
    }
}

}


Управляющий мидлет
Код

public class c3d extends MIDlet {
  
  public Display dis;//ссылка на дисплей
   
  public c3d(){

      dis=Display.getDisplay(this);

 }


    public void startApp() {

        gc canvasss=new gc(this, dis);//нашему geme canvas передаем в качестве параметров управляющий мидлет и дисплей
     
    }

    public void pauseApp() {
    }

    public void destroyApp(boolean unconditional) {
    }

   //помимо стандартных, напишем обработчик выхода, который будет вызыватся canvasss -oм
   public void exit(){
         destroyApp(false);
         notifyDestroyed();
   }


}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)