大家可以把此工程导入到Eclipse,然后编译运行,试玩一下。最后对应着看代码,这样更容易理解。下面上代码:
专注于为中小企业提供网站设计制作、成都网站设计服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业祁连免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了数千家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。
- class LunarView extends SurfaceView implements SurfaceHolder.Callback {
- class LunarThread extends Thread {
- /*
- * Difficulty setting constants
- */
- public static final int DIFFICULTY_EASY = 0;
- public static final int DIFFICULTY_HARD = 1;
- public static final int DIFFICULTY_MEDIUM = 2;
- /*
- * Physics constants
- */
- public static final int PHYS_DOWN_ACCEL_SEC = 35;
- public static final int PHYS_FIRE_ACCEL_SEC = 80;
- public static final int PHYS_FUEL_INIT = 60;
- public static final int PHYS_FUEL_MAX = 100;
- public static final int PHYS_FUEL_SEC = 10;
- public static final int PHYS_SLEW_SEC = 120; // degrees/second rotate
- public static final int PHYS_SPEED_HYPERSPACE = 180;
- public static final int PHYS_SPEED_INIT = 30;
- public static final int PHYS_SPEED_MAX = 120;
- /*
- * State-tracking constants
- */
- public static final int STATE_LOSE = 1;
- public static final int STATE_PAUSE = 2;
- public static final int STATE_READY = 3;
- public static final int STATE_RUNNING = 4;
- public static final int STATE_WIN = 5;
- /*
- * Goal condition constants
- */
- public static final int TARGET_ANGLE = 18; // > this angle means crash
- public static final int TARGET_BOTTOM_PADDING = 17; // px below gear
- public static final int TARGET_PAD_HEIGHT = 8; // how high above ground
- public static final int TARGET_SPEED = 28; // > this speed means crash
- public static final double TARGET_WIDTH = 1.6; // width of target
- /*
- * UI constants (i.e. the speed & fuel bars)
- */
- public static final int UI_BAR = 100; // width of the bar(s)
- public static final int UI_BAR_HEIGHT = 10; // height of the bar(s)
- private static final String KEY_DIFFICULTY = "mDifficulty";
- private static final String KEY_DX = "mDX";
- private static final String KEY_DY = "mDY";
- private static final String KEY_FUEL = "mFuel";
- private static final String KEY_GOAL_ANGLE = "mGoalAngle";
- private static final String KEY_GOAL_SPEED = "mGoalSpeed";
- private static final String KEY_GOAL_WIDTH = "mGoalWidth";
- private static final String KEY_GOAL_X = "mGoalX";
- private static final String KEY_HEADING = "mHeading";
- private static final String KEY_LANDER_HEIGHT = "mLanderHeight";
- private static final String KEY_LANDER_WIDTH = "mLanderWidth";
- private static final String KEY_WINS = "mWinsInARow";
- private static final String KEY_X = "mX";
- private static final String KEY_Y = "mY";
- /*
- * Member (state) fields
- */
- /** The drawable to use as the background of the animation canvas */
- private Bitmap mBackgroundImage;
- /**
- * Current height of the surface/canvas.
- *
- * @see #setSurfaceSize
- */
- private int mCanvasHeight = 1;
- /**
- * Current width of the surface/canvas.
- *
- * @see #setSurfaceSize
- */
- private int mCanvasWidth = 1;
- /** What to draw for the Lander when it has crashed */
- private Drawable mCrashedImage;
- /**
- * Current difficulty -- amount of fuel, allowed angle, etc. Default is
- * MEDIUM.
- */
- private int mDifficulty;
- /** Velocity dx. */
- private double mDX;
- /** Velocity dy. */
- private double mDY;
- /** Is the engine burning? */
- private boolean mEngineFiring;
- /** What to draw for the Lander when the engine is firing */
- private Drawable mFiringImage;
- /** Fuel remaining */
- private double mFuel;
- /** Allowed angle. */
- private int mGoalAngle;
- /** Allowed speed. */
- private int mGoalSpeed;
- /** Width of the landing pad. */
- private int mGoalWidth;
- /** X of the landing pad. */
- private int mGoalX;
- /** Message handler used by thread to interact with TextView */
- private Handler mHandler;
- /**
- * Lander heading in degrees, with 0 up, 90 right. Kept in the range
- * 0..360.
- */
- private double mHeading;
- /** Pixel height of lander image. */
- private int mLanderHeight;
- /** What to draw for the Lander in its normal state */
- private Drawable mLanderImage;
- /** Pixel width of lander image. */
- private int mLanderWidth;
- /** Used to figure out elapsed time between frames */
- private long mLastTime;
- /** Paint to draw the lines on screen. */
- private Paint mLinePaint;
- /** "Bad" speed-too-high variant of the line color. */
- private Paint mLinePaintBad;
- /** The state of the game. One of READY, RUNNING, PAUSE, LOSE, or WIN */
- private int mMode;
- /** Currently rotating, -1 left, 0 none, 1 right. */
- private int mRotating;
- /** Indicate whether the surface has been created & is ready to draw */
- private boolean mRun = false;
- /** Scratch rect object. */
- private RectF mScratchRect;
- /** Handle to the surface manager object we interact with */
- private SurfaceHolder mSurfaceHolder;
- /** Number of wins in a row. */
- private int mWinsInARow;
- /** X of lander center. */
- private double mX;
- /** Y of lander center. */
- private double mY;
- public LunarThread(SurfaceHolder surfaceHolder, Context context,
- Handler handler) {
- // get handles to some important objects
- mSurfaceHolder = surfaceHolder;
- mHandler = handler;
- mContext = context;
- Resources res = context.getResources();
- // cache handles to our key sprites & other drawables
- mLanderImage = context.getResources().getDrawable(
- R.drawable.lander_plain);
- mFiringImage = context.getResources().getDrawable(
- R.drawable.lander_firing);
- mCrashedImage = context.getResources().getDrawable(
- R.drawable.lander_crashed);
- // load background image as a Bitmap instead of a Drawable b/c
- // we don't need to transform it and it's faster to draw this way
- mBackgroundImage = BitmapFactory.decodeResource(res,
- R.drawable.earthrise);
- // Use the regular lander image as the model size for all sprites
- mLanderWidth = mLanderImage.getIntrinsicWidth();
- mLanderHeight = mLanderImage.getIntrinsicHeight();
- // Initialize paints for speedometer
- mLinePaint = new Paint();
- mLinePaint.setAntiAlias(true);
- mLinePaint.setARGB(255, 0, 255, 0);
- mLinePaintBad = new Paint();
- mLinePaintBad.setAntiAlias(true);
- mLinePaintBad.setARGB(255, 120, 180, 0);
- mScratchRect = new RectF(0, 0, 0, 0);
- mWinsInARow = 0;
- mDifficulty = DIFFICULTY_MEDIUM;
- // initial show-up of lander (not yet playing)
- mX = mLanderWidth;
- mY = mLanderHeight * 2;
- mFuel = PHYS_FUEL_INIT;
- mDX = 0;
- mDY = 0;
- mHeading = 0;
- mEngineFiring = true;
- }
- /**
- * Starts the game, setting parameters for the current difficulty.
- */
- public void doStart() {
- synchronized (mSurfaceHolder) {
- // First set the game for Medium difficulty
- mFuel = PHYS_FUEL_INIT;
- mEngineFiring = false;
- mGoalWidth = (int) (mLanderWidth * TARGET_WIDTH);
- mGoalSpeed = TARGET_SPEED;
- mGoalAngle = TARGET_ANGLE;
- int speedInit = PHYS_SPEED_INIT;
- // Adjust difficulty params for EASY/HARD
- if (mDifficulty == DIFFICULTY_EASY) {
- mFuel = mFuel * 3 / 2;
- mGoalWidth = mGoalWidth * 4 / 3;
- mGoalSpeed = mGoalSpeed * 3 / 2;
- mGoalAngle = mGoalAngle * 4 / 3;
- speedInit = speedInit * 3 / 4;
- } else if (mDifficulty == DIFFICULTY_HARD) {
- mFuel = mFuel * 7 / 8;
- mGoalWidth = mGoalWidth * 3 / 4;
- mGoalSpeed = mGoalSpeed * 7 / 8;
- speedInit = speedInit * 4 / 3;
- }
- // pick a convenient initial location for the lander sprite
- mX = mCanvasWidth / 2;
- mY = mCanvasHeight - mLanderHeight / 2;
- // start with a little random motion
- mDY = Math.random() * -speedInit;
- mDX = Math.random() * 2 * speedInit - speedInit;
- mHeading = 0;
- // Figure initial spot for landing, not too near center
- while (true) {
- mGoalX = (int) (Math.random() * (mCanvasWidth - mGoalWidth));
- if (Math.abs(mGoalX - (mX - mLanderWidth / 2)) > mCanvasHeight / 6)
- break;
- }
- mLastTime = System.currentTimeMillis() + 100;
- setState(STATE_RUNNING);
- }
- }
- /**
- * Pauses the physics update & animation.
- */
- public void pause() {
- synchronized (mSurfaceHolder) {
- if (mMode == STATE_RUNNING) setState(STATE_PAUSE);
- }
- }
- /**
- * Restores game state from the indicated Bundle. Typically called when
- * the Activity is being restored after having been previously
- * destroyed.
- *
- * @param savedState Bundle containing the game state
- */
- public synchronized void restoreState(Bundle savedState) {
- synchronized (mSurfaceHolder) {
- setState(STATE_PAUSE);
- mRotating = 0;
- mEngineFiring = false;
- mDifficulty = savedState.getInt(KEY_DIFFICULTY);
- mX = savedState.getDouble(KEY_X);
- mY = savedState.getDouble(KEY_Y);
- mDX = savedState.getDouble(KEY_DX);
- mDY = savedState.getDouble(KEY_DY);
- mHeading = savedState.getDouble(KEY_HEADING);
- mLanderWidth = savedState.getInt(KEY_LANDER_WIDTH);
- mLanderHeight = savedState.getInt(KEY_LANDER_HEIGHT);
- mGoalX = savedState.getInt(KEY_GOAL_X);
- mGoalSpeed = savedState.getInt(KEY_GOAL_SPEED);
- mGoalAngle = savedState.getInt(KEY_GOAL_ANGLE);
- mGoalWidth = savedState.getInt(KEY_GOAL_WIDTH);
- mWinsInARow = savedState.getInt(KEY_WINS);
- mFuel = savedState.getDouble(KEY_FUEL);
- }
- }
- @Override
- public void run() {
- while (mRun) {
- Canvas c = null;
- try {
- c = mSurfaceHolder.lockCanvas(null);
- synchronized (mSurfaceHolder) {
- if (mMode == STATE_RUNNING) updatePhysics();
- doDraw(c);
- }
- } finally {
- // do this in a finally so that if an exception is thrown
- // during the above, we don't leave the Surface in an
- // inconsistent state
- if (c != null) {
- mSurfaceHolder.unlockCanvasAndPost(c);
- }
- }
- }
- }
- /**
- * Dump game state to the provided Bundle. Typically called when the
- * Activity is being suspended.
- *
- * @return Bundle with this view's state
- */
- public Bundle saveState(Bundle map) {
- synchronized (mSurfaceHolder) {
- if (map != null) {
- map.putInt(KEY_DIFFICULTY, Integer.valueOf(mDifficulty));
- map.putDouble(KEY_X, Double.valueOf(mX));
- map.putDouble(KEY_Y, Double.valueOf(mY));
- map.putDouble(KEY_DX, Double.valueOf(mDX));
- map.putDouble(KEY_DY, Double.valueOf(mDY));
- map.putDouble(KEY_HEADING, Double.valueOf(mHeading));
- map.putInt(KEY_LANDER_WIDTH, Integer.valueOf(mLanderWidth));
- map.putInt(KEY_LANDER_HEIGHT, Integer
- .valueOf(mLanderHeight));
- map.putInt(KEY_GOAL_X, Integer.valueOf(mGoalX));
- map.putInt(KEY_GOAL_SPEED, Integer.valueOf(mGoalSpeed));
- map.putInt(KEY_GOAL_ANGLE, Integer.valueOf(mGoalAngle));
- map.putInt(KEY_GOAL_WIDTH, Integer.valueOf(mGoalWidth));
- map.putInt(KEY_WINS, Integer.valueOf(mWinsInARow));
- map.putDouble(KEY_FUEL, Double.valueOf(mFuel));
- }
- }
- return map;
- }
- /**
- * Sets the current difficulty.
- *
- * @param difficulty
- */
- public void setDifficulty(int difficulty) {
- synchronized (mSurfaceHolder) {
- mDifficulty = difficulty;
- &nb
当前标题:Android游戏开发之八:SurfaceView类的应用实例
URL地址:http://www.csdahua.cn/qtweb/news15/400465.html网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网