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

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

虽然都是同一个类的对象,但是个体实例是用来储存独立的个体对象的,个体属性的变化不会影响到其他的个体对象。数据模板则是每个个体对象在实例化时,生成属性所参照的模板。因此,数据模板一定不要作为个体对象来使用(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);

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



原文地址:https://www.cnblogs.com/zzqm-gamelife/p/10432180.html

时间: 2024-10-10 20:56:50

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

Objective-C中小怪兽的逻辑

学习Objective-C的面向对象也有一段时间了,为了犒劳自己的学习成果,写个小怪兽来犒劳一下自己把.在LOL中有怪兽和英雄的角色吧,接下来就先写一个小怪兽的类吧.从小怪兽的角度来讲,怪兽都有那些行为和属性呢?最重要的两点是小怪兽要打英雄对吧,"攻击英雄"的行为是少不了的,另一个是小怪兽打不过怎么办呢?打不过就跑呗,顺理成章,得有"逃跑"行为吧.要想跑得会动,所以得有"移动"的行为吧. 小怪兽除了上面的基本行为外,还有那些属性呢?小怪兽在攻击英

奥尔曼打小怪兽

怪兽类 1 package com.lovo; 2 3 public class Monster { 4 private String name; 5 private int hp; //血量 6 private int aggressivity; //攻击力 7 private int defense; //防御力 8 9 10 public Monster() { 11 } 12 13 public Monster(String name, int hp, int aggressivity,

小怪兽 Java反射技术 等你来打

Java反射技术,是java的难点,也是程序员进化过程中的必打小怪兽,这里就根据java api好好研究一下java的反射技术. Class Fields Methods 请先回忆一下[java类的定义]. 一.反射是什么 反射是什么?百度百科这样定义:JAVA反射机制是在运行状态下,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取对象信息以及动态调用对象方法的功能称为java语言的反射机制. 可以这样理解,大家小时候有木有玩过平

小怪兽的逻辑

学习Objective-C的面向对象也有一段时间了,为了犒劳自己的学习成果,写个小怪兽来犒劳一下自己把.在LOL中有怪兽和英雄的角色吧,接下来就先写一个小怪兽的类吧.从小怪兽的角度来讲,怪兽都有那些行为和属性呢?最重要的两点是小怪兽要打英雄对吧,“攻击英雄”的行为是少不了的,另一个是小怪兽打不过怎么办呢?打不过就跑呗,顺理成章,得有“逃跑”行为吧.要想跑得会动,所以得有“移动”的行为吧. 小怪兽除了上面的基本行为外,还有那些属性呢?小怪兽在攻击英雄的同时生命力是由变化的,会由一个值变到另一个值,

经典笔试算法题之打小怪兽

import java.util.Arrays; import java.util.Comparator; import java.util.PriorityQueue; import java.util.Scanner; /** * @author liusandao * @description * 有N只怪兽,每只怪兽有血量a[i],你有M支箭,每支箭可以造成b[i]点伤害, * 会消耗c[i]点能量.你要用箭杀死某只怪兽,该箭的伤害必须大于等于怪兽的 * 血量,打一只怪兽只能用一支箭,每

奥特曼打小怪兽

1 /** 2 * OUTMAN附 3 * 4 * @author 王启文 5 * 6 */ 7 public class One { 8 private String name; 9 private int hp; 10 private int mp; 11 private int damage; 12 private int defense; 13 private int intelligence; 14 15 public One(String name, int hp, int mp,

一加新机来袭,你准备好迎接一台“性能小怪兽”了吗?

一加已经成为了"品质"的代名词了,每年两场发布会都变得万众期待.之前可能国内只有少部分消费者了解一加手机,但是现在一加已经靠品质获得了喝彩和忠实的粉丝. 一加手机从面世以来一直都是主要针对海外市场的,并且在海外也取得非常不俗的成绩.其后被也是从国外传到了国内,这是国产绝无仅有的,真是这样的特殊性,一加手机才能收获今天这么多掌声. 根据最新消息显示,今年下边年一加又有一款新机来袭,该机就是一加手机6的升级版,该机就是一加手机6T.目前也有媒体曝光了一组一加手机6T的相关图片和参数,从资料

配置管理是个“小怪兽”

那么按照这个逻辑,软件研发的管理,也应该越来越厉害才对啊~ 然鹅……很多初级的软件项目管理问题,仍然困扰着我们.细想想,为啥大家嘴上一直说“管理很重要”,行动上却又不愿意为此投入呢?一张图告诉你! 我一直在想,在项目管理的众多领域里,到底哪一个,可以快速反应出管理改进的好处呢?项目经理帮我找到了答案. 这挺让我欣喜的,这正好论证了我们建立的PM核心能力架构的双支柱——过程能力和领导能力. 软件的需求哪有不变的,为啥需求变更让人如此“害怕”呢?控制变更的“变更过程”从概念上讲是比较简单的,但执行起

2014年国人开发的最热门的开源软件TOP 100

不知道从什么时候开始,很多一说起国产好像就非常愤慨,其实大可不必.做开源中国六年有余,这六年时间国内的开源蓬勃发展,从一开始的使用到贡献,到推出自己很多的开源软件,而且还有很多软件被国外的认可.中国是开源不可忽视的力量. 而我们这个榜单也是从这些国人开发.主要参与开发或者基于国外开源软件进行改进并形成独立版本的软件中,根据该软件的访问.收藏.下载等多个角度,从而得出前 100 名最受欢迎的开源软件.我们所评选出来的软件并非同类型,尽管放在一起不是很科学,但我们仍希望通过我们的视角让大家对国内一些