Android 简单游戏实现笑脸的移动与人物移动
发布日期:2021-06-30 22:35:02 浏览次数:3 分类:技术文章

本文共 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 List
mFaces;//笑脸集合 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Android 关于自定义TextView的测量
下一篇:Android 使用Handler模仿流行的AsyncHttpClient

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年04月27日 04时59分41秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

tensorflow使用tensorboard进行可视化 2019-04-30
神经网络调参实战(二)—— activation & initializer & optimizer 2019-04-30
凸优化 convex optimization 2019-04-30
数据库索引 & 为什么要对数据库建立索引 / 数据库建立索引为什么会加快查询速度 2019-04-30
IEEE与APA引用格式 2019-04-30
research gap 2019-04-30
pytorch训练cifar10数据集查看各个种类图片的准确率 2019-04-30
Python鼠标点击图片,获取点击点的像素坐标 2019-04-30
路径规划(一) —— 环境描述(Grid Map & Feature Map) & 全局路径规划(最优路径规划(Dijkstra&A*star) & 概率路径规划(PRM&RRT)) 2019-04-30
神经网络调参实战(四)—— 加深网络层次 & 批归一化 batch normalization 2019-04-30
数据挖掘与数据分析(三)—— 探索性数据分析EDA(多因子与复合分析) & 可视化(1)—— 假设检验(μ&卡方检验&方差检验(F检验))&相关系数(皮尔逊&斯皮尔曼) 2019-04-30
RRT算法(快速拓展随机树)的Python实现 2019-04-30
路径规划(二) —— 轨迹优化(样条法) & 局部规划(人工势能场法) & 智能路径规划(生物启发(蚁群&RVO) & 强化学习) 2019-04-30
强化学习(四) —— Actor-Critic演员评论家 & code 2019-04-30
RESTful API 2019-04-30
优化算法(四)——粒子群优化算法(PSO) 2019-04-30
数据挖掘与数据分析(三)—— 探索性数据分析EDA(多因子与复合分析) & 可视化(2)——回归分析(最小二乘法&决定系数&残差不相关)&主成分分析&奇异值分解 2019-04-30
数据在Oracle中的存储 2019-04-30
优化算法(五)—人工蜂群算法Artificial Bee Colony Algorithm(ABC) 2019-04-30
轨迹规划 trajectory planning 2019-04-30