主角需要有个可以殴打的小怪兽:数据模板和个体实例的区别(新手的一个常见错误)

这一篇文章中,主要是要理清一个概念:

虽然都是同一个类的对象,但是个体实例是用来储存独立的个体对象的,个体属性的变化不会影响到其他的个体对象。数据模板则是每个个体对象在实例化时,生成属性所参照的模板。因此,数据模板一定不要作为个体对象来使用(ps,像我这样的初学者很容易犯这类错误,比如改动了一个道具的攻击力,然后发现道具栏中其他的同类道具攻击力都给改动了!!!)

那么,就拿主角喜欢殴打的小怪兽来举例吧。

首先,通过读取xml配置,我们可以获得一套怪物的数据模板:

List<Enemy> lEnemy = new ArrayList<Enemy>();    //存储怪物模板配置
getEnemyData(is,assetManager,xmlParser,"enemy.xml");

/**
 * 从xml文件中读取场景中的怪物数据,并添加到各场景的怪物列表中
 * @param fileName 文件名称
 */
private void getEnemyData(InputStream inputStream,AssetManager am,XmlPullParser xpp,String fileName) {
    try {
        //打开怪物配置文件
     ...//定义即将添加到怪物列表中的怪物
        Enemy enemy=null;
        while(eventType!=XmlPullParser.END_DOCUMENT){
            switch(eventType){
                case XmlPullParser.START_DOCUMENT:
                    break;
                case XmlPullParser.START_TAG:
                    //从io流中读取到活动场景开始的标签
                    if(xpp.getName().equals("enemy")) {
                        //初始化怪物
                        enemy = new Enemy();
                        //fightScene.setId(Integer.parseInt(xpp.getAttributeValue(0)));
                    }else if(xpp.getName().equals("id")){
                        enemy.setId(Integer.parseInt(xpp.nextText()));
                    }else if(xpp.getName().equals("name")){
                        enemy.setName(xpp.nextText());
                    }else if(xpp.getName().equals("...")){
              ......
            }
break; case XmlPullParser.END_TAG: //从io流中读取到怪物结束的标签,将赋值后的怪物添加到对应场景的怪物列表中 if(xpp.getName().equals("enemy")){   lEnemy.add(enemy); } break; } eventType=xpp.next(); } inputStream.close(); }catch(Exception e){ Log.i("InitError","读取怪物配置失败⊙﹏⊙∥∣°"); } }

在这里,lEnemy中存储的Enemy对象,就是数据模板。

如果,主角需要殴打小怪兽的方法如下:

public class Role{
    private int atk = 10;  //角色攻击力
    ...
    public void attackEnemy(Enemy enemy){
        enemy.setHealth(enemy.getHealth()  - this.atk );
    }
}

那么传递的参数,绝对不能是lEnemy.get(i),即 role.attackEnemy(lEnemy.get(i)) 是被禁止的。

毕竟,我们的主角并不想打死一只小怪物后,以后就再也遇不到活的小怪物了,毕竟主角还是需要有表现的机会的么。

正确的方法应该如下:

Enemy enemy = new Enemy();
//将怪物模板的数据复制到新生成的怪物个体中
enemy.setHealth(lEnemy.get(i).getHealth());
role.attackEnemy(enemy);

这样,每次主角遇到怪物的时候,就都会是一个新鲜的小怪兽了。


posted on 2019-02-25 17:33  竹杖擒马  阅读(149)  评论(0编辑  收藏  举报