You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android坦克游戏Tank类加载不同drawable资源问题求解

解决方案

核心思路是直接传入int类型的drawable资源ID作为构造参数,刚好匹配BitmapFactory.decodeResource的入参要求,无需额外转换Drawable对象。


步骤1:修改Tank类,新增自定义资源构造方法

通过构造方法重载,既保留原有默认坦克的实例化方式,也支持自定义资源传入,同时复用逻辑减少冗余代码:

public class Tank {
    private int x,y;
    int width, height;
    Bitmap tank1;

    // 原有默认构造方法,保留兼容旧代码,默认加载蓝色坦克
    Tank(int screenY, Resources res){
        // 调用新构造方法,传入默认资源ID
        this(screenY, res, R.drawable.azul_tanque);
    }

    // 新增支持自定义资源的构造方法
    Tank(int screenY, Resources res, int tankResId){
        tank1 = BitmapFactory.decodeResource(res, tankResId);
        width = tank1.getWidth();
        height = tank1.getHeight();
        width /=4;
        height/=4;
        // 注意screenRatio是GameView的静态变量,需要显式引用
        width *= (int) GameView.screenRatioX;
        height *= (int) GameView.screenRatioY;
        tank1 = Bitmap.createScaledBitmap(tank1,width,height,false);
        setY(screenY / 2);
    }

    // 补充你代码中用到但未实现的必要方法
    public Bitmap getTank() {
        return tank1;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }
}

步骤2:修改GameView中的Tank实例化代码

实例化时直接传入对应drawable的资源ID即可生成不同样式的坦克:

public GameView(Context context, int screenX, int screenY) {
    super(context);
    background = new Background(screenX,screenY,getResources());
    paint = new Paint();
    screenRatioX = 2340f / screenX;
    screenRatioY= 1080f / screenY;
    // 第一个坦克用默认样式(蓝色坦克)
    tank = new Tank(screenY,getResources());
    // 第二个坦克传入自定义资源ID,比如红色坦克
    tank2 = new Tank(screenY,getResources(), R.drawable.rojo_tanque);
}

可选扩展:如果确实需要传入Drawable对象的处理方式

如果你的业务场景已经拿到了Drawable对象,不需要从资源ID加载,可以用如下方式将Drawable转为Bitmap:

// 新增Drawable入参的构造方法
Tank(int screenY, Drawable tankDrawable){
    // 先把Drawable转成Bitmap
    tank1 = drawableToBitmap(tankDrawable);
    // 后面的缩放逻辑和之前一致...
}

// Drawable转Bitmap工具方法
private Bitmap drawableToBitmap(Drawable drawable) {
    if (drawable instanceof BitmapDrawable) {
        return ((BitmapDrawable) drawable).getBitmap();
    }
    Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
    drawable.draw(canvas);
    return bitmap;
}

内容的提问来源于stack exchange,提问作者Richman19

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 19:36:03