J2ME: Как сохранить линию, созданную с помощью drawline (), и начать заново с конечной точки линии, сохраняя предыдущую? - PullRequest
2 голосов
/ 10 марта 2012

Я пытаюсь создать мидлет, с помощью которого я могу рисовать что угодно с помощью клавиш управления курсором.Я использовал метод drawLine.Но я хочу создать линию, затем изменить направление, сохраняя предыдущую линию, но линия продолжает вращаться.

По сути, я должен иметь возможность рисовать что угодно в любом направлении.

Это мой код:

public class Pacer extends MIDlet{
public void startApp() {
Displayable d = new PacerCanvas();

d.addCommand(new Command("Exit", Command.EXIT, 0));
d.setCommandListener(new CommandListener() {
  public void commandAction(Command c, Displayable s) {
    notifyDestroyed();
  }
} );

Display.getDisplay(this).setCurrent(d);
 }

public void pauseApp() { }

public void destroyApp(boolean unconditional) { }
}
/**
*
* @author Rumman
*/
import javax.microedition.lcdui.*;

public class PacerCanvas extends Canvas {

private String name;
private int w,h,x1,y1,x2,y2;

public PacerCanvas(){
w = getWidth();
h = getHeight();
x1 =  w/2 ;
y1 = h/2 ;
x2 = x1 ;
y2 = y1 ;
}

protected void keyPressed(int key){
    name = getKeyName(key);
    if(name.equals("Right") || name.equals("6")){
    x2++;
    }
    else if(name.equals("Left") || name.equals("4")){
    x2--;
    }
    else if(name.equals("Up") || name.equals("2")){
    y2--;
    }
    else if(name.equals("Down") || name.equals("8")){
    y2++;
    }
    else if(name.equals("1")){
        x2--;
        y2++;
    }
    else if(name.equals("3")){
        x2++;
        y2++;
    }
    else if(name.equals("7")){

    }
    else if(name.equals("9")){
    }
    repaint();  
}

public void paint(Graphics g) {

g.setColor(0xffffff);
g.fillRect(0, 0, w, h);

g.setColor(0x000000);
g.drawLine(x1, y1, x2, y2);
}
}

Ответы [ 2 ]

1 голос
/ 30 марта 2012
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

/**
*
* @author Rumman
*/
import javax.microedition.lcdui.*;

public class PacerCanvas extends Canvas {

private String name;
private int w,h,x1,y1,x2,y2;
private Image image;
private Graphics ig;
public PacerCanvas(){
w = getWidth();
h = getHeight();
x1 =  w/2 ;
y1 = h/2 ;
x2 = x1 ;
y2 = y1 ;
image = Image.createImage(w,h);

ig = image.getGraphics();

ig.setColor(255, 255, 255);
ig.fillRect(0, 0, w, h);

}
protected void keyRepeated(int key){
keyPressed(key);
keyPressed(key);// I used this method multiple times as it makes it faster 
keyPressed(key);
keyPressed(key);
keyPressed(key);
keyPressed(key);
keyPressed(key);
keyPressed(key);
}
protected void keyPressed(int key){
    name = getKeyName(key);
    if(name.equals("Right") || name.equals("6")){
    x2++;
    }
    else if(name.equals("Left") || name.equals("4")){
    x2--;
    }
    else if(name.equals("Up") || name.equals("2")){
    y2--;
    }
    else if(name.equals("Down") || name.equals("8")){
    y2++;
    }
    else if(name.equals("1")){
        x2--;
        y2--;
    }
    else if(name.equals("3")){
        x2++;
        y2--;
    }
    else if(name.equals("7")){
        x2--;
        y2++;
    }
    else if(name.equals("9")){
        x2++;
        y2++;
    }
    repaint();  
}

public void paint(Graphics g) {


ig.setColor(0x000000);
ig.drawLine(x1, y1, x2, y2);
g.drawImage(image, 0, 0, Graphics.TOP|Graphics.LEFT);
x1=x2;
y1=y2;


}

public void draw(Image i) {
Graphics ig = i.getGraphics();
Pacer p = new Pacer();
// p.Display.getDisplay(this).setCurrent(i);
}
}
1 голос
/ 10 марта 2012

ваш код стирает экран, а затем каждый раз перерисовывает одну линию.

(Graphics.fillRect(0,0,width,length) в paint() стирает экран)

строка всегда начинается в центре экрана, потому что x1 и y1 никогда не меняются.

пользовательский ввод изменяет только конечную точку линии.

это не то, что вы, кажется, хотите сделать.

Есть 2 способа сделать то, что вы просите:
- запоминать каждый пользовательский ввод (в векторе), очищать экран и перерисовывать все строки каждый раз, когда вы перерисовываете. не совсем эффективен с точки зрения памяти или мерцания.
- прекратите стирать экран и просто нарисуйте новую линию для каждого пользовательского ввода.

в обоих случаях вы, вероятно, захотите сделать x1=x2;y1=y2; после каждого вызова drawLine();, чтобы переместить начало следующей строки в конец предыдущей строки.

Я также думаю, что вы хотите внедрить keyRepeated() для улучшения взаимодействия с пользователем.

Вы также можете изменить клип (используя Graphics.setClip()) при перерисовке, чтобы телефон обновлял только небольшую часть экрана для повышения производительности.

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

Чтобы использовать двойную буферизацию, вам нужно Image.getGraphics() и Graphics.drawImage()

...