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

Я пытаюсь создать мидлет, с помощью которого я могу рисовать что угодно с помощью клавиш курсора. Я использовал метод 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);
}
}

person rumman0786    schedule 10.03.2012    source источник


Ответы (1)


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

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

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

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

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

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

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

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

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

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

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

person michael aubert    schedule 10.03.2012
comment
Спасибо за ответ, у меня проблемы с реализацией того, что вы сказали. 1. вы сказали - прекратите стирать экран и просто рисуйте новую строку для каждого ввода пользователя. Как теперь перестать стирать экран? и как я могу его сохранить? Я использую keyPressed (), и теперь, когда вы предложили keyreapeated () и без перерисовки, как я могу нарисовать новую строку, сохранив предыдущую? 2. кто-то предложил мне нарисовать изображение и сохранить его, а затем перезаписать это изображение .... Мне это не удается. - person rumman0786; 24.03.2012
comment
3. x1 = x2; y1 = y2; Я понимаю это и также сделал то, что вы мне сказали, но проблема в том, что я не могу сохранить свои предыдущие рисунки на экране, он всегда удаляется и превращается в указатель / мышь. Вот мой измененный код ... не могли бы вы показать мне, как я могу реализовать то, что я пытаюсь сделать? - person rumman0786; 24.03.2012
comment
ответ обновлен для 1 и 2. для 3 вы не добавили новый код в правильное место. прочтите ответ еще раз. - person michael aubert; 26.03.2012
comment
Спасибо, @QuickRecipesOnSymbianOS, за вашу помощь. Я делал то, что хотел. Мой код приведен ниже в качестве ответа. - person rumman0786; 30.03.2012