您的位置:首页 > 移动开发 > Android开发

安卓 自定义View来开发自己的游戏或应用

2015-10-25 19:03 375 查看
案列是通过模拟一个经典游戏Pac-Man的场景 总共有Sample_8_1,MyView,MyThread三个类

(1)MyView类代码如下

package sa.dsa;

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.graphics.RectF;
import android.view.View;

public class MyView extends View{
static final int ANGLE_MAX=50;//张嘴的最大角度
static final int SPEED=4;//移动的步进
static final int SCREEN_WIDTH=480;//游戏场景宽度
static final int SCREEN_HEIGHT=320;//游戏场景高度

//四个方向常数
static final int LEFT = 2;//向右
static final int RIGHT=0;//向右
static final int UP=3;//向上
static final int DOWN=1;//向下
int angle=30;//当前张嘴总角度
int angleChange=3;//角度变化值
int radius=20;//半径
int centerX=radius;//当前位置
int centerY=radius;//当前位置
long timeStamp = System.currentTimeMillis();//记录换照片的时间
int currPhoto;//当前照片数组的索引
static int direction = RIGHT;
Bitmap bmpMan;
Bitmap[] bmpPhotos;//照片数组
int[] imgIds={R.drawable.a,R.drawable.b,R.drawable.c,R.drawable.d};

public MyView(Context context){//MyView类的构造器
super(context);
bmpMan = BitmapFactory.decodeResource(getResources(), R.drawable.man);//初始化每张图片
bmpPhotos = new Bitmap[imgIds.length];//初始化照片数组
for(int i=0;i<bmpPhotos.length;i++){
bmpPhotos[i]=BitmapFactory.decodeResource(getResources(), imgIds[i]);
}
}
protected void onDraw(Canvas canvas){
Paint paint = new Paint();//创建画笔对象
canvas.drawColor(Color.BLACK);
canvas.drawBitmap(bmpMan,centerX-radius,centerY-radius,null);//绘制英雄
paint.setColor(Color.BLACK);//设置画笔颜色
paint.setAntiAlias(true);//设置抗锯齿
RectF oval =new RectF(
centerX-radius-1,centerY-radius-2,
centerX-radius-1+2*radius+2,centerY-radius-2+2*radius+4
);
canvas.drawArc(oval, 360-angle+90*direction, 2*angle, true, paint);//绘制扇形实现张嘴闭嘴
if(System.currentTimeMillis()-timeStamp>5000){//如果时间间隔超过5秒
timeStamp = System.currentTimeMillis();//重新记录时间
currPhoto = (currPhoto+1) % bmpPhotos.length;//更换照片
}
canvas.drawBitmap(bmpPhotos[currPhoto], 80,40,null);
super.onDraw(canvas);

}

}


(2)MyThread类开发,代码如下

package sa.dsa;

public class MyThread extends Thread{
int sleepSpan = 30;//休眠时间
MyView myView;//MyView对象的引用
public MyThread(MyView myView){
this.myView = myView;
}
public void run(){//线程执行方法
while(true){
myView.angle=myView.angle+myView.angleChange;//修改角度值
if(myView.angle>MyView.ANGLE_MAX){//嘴巴张到最大进入闭嘴环节
myView.angleChange=-3;//设置角度为闭嘴
}
else if(myView.angle<0){
myView.angleChange=+3;
}
//移动英雄
switch(myView.directi
4000
on){//判断英雄方向
case MyView.RIGHT:
myView.centerX=myView.centerX+MyView.SPEED;  break;//向右
case MyView.UP:
myView.centerY=myView.centerY+MyView.SPEED;  break;//向上
case MyView.LEFT:
myView.centerX=myView.centerX-MyView.SPEED;  break;//向左
case MyView.DOWN:
myView.centerY=myView.centerY+MyView.SPEED;  break;//向下

}
if(myView.centerY+myView.radius>MyView.SCREEN_HEIGHT){
myView.centerY= myView.centerY-MyView.SPEED;
}//碰到了下边界

if(myView.centerY-myView.radius<0){
myView.centerY= myView.centerY+MyView.SPEED;
myView.direction=myView.RIGHT;
}
if(myView.centerX-myView.radius<0){
myView.centerX= myView.radius;
}
if(myView.centerX+myView.radius>MyView.SCREEN_WIDTH){
myView.centerX= myView.centerX-MyView.SPEED;
myView.direction=MyView.DOWN;
}
myView.postInvalidate();//重绘MyView
try{Thread.sleep(sleepSpan);}//休眠一段时间
catch(Exception e){e.printStackTrace();}
}
}

}


(3)Activity部分的开发,Activity在本案例中相当于控制器的角色

package sa.dsa;

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;

public class Sample_8_1Activity extends Activity {
MyView myView;//myView对象引用
MyThread mt;//MyThread对象引用
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.main);
//设置不显示应用程序标题栏
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);//设置全屏
myView = new MyView(this);
setContentView(myView);//设置当前屏幕
mt=new MyThread(myView);//创建MyThread对象
mt.start();//启动MyThread

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android