在上一篇文章中,我们已经成功实现整个世界的模拟以及显示,现在我们就在世界中创建一个玩家吧。
创建玩家类
玩家控制的“战机”也是一个刚体,所以我们需要创建玩家类,设置它的基本属性,和之前讲的矩形类类似。
private float x = 0, y = 0;//获取加速度传感器的值
public class PlayerBall extends MyBody {
float radius;//玩家半径
double HP = 100;//玩家当前血量
double HPMAX = HP;//玩家最大血量
double playerAD = 6;//玩家当前攻击力
double playerStartAD = playerAD;//玩家初始攻击力
int bulletLevel = 1;//玩家物理等级
double bulletPower = 0;//玩家武器能量
public PlayerBall(Body body, float radius, int color) { //构造器
this.body = body;//初始化成员变量
this.radius = radius;//初始化成员变量
this.color = color;//初始化成员变量
}
public void drawSelf(Canvas canvas, Paint paint) {//绘制方法
if(!isLive){//判断是否已经销毁
return;
}
Vec2 gravity = new Vec2(-20 * x, 20 * (y-4));//设置速度矢量
//限制玩家掉出屏幕
if(playerY-radius<0){
gravity = new Vec2(-20*x,5);
}
//限制玩家掉出屏幕
if(playerY+radius>SCREEN_HEIGHT){
gravity = new Vec2(-20*x,-5);
}
body.setLinearVelocity(gravity);//设置玩家的速度矢量
canvas.drawCircle(playerX, playerY, radius, paint);//绘制圆
paint.setStyle(Paint.Style.STROKE);//设置画笔样式
paint.setStrokeWidth(1);//设置画笔宽度
paint.setColor(color);//设置颜色
canvas.drawCircle(playerX, playerY, radius, paint);//绘制边
paint.reset();//恢复画笔设置
...
}
}
由于之前设置的边界是大于屏幕的,所以为了让玩家不调出屏幕,我们可以手动调节玩家位置,具体方法见上面代码。
在类中设置了玩家的一些属性,如HP等,对这些变量具体的一些操作这里就不做叙述了,因为这不是重点嘛,实现起来也不难,要看具体操作的话可以直接下载我的源码来看。
代码中有两个变量——x,y。这两个变量是通过加速度传感器获取的值,通过这个值我们来控制玩家,实现游戏的重力感应操作,这个一会儿会讲到。
生成玩家
和创建边界时一样,我们需要一个生成玩家的函数。
private PlayerBall pb;//创建一个PlayerBall实例
public PlayerBall createPlayerBall(//创建玩家
float x, //x坐标
float y, //y坐标
float radius, //半径
World world, //世界
int color) { //颜色
CircleDef shape = new CircleDef();//创建圆描述对象
shape.density = 2; //设置密度
shape.friction = 1f; //设置摩擦系数
shape.restitution = 0f; //设置能量损失率
shape.radius = radius / RATE; //设置半径
BodyDef bodyDef = new BodyDef(); //创建刚体描述对象
bodyDef.position.set(x / RATE, y / RATE); //设置位置
Body bodyTemp;
while ((bodyTemp = world.createBody(bodyDef)) == null) ;//在世界中创建刚体
bodyTemp.createShape(shape); //指定刚体形状
bodyTemp.setMassFromShapes();//设置物体质量
return new PlayerBall(bodyTemp, radius, color);//返回MyCircleColor对象
}
public void createPlayer(){
pb = createPlayerBall(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2, 35, world, Color.BLUE);
bl.add(pb);
}
和创建边界的函数类似,相信大家很容易理解。
加速度传感器
这里简单的讲一下什么是加速度传感器,加速度传感器的作用是用于获取手机当前“姿势”的数值(x,y,z三个值),“姿势”即平放、竖直、侧放等。
加速度传感器的原理为:以手机左下角的点为原点,原点至手机右下角为x轴正方向、原点至手机左上角为y轴正方向、原点至屏幕上方为z轴正方向建立坐标轴,获取到的x,y,z三个值为该轴负方向上受到的重力加速度的值,例如当手机平放时,三个值大约为0,0,10。OK,原理大致就这样,我们来看看如何使用吧。
SensorManager
SensorManager是获取手机传感器服务的类,我们通过SensorManager来获取想要使用的传感器。
private SensorManager sm;
...
public void onCreate(Bundle savedInstanceState) {
sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
...
}
这里我们只是创建了一个SensorManager对象。
获取加速度传感器服务
@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.playGameBtn:
sm.registerListener(myAccelerometerListener,
sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_GAME);//注册加速度传感器服务
break;
...
}
}
这里通过registerListener()函数注册加速度传感器。
myAccelerometerListener为监听器,接下来会讲到。
sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)表示注册加速度传感器服务。
SensorManager.SENSOR_DELAY_GAME为获取数值的频率,此频率为50Hz。
myAccelerometerListener监听器
监听器的作用想必大家都清楚,这里就是为了监听加速度传感器的数值:
final SensorEventListener myAccelerometerListener = new SensorEventListener() {
//复写onSensorChanged方法
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {//判断是否是加速度传感器服务
x = sensorEvent.values[0];//获取x的值
y = sensorEvent.values[1];//获取y的值
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
代码也很简单,就不多做解释了。
以上便是创建玩家以及对玩家的控制,在游戏中还有Bullet类(子弹类),Prop(道具类)等,这些类的创建方法和之前讲的矩形类、玩家类大同小异,后面也就不多做累述了,详细代码的话可直接下载我的源码。
恩~这次就到这里吧,下篇文章再见~