主角需要有个可以殴打的小怪兽:数据模板和个体实例的区别(新手的一个常见错误)
Posted zzqm-gamelife
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了主角需要有个可以殴打的小怪兽:数据模板和个体实例的区别(新手的一个常见错误)相关的知识,希望对你有一定的参考价值。
这一篇文章中,主要是要理清一个概念:
虽然都是同一个类的对象,但是个体实例是用来储存独立的个体对象的,个体属性的变化不会影响到其他的个体对象。数据模板则是每个个体对象在实例化时,生成属性所参照的模板。因此,数据模板一定不要作为个体对象来使用(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);
这样,每次主角遇到怪物的时候,就都会是一个新鲜的小怪兽了。
以上是关于主角需要有个可以殴打的小怪兽:数据模板和个体实例的区别(新手的一个常见错误)的主要内容,如果未能解决你的问题,请参考以下文章