首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >BitmapFactory.decodeResource问题

BitmapFactory.decodeResource问题
EN

Stack Overflow用户
提问于 2021-08-22 13:04:37
回答 2查看 197关注 0票数 0

我正在尝试开发一个坦克游戏,所以我需要建立两个不同的位图坦克。我已经创建了一个名为Tank.java的Java类,在这里我创建了我的坦克,但问题是我需要创建两个不同的坦克模型,但是在我的类中,我只能创建一个特定类型的坦克。

代码语言:javascript
运行
复制
public class Tank {

private int x,y;
int width, height;
Bitmap tank1

Tank(int screenY, Resources res){

    tank1 = BitmapFactory.decodeResource(res, R.drawable.azul_tanque);
    width = tank1.getWidth();
    height = tank1.getHeight();
    width /=4;
    height/=4;

    width *= (int)screenRatioX;
    height *= (int)screenRatioY;

    tank1 = Bitmap.createScaledBitmap(tank1,width,height,false);

    setY(screenY / 2);

}

}

您可以在这里看到这个类,但是问题是我从另一个类调用这个类,它在画布中绘制这个对象。

代码语言:javascript
运行
复制
public class GameView extends SurfaceView implements Runnable {

private Thread thread;
private Boolean isPlaying;

Paint paint;

public static float screenRatioX, screenRatioY;


private Tank tank;
private Tank tank2;


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());
    
    tank2 = new Tank(screenY,getResources());


}

@Override
public void run() {

    while(isPlaying){
        update();
        draw();
        sleep();
    }


}


private void draw(){
    if(getHolder().getSurface().isValid()){
        Canvas canvas = getHolder().lockCanvas();
        canvas.drawBitmap(background.background,background.x,background.y,paint);
        tank.setX((int)(64 * screenRatioX));
        tank2.setX((int)(2000 * screenRatioX));
        canvas.drawBitmap(tank.getTank(),tank.getX(),tank.getY(),paint);
        canvas.drawBitmap(tank2.getTank(),tank2.getX(),tank2.getY(),paint);
        getHolder().unlockCanvasAndPost(canvas);


    }

}

在这个类中,我调用坦克的构造函数,但我不能选择我想要使用的可绘制性。我试图创建另一个具有以下语义的坦克构造函数:

坦克(int screenY,Resources res,可绘制myTank).

在GameView类中,我实例化如下:

getResources.getDrawable(R.drawable.mytank));坦克=新坦克(screenY,getResources,screenY)

但是,当我在新坦克的构造函数上构造坦克时,它不起作用,因为方法:

BitmapFactory.decodeResource R.drawable.azul_tanque BitmapFactory.decodeResource(res,myTank)给出了一个错误,因为需要像第二个参数一样的int,但是在旧的构造函数中,我使用了R.drawable.azul_tanque,我认为第二个参数需要可绘制。

因此,任何人都可以帮助我,我如何编码新的构造函数来创建一个新的坦克,在GameView类中选择可绘制的。

非常感谢你们的时间各位。

Pd:如果您看到这里没有出现的方法,是因为我删除了它们,但是现在,这段代码在我的屏幕上给我画了两个相同的容器。

EN

回答 2

Stack Overflow用户

发布于 2021-08-22 13:23:13

如果您不想使用位图作为参数,您可以执行一个简单的If else操作,并传递一个开关变量。如下所示:

构造者:

代码语言:javascript
运行
复制
Tank(int screenY, Resources res, int switcher) {
if(switcher == 1)
    tank1 = BitmapFactory.decodeResource(res, R.drawable.azul_tanque);
else
    tank1 = BitmapFactory.decodeResource(res, R.drawable.second_tank);

GameView:

代码语言:javascript
运行
复制
tank = new Tank(screenY,getResources(), 1);

tank2 = new Tank(screenY,getResources(), 0);
票数 1
EN

Stack Overflow用户

发布于 2021-08-22 18:30:51

可以在构造函数中传递可绘制资源id。

代码语言:javascript
运行
复制
Tank(int screenY, Resources res, int resourceId){

    tank1 = BitmapFactory.decodeResource(res, resourceId);
    width = tank1.getWidth();
    height = tank1.getHeight();
    width /=4;
    height/=4;

    width *= (int)screenRatioX;
    height *= (int)screenRatioY;

    tank1 = Bitmap.createScaledBitmap(tank1,width,height,false);

    setY(screenY / 2);

}

现在你可以传递坦克的任何图像了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68881595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档