实例介绍
【实例简介】
【实例截图】
【核心代码】
package cn.nju; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.content.Context; import android.content.SharedPreferences; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; public class GameSurfaceView extends SurfaceView implements SurfaceHolder.Callback { private Rabit rabit; private RefurbishThread refurbishThread; private List<Bell> bell_list = new ArrayList<Bell>(); private Backgroud bg; private Context context; private BellCreator bell_creator; private Bird bird; private SurfaceHolder holder; private Bitmap bitmap_jump; private boolean jump_button_clicked = false; private boolean jump_comm_flag = false; private boolean audio_on = false; private AudioProvider audioProvider; private int score = 0; private int highest_score; private int hit_count = 0; private Paint paint; private boolean game_over = false; private Conclusion conclusion; public GameSurfaceView(Context context) { super(context); this.context = context; rabit = new Rabit(context); bg = new Backgroud(context); conclusion = new Conclusion(this); bitmap_jump = BitmapFactory.decodeResource(context.getResources(), R.drawable.button); init_audio(); init_highest_score(); bell_creator = new BellCreator(context); bird = new Bird(context); refurbishThread = new RefurbishThread(); init_bell_list(); paint = new Paint(); this.holder = this.getHolder(); holder.addCallback(this); this.setFocusable(true); } private void init() { rabit.init(); bg.init(); init_bird(); jump_button_clicked = false; jump_comm_flag = false; for (int i = 0; i < bell_list.size(); i) { bell_creator.recycle(bell_list.get(i)); } bell_creator.init(); init_bell_list(); highest_score = (highest_score > score) ? highest_score : score; score = 0; hit_count = 0; } private void init_bird() { bird.setState(Bird.BIRD_LEFT_FLY0); bird.setCenter_x(240); bird.setCenter_y(30); bird.setOn_screen(true); } private void init_highest_score() { SharedPreferences settings = ((GameActivity) context) .getPreferences(Activity.MODE_PRIVATE); highest_score = settings.getInt("highestscore", 0); } private void init_audio() { this.audio_on = ((GameActivity) context).isAudio_on(); if (audio_on) { audioProvider = new AudioProvider(context); } } private void init_bell_list() { Bell bell0 = bell_creator.createBell(); Bell bell1 = bell_creator.createBell(); Bell bell2 = bell_creator.createBell(); Bell bell3 = bell_creator.createBell(); Bell bell4 = bell_creator.createBell(); bell0.setCenter_y(170); bell1.setCenter_y(130); bell2.setCenter_y(90); bell3.setCenter_y(50); bell4.setCenter_y(10); bell_list.removeAll(bell_list); bell_list.add(bell0); bell_list.add(bell1); bell_list.add(bell2); bell_list.add(bell3); bell_list.add(bell4); } protected void onDraw(Canvas canvas) { super.onDraw(canvas); bg.onDraw(canvas); if (!jump_button_clicked) { canvas.drawBitmap(bitmap_jump, 333, 199, paint); } drawBell(canvas); rabit.onDraw(canvas); drawScore(canvas); if (game_over) { conclusion.onDraw(canvas); } if (bird.isOn_screen()) { bird.onDraw(canvas); } } private void drawBell(Canvas canvas) { for (int i = 0; i < bell_list.size(); i) { bell_list.get(i).onDraw(canvas); } } private void drawScore(Canvas canvas) { paint.setColor(Color.WHITE); paint.setTextSize(15); canvas.drawText("" score, 22, 22, paint); } public boolean onKeyUp(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK) { this.refurbishThread.setGo_on(false); } return true; } public boolean onTouchEvent(MotionEvent event) { float x = event.getX(); float y = event.getY(); if (game_over) { ////////////////////////////游戏结束后的触屏处理 switch (event.getAction()) { case MotionEvent.ACTION_DOWN: if (x >= 165 && x <= 237 && y >= 154 && y <= 180) { conclusion.setPressed(true); } break; case MotionEvent.ACTION_MOVE: break; case MotionEvent.ACTION_UP: if (x >= 165 && x <= 237 && y >= 154 && y <= 180) { conclusion.setPressed(false); init(); game_over = false; } break; default: break; } } else { ////////////////////////////游戏中的触屏处理 if (jump_button_clicked) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_MOVE: case MotionEvent.ACTION_UP: rabit.setX_destination(x); break; default: rabit.setX_destination(rabit.getX()); } } else { if (x > 327 && x < 364 && y > 196 && y < 230) { if(event.getAction() == MotionEvent.ACTION_UP){ jump_comm_flag = true; jump_button_clicked = true; } } else { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_MOVE: case MotionEvent.ACTION_UP: rabit.setX_destination(x); break; default: rabit.setX_destination(rabit.getX()); } } } } return true; } public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } public void surfaceCreated(SurfaceHolder holder) { refurbishThread.setGo_on(true); refurbishThread.start(); if (audio_on) { audioProvider.play_bg(); } } @Override public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub refurbishThread.setGo_on(false); if (audio_on) { // player.stop(); // player.release(); // soundPool.release(); audioProvider.release(); } // save highest score highest_score = (highest_score > score) ? highest_score : score; SharedPreferences pre = ((GameActivity) context).getPreferences(0); SharedPreferences.Editor editor = pre.edit(); editor.putInt("highestscore", highest_score); } class RefurbishThread extends Thread { private boolean go_on = false; public boolean isGo_on() { return go_on; } public void setGo_on(boolean goOn) { go_on = goOn; } public void run() { while (go_on) { try { // Thread.sleep(50); Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } update_all_components(); synchronized (holder) { Canvas canvas = holder.lockCanvas(); GameSurfaceView.this.onDraw(canvas); holder.unlockCanvasAndPost(canvas); } } } } private void update_rabit(){ /** * rabit need jump up 93.72px per time 4 23 5 18 6 15 * */ if (rabit.isOnGround()) { // 处理水平方向移动 // rabit 到达目的位置 if (Math.abs(rabit.getX() - rabit.getX_destination()) < 5) { if (rabit.isFaceLeft()) { rabit.setPic_state(Rabit.RABIT_PIC_LEFT_STOP); rabit.setFace_state(Rabit.RABIT_FACE_LEFT); rabit.setGround_state(Rabit.RABIT_LEFT_STOP); } else { rabit.setPic_state(Rabit.RABIT_PIC_RIGHT_STOP); rabit.setFace_state(Rabit.RABIT_FACE_RIGHT); rabit.setGround_state(Rabit.RABIT_RIGHT_STOP); } } else if (rabit.getX() - rabit.getX_destination() >= 5) { // rabit 在destination的右面,它将向左移动 rabit.setFace_state(Rabit.RABIT_FACE_LEFT); rabit.setX(rabit.getX() - Rabit.SPEED_X); if (rabit.getGround_state() == Rabit.RABIT_LEFT_MOVE1_ON_GROUND) { rabit.setGround_state(Rabit.RABIT_LEFT_MOVE2_ON_GROUND); rabit.setPic_state(Rabit.RABIT_PIC_ON_GROUND_LEFT_JUMP1); } else if (rabit.getGround_state() == Rabit.RABIT_LEFT_MOVE2_ON_GROUND) { rabit.setGround_state(Rabit.RABIT_LEFT_MOVE1_ON_GROUND); rabit.setPic_state(Rabit.RABIT_PIC_ON_GROUND_LEFT_JUMP0); } else { rabit.setGround_state(Rabit.RABIT_LEFT_MOVE1_ON_GROUND); rabit.setPic_state(Rabit.RABIT_PIC_ON_GROUND_LEFT_JUMP0); } } else if (rabit.getX_destination() - rabit.getX() > 5) { // rabit 在destination的左面,它将向右移动 rabit.setX(rabit.getX() Rabit.SPEED_X); rabit.setFace_state(Rabit.RABIT_FACE_RIGHT); if (rabit.getGround_state() == Rabit.RABIT_RIGHT_MOVE1_ON_GROUND) { rabit.setGround_state(Rabit.RABIT_RIGHT_MOVE2_ON_GROUND); rabit.setPic_state(Rabit.RABIT_PIC_ON_GROUND_RIGHT_JUMP1); } else if (rabit.getGround_state() == Rabit.RABIT_RIGHT_MOVE2_ON_GROUND) { rabit.setGround_state(Rabit.RABIT_RIGHT_MOVE1_ON_GROUND); rabit.setPic_state(Rabit.RABIT_PIC_ON_GROUND_RIGHT_JUMP0); } else { rabit.setGround_state(Rabit.RABIT_RIGHT_MOVE1_ON_GROUND); rabit.setPic_state(Rabit.RABIT_PIC_ON_GROUND_RIGHT_JUMP0); } } // process jump command if (jump_comm_flag) { rabit.setAir_state(Rabit.RABIT_ON_AIR_UP0); rabit.setGround_state(Rabit.RABIT_NOT_ON_GROUND); rabit.setY(rabit.getY() - Rabit.SPEED_Y); if (rabit.isFaceLeft()) { rabit.setPic_state(Rabit.RABIT_PIC_ON_AIR_LEFT_JUMP); } else { rabit.setPic_state(Rabit.RABIT_PIC_ON_AIR_RIGHT_JUMP); } jump_comm_flag = false; } } else { // //////////////////////////////////////////////////////////////////// // rabit在空中 // 处理水方向移动 // 此处10值得商榷,很多定值需三思!!!!!!!!!!!!! if (rabit.getX() - rabit.getX_destination() >= 10) { // rabit 在destination的右面,它将向左移动 rabit.setFace_state(Rabit.RABIT_FACE_LEFT); rabit.setX(rabit.getX() - Rabit.SPEED_X_ON_AIR); } else if (rabit.getX_destination() - rabit.getX() > 10) { // rabit 在destination的左面,它将向右移动 rabit.setX(rabit.getX() Rabit.SPEED_X_ON_AIR); rabit.setFace_state(Rabit.RABIT_FACE_RIGHT); } // 处理垂直方向 移动 if (rabit.getAir_state() == Rabit.RABIT_ON_AIR_UP0) { // rabit.setY(rabit.getY()-Rabit.SPEED_Y); rabit_move_up(); rabit.setAir_state(Rabit.RABIT_ON_AIR_UP1); if (rabit.isFaceLeft()) rabit.setPic_state(Rabit.RABIT_PIC_ON_AIR_LEFT_JUMP); else rabit.setPic_state(Rabit.RABIT_PIC_ON_AIR_RIGHT_JUMP); } else if (rabit.getAir_state() == Rabit.RABIT_ON_AIR_UP1) { // rabit.setY(rabit.getY()-Rabit.SPEED_Y); rabit_move_up(); rabit.setAir_state(Rabit.RABIT_ON_AIR_UP2); if (rabit.isFaceLeft()) rabit.setPic_state(Rabit.RABIT_PIC_ON_AIR_LEFT_JUMP); else rabit.setPic_state(Rabit.RABIT_PIC_ON_AIR_RIGHT_JUMP); } else if (rabit.getAir_state() == Rabit.RABIT_ON_AIR_UP2) { // rabit.setY(rabit.getY()-Rabit.SPEED_Y); rabit_move_up(); rabit.setAir_state(Rabit.RABIT_ON_AIR_UP3); if (rabit.isFaceLeft()) rabit.setPic_state(Rabit.RABIT_PIC_ON_AIR_LEFT_JUMP); else rabit.setPic_state(Rabit.RABIT_PIC_ON_AIR_RIGHT_JUMP); } else if (rabit.getAir_state() == Rabit.RABIT_ON_AIR_UP3) { // rabit.setY(rabit.getY()-Rabit.SPEED_Y); rabit_move_up(); rabit.setAir_state(Rabit.RABIT_ON_AIR_UP4); if (rabit.isFaceLeft()) rabit.setPic_state(Rabit.RABIT_PIC_ON_AIR_LEFT_JUMP); else rabit.setPic_state(Rabit.RABIT_PIC_ON_AIR_RIGHT_JUMP); } else if (rabit.getAir_state() == Rabit.RABIT_ON_AIR_UP4) { // rabit.setY(rabit.getY()-Rabit.SPEED_Y); rabit_move_up(); rabit.setAir_state(Rabit.RABIT_ON_AIR_UP5); if (rabit.isFaceLeft()) rabit.setPic_state(Rabit.RABIT_PIC_ON_AIR_LEFT_JUMP); else rabit.setPic_state(Rabit.RABIT_PIC_ON_AIR_RIGHT_JUMP); } else if (rabit.getAir_state() == Rabit.RABIT_ON_AIR_UP5) { rabit.setAir_state(Rabit.RABIT_ON_AIR_STOP); if (rabit.isFaceLeft()) rabit.setPic_state(Rabit.RABIT_PIC_ON_AIR_LEFT_STOP); else rabit.setPic_state(Rabit.RABIT_PIC_ON_AIR_RIGHT_STOP); } else if (rabit.getAir_state() == Rabit.RABIT_ON_AIR_STOP) { rabit.setAir_state(Rabit.RABIT_ON_AIR_DOWN); if (rabit.isFaceLeft()) rabit.setPic_state(Rabit.RABIT_PIC_ON_AIR_LEFT_STOP); else rabit.setPic_state(Rabit.RABIT_PIC_ON_AIR_RIGHT_STOP); } else if (rabit.getAir_state() == Rabit.RABIT_ON_AIR_DOWN) { // rabit.setY(rabit.getY() Rabit.SPEED_Y); rabit.setAir_state(Rabit.RABIT_ON_AIR_DOWN); if (rabit.isFaceLeft()) rabit.setPic_state(Rabit.RABIT_PIC_ON_AIR_LEFT_DOWN); else rabit.setPic_state(Rabit.RABIT_PIC_ON_AIR_RIGHT_DOWN); rabit_move_down(); } } } private void update_bells(){ for (int i = 0; i < bell_list.size(); i) { Bell bell = bell_list.get(i); if (bell.isExplode()) { if (bell.getState() == Bell.BELL_EXPLODE0) { bell.setState(Bell.BELL_EXPLODE1); } else if (bell.getState() == Bell.BELL_EXPLODE1) { bell.setState(Bell.BELL_EXPLODE2); } else if (bell.getState() == Bell.BELL_EXPLODE2) { bell_list.remove(bell); bell_creator.recycle(bell); --i; } } else { if (rabit.isHitBell(bell)) { hit_count; score = hit_count * 10; if(audio_on) audioProvider.play_bell_ding(); bell.setState(Bell.BELL_EXPLODE0); rabit.setAir_state(Rabit.RABIT_ON_AIR_UP0); if (rabit.isFaceLeft()) { rabit.setPic_state(Rabit.RABIT_PIC_ON_AIR_LEFT_JUMP); } else { rabit.setPic_state(Rabit.RABIT_PIC_ON_AIR_RIGHT_JUMP); } } } } } private void update_bird(){ if (bird.isOn_screen()) { // 处理垂直 if (bird.getCenter_y() > Constant.SCREEN_HEIGHT) { bird.setOn_screen(false); } } if (bird.isOn_screen()) { // 处理水平 if (bird.isHited()) { if (bird.isFaceLeft()) { bird .setCenter_x(bird.getCenter_x() - Bird.BIRD_SPEED_POWER); if (bird.getCenter_x() < -5) { bird.setOn_screen(false); } } else { bird .setCenter_x(bird.getCenter_x() Bird.BIRD_SPEED_POWER); if (bird.getCenter_x() > Constant.SCREEN_WIDTH 5) { bird.setOn_screen(false); } } } else { if (bird.isFaceLeft()) { bird.setCenter_x(bird.getCenter_x() - Bird.BIRD_SPEED); if (bird.getCenter_x() < -5) { bird.setCenter_x(0); bird.setState(Bird.BIRD_RIGHT_FLY0); } else { if (rabit.isHitBird(bird)) { hit_count; score *= 2; if(audio_on) audioProvider.play_twitter(); bird.setState(Bird.BIRD_LEFT_FLY_POWER); rabit.setAir_state(Rabit.RABIT_ON_AIR_UP0); if (rabit.isFaceLeft()) { rabit .setPic_state(Rabit.RABIT_PIC_ON_AIR_LEFT_JUMP); } else { rabit .setPic_state(Rabit.RABIT_PIC_ON_AIR_RIGHT_JUMP); } } else if (bird.getState() == Bird.BIRD_LEFT_FLY0) { bird.setState(Bird.BIRD_LEFT_FLY1); } else if (bird.getState() == Bird.BIRD_LEFT_FLY1) { bird.setState(Bird.BIRD_LEFT_FLY2); } else { bird.setState(Bird.BIRD_LEFT_FLY0); } } } else { bird.setCenter_x(bird.getCenter_x() Bird.BIRD_SPEED); if (bird.getCenter_x() > Constant.SCREEN_WIDTH 5) { bird.setCenter_x(Constant.SCREEN_WIDTH); bird.setState(Bird.BIRD_LEFT_FLY0); } else { if (rabit.isHitBird(bird)) { hit_count; score *= 2; if(audio_on) audioProvider.play_twitter(); bird.setState(Bird.BIRD_LEFT_FLY_POWER); rabit.setAir_state(Rabit.RABIT_ON_AIR_UP0); if (rabit.isFaceLeft()) { rabit .setPic_state(Rabit.RABIT_PIC_ON_AIR_LEFT_JUMP); } else { rabit .setPic_state(Rabit.RABIT_PIC_ON_AIR_RIGHT_JUMP); } } else if (bird.getState() == Bird.BIRD_RIGHT_FLY0) { bird.setState(Bird.BIRD_RIGHT_FLY1); } else if (bird.getState() == Bird.BIRD_RIGHT_FLY1) { bird.setState(Bird.BIRD_RIGHT_FLY2); } else { bird.setState(Bird.BIRD_RIGHT_FLY0); } } } } } // 添加一个bird的逻辑 if (hit_count % 11 == 0 && bird.isOn_screen() == false && rabit.getY() < 210) { init_bird(); } } private void update_all_components() { if (game_over) return; update_rabit(); update_bells(); update_bird(); } private void rabit_move_up() { if (rabit.getCenter_y() > Constant.SCREEN_HEIGHT / 2) { rabit.setY(rabit.getY() - Rabit.SPEED_Y); return; } // 处理屏幕背景的变化 // 处理bells的位置 // 所有的bell下移 // rabit跳跃至屏幕1/2处~2/3时,处理整个场景Components变化 if (rabit.getCenter_y() > 0.33 * Constant.SCREEN_HEIGHT) { for (int i = 0; i < bell_list.size(); i) { Bell bell = bell_list.get(i); bell.setCenter_y(bell.getCenter_y() Rabit.SPEED_Y / 2); } bg.drag_down((int) Rabit.SPEED_Y / 2); bird.setCenter_y(bird.getCenter_y() Rabit.SPEED_Y / 2); rabit.setCenter_y(rabit.getCenter_y() - Rabit.SPEED_Y / 2); } else { // rabit跳跃比屏幕的2/3处还高时,处理整个场景的变化 for (int i = 0; i < bell_list.size(); i) { Bell bell = bell_list.get(i); bell.setCenter_y(bell.getCenter_y() Rabit.SPEED_Y); } bg.drag_down((int) Rabit.SPEED_Y); if (bird.isOn_screen()) { bird.setCenter_y(bird.getCenter_y() Rabit.SPEED_Y); } } // 是否需要清理落地的bell, bell_list[0] 处于最底处,判断它是否落地 Bell lowBell = bell_list.get(0); if (lowBell != null) { if (lowBell.getCenter_y() > 230) { bell_list.remove(lowBell); bell_creator.recycle(lowBell); } } // 判断是否需要添加新的bell, bell_list[size-1] 处于最高处,通过它来判断 if (bell_list.size() > 0) { Bell upBell = bell_list.get(bell_list.size() - 1); if (upBell.getCenter_y() > 50) bell_list.add(bell_creator.createBell()); } } private void rabit_move_down() { if (rabit.getY() > 210) { //rabit已经下落至屏幕底部,不可能在碰到bell, rabit输了高空下坠时背景,bell,bird的位置处理 if (bg.isLowest()) { game_over = true; rabit.setY(Constant.RABIT_INIT_Y); if (rabit.isFaceLeft()) { rabit.setPic_state(Rabit.RABIT_PIC_LEFT_STOP); } else { rabit.setPic_state(Rabit.RABIT_PIC_RIGHT_STOP); } bg.init(); } else { // bg 向上拖动 bg.drag_up((int) Rabit.SPEED_Y); //屏幕上的bird向上移动 if (bird.isOn_screen()) { bird.setCenter_y(bird.getCenter_y() - Rabit.SPEED_Y); if (bird.getCenter_y() < 0) { bird.setOn_screen(false); } } // 所有的bell向上移动 for (int i = 0; i < bell_list.size(); i) { Bell bell = bell_list.get(i); bell.setCenter_y(bell.getCenter_y() - Rabit.SPEED_Y); } // 处理移动到屏幕外的bell if (bell_list.size() > 0) { Bell bell_up = bell_list.get(bell_list.size() - 1); if (bell_up.getCenter_y() < -Bell.BELL_OK_HEIGHT / 2) { bell_list.remove(bell_up); bell_creator.recycle(bell_up); } } } } else { // rabit 还没有玩完 rabit.setY(rabit.getY() Rabit.SPEED_Y); } } public int getScore() { return score; } public void setScore(int score) { this.score = score; } public int getHighest_score() { return highest_score; } public void setHighest_score(int highestScore) { highest_score = highestScore; } }
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论