java - 每隔几秒绘制一次 Sprite

标签 java android

我想在定义的时间间隔内一次又一次地在下面的代码中执行这段代码

  for (Sprite sprite : sprites) {
         sprite.onDraw(canvas);             

          }

我尝试了几种方法,但我遇到了错误。因为我的所有动画都与 sleep 和线程扩展类同步

    package com.okok;
 import java.util.ArrayList;
 import java.util.List;
 import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.SurfaceHolder.Callback;
public class GameView extends SurfaceView {
   private Bitmap bmp;
   private SurfaceHolder holder;
   private GameLoopThread gameLoopThread;
   private List<Sprite> sprites = new ArrayList<Sprite>();
   private long lastClick;
private Bitmap bmpBlood;
private List<TempSprite> temps = new ArrayList<TempSprite>();
private int mint;
   public GameView(Context context) {
         super(context);
         gameLoopThread = new GameLoopThread(this);
         holder = getHolder();
         holder.addCallback(new Callback() {
                @Override
                public void surfaceDestroyed(SurfaceHolder holder) {
                }
                @Override
                public void surfaceCreated(SurfaceHolder holder) {
                       createSprites();
                       gameLoopThread.setRunning(true);
                       gameLoopThread.start();
                }
                @Override
                public void surfaceChanged(SurfaceHolder holder, int format,
                              int width, int height) {
                }
         });
         bmpBlood = BitmapFactory.decodeResource(getResources(), R.drawable.blast);
   }
   private void createSprites() {
         sprites.add(createSprite(R.drawable.greenenact));
         sprites.add(createSprite(R.drawable.greenenact));
         sprites.add(createSprite(R.drawable.greenenact));

   }
   private Sprite createSprite(int resouce) {
         Bitmap bmp = BitmapFactory.decodeResource(getResources(), resouce);
         return new Sprite(this, bmp);
   }
   @Override
   protected void onDraw(Canvas canvas) {
         canvas.drawColor(Color.rgb(21, 181, 195));
         for (int i = temps.size() - 1; i >= 0; i--) {
             temps.get(i).onDraw(canvas);
       }
         for (Sprite sprite : sprites) {
             sprite.onDraw(canvas);             

              }

   }

@Override
   public boolean onTouchEvent(MotionEvent event) {
         if (System.currentTimeMillis() - lastClick > 500) {
                lastClick = System.currentTimeMillis();
             synchronized (getHolder()) {
             float x = event.getX();
                float y =event.getY();

                   for (int i = sprites.size() - 1; i >= 0; i--) {
                        Sprite sprite = sprites.get(i);
                        if (sprite.isCollition(x, y)) {
                              sprites.remove(sprite);
                            temps.add(new TempSprite(temps, this, x, y, bmpBlood));
                              break;
                        }
                    }
                }
         }
         return true;
   }
   }

这是我用来移动东西的 GameLoopThread 类

  package com.okok;

   import android.graphics.Canvas;
   public class GameLoopThread extends Thread {
   static final long FPS = 10;
   private GameView view;
   private boolean running = false;

   public GameLoopThread(GameView view) {
         this.view = view;
   }

   public void setRunning(boolean run) {
         running = run;
   }

   @Override
   public void run() {
         long ticksPS = 1000 / FPS;
         long startTime;
         long sleepTime;
         while (running) {
                Canvas c = null;
                startTime = System.currentTimeMillis();
                try {
                       c = view.getHolder().lockCanvas();
                       synchronized (view.getHolder()) {
                              view.onDraw(c);
                       }
                } finally {
                       if (c != null) {
                              view.getHolder().unlockCanvasAndPost(c);
                       }
                }
                sleepTime = ticksPS - (System.currentTimeMillis() - startTime);
                try {
                       if (sleepTime > 0)
                              sleep(sleepTime);
                       else
                              sleep(10);
                } catch (Exception e) {}
         }
   }
    }

最佳答案

尝试这样的事情:

 private void createSprites() {
       {
        new Thread(new Runnable() {
            public void run() {
                for (int z =0; z<20; z++ ) // total of 20 sprites
                try
                    {
                    Thread.sleep(5000);   // new enemy every 5 seconds
                    sprites.add(createSprite(R.drawable.image));
                    z++;

                    }
                catch(InterruptedException e)
                    {
                    e.printStackTrace();
                    }
            }
        }).start();
       }

关于java - 每隔几秒绘制一次 Sprite,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19327751/

相关文章:

java - 如何在启动 Kotlin 时刷新 Activity ?

java - 类设计最小化内存使用 : if an object instance variable (non-primitive) is null does it still use the necessary reference bytes?

java - 防止水平调整 SWT 窗口的大小

java - 为什么我的自定义异常不起作用? java

java - 如何在 Firestore 查询的组合任务中获取最后一个可见的 DocumentSnapshot?

android - 如何在android中实现阴影(环境光)背景?

android - React-Native 构建的应用程序使用旧图像

java - Spring:init-method、PostConstruct、afterPropertiesSet:何时使用其中一个而不是其他?

java - android - 从命令行构建时的链接资源

android - 调试和 Release模式的 SHA-1 证书是否不同?