Низкоуровневое программирование. Обработка нажатий.
Обработка нажатий клавиатуры
Для обработки нажатий в GameCanvas нужно воспользоваться методом getKeyStates. Он возвращает значение последней нажатой клавиши. Для того, чтобы узнать назначение нажатой клавиши, необходимо воспользоваться константами, например, LEFT_PRESSED, FIRE_PRESSED и т.д. Вот пример программы, которая осуществляет обработку нажатий клавиш
Файл HelloMIDlet.java
package hello;
import javax.microedition.midlet.*;
public class HelloMIDlet extends MIDlet{
Canva canva;
public HelloMIDlet() {
canva=new Canva(this);
}
public void startApp() {
while(true){
canva.paint();
}
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
canva=null;
}
}
Файл Canva.java
package hello;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.game.GameCanvas;
public class Canva extends GameCanvas{
Display myDisplay;
Canva(HelloMIDlet midlet){
super(true);
myDisplay=Display.getDisplay(midlet);
myDisplay.setCurrent(this);
setFullScreenMode(true);
}
void paint(){
paint(getGraphics());
flushGraphics();
}
public void paint(Graphics g){
int x=getKeyStates();
String s="";
if(x==LEFT_PRESSED){
s="Left";
}else if(x==RIGHT_PRESSED){
s="right";
}else if(x==UP_PRESSED){
s="up";
}else if(x==DOWN_PRESSED){
s="down";
}else if(x==FIRE_PRESSED){
s="fire";
}
g.setColor(Integer.MAX_VALUE);
g.fillRect(0, 0, g.getClipWidth(), g.getClipHeight());
g.setColor(0);
g.drawString(s, 10, 10, 0);
}
}
MobileApplication2.jad
MobileApplication2.jar
Данная программа неидеальна - в ней есть вечный цикл, что может повлечь кучу глюков. Например, будет невозможно выйти из приложения с помощью стандартных методов. В реальной программе для обработки нажатий следует воспользоваться, например, таймером. Вот как это может выглядеть:
Файл HelloMIDlet.java:
package hello;
import javax.microedition.midlet.*;
public class HelloMIDlet extends MIDlet{
Canva canva;
public HelloMIDlet() {
canva=new Canva(this);
}
public void startApp() {
canva.start();
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
canva=null;
}
}
Файл Canva.java
package hello;
import java.util.Timer;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.game.GameCanvas;
public class Canva extends GameCanvas{
Display myDisplay;
String s;
MyTimer timer;
Canva(HelloMIDlet midlet){
super(true);
myDisplay=Display.getDisplay(midlet);
myDisplay.setCurrent(this);
setFullScreenMode(true);
}
void start(){
timer=new MyTimer(this);
new Timer().schedule(timer, 0, 10);
}
void paint(){
paint(getGraphics());
flushGraphics();
}
public void flushKey(){
int x=getKeyStates();
s="";
if(x==LEFT_PRESSED){
s="Left";
}else if(x==RIGHT_PRESSED){
s="right";
}else if(x==UP_PRESSED){
s="up";
}else if(x==DOWN_PRESSED){
s="down";
}else if(x==FIRE_PRESSED){
s="fire";
}else{
s=x + "";
}
paint();
}
public void paint(Graphics g){
g.setColor(Integer.MAX_VALUE);
g.fillRect(0, 0, g.getClipWidth(), g.getClipHeight());
g.setColor(0);
g.drawString(s, 10, 10, 0);
}
}
Файл MyTimer.java
package hello;
import java.util.TimerTask;
public class MyTimer extends TimerTask{
Canva canva;
MyTimer(Canva canva){
this.canva=canva;
}
public void run() {
canva.flushKey();
}
}
Не все нажатия клавиши можно определить таким способом. Некоторые клавиши можно обработать с помощью объекта объекта Command, другие являются системными, третьи, хоть и не являются системными, но все равно не обрабатываются. В общем, разработчики виртуальных машин постарались усложнить нам жизнь.
Обработка нажатий в сенсорном телефоне.
Тут все гораздо проще. Есть три переопределяемых public- метода:
- pointerPressed(int x, int y) - момент нажатия на экран.
- pointerDragged(int x, int y) - удерживание.
- pointerReleased(int x, int y) - момент отпускания.
При возникновении одного из этих событий вызывается соответствующий метод, в который в качестве параметров передаются координаты нажатия.
Напомню, что для того, чтобы выбрать в качестве эмулятора сенсорный телефон, нужно щелкнуть на проекте правой кнопкой мыши, выбрать пункт "Свойства" ("Properties") и на вкладке "Платформа" ("Platform") выбрать в качестве девайса "DefaultFixTouchPhone".
Так как все предельно ясно, то перейдем сразу к примеру (единственное, что стоит уточнить: если в момент отработки метода, например, pointerPressed, вызовется еще один этот метод, то только что вызванный метод встанет в очередь и начнет работать после того, как отработает первый метод).
Файл HelloMIDlet.java
package hello;
import javax.microedition.midlet.*;
public class HelloMIDlet extends MIDlet{
Canva canva;
public HelloMIDlet() {
canva=new Canva(this);
}
public void startApp() {
canva.paint();
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
canva=null;
}
}
Файл Canva.java
package hello;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.game.GameCanvas;
public class Canva extends GameCanvas{
Display myDisplay;
String s="";
Canva(HelloMIDlet midlet){
super(true);
myDisplay=Display.getDisplay(midlet);
myDisplay.setCurrent(this);
setFullScreenMode(true);
}
void paint(){
paint(getGraphics());
flushGraphics();
}
public void pointerPressed(int x, int y){
s=x + " " + y;
paint();
}
public void pointerDragged(int x, int y){
s=x + " " + y;
paint();
}
public void pointerReleased(int x, int y){
s="";
paint();
}
public void paint(Graphics g){
g.setColor(Integer.MAX_VALUE);
g.fillRect(0, 0, g.getClipWidth(), g.getClipHeight());
g.setColor(0);
g.drawString(s, 10, 10, 0);
}
}
MobileApplication2.jad
MobileApplication2.jar