我在这里遇到问题,我自己无法解决。以前一切都还好,但是当我决定添加方法doShoot();
时,用于拍摄停止工作的项目。
这里有一些代码
玩家类
package game.objectsmain;
import game.main.R;
import game.objects.animation.PlayerBullet;
import java.util.List;
import java.util.Random;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.Drawable;
import android.view.MotionEvent;
public class Player extends GameObject {
public static final int P_DEF_SPEED = 3;
public static final int P_HIGH_SPEED = 6;
//......//
private static Random rand = new Random();
private List<PlayerBullet> bulletList;
private GunType gunType;
Context context;
Bitmap mBasic;
Bitmap mSpray;
public Player(Drawable image, int cordX, int cordY) {
super(image);
// TODO Auto-generated constructor stub
setXCoord(cordX);
setYCoord(cordY);
setSpeedX(P_DEF_SPEED);
setSpeedY(P_DEF_SPEED);
update();
mBasic = BitmapFactory.decodeResource(context.getResources(), R.drawable.bullet3);
mSpray = BitmapFactory.decodeResource(context.getResources(), R.drawable.spray);
}
//......//
public void doShoot()
{
//I ADDED THIS
if(gunType == GunType.BASIC)
{
PlayerBullet b = new PlayerBullet(mBasic, getXCoord(), getYCoord(), 15, 35, 3, 3, BulletDirection.CENTER);
bulletList.add(b);
}
if(gunType == GunType.SPRAY)
{
PlayerBullet b1 = new PlayerBullet(mSpray, getXCoord(), getYCoord(), 15, 15, 3, 3, BulletDirection.CENTER);
PlayerBullet b2 = new PlayerBullet(mSpray, getXCoord(), getYCoord(), 15, 15, 3, 3, BulletDirection.RIGHT);
PlayerBullet b3 = new PlayerBullet(mSpray, getXCoord(), getYCoord(), 15, 15, 3, 3, BulletDirection.LEFT);
bulletList.add(b1);
bulletList.add(b2);
bulletList.add(b3);
}//
}
//......//
public void draw(Canvas canvas)
{
mImage.draw(canvas);
//AND ADDED THIS
synchronized (bulletList) {
for (PlayerBullet bullet: bulletList) {
bullet.animate();
bullet.draw(canvas);
//bullet.animate();
}
}
}//BTW i tried to add this foreach path into doShoot() too it not helps
}
子弹课。它虽然哼了一声
package game.objects.animation;
import game.objectsmain.BulletDirection;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
public class PlayerBullet extends AnimatedObject{
private double mSpeedY;
private double mSpeedX;
private BulletDirection bulletDir;// direction here it's just enum looks like public enum BulletDirection{LEFT,RIGHT,CENTER}
public PlayerBullet(Bitmap bitmap, int x, int y, int width, int height, int fps,
int frameCount, BulletDirection dir) {
super(bitmap, x, y, width, height, fps, frameCount);
// TODO Auto-generated constructor stub
bulletDir = dir;//направление пули
setFramePeriod(5000/ fps);
setSpeeds();
}
public void draw(Canvas canvas) {
// where to draw the sprite
//setY(getY() - mSpeedY);
Rect destRect = new Rect(getX(), getY(), getX() + spriteWidth, getY() + spriteHeight);
canvas.drawBitmap(bitmap, sourceRect, destRect, null);
}
public void animate()//анимация движения
{
super.animate();
setY(getY() + (int)mSpeedY);
setX(getX() + (int)mSpeedX);
// checkBorders(rect);
}
private void setSpeeds()
{
if(bulletDir.equals(BulletDirection.CENTER))
{
mSpeedY = -10;
mSpeedX = 0;
}
else
{
mSpeedY = -8;
mSpeedX = 5;
if(bulletDir.equals(BulletDirection.LEFT))
mSpeedX = -1 * mSpeedX;
}
}
/*public void move()
{
xCoord = xCoord + xSpeed;
yCoord = yCoord + ySpeed;
this.resetBounds();
if(yCoord < (0 - width) || xCoord < 0-width || xCoord > screenWidth)
alive = false;
}*/
}
主线程类
package game.view;
import game.main.R;
import game.objects.animation.Explosion;
import game.objects.animation.PlayerBullet;
import game.objects.animation.ScrollingElement;
import game.objectsmain.BulletDirection;
import game.objectsmain.Player;
import java.util.ArrayList;
import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.drawable.Drawable;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
public class ViewManager extends Thread
{
private static final int FIELD_WIDTH = 480;
private static final int FIELD_HEIGHT = 800;
private static final int dist = 100;
public int touchedX, touchedY;
/** Область, на которой будем рисовать */
private SurfaceHolder mSurfaceHolder;
/** Состояние потока (выполняется или нет. Нужно, чтобы было удобнее прибивать поток, когда потребуется) */
private boolean mRunning;
/** Стили рисования */
private Paint mPaint;
/** The drawable to use as the background of the animation canvas */
private Bitmap mBackgroundImage;
private Bitmap mLinesImage;
private Bitmap mExplosionImage;
private Bitmap mBulletImage;
private Drawable mPlayerImage;
private ArrayList<ScrollingElement> mScrollEls = new ArrayList<ScrollingElement>();
private ArrayList<PlayerBullet> mBullets = new ArrayList<PlayerBullet>();
private ArrayList<Explosion> mBang = new ArrayList<Explosion>();
public Player mHero;
// desired fps
private final static int MAX_FPS = 50;
// maximum number of frames to be skipped
private final static int MAX_FRAME_SKIPS = 5;
// the frame period
private final static int FRAME_PERIOD = 1000 / MAX_FPS;
private Explosion mBoom;//объект класса взрыв
public ViewManager(SurfaceHolder surfaceHolder, Context context)
{
mSurfaceHolder = surfaceHolder;
mRunning = false;
Resources res = context.getResources();
mExplosionImage = BitmapFactory.decodeResource(res, R.drawable.explosion);
mBackgroundImage = BitmapFactory.decodeResource(res, R.drawable.bckgr1);
mLinesImage = BitmapFactory.decodeResource(res, R.drawable.lines3);
mPlayerImage = res.getDrawable(R.drawable.test);
mBulletImage = BitmapFactory.decodeResource(res, R.drawable.bullet3);
InitElements(res);
mHero = new Player(mPlayerImage, 240, 400);
mBoom = new Explosion(mExplosionImage, 200, 500, 64, 64, 7, 7);
}
/**
* Задание состояния потока
* @param running
*/
public void setRunning(boolean running)
{
mRunning = running;
}
public void run()
{
while (mRunning)
{
Canvas canvas = null;
try
{
// подготовка Canvas-а
canvas = mSurfaceHolder.lockCanvas();
synchronized (mSurfaceHolder)
{
mHero.update();
// собственно рисование
doDraw(canvas);
//mImage.draw(canvas);
}
}
catch (Exception e) { }
finally
{
if (canvas != null)
{
mSurfaceHolder.unlockCanvasAndPost(canvas);
}
}
}
}
public boolean gettouch = false;
private void doDraw(Canvas canvas) {
canvas.drawBitmap(mBackgroundImage, 0, 0, null);
//отрисовка анимации
//......//
mHero.draw(canvas);
}
}
//....//
}
LOGCAT说什么
11-27 15:39:36.852: INFO/ActivityManager(58): Displayed activity game.main/game.mainmenu.MainMenuActivity: 2102 ms (total 2102 ms)
11-27 15:39:42.073: DEBUG/dalvikvm(124): GC_EXPLICIT freed 2866 objects / 133872 bytes in 140ms
11-27 15:39:47.113: DEBUG/dalvikvm(197): GC_EXPLICIT freed 117 objects / 5160 bytes in 144ms
11-27 15:39:52.133: DEBUG/dalvikvm(265): GC_EXPLICIT freed 765 objects / 55144 bytes in 138ms
11-27 15:39:52.383: INFO/ActivityManager(58): Starting activity: Intent { cmp=game.main/game.mainmenu.StartGame }
11-27 15:39:52.693: DEBUG/dalvikvm(303): GC_EXTERNAL_ALLOC freed 267 objects / 13328 bytes in 50ms
11-27 15:39:53.054: DEBUG/AndroidRuntime(303): Shutting down VM
11-27 15:39:53.054: WARN/dalvikvm(303): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
11-27 15:39:53.073: ERROR/AndroidRuntime(303): FATAL EXCEPTION: main
11-27 15:39:53.073: ERROR/AndroidRuntime(303): java.lang.RuntimeException: Unable to start activity ComponentInfo{game.main/game.mainmenu.StartGame}: java.lang.NullPointerException
11-27 15:39:53.073: ERROR/AndroidRuntime(303): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
11-27 15:39:53.073: ERROR/AndroidRuntime(303): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
11-27 15:39:53.073: ERROR/AndroidRuntime(303): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
11-27 15:39:53.073: ERROR/AndroidRuntime(303): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
11-27 15:39:53.073: ERROR/AndroidRuntime(303): at android.os.Handler.dispatchMessage(Handler.java:99)
11-27 15:39:53.073: ERROR/AndroidRuntime(303): at android.os.Looper.loop(Looper.java:123)
11-27 15:39:53.073: ERROR/AndroidRuntime(303): at android.app.ActivityThread.main(ActivityThread.java:4627)
11-27 15:39:53.073: ERROR/AndroidRuntime(303): at java.lang.reflect.Method.invokeNative(Native Method)
11-27 15:39:53.073: ERROR/AndroidRuntime(303): at java.lang.reflect.Method.invoke(Method.java:521)
11-27 15:39:53.073: ERROR/AndroidRuntime(303): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
11-27 15:39:53.073: ERROR/AndroidRuntime(303): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
11-27 15:39:53.073: ERROR/AndroidRuntime(303): at dalvik.system.NativeStart.main(Native Method)
11-27 15:39:53.073: ERROR/AndroidRuntime(303): Caused by: java.lang.NullPointerException
11-27 15:39:53.073: ERROR/AndroidRuntime(303): at game.objectsmain.Player.<init>(Player.java:45)
11-27 15:39:53.073: ERROR/AndroidRuntime(303): at game.view.ViewManager.<init>(ViewManager.java:73)
11-27 15:39:53.073: ERROR/AndroidRuntime(303): at game.view.ViewPanel.<init>(ViewPanel.java:24)
11-27 15:39:53.073: ERROR/AndroidRuntime(303): at game.mainmenu.StartGame.onCreate(StartGame.java:18)
11-27 15:39:53.073: ERROR/AndroidRuntime(303): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
11-27 15:39:53.073: ERROR/AndroidRuntime(303): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
11-27 15:39:53.073: ERROR/AndroidRuntime(303): ... 11 more
11-27 15:39:53.093: WARN/ActivityManager(58): Force finishing activity game.main/game.mainmenu.StartGame
11-27 15:39:53.104: WARN/ActivityManager(58): Force finishing activity game.main/game.mainmenu.MainMenuActivity
11-27 15:39:53.373: INFO/ARMAssembler(58): generated scanline__00000077:03515104_00000000_00000000 [ 33 ipp] (47 ins) at [0x2d2d78:0x2d2e34] in 463339 ns
11-27 15:39:53.677: WARN/ActivityManager(58): Activity pause timeout for HistoryRecord{44ec3010 game.main/game.mainmenu.StartGame}
11-27 15:40:04.141: WARN/ActivityManager(58): Activity destroy timeout for HistoryRecord{44f01440 game.main/game.mainmenu.MainMenuActivity}
11-27 15:40:04.143: WARN/ActivityManager(58): Activity destroy timeout for HistoryRecord{44ec3010 game.main/game.mainmenu.StartGame}
11-27 15:40:14.553: DEBUG/AndroidRuntime(312): >>>>>>>>>>>>>> AndroidRuntime START <<<<<<<<<<<<<<
11-27 15:40:14.553: DEBUG/AndroidRuntime(312): CheckJNI is ON
11-27 15:40:14.703: DEBUG/AndroidRuntime(312): --- registering native functions ---
答案 0 :(得分:1)
问题在于您尝试向尚未初始化的bulletList
添加项目符号,从而生成NullPointerException
。您必须将以下代码添加到构造函数中:
bulletList = new List<PlayerBullet>();
答案 1 :(得分:0)
NullPointerException
中有Player
- 看起来您的context
成员未初始化。