java - 安卓图片加载

标签 java android image

我对 Android 相当陌生,在加载图像时遇到问题。我当前的代码如下所示:

package com.android.skeleton;

import java.io.IOException;
import java.io.InputStream;
import java.util.Random;

import android.content.Context;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.media.SoundPool;

public class GameModel extends Game {
    private Bitmap background;
    private Bitmap gameover;
    public final int PLAYER = 0;
    public final int ENEMY = 1;
    public final int EXIT = 2;
    public final int BIGENEMY = 3;

    private int health;

    Sprite player;
    Enemy enemy1;
    Enemy enemy2;
    BigEnemy enemy3;
    Enemy enemy4;
    Enemy enemy5;
    Enemy enemy6;
    Exit exit;

    //Images
    Bitmap cat;
    Bitmap jellyfish;
    Bitmap bigdog;
    Bitmap exitTile;

    SoundPool music;
    SoundPool damageSound;

    Context context;
    InputStream inputStream = null;

    private static GameModel gameModel = null;
    public static GameModel getGameModel(){
        if(gameModel == null){
            gameModel = new GameModel();
        }
        return gameModel;
    }
    private GameModel(){

    }

    public void update(){

    }

    public void draw(Canvas canvas){

    }

    public boolean processTouchEvent(int x, int y){
        return false;
    }
    @Override
    public void gameStart() {
        // TODO Auto-generated method stub

         try{
                AssetManager assetManager = context.getAssets();
                inputStream = assetManager.open("/resources/blackcat.png");
                cat = BitmapFactory.decodeStream(inputStream);
                inputStream.close();

                inputStream = assetManager.open("/resources/Jellyfish1.png");
                jellyfish = BitmapFactory.decodeStream(inputStream);
                inputStream.close();

                inputStream = assetManager.open("/resources/Dog.png");
                bigdog = BitmapFactory.decodeStream(inputStream);
                inputStream.close();

                inputStream = assetManager.open("/resources/exit.png");
                exitTile = BitmapFactory.decodeStream(inputStream);
                inputStream.close();

                inputStream = assetManager.open("/resources/kitchen.png");
                background = BitmapFactory.decodeStream(inputStream);
                inputStream.close();

                inputStream = assetManager.open("/resources/endscreen.png");
                gameover = BitmapFactory.decodeStream(inputStream);
                inputStream.close();
                }catch(IOException ex){}

         gameSetBackground(background);

        player = new Sprite(cat, 0);
        enemy1 = new Enemy(jellyfish, 0);
        enemy2 = new Enemy(jellyfish, 0);
        enemy4 = new Enemy(jellyfish, 0);
        enemy5 = new Enemy(jellyfish, 0);
        enemy6 = new Enemy(jellyfish, 0);
        enemy3 = new BigEnemy(bigdog, 1.4);
        exit = new Exit (exitTile, 0);

        player.setLocation(320, 480);
        player.setType(0);
        player.setActive();
        health = 10;

        enemy1.setLocation(0, 160);
        enemy1.setVelocity(5, 0);
        enemy1.setType(1);
        enemy1.setActive();

        enemy2.setLocation(640, 320);
        enemy2.setVelocity(-5, 0);
        enemy2.setType(1);
        enemy2.setActive();

        Random random = new Random();
        Random random2 = new Random();
        int i = Math.abs(random.nextInt() % 10);
        int j = Math.abs(random2.nextInt() % 10);

        while (i < 2){
            i = Math.abs(random.nextInt() % 10);
        }
        while (j < 2){
            j = Math.abs(random.nextInt() % 10);
        }

        enemy4.setLocation(640, 0);
        enemy4.setVelocity(-i, j);
        enemy4.setType(1);
        enemy4.setActive();

        Random random3 = new Random();
        Random random4 = new Random();
        int k = Math.abs(random3.nextInt() % 10);
        int l = Math.abs(random4.nextInt() % 10);

        while (k < 2){
            k = Math.abs(random.nextInt() % 10);
        }
        while (l < 2){
            l = Math.abs(random.nextInt() % 10);
        }

        enemy5.setLocation(0, 480);
        enemy5.setVelocity(k, l);
        enemy5.setType(1);
        enemy5.setActive();

        enemy6.setLocation(600, 440);
        enemy6.setVelocity(0, -5);
        enemy6.setType(1);
        enemy6.setActive();

        exit.setLocation(600, 0);
        exit.setVelocity(0, 0);
        exit.setType(2);
        exit.setActive();

        //Add sprites to game
        gameAddSprite(player);
        gameAddSprite(enemy1);
        gameAddSprite(enemy2);
        gameAddSprite(enemy3);
        gameAddSprite(enemy4);
        gameAddSprite(enemy5);
        gameAddSprite(enemy6);
        gameAddSprite(exit);

    }
    @Override
    public void gameEnd() {
        // TODO Auto-generated method stub
        player.setInactive();
        enemy1.setInactive();
        enemy2.setInactive();
        enemy3.setInactive();
        enemy4.setInactive();
        enemy5.setInactive();
        enemy6.setInactive();
        exit.setInactive();
        gameSetBackground(gameover);

    }
    @Override
    public void gameUpdate(Canvas canvas) {
        // TODO Auto-generated method stub
        player.update();

        enemy1.rotate(0.1);
        enemy1.update();

        enemy2.rotate(0.1);
        enemy2.update();

        enemy3.update();

        enemy4.rotate(0.1);
        enemy4.update();

        enemy5.rotate(0.1);
        enemy5.update();

        enemy6.rotate(0.2);
        enemy6.update();

        if(enemy3.getPosy() == 430){
            enemy3.setInactive();
        }

        if(health == 0){
            gameEnd();
        }
    }
    @Override
    public void spriteCollide(Sprite s1, Sprite s2) {
        // TODO Auto-generated method stub

        if(s2.getType() == ENEMY && s1.getType() == PLAYER)
        {
            health -= 1;
        }
        if(s2.getType() == BIGENEMY && s1.getType() == PLAYER)
        {
            health -= 1;
        }
        if (s2.getType() == EXIT && s1.getType() == PLAYER)
        {
            gameEnd();
        }
        if(s2.getType() == ENEMY && s1.getType() == ENEMY)
        {
            double i = s2.getVelx();
            double j = s2.getVely();
            double k = s1.getVelx();
            double l = s1.getVely();
            s2.setVelocity(-i, -j);
            s1.setVelocity(-k,-l);
        }
    }

    public void actionPerformed() {
        // TODO Auto-generated method stub

            //Create random spawn positions for bigdogs
            Random random = new Random();
            Random random2 = new Random();
            int xPos = Math.abs(random.nextInt() % 640);
            int yVel = Math.abs(random2.nextInt() % 20);

            //Make sure y velocity is between 10 and 30. Set this way for now
            //to hide problems with individual enemy3 sprites becoming inactive.
            while (yVel < 10)
                yVel = Math.abs(random.nextInt() % 30);

            //Spawn big dogs with random x position and y velocity
            //according to timer settings.
                enemy3.setLocation(xPos, 0);
                enemy3.setActive();
                enemy3.setVelocity(0, -yVel);
                enemy3.setType(3);

    }
@Override
public void gameCheckInputs() {
    // TODO Auto-generated method stub

}

}

我知道我可能做了一些愚蠢的事情,这可能是一个非常快速的解决方案。

更新了完整代码

这是日志文件:

04-30 03:49:19.490: W/dalvikvm(749): threadid=1: thread exiting with uncaught exception (group=0x409c01f8)
04-30 03:49:19.560: E/AndroidRuntime(749): FATAL EXCEPTION: main
04-30 03:49:19.560: E/AndroidRuntime(749): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.skeleton/com.android.skeleton.Android_SkeletonActivity}: java.lang.NullPointerException
04-30 03:49:19.560: E/AndroidRuntime(749):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
04-30 03:49:19.560: E/AndroidRuntime(749):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
04-30 03:49:19.560: E/AndroidRuntime(749):  at android.app.ActivityThread.access$600(ActivityThread.java:123)
04-30 03:49:19.560: E/AndroidRuntime(749):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
04-30 03:49:19.560: E/AndroidRuntime(749):  at android.os.Handler.dispatchMessage(Handler.java:99)
04-30 03:49:19.560: E/AndroidRuntime(749):  at android.os.Looper.loop(Looper.java:137)
04-30 03:49:19.560: E/AndroidRuntime(749):  at android.app.ActivityThread.main(ActivityThread.java:4424)
04-30 03:49:19.560: E/AndroidRuntime(749):  at java.lang.reflect.Method.invokeNative(Native Method)
04-30 03:49:19.560: E/AndroidRuntime(749):  at java.lang.reflect.Method.invoke(Method.java:511)
04-30 03:49:19.560: E/AndroidRuntime(749):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
04-30 03:49:19.560: E/AndroidRuntime(749):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
04-30 03:49:19.560: E/AndroidRuntime(749):  at dalvik.system.NativeStart.main(Native Method)
04-30 03:49:19.560: E/AndroidRuntime(749): Caused by: java.lang.NullPointerException
04-30 03:49:19.560: E/AndroidRuntime(749):  at com.android.skeleton.Game.gameSetBackground(Game.java:61)
04-30 03:49:19.560: E/AndroidRuntime(749):  at com.android.skeleton.GameModel.gameStart(GameModel.java:98)
04-30 03:49:19.560: E/AndroidRuntime(749):  at com.android.skeleton.GameSurfaceView.<init>(GameSurfaceView.java:23)
04-30 03:49:19.560: E/AndroidRuntime(749):  at com.android.skeleton.Android_SkeletonActivity.onCreate(Android_SkeletonActivity.java:18)
04-30 03:49:19.560: E/AndroidRuntime(749):  at android.app.Activity.performCreate(Activity.java:4465)
04-30 03:49:19.560: E/AndroidRuntime(749):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
04-30 03:49:19.560: E/AndroidRuntime(749):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)

这是游戏设置背景

public void gameSetBackground(Bitmap i){
        backgroundImage = i;
        if (clearList == null){
            clearList = new LinkedList<Rect>(); }
        clearList.add(new Rect(0, 0, canvas.getWidth(), canvas.getHeight()));
    }

这是 Game.java

package com.android.skeleton;

import java.util.LinkedList;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.util.Log;
import android.view.SurfaceHolder;


public abstract class Game implements Runnable {

    private LinkedList<Sprite> spriteList;

    public LinkedList<Sprite> sprites(){
        return spriteList;
    }
    private LinkedList<Rect>clearList;
    private Thread gameThread;
    private Bitmap backgroundImage=null;
    Canvas canvas;
    SurfaceHolder surfaceHolder = null;
    Canvas backGraphics;

    public abstract void gameStart();

    public abstract void gameEnd();

    public abstract void gameUpdate(Canvas c);

    public abstract void spriteCollide(Sprite s1, Sprite s2);

    public void init(){
        spriteList = new LinkedList<Sprite>();
        clearList = new LinkedList<Rect>();
        canvas = new Canvas();
    }

    public void setDebugOn(){
        for(Sprite s: spriteList)
            s.showRectangle();
    }
    public void setDebugOff(){
        for(Sprite s: spriteList)
            s.hideRectangle();
    }

    public void gameAddSprite(Sprite s){
        spriteList.add(s);
    }

    public void gameAddSprites(Sprite []slist){
        for(Sprite sp: slist)
            spriteList.add(sp);
    }

    public void gameSetBackground(Bitmap i){
        backgroundImage = i;
        if (clearList == null){
            clearList = new LinkedList<Rect>(); }
        clearList.add(new Rect(0, 0, canvas.getWidth(), canvas.getHeight()));
    }

    public void start(){
        gameThread  = new Thread(this);
        gameThread.start();
        gameStart();
    }

    public void stop(){
        gameEnd();
        gameThread = null;
    }

    public void update(Canvas canvas){
        for(Sprite s: spriteList){
            if(s.needsCleared()){

        }
        gameUpdate(backGraphics);
        paint(canvas);}
    }

    public void paint(Canvas canvas){
        if(backgroundImage != null) {
            for(Rect r: clearList){
                backGraphics.drawBitmap(backgroundImage, 
                                       r.left, r.top, null);
            }
        } else {
            for(@SuppressWarnings("unused") Rect r: clearList){
            }
        }
        clearList.clear();
        int n = spriteList.size();
        for(int i=n-1; i>=0; i--){
            spriteList.get(i).draw(backGraphics);
        }
    }

    public void run() {
        while(gameThread == Thread.currentThread()){
            if(surfaceHolder.getSurface().isValid()){
                canvas = new Canvas();
            canvas = surfaceHolder.lockCanvas();
            gameCheckInputs();
            checkCollisions();
            paint(canvas);
            try{
                Thread.sleep(40);
            }
            catch(InterruptedException ex){
                ex.printStackTrace();
            }
        }
            surfaceHolder.unlockCanvasAndPost(canvas);
        }
    }

    private void checkCollisions(){
        if(spriteList.size() > 1){
            int nsprites = spriteList.size();
            for(int i=0; i<nsprites; i++) if(spriteList.get(i).isActive()){
                for(int j = i+1; j<nsprites; j++) if(spriteList.get(j).isActive()){
                    if(spriteList.get(i).getRect().intersect(spriteList.get(j).getRect())){
                        spriteCollide(spriteList.get(i), spriteList.get(j));
                    }
                }
            }
        }           
    }

    public void gameCheckInputs() {
        // TODO Auto-generated method stub

    }

    public void gameStart(Context context) {
        // TODO Auto-generated method stub

    }
}

最佳答案

您好,nutriletter,我可以知道您真正想做什么吗 -

public void gameSetBackground(Bitmap i){
    backgroundImage = i;
    if (clearList == null){
        clearList = new LinkedList<Rect>(); }
    clearList.add(new Rect(0, 0, canvas.getWidth(), canvas.getHeight()));
}

您没有使用backgroundImage我说得对吗?

试试这个 -

if(backgroundImage!=null) 

你的其余代码..

关于java - 安卓图片加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10378293/

相关文章:

android - 如何使这段动画代码更有效?

html - SVG 图像未与 100vh 视口(viewport)中的 'object-fit' 等价物对齐

java - 不使用 compareTo 的排序算法

java - 为什么使用 lambda 表达式我的字符串操作速度很慢?

java - JAXB:XML 注册表中没有与 namespace 和名称匹配的 XML 元素声明

android - Xamarin.Forms(Android) 人脸检测器

Java + Android -> 启动新 Activity 时出现空指针异常

html - 可以在网站上使用的最大图像尺寸是多少?

javascript - 每 x 秒从远程服务器重新加载一次图像,而不重新加载整个页面

java - 开始新 Activity android后访问 Intent