/** * Copyright 2008 - 2011 * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. * * @project loonframework * @author chenpeng * @email:ceponline@yahoo.com.cn * @version 0.1.1 */ package loon.srpg.actor; import loon.LRelease; import loon.action.sprite.AnimationHelper; import loon.opengl.GLEx; import loon.srpg.SRPGType; import loon.srpg.ability.SRPGAbilityFactory; public class SRPGActors implements LRelease { private SRPGActor[] actors; private int tileWidth, tileHeight; private int cursorIndex; public SRPGActors(int size, int tileWidth, int tileHeight) { this.cursorIndex = -1; this.tileWidth = tileWidth; this.tileHeight = tileHeight; this.actors = new SRPGActor[size]; for (int i = 0; i < size; i++) { actors[i] = new SRPGActor(); } } public final void makeDefActors() { // LGame默认的技能设置(包含常见的传送魔法等) SRPGAbilityFactory.makeDefAbilitys(); // LGame默认的角色设置(包含骑士等十个职业) SRPGActorFactory.makeDefActorStatus(); } /** * 放置一个SRPG角色到指定的索引位置 * * @param index * @param actor * @return */ public SRPGActor putActor(int index, SRPGActor actor) { return this.actors[index] = actor; } /** * 放置一个SRPG角色到指定的索引位置 * * @param index * @param name * @param fileName * @param statusIndex * @param level * @param team * @return */ public SRPGActor putActor(int index, String name, String fileName, int statusIndex, int level, int team) { return this.actors[index] = new SRPGActor(name, fileName, statusIndex, level, team, tileWidth, tileHeight); } /** * 放置一个SRPG角色到指定的索引位置 * * @param index * @param name * @param animation * @param statusIndex * @param level * @param team * @return */ public SRPGActor putActor(int index, String name, AnimationHelper animation, int statusIndex, int level, int team) { return this.actors[index] = new SRPGActor(name, statusIndex, level, team, animation, tileWidth, tileHeight); } /** * 放置一个SRPG角色到指定的索引位置 * * @param index * @param name * @param fileName * @param statusIndex * @param level * @param team * @param x * @param y * @return */ public SRPGActor putActor(int index, String name, String fileName, int statusIndex, int level, int team, int x, int y) { SRPGActor actor = putActor(index, name, fileName, statusIndex, level, team); actor.setPos(x, y); return actor; } /** * 放置一个SRPG角色到指定的索引位置 * * @param index * @param name * @param animation * @param statusIndex * @param level * @param team * @param x * @param y * @return */ public SRPGActor putActor(int index, String name, AnimationHelper animation, int statusIndex, int level, int team, int x, int y) { SRPGActor actor = putActor(index, name, animation, statusIndex, level, team); actor.setPos(x, y); return actor; } /** * 放置一个SRPG角色到指定的索引位置 * * @param index * @param actor * @param x * @param y * @return */ public SRPGActor putActor(int index, SRPGActor actor, int x, int y) { SRPGActor o = putActor(index, actor); o.setPos(x, y); return o; } /** * 放置一个SRPG角色到游戏中,并返回自动获得的索引位置 * * @param actor * @param x * @param y * @return */ public int putActor(SRPGActor actor, int x, int y) { int no = getNextNumber(); if (no == -1) { return -1; } else { putActor(no, actor, x, y); return no; } } /** * 返回当前选中的角色 * * @return */ public SRPGActor get() { if (cursorIndex == -1) { return null; } return actors[cursorIndex]; } /** * 查询指定索引所对应的游戏角色 * * @param index * @return */ public SRPGActor find(int index) { if (index >= 0 && index < actors.length) { return actors[index]; } else { return null; } } /** * 查询指定角色对应的索引ID * * @param actor * @return */ public int find(SRPGActor actor) { for (int i = 0; i < actors.length; i++) if (actors[i] == actor) { return i; } return -1; } /** * 检查指定坐标位置是否有游戏角色存在 * * @param x * @param y * @return */ public int checkActor(int x, int y) { for (int i = 0; i < actors.length; i++) { if (actors[i].getPosX() == x && actors[i].getPosY() == y && actors[i].isVisible()) { return cursorIndex = i; } } return cursorIndex = -1; } /** * 获得当前SRPG角色集合中的角色总数 * * @return */ public int size() { return actors == null ? 0 : actors.length; } /** * 获得一个可用的角色索引ID * * @return */ public int getNextNumber() { for (int i = 0; i < actors.length; i++) { if (!actors[i].isExist()) { return i; } } return -1; } /** * 获得一个处于指定group标识分组中的角色索引 * * @param group * @return */ public int getGroupValue(int group) { return getGroupValue(group, true); } /** * 获得一个处于指定group标识分组中的角色索引 * * @param group * @param flag * @return */ public int getGroupValue(int group, boolean flag) { int index = 0; for (int i = 0; i < actors.length; i++) { if (!actors[i].isVisible()) { continue; } boolean ret = actors[i].getActorStatus().group == group; if (!flag) { ret = !ret; } if (ret) { index++; } } return index; } /** * 获得一个处于指定team标识分组中的角色索引 * * @param team * @return */ public int getTeamValue(int team) { return getTeamValue(team, true); } /** * 获得一个处于指定team标识分组中的角色索引 * * @param team * @param flag * @return */ public int getTeamValue(int team, boolean flag) { int index = 0; for (int i = 0; i < actors.length; i++) { if (!actors[i].isVisible()) { continue; } boolean ret = actors[i].getActorStatus().team == team; if (!flag) { ret = !ret; } if (ret) { index++; } } return index; } /** * 获得所有处于指定group标识分组中的角色索引 * * @param group * @return */ public int[] getGroupArray(int group) { return getGroupArray(group, true); } /** * 获得所有处于指定group标识分组中的角色索引 * * @param group * @param flag * @return */ public int[] getGroupArray(int group, boolean flag) { int[] res = new int[getGroupValue(group, flag)]; int index = 0; for (int i = 0; i < actors.length; i++) { if (!actors[i].isVisible()) { continue; } boolean ret = actors[i].getActorStatus().group == group; if (!flag) { ret = !ret; } if (ret) { res[index] = i; index++; } } return res; } /** * 获得所有处于指定team标识分组中的角色索引 * * @param team * @return */ public int[] getTeamArray(int team) { return getTeamArray(team, true); } /** * 获得所有处于指定team标识分组中的角色索引 * * @param team * @param flag * @return */ public int[] getTeamArray(int team, boolean flag) { int[] res = new int[getTeamValue(team, flag)]; int index = 0; for (int i = 0; i < actors.length; i++) { if (!actors[i].isVisible()) { continue; } boolean ret = actors[i].getActorStatus().team == team; if (!flag) { ret = !ret; } if (ret) { res[index] = i; index++; } } return res; } /** * 预测指定角色向指定X轴移动后的X轴位置 * * @param role * @param d * @return */ public int nextPosX(int role, int d) { int nx = actors[role].getPosX(); switch (d) { case SRPGType.MOVE_RIGHT: nx++; break; case SRPGType.MOVE_LEFT: nx--; break; } return nx; } /** * 预测指定角色向指定Y轴移动后的Y轴位置 * * @param role * @param d * @return */ public int nextPosY(int role, int d) { int ny = actors[role].getPosY(); switch (d) { case SRPGType.MOVE_UP: ny--; break; case SRPGType.MOVE_DOWN: ny++; break; } return ny; } /** * 遍历所有SRPG精灵的下一步动作 * */ public void next() { for (int i = 0; i < actors.length; i++) { actors[i].next(); } } /** * 绘制所有战场精灵的图像 * * @param g * @param x * @param y */ public void draw(GLEx g, int x, int y) { for (int i = 0; i < actors.length; i++) { if (actors[i].isVisible()) { actors[i].draw(g, x, y); } } } public int getCursorIndex() { return cursorIndex; } public void reset() { close(); reset(size()); } public void reset(int size) { this.actors = new SRPGActor[size]; for (int i = 0; i < size; i++) { actors[i] = new SRPGActor(); } } public SRPGActor[] getActors() { return actors; } public int getTileHeight() { return tileHeight; } public void setTileHeight(int tileHeight) { this.tileHeight = tileHeight; } public int getTileWidth() { return tileWidth; } public void setTileWidth(int tileWidth) { this.tileWidth = tileWidth; } @Override public void close() { for (int i = 0; i < actors.length; i++) { actors[i] = null; } } }