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
相关产品推荐
相关产品推荐

