2014-02-11 4 views
0

У меня проблема, которую я пытался решить почти 2 дня. (В итоге, переключившись на OpenGL: D) Во всяком случае ... У меня есть Canvas, и я пытаюсь сделать простую змеиную игру. Только для этой задачи представим себе змея состоит из 5х5 пикселей прямоугольников, он оставляет след (без клиринговой) и перемещение вправо от 0, 50 позиции ... вот код:Android Canvas weird shifting

public class Snake extends AnimationWallpaper { 

    @Override 
    public Engine onCreateEngine() { 
     return new SnakeEngine(); 
    } 

    class SnakeEngine extends AnimationEngine { 
     int i = 0; 
     Paint paint = new Paint(); 

     @Override 
     public void onCreate(SurfaceHolder surfaceHolder) { 
      super.onCreate(surfaceHolder); 

      // By default we don't get touch events, so enable them. 
      setTouchEventsEnabled(true); 
     } 

     @Override 
     public void onSurfaceChanged(SurfaceHolder holder, int format, 
            int width, int height) { 
      super.onSurfaceChanged(holder, format, width, height); 
     } 

     @Override 
     public void onOffsetsChanged(float xOffset, float yOffset, 
            float xOffsetStep, float yOffsetStep, int xPixelOffset, 
            int yPixelOffset) { 

      super.onOffsetsChanged(xOffset, yOffset, xOffsetStep, yOffsetStep, 
        xPixelOffset, yPixelOffset); 
     } 

     @Override 
     public Bundle onCommand(String action, int x, int y, int z, 
           Bundle extras, boolean resultRequested) { 
      if ("android.wallpaper.tap".equals(action)) { 
      } 
      return super.onCommand(action, x, y, z, extras, resultRequested); 
     } 

     @Override 
     protected void drawFrame() { 
      SurfaceHolder holder = getSurfaceHolder(); 

      Canvas c = null; 
      try { 
       c = holder.lockCanvas(); 
       if (c != null) { 
        draw(c); 
       } 
      } finally { 
       if (c != null) 
        holder.unlockCanvasAndPost(c); 
      } 
     } 

     void draw(Canvas c) { 
      //c.save(); 
      //c.drawColor(0xff000000); 

      paint.setAntiAlias(true); 

      // paint the fill 
      paint.setColor(Color.RED); 
      paint.setStyle(Paint.Style.FILL_AND_STROKE); 
      c.drawRect(i*5, 50, (i+1)*5, 55, paint); 

      //c.restore(); 
     } 

     @Override 
     protected void iteration() { 
      i++; 

      super.iteration(); 
     } 

    } 

} 

И вот выход: output

И это еще не все, когда он рисует его любопытное смещение ... это означает, что вы видите, смещено в правую сторону, чтобы оно не actualy стоять на том же месте ...

Если у вас есть какие-либо идеи, почему это так, сообщите мне!

ответ

0

В холсте есть функция повторного использования, которая практически просто добавляет новые рисунки к тому, что находится на холсте, поэтому, если вы рисуете 1 квадрат в то время, в следующий раз, когда у вас будет все, что у вас было до +1, если вы не хочу этого, и вы хотите, чтобы полностью манипулировать каждую ничью с нуля, просто добавьте эту строку кода, прежде чем начать рисовать

canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); 

Он очистит все, что было в предыдущем состоянии холста, и вы можете начать снова рисовать все, что хотите ...

Надеюсь, что это поможет!

С уважением!

+0

Нет, я не хочу ясного, актуального, я хочу опояснить. Но он должен нарисовать прямую линию вместо пунктирной ... это «сдвиг», о чем я говорю. Srsly не знаю, где проблема ... Я зарегистрировал фактические переменные, и они в порядке ... может быть, проблема с DPI? Не знаю... – arenaq