2013-04-19 3 views
1

Я разрабатываю игру для Android. Между этапами я хочу показать часть карты с маршрутом и перенести ее из города в город (с этапа на сцену).Перемещение растрового изображения с SurfaceView медленно

Сначала я хочу сделать это на своем телефоне, это Samsung Galaxy Y, 240x320 Qvga ldpi.

Итак, у меня есть файл карты в формате jpg. Это изображение 2463x602, это карта мира. Я сделал это, все сделано, кроме одного. Эта «анимация» для меня медленная.

Когда я начну с этого, я подумал, что это будет так быстро, и я буду обрабатывать скорость с помощью Thread.sleep(); но дело в том, что это не быстро.

Как я могу сделать это быстрее? Вот мой код:

package hu.mycompany.myproject; 

import android.app.Activity; 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Paint; 
import android.graphics.Rect; 
import android.media.AudioManager; 
import android.media.SoundPool; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Menu; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 

public class MapActivity extends Activity { 

    DrawView drawView; 
    SoundPool soundPool; 
    int soundId; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     this.setVolumeControlStream(AudioManager.STREAM_MUSIC); 
     soundPool = new SoundPool(1, AudioManager.STREAM_MUSIC, 0); 
     soundId = soundPool.load(this, R.raw.airplane, 1); 
     drawView = new DrawView(this); 
     setContentView(drawView); 
    } 

    public void playSound() { 
     soundPool.play(soundId, 1f, 1f, 1, 0, 1f); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     playSound(); 
     drawView.resume(); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     drawView.pause(); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.activity_map, menu); 
     return true; 
    } 

    public class DrawView extends SurfaceView implements Runnable { 
     Bitmap gameMap = null; 
     Thread gameLoop = null; 
     SurfaceHolder surface; 
     Rect rect; 
     volatile boolean running; 
     volatile boolean moved; 

     public DrawView(Context context) { 
      super(context); 
      moved = false; 
      surface = getHolder(); 
      gameMap = BitmapFactory.decodeResource(getResources(), 
        R.drawable.map); 

     } 

     public void resume() { 
      running = true; 
      gameLoop = new Thread(this); 
      gameLoop.start(); 
     } 

     public void pause() { 
      running = false; 
      while (true) { 
       try { 
        gameLoop.join(); 
       } catch (InterruptedException e) { 

       } 
      } 
     } 

     @Override 
     public void run() { 
      Rect canvasSize = new Rect(0, 0, 240, 320); 
      Paint paint = new Paint(); 
      paint.setAntiAlias(true); 
      while (running) { 
       if (!surface.getSurface().isValid()) { 
        continue; 
       } 
       if (!moved) { 
        int i; 
        for (i = 80; i <= 830; i++) { 
         Canvas canvas = surface.lockCanvas(); 
         rect = new Rect(i, 250, (i + 240), 570); 
         canvas.drawBitmap(gameMap, rect, canvasSize, paint); 
         surface.unlockCanvasAndPost(canvas); 
        } 
        moved = true; 
       } 
      } 
     } 

    } 

} 
+0

Я забыл упомянуть, размер файла изображения 145 КБ – vaso123

ответ

0

1-попробуйте уменьшить размер изображения, экспортируя его сохранить для веб в Photoshop и выберите PNG в качестве типа расширения 2- Вы должны создать два класса, один для обработки нити и другой для рендеринга и игровая логика. Поток будет управлять им путем блокировки холста при рендеринге системы. Посмотрите на эту ссылку http://android-er.blogspot.com/2010/05/android-surfaceview.html

+0

Я попытался уменьшить размер моей картинки. PNG будет больше, поэтому я выбираю jpg с низким качеством. Теперь я сократил изображение до половины, так что теперь это 82,2KB и 1210x602. это скорее немного больше, но не значимо. И вообще, если вы видите мой код, я делаю именно то, что вы говорите. Существует класс для рендеринга, называемый DrawView. (Если в блоге вы порекомендовали меня, проверьте загружаемый файл, Avira сообщает, что он содержит вирус). – vaso123

+0

нет, это не мое, я просто нашел его в результатах поиска, кстати, код должен работать, почему вам нужно скачать файл sourcce? Редактировать: я нашел другого, попробуйте этот, http://obviam.net/index.php/a-very-basic-the-game-loop-for-android/ –

+0

, конечно, я попытался скопировать/вставить этот проект, он говорит мне по строке 46: Подозрительный вызов метода; вероятно, следует называть «draw», а не «onDraw» Я думал, что это ваш блог, вот почему я говорю вам. Я также проверяю вашу вторую ссылку. – vaso123

Смежные вопросы