package com.rpsg.rpg.controller; import java.util.ArrayList; import java.util.List; import com.rpsg.gdxQuery.$; import com.rpsg.rpg.core.Log; import com.rpsg.rpg.object.game.MapScript; import com.rpsg.rpg.object.map.CollideType; import com.rpsg.rpg.object.map.NPC; /** * GDX-RPG 脚本控制器<br> * 该类控制所有当前执行的脚本,当一个NPC和玩家产生碰撞时,则创建一个脚本。<br> * 要想访问此类,请调用Game.map.script */ public class MapScriptController { List<MapScript> scripts = new ArrayList<>(); /** * 当产生碰撞时,调用该方法以产生一个脚本 * @param npc 哪位NPC产生的碰撞 * @param type 碰撞类型 */ public void add(NPC npc, CollideType type) { //如果有正在执行的,一样的脚本,则不在加了 if($.anyMatch(scripts, script -> script.equals(npc, type))) return; //如果NPC拥有当前碰撞的脚本 if(npc.scripts.containsKey(type)){ MapScript script = new MapScript(npc, type, npc.scripts.get(type)); scripts.add(script); Log.i("create collide["+npc + " with " + type +" collide]"); //启动线程 script.start(); } } public void act() { //当有已经执行完毕的脚本,就移除托管 $.removeIf(scripts, MapScript::executed); //act当前所有脚本 $.each(scripts, MapScript::act); } }