基于JBox2D物理引擎开发的“雷电”小游戏(四)——创建玩家

在上一篇文章中,我们已经成功实现整个世界的模拟以及显示,现在我们就在世界中创建一个玩家吧。

创建玩家类

玩家控制的“战机”也是一个刚体,所以我们需要创建玩家类,设置它的基本属性,和之前讲的矩形类类似。

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(道具类)等,这些类的创建方法和之前讲的矩形类、玩家类大同小异,后面也就不多做累述了,详细代码的话可直接下载我的源码。

恩~这次就到这里吧,下篇文章再见~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值