Zitat:
image1.canvas.moveto(shape1.left, shape1.top);
image1.canvas.lineto(shape1.left, shape1.top);
Öhm...du zeichnest eine Line auf den gleichen Punkt wie den Startpunkt? Das ergibt nicht soviel Sinn
Ich kenne jetzt deinen Code nicht, aber ich schätze mal, dass das Flackern daher kommt, dass das Shape das Image überlappt...?
Edit:
Das ist generell keine gute Idee. Wenn du eine Zeichenfläche hast, dann sollte die auch für sich alleine stehen und nicht durch andere Objekte überlagert werden, das gibt sonst Chaos bei den Repaint-Zyklen der einzelnen Objekte.
Sinnvoller wäre es doch, die Schiffe auch auf den Canvas zu zeichnen, anstatt dafür jeweils ein einzelnes Shape zu nehmen.
Poste mal bitte ein wenig mehr code.