Android 简单游戏实现笑脸的移动与人物移动
发布日期:2021-06-30 22:35:02
浏览次数:4
分类:技术文章
本文共 8452 字,大约阅读时间需要 28 分钟。
第一步:创建对象的基类Sprite
说明:因为游戏里的对象都有图片,位置属性 都有一个共有的方法,就是绘制自己public abstract class Sprite { public Bitmap defaultBitmap; public Point position; public Sprite(Bitmap defaultBitmap, Point position) { this.defaultBitmap = defaultBitmap; this.position = position; } /** * 每个对象都能画自己 * @param canvas */ public void drawSelf(Canvas canvas){ canvas.drawBitmap(defaultBitmap, position.x, position.y, null); }}
—————————————————–
(java 架构师全套教程,共760G, 让你从零到架构师,每月轻松拿3万) 请先拍 , 下载请用百度盘 目录如下: 01.高级架构师四十二个阶段高 02.Java高级系统培训架构课程148课时 03.Java高级互联网架构师课程 04.Java互联网架构Netty、Nio、Mina等-视频教程 05.Java高级架构设计2016整理-视频教程 06.架构师基础、高级片 07.Java架构师必修linux运维系列课程 08.Java高级系统培训架构课程116课时 (送:hadoop系列教程,java设计模式与数据结构, Spring Cloud微服务, SpringBoot入门) 01高级架构师四十二个阶段高内容: 01高级架构师四十二个阶段高内容: —————————————————–第二步:创建三个对象 人, 按钮,笑脸
public class Man extends Sprite{ public static final int MOVE_DOWN = 0x00; public static final int MOVE_UP = 0x01; public static final int MOVE_LEFT = 0x02; public static final int MOVE_RIGHT = 0x03; private int speed = 6; public Man(Bitmap defaultBitmap, Point position) { super(defaultBitmap, position); } /** * 创建笑脸 * @param context * @param drawableId * @return */ public Face createFace(Context context,Point touchPoint, int drawableId){ Bitmap faceBitmap = BitmapFactory.decodeResource(context.getResources(), drawableId); Face face = new Face(faceBitmap, new Point(position.x + 50, position.y + 50), touchPoint); return face; } /** * 移动 * @param direct */ public void move(int direct){ if (direct == MOVE_DOWN) { position.y += speed; }else if (direct == MOVE_UP) { position.y -= speed; }else if (direct == MOVE_LEFT) { position.x -= speed; }else if (direct == MOVE_RIGHT) { position.x += speed; } } /** * 设置速度 */ public void setSpeed(int speed){ this.speed = speed; }}
public class MyButton extends Sprite{
private boolean isClick = false; private Bitmap pressBitmap; public MyButton(Bitmap defaultBitmap, Point position, Bitmap pressBitmap) { super(defaultBitmap, position); this.pressBitmap = pressBitmap; } @Override public void drawSelf(Canvas canvas) { if (isClick) { //绘制向下 canvas.drawBitmap(pressBitmap, position.x, position.y, null); }else { super.drawSelf(canvas);//默认 } } /** * 判断按钮是否可点击 * @return */ public boolean isClick(Point touchPoint) { Rect rect = new Rect(position.x, position.y, position.x + pressBitmap.getWidth(), position.y + pressBitmap.getHeight()); isClick = rect.contains(touchPoint.x, touchPoint.y); return isClick; } public void setClick(boolean isClick) { this.isClick = isClick; } /** * 提供向外的点击事件 */ public void click(){ if (mListener != null) { mListener.click(); } } private OnButtonClickListener mListener; public interface OnButtonClickListener{ void click(); } public void setOnButtonClickListener(OnButtonClickListener listener){ this.mListener = listener; }}
public class Face extends Sprite{ int speed = 30; private int tx; private int ty; public Face(Bitmap defaultBitmap, Point position, Point touchPoint) { super(defaultBitmap, position); //起始点与尾部点的距离,即三角形的的直角边 int X = touchPoint.x - position.x; int Y = touchPoint.y - position.y; //斜边长度 int Len = (int) Math.sqrt(X*X + Y*Y); tx = speed * X / Len; ty = speed * Y / Len; } /** * 笑脸移动的方法 */ public void move(){ this.position.x += tx; this.position.y += ty; }}
第三步:创建游戏界面
public class GameView extends SurfaceView implements SurfaceHolder.Callback{ private boolean isRuning = false; private SurfaceTask mTask; private SurfaceHolder mHolder; private Man mMan;//人物 private ListmFaces;//笑脸集合 private MyButton mButton;//按钮 private ExecutorService mPool; public GameView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); mHolder = getHolder(); mHolder.addCallback(this); mPool = Executors.newFixedThreadPool(5); } public GameView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public GameView(Context context) { this(context, null); } @Override/**创建是调用*/ public void surfaceCreated(SurfaceHolder holder) { Bitmap manBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.avatar_boy); //创建小人 mMan = new Man(manBitmap, new Point(0, 0)); //创建笑脸 mFaces = new CopyOnWriteArrayList (); //创建按钮图片 Bitmap btnBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.bottom_default); Bitmap pressBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.bottom_press); mButton = new MyButton(btnBitmap, new Point(getWidth()/2, getHeight()-100), pressBitmap); mButton.setOnButtonClickListener(listener); mTask = new SurfaceTask(); isRuning = true; mPool.execute(mTask); } private OnButtonClickListener listener = new OnButtonClickListener() { @Override public void click() { mMan.move(Man.MOVE_DOWN); } }; @Override/**改变时是调用*/ public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override/**销毁时调用*/ public void surfaceDestroyed(SurfaceHolder holder) { //停止线程 isRuning = false; } private class SurfaceTask implements Runnable{ @Override public void run() { while(isRuning){ try { long start = System.currentTimeMillis(); drawUI(); long end = System.currentTimeMillis(); long dtime = end - start; int fps = (int) (1000 / dtime);//得到游戏的帧数 一般是30帧数 System.out.println("fps --" + fps); } catch (Exception e) { e.printStackTrace(); } } } } /** * 处理屏幕点击 * @param event */ public void handTouch(MotionEvent event){ switch (event.getAction()) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_MOVE: int x = (int) event.getRawX(); int y = (int) event.getRawY(); //处理按钮事件 if (mButton.isClick(new Point(x, y))) { //mMan.move(Man.MOVE_DOWN); mButton.click(); }else { //创建笑脸并移动 Face mFace = mMan.createFace(getContext(), new Point(x, y), R.drawable.rating_small); mFaces.add(mFace); } break; case MotionEvent.ACTION_UP: //手指抬起时,不能再点击 mButton.setClick(false); break; default: break; } } /** * 绘制矩形 */ public void drawUI() { //锁定界面 Canvas canvas = mHolder.lockCanvas(); Paint paint = new Paint(); paint.setColor(Color.GRAY); //画矩形 canvas.drawRect(0, 0, getWidth(), getHeight(), paint); mMan.drawSelf(canvas); mButton.drawSelf(canvas); //List tempFaces = new ArrayList (); for(Face face : mFaces){ if (face != null) { face.drawSelf(canvas); face.move(); if (face.position.x < 0 || face.position.x > getWidth() || face.position.y < 0 || face.position.y > getHeight()) { mFaces.remove(face); //tempFaces.add(face); } } } //不在屏幕内的笑脸移除 //mFaces.remove(tempFaces); //解锁并提交 mHolder.unlockCanvasAndPost(canvas); }}
第四部:实现
public class PlantActivity extends Activity { private GameView gameView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); gameView = new GameView(getApplicationContext()); setContentView(gameView); } @Override public boolean onTouchEvent(MotionEvent event) { gameView.handTouch(event); return super.onTouchEvent(event); }}
转载地址:https://lovoo.blog.csdn.net/article/details/51223649 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
表示我来过!
[***.240.166.169]2024年04月10日 15时43分58秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
区块链的优势和劣势的对比
2019-05-01
新技术,区块链能用在什么领域
2019-05-01
区块链技术应用,最先医疗行业
2019-05-01
新币上市旧币会降价吗
2019-05-01
为什么币圈的基础设施越来越多
2019-05-01
区块链投资要注意这几点
2019-05-01
市场套利策略是什么
2019-05-01
跨市场套利怎么处理
2019-05-01
当博士进入币圈会怎么样
2019-05-01
以太坊技术分解
2019-05-01
以太坊技术怎么提供安全性
2019-05-01
如何验证以太坊技术安全性
2019-05-01
数字货币的投资正确之路
2019-05-01
委员会怎么验证比特币真伪
2019-05-01
迅雷陷入窘迫,但是无可替代
2019-05-01
PHP之 使用PHPMailer插件实现邮件发送功能
2019-05-01
Linux之 关于VM虚拟机网卡的设置
2019-05-01
Lnmp环境搭建之php-7.2.19安装配置
2019-05-01
《增长黑客》(肖恩·艾利斯)学习笔记——第一部分 方法
2019-05-01