wve

导航

简单七巧板源码

自己以前写过一个简单的七巧板,功能不完善,玩玩可以,不要太认真,分享下。

主程序入口

qiqiao.java
/*
 * @description:
 *         main qiqiao activity
 * @author: warren 
 * @email: warrenqin@hotmail.com
 * @date: 2012.1.10 
 */
package com.my.Qiqiao;
import com.my.game.GameView;

import android.app.Activity;
import android.os.Bundle;

import android.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout;

public class Qiqiao extends Activity
{

    public void onCreate(Bundle savedInstanceState)
    {
        
        super.onCreate(savedInstanceState);
        
        /* 设置Activity要显示的布局为(R.layout.main) */
        //setContentView(R.layout.main);
        
        LinearLayout layout = new LinearLayout(this);
        layout.setOrientation(LinearLayout.VERTICAL);
        
        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
                LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
    
        layout.addView(new GameView(this), new LayoutParams(LayoutParams.WRAP_CONTENT,
                LayoutParams.WRAP_CONTENT));
        
        setContentView(layout, layoutParams);
        
        
    }
}

 

整个代码结构可以分为三部分:控制显示的,控制逻辑的,控制数据的 ,真惭愧具体细节都记不太清楚了。

GameView.java 是整个显示的入口

GameView.java
  1 /*
  2  * @description:
  3  *         This file get the action and draw the physics. while one click the panel , 
  4  * change the selected physic angle;while scroll ,the physic follow your finger. 
  5  *    
  6  * @author: warren 
  7  * @email: warrenqin@hotmail.com
  8  * @date: 2012.1.10 
  9  */
 10 package com.my.game;
 11 
 12 import android.content.Context;
 13 import android.graphics.Canvas;
 14 import android.graphics.Color;
 15 import android.graphics.Paint;
 16 import android.util.Log;
 17 import android.view.GestureDetector;
 18 import android.view.GestureDetector.OnDoubleTapListener;
 19 import android.view.GestureDetector.OnGestureListener;
 20 import android.view.MotionEvent;
 21 import android.view.View;
 22 
 23 public class GameView  extends View implements OnDoubleTapListener, OnGestureListener {
 24     private  DrawPhysics drawPhysics;
 25     private LogicPhysics logicphysic;
 26     Paint paint;
 27     private GestureDetector gestureScanner; 
 28     String Tag="GameView";
 29     public GameView(Context context) {
 30         super(context);
 31         // TODO Auto-generated constructor stub
 32         drawPhysics=new DrawPhysics();
 33         logicphysic=new LogicPhysics();
 34         paint = new Paint();
 35         gestureScanner=new GestureDetector(this);   
 36         gestureScanner.setOnDoubleTapListener(this);
 37         
 38          setBackgroundColor(Color.WHITE);
 39          paint.setColor(Color.GREEN);    
 40     }
 41     
 42     @Override
 43     protected void onDraw(Canvas canvas) {
 44         
 45         drawPhysics.drawPhysics(canvas, paint);
 46         super.onDraw(canvas);
 47     
 48     }
 49     @Override
 50     public boolean onTouchEvent(MotionEvent event) {
 51         //postInvalidate();
 52          gestureScanner.onTouchEvent(event);
 53          invalidate();
 54         return true;
 55     }
 56 
 57     public boolean onDoubleTap(MotionEvent e) {
 58         // TODO Auto-generated method stub
 59          Log.d(Tag, "onDoubleTap");
 60         return false;
 61     }
 62 
 63     public boolean onDoubleTapEvent(MotionEvent e) {
 64         // TODO Auto-generated method stub
 65          Log.d(Tag, "onDoubleTapEvent");
 66         return false;
 67     }
 68 
 69     public boolean onSingleTapConfirmed(MotionEvent e) {
 70         // TODO Auto-generated method stub
 71          Log.d(Tag, "onSingleTapConfirmed");
 72          
 73          logicphysic.cancelSelect();
 74         return false;
 75     }
 76 
 77     public boolean onDown(MotionEvent e) {
 78         // TODO Auto-generated method stub
 79         float x=e.getX();
 80         float y=e.getY();
 81         int i;
 82         Log.d(Tag, "onDown");
 83         
 84         i=logicphysic.checkSelected(x,y);
 85         if(i<7){
 86             logicphysic.setSelect(i);
 87             Log.d(Tag,"get one physic");
 88         }else{
 89             logicphysic.cancelSelect();
 90             Log.d(Tag,"get null physic");
 91         }
 92         return false;
 93     }
 94 
 95     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
 96             float velocityY) {
 97         // TODO Auto-generated method stub
 98          logicphysic.cancelSelect();
 99          Log.d(Tag, "onFling");
100         return false;
101     }
102 
103     public void onLongPress(MotionEvent e) {
104         // TODO Auto-generated method stub
105          logicphysic.longPressEvent(e.getX(), e.getY());
106          Log.d(Tag, "onLongPress");
107     }
108 
109     public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
110             float distanceY) {
111         // TODO Auto-generated method stub
112         logicphysic.scrollEvent(e2.getX(), e2.getY());
113          Log.d(Tag, "onScroll");
114         return false;
115     }
116 
117     public void onShowPress(MotionEvent e) {
118         // TODO Auto-generated method stub
119          Log.d(Tag, "onShowPress");
120         
121     }
122 
123     public boolean onSingleTapUp(MotionEvent e) {
124         // TODO Auto-generated method stub
125          logicphysic.oneClickEvent(e.getX(),e.getY());
126          Log.d(Tag, "onSingleTapUp");
127         return false;
128     }
129 
130 
131 }

PhysicsPara.java定义基本的图形要素,中心点坐标、 相对于基准方向的 角度、图形内切圆半径,有了它们就很容的构造出我们所需要的图形了。

PhysicsPara.java
 1 /*
 2  * @description:
 3  *         
 4  * @author: warren 
 5  * @email: warrenqin@hotmail.com
 6  * @date: 2012.1.10 
 7  */
 8 package com.my.game;
 9 
10 public class PhysicsPara {
11     int px; //base x position
12     int py; //base y position
13     int angle;
14     float radius;//inner circle radius 
15     
16     public PhysicsPara(){
17         px=0;
18         py=0;
19         angle=0;
20         radius=0;
21     }
22     
23     public PhysicsPara(int x,int y,int agle){
24         px=x;
25         py=y;
26         angle=agle;
27         radius=0;
28     }  
29     
30     // set inner 
31     public void setRadius(float r){
32             radius=r;
33     }
34     public float getRadius(){
35         return radius;
36     } 
37     
38     //
39     public void setX(int x){    
40         px=x;        
41     }
42     public int getX(){
43         return px;
44     }
45     //
46     public void setY(int y){
47         py=y;    
48     }
49     public int getY(){    
50         return py;
51     }
52     
53 }

DrawPhysics.java 定义了不同图形的实现,也就是说四边形、三角形、平行四边形长什么样子都是由着个文件决定的。

DrawPhysics.java
/*
 * @description: 
 *         if you want to read the code easily , please refer to  the Document 
 *  qiqiaodesigned.docx. This file is indicate how to construct the seven physics.
 * @author: warren 
 * @email: warrenqin@hotmail.com
 * @date: 2012.1.10 
 */
package com.my.game;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Point;
import android.util.Log;

public class DrawPhysics {
    
    private int baseLength;
    DataPhysics dataPhysic;
    
    public DrawPhysics(){
        dataPhysic= DataPhysics.instance;
        baseLength=DataPhysics.baseLength;    
    }
    
  //draw big triangle.
  public void drawTriangleB1(Canvas canvas,Paint paint,PhysicsPara para){
      Path patht = new Path();
        float basex,basey;
        double x,y;
        //double diameter=2*baseLength;
        double edgeLength=2*baseLength;
        basex=para.px;
        basey=para.py;
        double angle;
        
        double ao=edgeLength*Math.sqrt(2)/(2*Math.cos(22.5*Math.PI/180));
        double oc=edgeLength*(Math.sqrt(2)-1);
        
        // first point
        angle=67.5-para.angle;
        x=basex-ao*Math.cos(angle*Math.PI/180);
        y=basey-ao*Math.sin(angle*Math.PI/180);
        patht.moveTo((float)x,(float)y);
        
        // second point
        angle=22.5-para.angle;
        x=basex+ao*Math.cos(angle*Math.PI/180);
        y=basey+ao*Math.sin(angle*Math.PI/180);
        patht.lineTo((float)x,(float)y);
        
        //third point
        angle=45-para.angle;
        x=basex-oc*Math.sin(angle*Math.PI/180);
        y=basey+oc*Math.cos(angle*Math.PI/180);
        patht.lineTo((float)x,(float)y);
        
        patht.close();
        canvas.drawPath(patht, paint);
  }
  public void drawTriangleB2(Canvas canvas,Paint paint,PhysicsPara para){
      Path patht = new Path();
        float basex,basey;
        double x,y;
        //double diameter=2*baseLength;
        double edgeLength=2*baseLength;
        basex=para.px;
        basey=para.py;
        double angle;
        
        double ao=edgeLength*Math.sqrt(2)/(2*Math.cos(22.5*Math.PI/180));
        double oc=edgeLength*(Math.sqrt(2)-1);
        
        // first point
        angle=67.5-para.angle;
        x=basex-ao*Math.cos(angle*Math.PI/180);
        y=basey-ao*Math.sin(angle*Math.PI/180);
        patht.moveTo((float)x,(float)y);
        
        // second point
        angle=22.5-para.angle;
        x=basex+ao*Math.cos(angle*Math.PI/180);
        y=basey+ao*Math.sin(angle*Math.PI/180);
        patht.lineTo((float)x,(float)y);
        
        //third point
        angle=45-para.angle;
        x=basex-oc*Math.sin(angle*Math.PI/180);
        y=basey+oc*Math.cos(angle*Math.PI/180);
        patht.lineTo((float)x,(float)y);
        
        patht.close();
        canvas.drawPath(patht, paint);
        
  }
  public void drawTriangeM(Canvas canvas,Paint paint,PhysicsPara para){
      Path patht = new Path();
        float basex,basey;
        double x,y;
        double edgeLength=Math.sqrt(2)*baseLength;
        basex=para.px;
        basey=para.py;
        double angle;
        
        double ao=edgeLength*Math.sqrt(2)/(2*Math.cos(22.5*Math.PI/180));
        double oc=edgeLength*(Math.sqrt(2)-1);
        
        // first point
        angle=67.5-para.angle;
        x=basex-ao*Math.cos(angle*Math.PI/180);
        y=basey-ao*Math.sin(angle*Math.PI/180);
        patht.moveTo((float)x,(float)y);
        
        // second point
        angle=22.5-para.angle;
        x=basex+ao*Math.cos(angle*Math.PI/180);
        y=basey+ao*Math.sin(angle*Math.PI/180);
        patht.lineTo((float)x,(float)y);
        
        //third point
        angle=45-para.angle;
        x=basex-oc*Math.sin(angle*Math.PI/180);
        y=basey+oc*Math.cos(angle*Math.PI/180);
        patht.lineTo((float)x,(float)y);
        
        patht.close();
        canvas.drawPath(patht, paint);
    
  }
  // draw small triangle 1
  public void drawTriangleS1(Canvas canvas,Paint paint,PhysicsPara para){
        Path patht = new Path();
        float basex,basey;
        double x,y;
        double edgeLength=baseLength;
        basex=para.px;
        basey=para.py;
        double angle;
        
        double ao=edgeLength*Math.sqrt(2)/(2*Math.cos(22.5*Math.PI/180));
        double oc=edgeLength*(Math.sqrt(2)-1);
        
        // first point
        angle=67.5-para.angle;
        x=basex-ao*Math.cos(angle*Math.PI/180);
        y=basey-ao*Math.sin(angle*Math.PI/180);
        patht.moveTo((float)x,(float)y);
        
        // second point
        angle=22.5-para.angle;
        x=basex+ao*Math.cos(angle*Math.PI/180);
        y=basey+ao*Math.sin(angle*Math.PI/180);
        patht.lineTo((float)x,(float)y);
        
        //third point
        angle=45-para.angle;
        x=basex-oc*Math.sin(angle*Math.PI/180);
        y=basey+oc*Math.cos(angle*Math.PI/180);
        patht.lineTo((float)x,(float)y);
        
        patht.close();
        canvas.drawPath(patht, paint);
  }
  
  // draw small tiangle2
  public void drawTriangleS2(Canvas canvas,Paint paint,PhysicsPara para){
      Path patht = new Path();
        float basex,basey;
        double x,y;
        double edgeLength=baseLength;
        basex=para.px;
        basey=para.py;
        double angle;
        
        double ao=edgeLength*Math.sqrt(2)/(2*Math.cos(22.5*Math.PI/180));
        double oc=edgeLength*(Math.sqrt(2)-1);
        
        // first point
        angle=67.5-para.angle;
        x=basex-ao*Math.cos(angle*Math.PI/180);
        y=basey-ao*Math.sin(angle*Math.PI/180);
        patht.moveTo((float)x,(float)y);
        
        // second point
        angle=22.5-para.angle;
        x=basex+ao*Math.cos(angle*Math.PI/180);
        y=basey+ao*Math.sin(angle*Math.PI/180);
        patht.lineTo((float)x,(float)y);
        
        //third point
        angle=45-para.angle;
        x=basex-oc*Math.sin(angle*Math.PI/180);
        y=basey+oc*Math.cos(angle*Math.PI/180);
        patht.lineTo((float)x,(float)y);
        
        patht.close();
        canvas.drawPath(patht, paint);
  }
  
  public void drawSquare(Canvas canvas,Paint paint,PhysicsPara para){
        Path patht = new Path();
        float basex,basey;
        double x,y;
        double edgeLength=Math.sqrt(2)*baseLength/2;
        basex=para.px;
        basey=para.py;
        float angle;
        
        //first point 
        angle=45-para.angle;
        x=basex-edgeLength*Math.cos(angle*Math.PI/180);
        y=basey-edgeLength*Math.sin(angle*Math.PI/180);
        patht.moveTo((float)x,(float)y);    
        
        //second point
        angle=45+para.angle;
        x=basex+edgeLength*Math.cos(angle*Math.PI/180);
        y=basey-edgeLength*Math.sin(angle*Math.PI/180);
        patht.lineTo((float)x,(float)y);    
        
        //third point
        angle=45-para.angle;
        x=basex+edgeLength*Math.cos(angle*Math.PI/180);
        y=basey+edgeLength*Math.sin(angle*Math.PI/180);
        patht.lineTo((float)x,(float)y);
        
        //fourth point
        angle=45+para.angle;
        x=basex-edgeLength*Math.cos(angle*Math.PI/180);
        y=basey+edgeLength*Math.sin(angle*Math.PI/180);
        patht.lineTo((float)x,(float)y);
        
        patht.close();
        canvas.drawPath(patht, paint);
  }
  
   public void drawParallelogram( Canvas canvas, Paint paint,PhysicsPara para){
        //画一个正方向平行四边形
        Path patht=new Path();
        float basex ,basey;
        double x,y;
        double edgeLength=baseLength;
        basex=para.px;
        basey=para.py;
        double angle;
        
        //first point 
        angle=22.5-para.angle;
        x=basex-edgeLength*Math.sqrt(5)*Math.cos(angle*Math.PI/180)/2;
        y=basey-edgeLength*Math.sqrt(5)*Math.sin(angle*Math.PI/180)/2;
        patht.moveTo((float)x,(float)y);
        
        //second point
        angle=45+para.angle;
        x=basex+edgeLength*Math.cos(angle*Math.PI/180)/2;
        y=basey-edgeLength*Math.sin(angle*Math.PI/180)/2;        
        patht.lineTo((float)x,(float)y);
        
        //third point
        angle=22.5-para.angle;
        x=basex+edgeLength*Math.sqrt(5)*Math.cos(angle*Math.PI/180)/2;
        y=basey+edgeLength*Math.sqrt(5)*Math.sin(angle*Math.PI/180)/2;
        patht.lineTo((float)x,(float)y);
        
        //fourth point
        angle=45+para.angle;
        x=basex-edgeLength*Math.cos(angle*Math.PI/180)/2;
        y=basey+edgeLength*Math.sin(angle*Math.PI/180)/2;
        patht.lineTo((float)x,(float)y);
        
        patht.close();
        canvas.drawPath(patht, paint);
    }
   
   public void drawRect(Canvas canvas, Paint paint,Point point){
       //draw a 
       canvas.drawRect(10, 80, 70, 140, paint);
   }
   
   
   public void drawButtonRotation(Canvas canvas, Paint paint){
       
       //canvas.drawRect(10, 80, 70, 140, paint);
   }
   
   public void drawPhysics(Canvas canvas, Paint paint){
       
       
       drawTriangleB1(canvas, paint,dataPhysic.TriangleB1);
       drawTriangleB2(canvas, paint,dataPhysic.TriangleB2);
       drawTriangeM(canvas, paint,dataPhysic.TriangleM);
       drawTriangleS1(canvas, paint,dataPhysic.TriangleS1);
       drawTriangleS2(canvas, paint,dataPhysic.TriangleS2);
       drawSquare(canvas, paint,dataPhysic.Square);
       drawParallelogram(canvas, paint,dataPhysic.parallelogram);

       drawButtonRotation(canvas,paint);
   
   }
}

DataPhysics.java 用于定义所有图形的尺寸,并缓存每个图形的基本参数

DataPhysics .java
 1 /*
 2  * @description:
 3  *         This file save all of the physic data include angle and coordinate.
 4  * @author: warren 
 5  * @email: warrenqin@hotmail.com
 6  * @date: 2012.1.10 
 7  */
 8 
 9 package com.my.game;
10 
11 import android.graphics.Point;
12 import android.util.Log;
13 
14 public class DataPhysics {
15      
16     static DataPhysics instance=new DataPhysics();
17     //define button size and position
18      static int RotateButtonWidth =50;
19      static int RotateButtonHeight=20;
20      static Point ButtonPoint=new Point(100,100); 
21     
22      //define physics base length 
23      // if you want to change the all of the size , please change baseLength
24     final static int baseLength=100;
25     
26     //define array of the physics's point 
27     //PhysicsPara[] arryPhysic=new PhysicsPara[7];
28     
29     PhysicsPara TriangleB1;
30     PhysicsPara TriangleB2;
31     PhysicsPara TriangleM ;
32     PhysicsPara TriangleS1;
33     PhysicsPara TriangleS2;
34     PhysicsPara Square;
35     PhysicsPara parallelogram;
36     PhysicsPara[] physicsArry;
37     //={TriangleB1,TriangleB2,TriangeM,TriangleS1,TriangleS2,Square,parallelogram};
38     
39     public DataPhysics(){
40       TriangleS1  = new PhysicsPara(80,100,0);
41          TriangleS2  = new PhysicsPara(200,100,0);
42          TriangleM = new PhysicsPara(90,250,0);
43       TriangleB2 = new PhysicsPara(100,450,0);
44       TriangleB1 = new PhysicsPara(350,450,0);
45       Square  = new PhysicsPara(100,600,0);
46       parallelogram  = new PhysicsPara(300,600,4);    
47       setRadius(baseLength); 
48       physicsArry=new PhysicsPara[7];
49       physicsArry[0]=TriangleB1;
50       physicsArry[1]=TriangleB2;
51       physicsArry[2]=TriangleM;
52       physicsArry[3]=TriangleS1;
53       physicsArry[4]=TriangleS2;
54       physicsArry[5]=Square;
55       physicsArry[6]=parallelogram;
56       
57     }
58     
59     //while quit game then save all of the physics data 
60     public void saveData(){
61         // not do it 
62         
63     }
64     
65     public void setRadius(int ibaselength){
66         double buf;
67         Log.d("qcw", "setRadius");
68         System.out.println(ibaselength);
69         //
70         buf=2*ibaselength*(1-Math.cos(45*Math.PI/180));
71         System.out.println(buf);
72         TriangleB1.setRadius((float) buf);
73         TriangleB2.setRadius((float) buf);
74         //
75         buf=Math.sqrt(2)*ibaselength*(1-Math.cos(45*Math.PI/180));
76         System.out.println(buf);
77         TriangleM.setRadius((float)buf);
78         
79         //
80         buf=ibaselength*(1-Math.cos(45*Math.PI/180));
81         System.out.println(buf);
82         TriangleS1.setRadius((float)buf);
83         TriangleS2.setRadius((float)buf);
84         //
85         buf=ibaselength/2;
86         System.out.println(buf);
87         Square.setRadius((float)buf);
88         parallelogram.setRadius((float)buf);
89         Log.d("qcw", "out setRadius");
90     
91     }
92     
93       
94 }

LogicPhysics.java 主要实现了是否被选中 以及 单击 双击 事件的检测等。

LogicPhysics.java
 1 /*
 2  * @description:
 3  *         
 4  * @author: warren 
 5  * @email: warrenqin@hotmail.com
 6  * @date: 2012.1.10 
 7  */
 8 package com.my.game;
 9 
10 public class LogicPhysics {
11     
12     public DataPhysics dataphysics=DataPhysics.instance;
13     private int physicSelectIndex;
14     String Tag="LogicPhysics";
15     public LogicPhysics(){
16         physicSelectIndex=8;
17     }
18     public int checkSelected(float x,float y){
19         int i=0;
20         int x1,y1;
21         double d;
22         float r;
23         //Log.d(Tag, "Enter checkselected");
24         for(i=0;i<7;i++){
25               x1=dataphysics.physicsArry[i].getX();
26             y1=dataphysics.physicsArry[i].getY();
27             d= Math.sqrt( (x1-x)*(x1-x) + (y1-y)*(y1-y));
28             //System.out.println(d);
29             r=dataphysics.physicsArry[i].getRadius();
30             //System.out.println(r);
31             if(d<=r){
32             //    System.out.println(i);
33             //    Log.d(Tag, "Out checkselected");
34                 return i;
35             }
36         }
37         //  Log.d(Tag, "Out checkselected");
38         return 8;
39     }
40     public void setSelect(int index){
41         physicSelectIndex=index;
42     }
43     public void cancelSelect(){
44         physicSelectIndex=8;
45     }
46     public void oneClickEvent(float x,float y){
47         if(physicSelectIndex<7){
48             dataphysics.physicsArry[physicSelectIndex].angle+=45;
49         }else{
50             
51         }        
52     }
53     
54     public void doubleClickEvent(float x,float y){
55         if(physicSelectIndex<7){
56             dataphysics.physicsArry[physicSelectIndex].angle-=45;
57         }else{
58             
59         }
60     }
61     public void scrollEvent(float x,float y){
62         if(physicSelectIndex<7){
63             dataphysics.physicsArry[physicSelectIndex].px=(int)x;
64             dataphysics.physicsArry[physicSelectIndex].py=(int)y;
65         }else{
66             
67         }
68         
69     }
70     
71     public void longPressEvent(float x,float y){
72         
73         if(physicSelectIndex<7){
74             
75         }else{
76             
77         }        
78     }
79     
80 }

 

代码就这些了,我是在M9上调试的,没有在其他机器上试过。

操作方式:双击可旋转,单击选择后拖动

注意:

如果要在其他机器上运行请自行修改DataPhysics.java 中的相关参数: baseLength 决定所有图形的大小、DataPhysics()中初始化了七个图形的初始位置(如果显示少了图形,修改这里)。

 

 问题:没有做边界检测,没有做翻转、双击旋转的角度是固定的  、其他

 

 

 

 

 

 

 

posted on 2012-11-15 11:30  wve  阅读(825)  评论(0编辑  收藏  举报