package edu.minggo.game.icecream; import java.util.ArrayList; import java.util.List; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.os.Handler; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceHolder.Callback; import android.view.SurfaceView; import android.widget.Toast; import edu.minggo.chat.R; import edu.minggo.chat.ui.GameIceCreamActivity; import edu.minggo.chat.ui.GameIceCreamActivity.OnResetGameListen; /** * 堆雪糕 * @author minggo * @date 2013-5-8上午09:58:33 */ public class DropIceCreamSurfaceView extends SurfaceView implements Callback, Runnable { private final static int MAX_TOUCH = 3; // 按钮设置 private Bitmap leftBt; private Bitmap midBt; private Bitmap rightBt; // 甜筒位置 private Bitmap lefttong; private Bitmap midtong; private Bitmap righttong; // 按钮的x y坐标 private int leftbtX, leftbtY; private int midbtX, midbtY; private int rightbtX, rightbtY; // 按钮上往下的图片 private Bitmap downbt1; private Bitmap downbt2; private Bitmap downbt3; // 礼物堆积头和�? private Bitmap presentDown; private Bitmap presentUp; private Bitmap background; // 箭头 private int down1X, down1Y; private int down2X, down2Y; private int down3X, down3Y; // 屏幕长宽 private int displayW; private int displayH; private Canvas canvas; private Paint paint; SurfaceHolder surfaceHolder; private Context context; // 下落线程 Thread th; private Bitmap[] present; private int random1; private int random2; private int random3; private boolean flag1; private boolean flag2; private boolean flag3; private double currentHeightA; private double currentHeightB; private double currentHeightC; private int index1; private int index2; private int index3; private int presentHieht; private List<Bitmap> a; private List<Bitmap> b; private List<Bitmap> c; private int leftClick = 0; private int midClick = 0; private int rightClick = 0; private boolean clickable; private Handler timeHandler; private Handler stopHandler; private int yesClick; private boolean moreClick; //游戏的开始和结束的监听器 private DropPresentListen dropPresentListen; private OnResetGameListen onResetGameListen = new OnResetGameListen() { @Override public void onReset() { initData(); onMyDraw(); } }; public DropPresentListen getDropPresentListen() { return dropPresentListen; } public void setDropPresentListen(DropPresentListen dropPresentListen) { this.dropPresentListen = dropPresentListen; } public DropIceCreamSurfaceView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); this.context = context; surfaceHolder = this.getHolder(); surfaceHolder.addCallback(this); paint = new Paint(); paint.setColor(Color.WHITE); } public DropIceCreamSurfaceView(Context context, AttributeSet attrs) { super(context, attrs); this.context = context; surfaceHolder = this.getHolder(); surfaceHolder.addCallback(this); paint = new Paint(); paint.setColor(Color.WHITE); } public DropIceCreamSurfaceView(Context context) { super(context); this.context = context; surfaceHolder = this.getHolder(); surfaceHolder.addCallback(this); paint = new Paint(); paint.setColor(Color.TRANSPARENT); } /** * 画面 */ public void onMyDraw() { canvas = surfaceHolder.lockCanvas(); //canvas.drawBitmap(BitmapFactory.decodeResource(this.getResources(),R.drawable.present_head), 0, 0, null); try { if (canvas != null) { canvas.drawBitmap(background, 0, 0, null); //canvas.drawRGB(255, 255, 255); canvas.drawBitmap(lefttong, leftbtX+displayW/3/10, displayH-(displayW/2), paint); canvas.drawBitmap(midtong, leftbtX+displayW/3/10+displayW/3, displayH-(displayW/2), paint); canvas.drawBitmap(righttong, leftbtX+displayW/3/10+2*displayW/3, displayH-(displayW/2), paint); canvas.drawBitmap(leftBt, leftbtX, leftbtY, paint); canvas.drawBitmap(midBt, midbtX, midbtY, paint); canvas.drawBitmap(rightBt, rightbtX, rightbtY, paint); canvas.drawBitmap(downbt1, down1X, down1Y, paint); canvas.drawBitmap(downbt2, down2X, down2Y, paint); canvas.drawBitmap(downbt3, down3X, down3Y, paint); //canvas.drawBitmap(rondombt, 0, 0, paint); for (int i = 0; i < random1; i++) { if (i == random1 - 1) { canvas.drawBitmap(presentUp, leftbtX, displayH-displayW/2 - presentDown.getHeight() * i - presentUp.getHeight(), paint); } else { canvas.drawBitmap(presentDown, leftbtX, displayH-displayW/2 - presentDown.getHeight() * (i + 1), paint); } } for (int i = 0; i < random2; i++) { if (i == random2 - 1) { canvas.drawBitmap(presentUp, midbtX, displayH-displayW/2 - presentDown.getHeight() * i - presentUp.getHeight(), paint); } else { canvas.drawBitmap(presentDown, midbtX, displayH-displayW/2 - presentDown.getHeight() * (i + 1), paint); } } for (int i = 0; i < random3; i++) { if (i == random3 - 1) { canvas.drawBitmap(presentUp, rightbtX, displayH-displayW/2 - presentDown.getHeight() * i - presentUp.getHeight(), paint); } else { canvas.drawBitmap(presentDown, rightbtX, displayH-displayW/2 - presentDown.getHeight() * (i + 1), paint); } } if (!a.isEmpty()) { for (int i = 0; i < a.size(); i++) { if (i <= random1 && i < a.size() - 1) { canvas.drawBitmap( a.get(i), leftbtX, (float) (displayH - lefttong.getHeight() - presentHieht - leftBt.getHeight()/2 * (i)), paint); } if (i == a.size() - 1 && !flag1) { canvas.drawBitmap( a.get(i), leftbtX, (float) (displayH - lefttong.getHeight() - presentHieht - leftBt.getHeight()/2 * (i)), paint); } } } if (!b.isEmpty()) { for (int i = 0; i < b.size(); i++) { if (i <= random2 && i < b.size() - 1) { canvas.drawBitmap( b.get(i), midbtX, (float) (displayH - midtong.getHeight() - presentHieht - leftBt.getHeight()/2 * (i)), paint); } if (i == b.size() - 1 && !flag2) { canvas.drawBitmap( b.get(i), midbtX, (float) (displayH - midtong.getHeight() - presentHieht - leftBt.getHeight()/2 * (i)), paint); } } } if (!c.isEmpty()) { for (int i = 0; i < c.size(); i++) { if (i <= random3 && i < c.size() - 1) { canvas.drawBitmap( c.get(i), rightbtX, (float) (displayH - righttong.getHeight()- presentHieht - leftBt.getHeight()/2 * (i)), paint); } if (i == c.size() - 1 && !flag3) { canvas.drawBitmap( c.get(i), rightbtX, (float) (displayH - righttong.getHeight() - presentHieht -leftBt.getHeight()/2 * (i)), paint); } } } canvas.save(); if (flag2 == true) { canvas.drawBitmap(present[index2], midbtX, (float) currentHeightB, paint); } canvas.restore(); canvas.save(); if (flag1 == true) { canvas.drawBitmap(present[index1], leftbtX, (float) currentHeightA, paint); } canvas.restore(); canvas.save(); if (flag3 == true) { canvas.drawBitmap(present[index3], rightbtX, (float) currentHeightC, paint); } canvas.restore(); } } catch (Exception e) { e.printStackTrace(); } finally { if (canvas != null) { surfaceHolder.unlockCanvasAndPost(canvas); } } } /** * 左边的雪糕下落的轨迹 */ public void onDownLogicA() { if (currentHeightA < (displayH - lefttong.getHeight() - presentHieht - leftBt.getHeight()/2 * (leftClick - 1))) { currentHeightA += 40; if (currentHeightA >= (displayH - lefttong.getHeight() - presentHieht - leftBt.getHeight()/2 * (leftClick - 1))) { currentHeightA = (displayH - lefttong.getHeight() - presentHieht - leftBt.getHeight()/2 * (leftClick - 1)); } } else { flag1 = false; currentHeightA = 0; } } /** * 中间的雪糕下落的轨迹 */ public void onDownLogicB() { if (currentHeightB < (displayH - midtong.getHeight() - presentHieht - leftBt.getHeight()/2 * (midClick - 1))) { currentHeightB += 40; if (currentHeightB >= (displayH - midtong.getHeight() - presentHieht - leftBt.getHeight()/2 * (midClick - 1))) { currentHeightB = (displayH - midtong.getHeight() - presentHieht - leftBt.getHeight()/2 * (midClick - 1)); } } else { flag2 = false; currentHeightB = 0; } } /** * 右边的雪糕的下落轨迹 */ public void onDownLogicC() { if (currentHeightC < (displayH - righttong.getHeight() - presentHieht - leftBt.getHeight()/2 * (rightClick - 1))) { currentHeightC += 40; if (currentHeightC >= (displayH - righttong.getHeight() - presentHieht - leftBt.getHeight()/2 * (rightClick - 1))) { currentHeightC = (displayH - righttong.getHeight() - presentHieht - leftBt.getHeight()/2 * (rightClick - 1)); } } else { flag3 = false; currentHeightC = 0; } } @Override public void run() { } /** * 创建游戏画面初始化参�? */ @Override public void surfaceCreated(SurfaceHolder holder) { GameIceCreamActivity.OnResetGameListen = onResetGameListen; flag1 = false; flag2 = false; flag3 = false; clickable = false; displayW = this.getWidth(); displayH = this.getHeight(); background = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(this.getResources(), R.drawable.droppresent_bg), displayW, displayH, true); presentUp = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(this.getResources(), R.drawable.present_head),displayW/3,displayW/6+5,true); presentDown =Bitmap.createScaledBitmap(BitmapFactory.decodeResource(this.getResources(), R.drawable.present_tail),displayW/3,displayW/6+5,true); leftBt = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(this.getResources(), R.drawable.leftbt), displayW/3, displayW/3, true); midBt = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(this.getResources(), R.drawable.midbt), displayW/3, displayW/3, true); rightBt = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(this.getResources(), R.drawable.rightbt), displayW/3, displayW/3, true); downbt1 = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(this.getResources(), R.drawable.down),displayW/7,displayW/7,true); downbt2 = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(this.getResources(), R.drawable.down),displayW/7,displayW/7,true); downbt3 = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(this.getResources(), R.drawable.down),displayW/7,displayW/7,true); present = new Bitmap[6]; present[0] = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(this.getResources(), R.drawable.present1),displayW/3,displayW/3,true); present[1] = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(this.getResources(), R.drawable.present2),displayW/3,displayW/3,true); present[2] = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(this.getResources(), R.drawable.present3),displayW/3,displayW/3,true); present[3] = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(this.getResources(), R.drawable.present4),displayW/3,displayW/3,true); present[4] = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(this.getResources(), R.drawable.present5),displayW/3,displayW/3,true); present[5] = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(this.getResources(), R.drawable.present6),displayW/3,displayW/3,true); lefttong = BitmapFactory.decodeResource(this.getResources(),R.drawable.tong); lefttong = Bitmap.createScaledBitmap(lefttong,displayW*4/14,lefttong.getHeight(),true); midtong = BitmapFactory.decodeResource(this.getResources(),R.drawable.tong); midtong = Bitmap.createScaledBitmap(midtong,displayW*4/14,lefttong.getHeight(),true); righttong = BitmapFactory.decodeResource(this.getResources(),R.drawable.tong); righttong = Bitmap.createScaledBitmap(righttong,displayW*4/14,lefttong.getHeight(),true); presentHieht = present[0].getHeight(); leftbtX = (displayW - ((leftBt.getWidth() * 3))) / 2; leftbtY = displayH - leftBt.getHeight(); midbtX = leftBt.getWidth() + leftbtX; midbtY = displayH - midBt.getHeight(); rightbtX = midbtX + rightBt.getWidth(); rightbtY = displayH - rightBt.getHeight(); //down1X = (displayW - ((leftBt.getWidth() * 3))) / 2 + 25; down1X = displayW/10; down2X = midbtX + displayW/10; down3X = rightbtX + displayW/10; down1Y = displayH-(displayW/8)*2; down2Y = displayH-(displayW/8)*2; down3Y = displayH-(displayW/8)*2; initData(); timeHandler = new Handler(); stopHandler = new Handler(); timeHandler.postDelayed(new Runnable() { @Override public void run() { clickable = true; dropPresentListen.gameStart(); } }, 3000); onMyDraw(); } /** * 随机生成�?��下落雪糕个数 */ public void initData() { a = new ArrayList<Bitmap>(); b = new ArrayList<Bitmap>(); c = new ArrayList<Bitmap>(); leftClick = 0; midClick = 0; rightClick = 0; yesClick = 0; moreClick = false; random1 = (int) (Math.random() * 4) + 1; random2 = (int) (Math.random() * 4) + 1; random3 = (int) (Math.random() * 4) + 1; } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { } @Override public boolean onTouchEvent(MotionEvent event) { int pointerCount = event.getPointerCount(); if (pointerCount > MAX_TOUCH) { pointerCount = MAX_TOUCH; } float x = event.getX(); float y = event.getY(); if (event.getAction() == MotionEvent.ACTION_DOWN && clickable) { System.out.println("x---->" + x + "++++y----->" + y); if (x > leftbtX && x < midbtX && y > leftbtY && y < displayH && leftClick <= random1) { if (leftClick == random1) { Toast.makeText(context, "A你按多了哦!", Toast.LENGTH_SHORT) .show(); } leftClick++; flag1 = true; index1 = (int) (Math.random() * 6); a.add(present[index1]); new Thread() { public void run() { while (flag1) { onMyDraw(); onDownLogicA(); } if (leftClick == random1 + 1) { initData(); timeHandler.postDelayed(new Runnable() { @Override public void run() { onMyDraw(); } }, 500); } else if (leftClick - 1 < random1) { yesClick++; } else { } } }.start(); } else if (x > midbtX && x < rightbtX && y > midbtY && y < displayH && midClick <= random2) { if (midClick == random2) { Toast.makeText(context, "B你按多了哦!", Toast.LENGTH_SHORT) .show(); } midClick++; flag2 = true; index2 = (int) (Math.random() * 6); b.add(present[index2]); new Thread() { public void run() { while (flag2) { onMyDraw(); onDownLogicB(); } if (random2 + 1 == midClick) { initData(); timeHandler.postDelayed(new Runnable() { @Override public void run() { onMyDraw(); } }, 500); } else if (midClick - 1 < random2) { yesClick++; } else { } } }.start(); } else if (x > rightbtX && x < rightbtX + rightBt.getWidth() && y > rightbtY && y < displayH && rightClick <= random3) { if (rightClick == random3) { Toast.makeText(context, "C你按多了哦!", Toast.LENGTH_SHORT) .show(); } rightClick++; flag3 = true; index3 = (int) (Math.random() * 6); c.add(present[index3]); new Thread() { public void run() { while (flag3) { onMyDraw(); onDownLogicC(); } if (random3 + 1 == rightClick) { initData(); timeHandler.postDelayed(new Runnable() { @Override public void run() { onMyDraw(); } }, 500); } else if (rightClick - 1 < random3) { yesClick++; } else { } } }.start(); } if (moreClick) { moreClick = false; } if (yesClick+1 == random1+random2+random3) { moreClick = true;; stopHandler.postDelayed(new Runnable() { @Override public void run() { System.out.println(moreClick+"<------------time"); if (moreClick) { dropPresentListen.gameStop(); } } }, 800); } } return true; } /** * 游戏的开始和结束的事件监听接�? * @author minggo * @date 2013-5-16下午04:32:39 */ public interface DropPresentListen{ public void gameStart(); public void gameStop(); } }