【发布时间】:2021-12-08 16:22:46
【问题描述】:
我试图让我的播放器在我每次点击屏幕时生成一个子弹。但是,每次我这样做时它都会崩溃并给我这个错误:
E/AndroidRuntime: FATAL EXCEPTION: Thread-3
Process: com.example.mgp2021, PID: 20750
java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getWidth()' on a null object reference
at com.example.mgp2021.Bullet.Render(Bullet.java:57)
这是子弹的脚本:
package com.example.spaceshooter;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.SurfaceView;
public class Bullet implements EntityBase{
private boolean isDone = false;
private Bitmap bullet = null, scaledbmp = null;
public float xPos = 0;
public float yPos = 0;
private float yLimit = 0;
//float imgRadius = bullet.getHeight() * 0.5f;
@Override
public boolean IsDone() {
return isDone;
}
@Override
public void SetIsDone(boolean _isDone) {
isDone = _isDone;
}
@Override
public void Init(SurfaceView _view) {
bullet = BitmapFactory.decodeResource(_view.getResources(), R.drawable.bullet);
//setting up values
xPos = DraggablePlayer.Instance.xPos;
yPos = DraggablePlayer.Instance.yPos;
//yLimit = _view.getHeight() * 0.5f;
}
@Override
public void Update(float _dt) {
yPos -= _dt * 300.f;
if(bullet == null)
{
Log.e("ERR","Failed to decode resource bullet");
}
}
@Override
public void Render(Canvas _canvas) {
Matrix transform = new Matrix();
transform.postTranslate(-bullet.getWidth()*0.5f, -bullet.getHeight()*0.5f);
transform.postTranslate(xPos, yPos);
_canvas.drawBitmap(bullet, transform, null);
}
@Override
public boolean IsInit() {
return bullet != null;
}
@Override
public int GetRenderLayer() {
return LayerConstants.BULLET_LAYER;
}
@Override
public void SetRenderLayer(int _newLayer) {
}
@Override
public ENTITY_TYPE GetEntityType() {
return ENTITY_TYPE.ENT_BULLET;
}
public static Bullet Create() {
Bullet result = new Bullet();
EntityManager.Instance.AddEntity(result, ENTITY_TYPE.ENT_BULLET);
return result;
}
}
这是我生成子弹时的脚本:
public void Update(float _dt) {
EntityManager.Instance.Update(_dt);
if (TouchManager.Instance.IsDown())
{
Bullet.Create();
}
}
我真的不确定是什么导致了这个错误,非常感谢任何帮助
【问题讨论】:
-
你的变量
bullet来自哪里? -
第 57 行的位图实例为空,因此不能在空对象引用上调用 getWidth()。
-
您应该检查在方法“Init”中为子弹变量初始化新值,默认值为您在声明时给出的NULL,因为该变量值为null,所以出现崩溃,可能读取drawable“R. drawable.bullet" 返回空值检查一下
-
@VojinPurić
private Bitmap bullet = null, scaledbmp = null;
标签: java android android-studio