当前位置: 代码迷 >> Android >> 贪吃蛇 android版 里边自己实现了简单的事件系统
  详细解决方案

贪吃蛇 android版 里边自己实现了简单的事件系统

热度:479   发布时间:2016-04-27 23:15:07.0
贪吃蛇 android版 里面自己实现了简单的事件系统

游戏预览


这里写图片描述


游戏是用SurfaceView开发的 流畅 和体验还是挺好


CanvasState 游戏的主要业务类

package bill;import java.util.ArrayList;import java.util.Collections;import java.util.EventListener;import java.util.EventListenerProxy;import java.util.HashMap;import java.util.Iterator;import java.util.LinkedList;import java.util.Random;import model.BtnGameRect;import model.Direction;import model.GameRect;import model.GameRectId;import model.GameRectType;import model.SNake;import model.SnakeNode;import helper.CollisionHelper;import helper.ScreenHelper;import com.shanghongshen.tsnake.R;import event.CheckEvent;import event.TouchClick;import android.R.id;import android.R.integer;import android.content.Context;import android.content.DialogInterface;import android.content.DialogInterface.OnClickListener;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.RectF;import android.view.SurfaceHolder;import android.widget.Toast;public class CanvasState {    public HashMap<String, GameRect> GameRects = new HashMap<String, GameRect>();    public ArrayList<BtnGameRect> btns = new ArrayList<BtnGameRect>();    public ArrayList<SNake> snakes = new ArrayList<SNake>();    public ArrayList<GameRect> foods = new ArrayList<GameRect>();    public SNake mainSnake;    private CanvasState() {    }    public static CanvasState getInstance() {        if (thisObj == null) {            thisObj = new CanvasState();        }        return thisObj;    }    static CanvasState thisObj;    int FrameRate = 15;    SurfaceHolder holder;    Context context;    int ScreenWidth;    int ScreenHeight;    int eachWidth;    int eachHeight;    int eachMap;    int mapOther;    boolean loadGameRect;    int maxFood = 5;    int maxSnakeSize = 5;    int mapWidth = 18;    int mapHeight = 18;    CollisionHelper collisionHelper = new CollisionHelper();    public void Restart() {        thisObj = new CanvasState();    }    /**     * 注册所有的矩阵块     */    void loadGameRect() {        ScreenWidth = ScreenHelper.getScreenWidth(context);        ScreenHeight = ScreenHelper.getScreenHeight(context);        eachHeight = ScreenHeight / 12;        eachWidth = ScreenWidth / 6;        // 背景        GameRect gameRect = new GameRect(GameRectId.background,                GameRectType.background, BitmapFactory.decodeResource(                        context.getResources(), R.drawable.background),                new RectF(0, 0, ScreenWidth, ScreenHeight));        GameRects.put(GameRectId.background, gameRect);        // 地图        gameRect = new GameRect(GameRectId.map, GameRectType.map,                BitmapFactory.decodeResource(context.getResources(),                        R.drawable.map), new RectF(50, eachHeight * 2,                        ScreenWidth - 50,                        (float) (ScreenWidth - 100 + eachHeight * 2)));        GameRects.put(GameRectId.map, gameRect);        eachMap = (int) ((int) (ScreenWidth - 100) / 18.5);        mapOther = eachMap / 4;        // 蓝色的食物        gameRect = new GameRect(GameRectId.foodBlue, GameRectType.food,                BitmapFactory.decodeResource(context.getResources(),                        R.drawable.blue), new RectF(0, 0, 0, 0));        GameRects.put(GameRectId.foodBlue, gameRect);        // 红色的食物        gameRect = new GameRect(GameRectId.foodRed, GameRectType.food,                BitmapFactory.decodeResource(context.getResources(),                        R.drawable.red), new RectF(0, 0, 0, 0));        GameRects.put(GameRectId.foodRed, gameRect);        // 绿色的食物        gameRect = new GameRect(GameRectId.foodGreen, GameRectType.food,                BitmapFactory.decodeResource(context.getResources(),                        R.drawable.green), new RectF(0, 0, 0, 0));        GameRects.put(GameRectId.foodGreen, gameRect);        // 按钮背景        gameRect = new GameRect(GameRectId.btnFameGreen,                GameRectType.background, BitmapFactory.decodeResource(                        context.getResources(), R.drawable.frame_green),                new RectF(0, eachHeight * 9, ScreenWidth, ScreenHeight));        GameRects.put(GameRectId.btnFameGreen, gameRect);        // 按钮右        BtnGameRect gameRectBtn = new BtnGameRect(GameRectId.btnRight,                GameRectType.button, BitmapFactory.decodeResource(                        context.getResources(), R.drawable.right),                BitmapFactory.decodeResource(context.getResources(),                        R.drawable.rightblue),                new RectF((float) (eachWidth * 3.5),                        (float) (eachHeight * 9.8), (float) (eachWidth * 5.5),                        (float) (eachHeight * 11.2)), true);        gameRectBtn.onClick = new TouchClick() {            @Override            public void OnClick() {                RightClick();            }        };        GameRects.put(GameRectId.btnRight, gameRectBtn);        btns.add(gameRectBtn);        CheckEvent.getInstance().RegisterEventGameRects.add(gameRectBtn);        // 按钮左        gameRectBtn = new BtnGameRect(GameRectId.btnLeft, GameRectType.button,                BitmapFactory.decodeResource(context.getResources(),                        R.drawable.left), BitmapFactory.decodeResource(                        context.getResources(), R.drawable.leftblue),                new RectF((float) (eachWidth * 0.5),                        (float) (eachHeight * 9.8), (float) (eachWidth * 2.5),                        (float) (eachHeight * 11.2)), true);        gameRectBtn.onClick = new TouchClick() {            @Override            public void OnClick() {                LeftClick();            }        };        GameRects.put(GameRectId.btnLeft, gameRectBtn);        btns.add(gameRectBtn);        CheckEvent.getInstance().RegisterEventGameRects.add(gameRectBtn);        // 按钮上        gameRectBtn = new BtnGameRect(GameRectId.btnUp, GameRectType.button,                BitmapFactory.decodeResource(context.getResources(),                        R.drawable.up), BitmapFactory.decodeResource(                        context.getResources(), R.drawable.upblue), new RectF(                        (float) (eachWidth * 2), (float) (eachHeight * 9.2),                        (float) (eachWidth * 4), (float) (eachHeight * 10.5)),                true);        gameRectBtn.onClick = new TouchClick() {            @Override            public void OnClick() {                UpClick();            }        };        GameRects.put(GameRectId.btnUp, gameRectBtn);        btns.add(gameRectBtn);        CheckEvent.getInstance().RegisterEventGameRects.add(gameRectBtn);        // 按钮下        gameRectBtn = new BtnGameRect(GameRectId.btnDown, GameRectType.button,                BitmapFactory.decodeResource(context.getResources(),                        R.drawable.down), BitmapFactory.decodeResource(                        context.getResources(), R.drawable.downblue),                new RectF((float) (eachWidth * 2), (float) (eachHeight * 10.5),                        (float) (eachWidth * 4), (float) (eachHeight * 11.8)),                true);        gameRectBtn.onClick = new TouchClick() {            @Override            public void OnClick() {                DownClick();            }        };        GameRects.put(GameRectId.btnDown, gameRectBtn);        btns.add(gameRectBtn);        CheckEvent.getInstance().RegisterEventGameRects.add(gameRectBtn);        // 按钮on        gameRectBtn = new BtnGameRect(GameRectId.btnOn, GameRectType.button,                BitmapFactory.decodeResource(context.getResources(),                        R.drawable.on_blue), BitmapFactory.decodeResource(                        context.getResources(), R.drawable.on_red), new RectF(                        (float) (eachWidth * 4), (float) (eachHeight * 0.5),                        (float) (eachWidth * 5.7), (float) (eachHeight * 1.5)),                true);        gameRectBtn.onClick = new TouchClick() {            @Override            public void OnClick() {                BtnGameRect btnOn = (BtnGameRect) GameRects                        .get(GameRectId.btnOn);                BtnGameRect btnOff = (BtnGameRect) GameRects                        .get(GameRectId.btnOff);                btnOn.ShowState = false;                btnOff.ShowState = true;                setIsSuspend(false);            }        };        GameRects.put(GameRectId.btnOn, gameRectBtn);        btns.add(gameRectBtn);        CheckEvent.getInstance().RegisterEventGameRects.add(gameRectBtn);        // 按钮off        gameRectBtn = new BtnGameRect(GameRectId.btnOff, GameRectType.button,                BitmapFactory.decodeResource(context.getResources(),                        R.drawable.off_blue), BitmapFactory.decodeResource(                        context.getResources(), R.drawable.off_red), new RectF(                        (float) (eachWidth * 4), (float) (eachHeight * 0.5),                        (float) (eachWidth * 5.7), (float) (eachHeight * 1.5)),                true);        gameRectBtn.onClick = new TouchClick() {            @Override            public void OnClick() {                BtnGameRect btnOn = (BtnGameRect) GameRects                        .get(GameRectId.btnOn);                BtnGameRect btnOff = (BtnGameRect) GameRects                        .get(GameRectId.btnOff);                btnOn.ShowState = true;                btnOff.ShowState = false;                setIsSuspend(true);            }        };        GameRects.put(GameRectId.btnOff, gameRectBtn);        gameRectBtn.ShowState = false;        btns.add(gameRectBtn);        CheckEvent.getInstance().RegisterEventGameRects.add(gameRectBtn);        // 加载snake 资源        SnakeNode snakeNode = new SnakeNode(GameRectId.snakeHeadTop,                GameRectType.snakeNode, BitmapFactory.decodeResource(                        context.getResources(), R.drawable.head_n), new RectF(                        0, 0, 0, 0));        GameRects.put(GameRectId.snakeHeadTop, snakeNode);        snakeNode = new SnakeNode(GameRectId.snakeHeadDown,                GameRectType.snakeNode, BitmapFactory.decodeResource(                        context.getResources(), R.drawable.head_s), new RectF(                        0, 0, 0, 0));        GameRects.put(GameRectId.snakeHeadDown, snakeNode);        snakeNode = new SnakeNode(GameRectId.snakeHeadLeft,                GameRectType.snakeNode, BitmapFactory.decodeResource(                        context.getResources(), R.drawable.head_w), new RectF(                        0, 0, 0, 0));        GameRects.put(GameRectId.snakeHeadLeft, snakeNode);        snakeNode = new SnakeNode(GameRectId.snakeHeadRight,                GameRectType.snakeNode, BitmapFactory.decodeResource(                        context.getResources(), R.drawable.head_e), new RectF(                        0, 0, 0, 0));        GameRects.put(GameRectId.snakeHeadRight, snakeNode);        snakeNode = new SnakeNode(GameRectId.snakeNode, GameRectType.snakeNode,                BitmapFactory.decodeResource(context.getResources(),                        R.drawable.snake), new RectF(0, 0, 0, 0));        GameRects.put(GameRectId.snakeNode, snakeNode);        mainSnake = getSnake(3, GameRectId.snakeHeadLeft);        mainSnake.SetSpeed(1000);        mainSnake.IsPause(true);        snakes.add(mainSnake);        // OpenAutoCreateSnake();        OpenAutoCreateFood();    }    public void OpenAutoCreateSnake() {        if (this.snakes.size() < this.maxSnakeSize) {            int c = this.maxSnakeSize - this.snakes.size() + 1;            for (int i = 0; i < c; i++) {                SNake sk = getSnake(4, GameRectId.snakeHeadRight);                sk.SetSpeed(2000);                sk.setAutoDirection(true);                snakes.add(sk);            }        }    }    public void OpenAutoCreateFood() {        int needSize = maxFood - foods.size();        LinkedList bankMap = GetAllBankIndex();        GameRect mapRect = GameRects.get(GameRectId.map);        for (int i = 0; i < needSize; i++) {            int ran = (int) (Math.random() * 3);            int ranLocation = (int) bankMap.get((int) (Math.random() * bankMap                    .size()));            RectF tempRect = new RectF();            tempRect.top = mapRect.rectF.top + this.mapOther + ranLocation                    / this.mapWidth * this.eachMap;            tempRect.bottom = tempRect.top + this.eachMap;            tempRect.left = mapRect.rectF.left + this.mapOther + ranLocation                    % this.mapWidth * this.eachMap;            tempRect.right = tempRect.left + this.eachMap;            switch (ran) {            case 0:                GameRect old1 = GameRects.get(GameRectId.foodRed);                GameRect gr1 = new GameRect(old1.Id, old1.gameRectType,                        old1.bitmap, tempRect);                foods.add(gr1);                break;            case 1:                GameRect old2 = GameRects.get(GameRectId.foodBlue);                GameRect gr2 = new GameRect(old2.Id, old2.gameRectType,                        old2.bitmap, tempRect);                foods.add(gr2);                break;            case 2:                GameRect old3 = GameRects.get(GameRectId.foodGreen);                GameRect gr3 = new GameRect(old3.Id, old3.gameRectType,                        old3.bitmap, tempRect);                foods.add(gr3);                break;            default:                OpenAutoCreateFood();                break;            }        }    }    /**     * 获取所有的空白场地的索引     */    public LinkedList GetAllBankIndex() {        LinkedList rst = new LinkedList();        int mapAll = mapWidth * mapHeight;        for (int i = 0; i < mapAll; i++) {            rst.add(i);        }        GameRect mapRect = GameRects.get(GameRectId.map);        // 排除所有的snake        for (SNake snake : snakes) {            if (snake.SnakeState) {                for (SnakeNode node : snake.SnakeNodes) {                    OutRect(mapRect.rectF, node.rectF, rst);                }            }        }        // 排除所有的食物        for (GameRect food : foods) {            OutRect(mapRect.rectF, food.rectF, rst);        }        return rst;    }    void OutRect(RectF mapRect, RectF neetOutRect, LinkedList rst) {        int left = (int) ((neetOutRect.left - mapRect.left - this.mapOther) / this.eachMap);        int top = (int) ((neetOutRect.top - mapRect.top - this.mapOther) / this.eachMap);        int index = rst.indexOf(left + top * this.mapWidth - 1);        if (index == -1) {            return;        }        rst.remove(index);    }    void CheckDie(SNake snake) {        SnakeNode head = snake.HeadNode;        for (int i = 1; i < snake.SnakeNodes.size(); i++) {            SnakeNode node = snake.SnakeNodes.get(i);            if (head.rectF.left == node.rectF.left&&head.rectF.top == node.rectF.top) {                snake.IsLive = false;                break;            }        }    }    /**     * 碰撞检测     */    public void CheckCollision() {        for (int i = 0; i < snakes.size(); i++) {            SNake item = snakes.get(i);            CheckDie(item);            // 蛇和蛇碰撞            // if (item!=mainSnake&&mainSnake.SnakeState) {            // SnakeNode mainSnakeHead = mainSnake.SnakeNodes.get(0);            // for (int j = 0; j < item.SnakeNodes.size(); j++) {            // boolean rst =            // collisionHelper.IsRectCollision(mainSnakeHead.rectF,item.SnakeNodes.get(j).rectF);            // if (rst) {            // //mainSnake.Stop();            // OpenAutoCreateSnake();            // return;            // }            // }            // }            // 蛇和食物碰撞            int foodSize = foods.size();            for (int j = 0; j < foodSize; j++) {                if (foods.size() == j) {                    break;                }                GameRect sHead = item.SnakeNodes.get(0);                GameRect nowFood = foods.get(j);                boolean rst = collisionHelper.IsRectCollision(sHead.rectF,                        nowFood.rectF);                if (rst) {                    // 移除食物                    foods.remove(j);                    // 增加蛇节                    SnakeNode last = item.SnakeNodes                            .get(item.SnakeNodes.size() - 1);                    RectF newRf = new RectF(last.rectF.left, last.rectF.top,                            last.rectF.right, last.rectF.bottom);                    switch (last.direction) {                    case Top:                        newRf.top += eachMap;                        newRf.bottom += eachMap;                        break;                    case Down:                        newRf.top -= eachMap;                        newRf.bottom -= eachMap;                        break;                    case Left:                        newRf.left += eachMap;                        newRf.right += eachMap;                        break;                    case Right:                        newRf.left -= eachMap;                        newRf.right -= eachMap;                        break;                    }                    SnakeNode sn = new SnakeNode(last.Id, last.gameRectType,                            last.bitmap, newRf);                    item.SnakeNodes.add(sn);                    OpenAutoCreateFood();                }            }        }    }    /**     * 暂停恢复     *      * @param suspend     */    public void setIsSuspend(boolean suspend) {        if (suspend) {            mainSnake.IsPause(true);        } else {            mainSnake.IsPause(false);        }    }    void Draw(Canvas cv) {        if (!loadGameRect) {            loadGameRect();            loadGameRect = true;        }        // 画背景        DrawBackground(cv);        // 碰撞检测        CheckCollision();        CheckGameState();        // 画蛇        DrawSnake(cv);        // 画食物        DrawFood(cv);    }    public void CheckGameState(){        if (!this.mainSnake.IsLive) {            //游戏结束            foods.clear();            snakes.clear();            mainSnake = getSnake(3, GameRectId.snakeHeadLeft);            mainSnake.SetSpeed(1000);            mainSnake.IsPause(true);            snakes.add(mainSnake);            OpenAutoCreateFood();            BtnGameRect btnOn = (BtnGameRect) GameRects                    .get(GameRectId.btnOn);            BtnGameRect btnOff = (BtnGameRect) GameRects                    .get(GameRectId.btnOff);            btnOn.ShowState = true;            btnOff.ShowState = false;            setIsSuspend(true);        }    }    private void DrawFood(Canvas cv) {        for (GameRect item : foods) {            cv.drawBitmap(item.bitmap, null, item.rectF, null);        }    }    private void DrawSnake(Canvas cv) {        for (SNake temp : snakes) {            if (temp.SnakeState) {                for (SnakeNode item : temp.SnakeNodes) {                    if (item.ShowState) {                        cv.drawBitmap(item.bitmap, null, item.rectF, null);                    }                }            }        }    }    private void DrawBackground(Canvas cv) {        cv.drawColor(Color.WHITE);        DrawGameRect(GameRectId.background, cv);        DrawGameRect(GameRectId.map, cv);        DrawGameRect(GameRectId.btnFameGreen, cv);        DrawGameRect(GameRectId.btnLeft, cv);        DrawGameRect(GameRectId.btnRight, cv);        DrawGameRect(GameRectId.btnUp, cv);        DrawGameRect(GameRectId.btnDown, cv);        DrawGameRect(GameRectId.btnOn, cv);        DrawGameRect(GameRectId.btnOff, cv);    }    void DrawGameRect(String id, Canvas cv) {        GameRect rect = GameRects.get(id);        if (rect != null && rect.ShowState) {            cv.drawBitmap(rect.bitmap, null, rect.rectF, null);        }    }    /*     * 获取一条蛇     */    public SNake getSnake(int size, String headId) {        SnakeNode head = (SnakeNode) this.GameRects.get(headId);        SnakeNode node = (SnakeNode) this.GameRects.get(GameRectId.snakeNode);        SnakeNode headNode = new SnakeNode(head.Id, head.gameRectType,                head.bitmap, getRectFRandom(null, headId));        SetDirection(headId, headNode);        SNake sk = new SNake(this.GameRects.get(GameRectId.map), eachMap,                mapOther, headNode, GameRects);        if (head != null) {            sk.SnakeNodes.add(headNode);        }        for (int i = 0; i < size - 1; i++) {            if (node != null) {                RectF tempR = getRectFRandom(sk.SnakeNodes.get(i).rectF, headId);                SnakeNode snakeNode = new SnakeNode(GameRectId.snakeNode,                        GameRectType.snakeNode, node.bitmap, tempR);                SetDirection(headId, snakeNode);                sk.SnakeNodes.add(snakeNode);            }        }        return sk;    }    void SetDirection(String headId, SnakeNode node) {        if (node == null)            return;        switch (headId) {        // 上        case GameRectId.snakeHeadTop:            node.direction = Direction.Top;            break;        // 下        case GameRectId.snakeHeadDown:            node.direction = Direction.Down;            break;        // 左        case GameRectId.snakeHeadLeft:            node.direction = Direction.Left;            break;        // 右        case GameRectId.snakeHeadRight:            node.direction = Direction.Right;            break;        }    }    RectF getRectFRandom(RectF lastRect, String headId) {        RectF temp = new RectF();        GameRect rect = GameRects.get(GameRectId.map);        if (lastRect == null) {            int randNumLeft = (int) (Math.random() * (13 - 7) + 7);            int randNumTop = (int) (Math.random() * (13 - 7) + 7);            temp.left = eachMap * randNumLeft + mapOther + rect.rectF.left;            temp.right = eachMap * randNumLeft + mapOther + rect.rectF.left                    + eachMap;            temp.top = eachMap * randNumTop + mapOther + rect.rectF.top;            temp.bottom = eachMap * randNumTop + mapOther + rect.rectF.top                    + eachMap;        } else if (headId == null) {            int randNumLeft = (int) (Math.random() * 18);            int randNumTop = (int) (Math.random() * 18);            temp.left = eachMap * randNumLeft + mapOther + rect.rectF.left;            temp.right = eachMap * randNumLeft + mapOther + rect.rectF.left                    + eachMap;            temp.top = eachMap * randNumTop + mapOther + rect.rectF.top;            temp.bottom = eachMap * randNumTop + mapOther + rect.rectF.top                    + eachMap;        } else {            switch (headId) {            // 上            case GameRectId.snakeHeadTop:                temp.top = lastRect.top - eachMap;                temp.bottom = lastRect.bottom - eachMap;                temp.right = lastRect.right;                temp.left = lastRect.left;                break;            // 下            case GameRectId.snakeHeadDown:                temp.top = lastRect.top + eachMap;                temp.bottom = lastRect.bottom + eachMap;                temp.right = lastRect.right;                temp.left = lastRect.left;                break;            // 左            case GameRectId.snakeHeadLeft:                temp.top = lastRect.top;                temp.bottom = lastRect.bottom;                temp.right = lastRect.right + eachMap;                temp.left = lastRect.left + eachMap;                break;            // 右            case GameRectId.snakeHeadRight:                temp.top = lastRect.top;                temp.bottom = lastRect.bottom;                temp.right = lastRect.right - eachMap;                temp.left = lastRect.left - eachMap;                break;            }        }        return temp;    }    void UpClick() {        if (!mainSnake.IsPause)            mainSnake.Run(Direction.Top);    }    void DownClick() {        if (!mainSnake.IsPause)            mainSnake.Run(Direction.Down);    }    void RightClick() {        if (!mainSnake.IsPause)            mainSnake.Run(Direction.Right);    }    void LeftClick() {        if (!mainSnake.IsPause)            mainSnake.Run(Direction.Left);    }}

游戏碰撞检测类


package helper;

import android.graphics.Rect;
import android.graphics.RectF;

/**
* 游戏碰撞检测类
*
* @author poolo
* @version 1.00
*/
public class CollisionHelper {

/**   * 矩形碰撞检测 参数为x,y,width,height   *    * @param x1   *            第一个矩形的x   * @param y1   *            第一个矩形的y   * @param w1   *            第一个矩形的w   * @param h1   *            第一个矩形的h   * @param x2   *            第二个矩形的x   * @param y2   *            第二个矩形的y   * @param w2   *            第二个矩形的w   * @param h2   *            第二个矩形的h   * @return 是否碰撞   */  public boolean IsRectCollision(float x1, float y1, float w1, float h1, float x2,           float y2, float w2, float h2) {       if (x2 > x1 && x2 > x1 + w1) {           return false;       } else if (x2 < x1 && x2 < x1 - w2) {           return false;       } else if (y2 > y1 && y2 > y1 + h1) {           return false;       } else if (y2 < y1 && y2 < y1 - h2) {           return false;       } else {           return true;       }   }   /**   * 矩形碰撞检测 参数为Rect对象   *    * @param r1   *            第一个Rect对象   * @param r2   *            第二个Rect对象   * @return 是否碰撞   */  public boolean IsRectCollision(RectF r1, RectF r2) {    if (r1.left==r2.left&&r1.right==r2.right&&r1.top==r2.top&&r1.bottom==r2.bottom) {        return true;    }else {        return false;    }} /**   * 圆形碰撞检测   *    * @param x1   *            第一个圆的圆心x   * @param y1   *            第一个圆的圆心y   * @param r1   *            第一个圆的半径   * @param x2   *            第二个圆的圆心x   * @param y2   *            第二个圆的圆心y   * @param r2   *            第二个圆的半径   * @return 是否碰撞   */  public boolean IsCircleCollision(int x1, int y1, int r1, int x2, int y2,           int r2) {       // 两点距大于 2圆形半径距离       if (Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2)) > r1 + r2) {           return false;       }       return true;   }   /**   * 圆形与矩形碰撞检测   *    * @param x1   *            第一个矩形的x   * @param y1   *            第一个矩形的y   * @param w1   *            第一个矩形的宽   * @param h1   *            第一个矩形的高   * @param x2   *            圆的圆心x   * @param y2   *            圆的圆心y   * @param r2   *            圆的半径r   * @return 是否碰撞   */  public boolean IsC2RCollision(int x1, int y1, int w1, int h1, int x2,           int y2, int r2) {       if ((Math.abs(x2 - (x1 + w1 / 2)) > w1 / 2 + r2)               || Math.abs(y2 - (y1 + h1 / 2)) > h1 / 2 + r2) {           return false;       }       return true;   }   /**   * 多矩形碰撞   *    * @param rArray1   * @param rArray2   * @return 是否碰撞   */  public boolean IsRectsCollision(RectF[] rArray1, RectF[] rArray2) {       for (RectF rt1 : rArray1) {           for (RectF rt2 : rArray2) {               if (IsRectCollision(rt1, rt2)) {                   return true;               }           }       }       return false;   }   

}


事件管理和分发类

package event;import java.util.ArrayList;import model.BtnGameRect;import model.GameRect;public class CheckEvent {    public ArrayList<BtnGameRect> RegisterEventGameRects = new ArrayList<BtnGameRect>();    static CheckEvent thisObj;    private CheckEvent() {    }    public static CheckEvent getInstance() {        if (thisObj == null) {            thisObj = new CheckEvent();        }        return thisObj;    }    public void Restart() {        thisObj = new CheckEvent();    }    public void CheckDown(float x, float y) {        for (int i = 0; i < RegisterEventGameRects.size(); i++) {            BtnGameRect item = RegisterEventGameRects.get(i);            if (item.rectF.left < x && item.rectF.right > x                    && item.rectF.top < y && item.rectF.bottom > y                    && item.ShowState) {                if (item.onDown != null) {                    item.onDown.OnDown();                }                break;            }        }    }    public void CheckUp(float x, float y) {        for (int i = 0; i < RegisterEventGameRects.size(); i++) {            BtnGameRect item = RegisterEventGameRects.get(i);            //if (item.rectF.left < x && item.rectF.right > x            //      && item.rectF.top < y && item.rectF.bottom > y            //      && item.ShowState) {            if (item.DownState) {                if (item.onUp != null) {                    item.onUp.OnUp();                }                if (item.onClick != null) {                    item.onClick.OnClick();                }            }            //}        }    }}

其他详细见源码

注:源码里的图片资源是破解的,请不要用作商业用途,否则后果自负

http://pan.baidu.com/s/1ntw25Hv

版权声明:欢迎装载,原文链接http://blog.csdn.net/shanghongshen/article/

  相关解决方案