我目前正在使用自己的引擎编写游戏。但是,有一个问题,我不确定如何以最高效的代码方式解决它: 对于游戏中的很多对象,我需要根据不同的条件/状态分配不同的纹理(我为此使用枚举)。一个例子:
玩家需要根据他所看的方向、他是在行走还是在等待、他的健康状况等来改变其纹理。
一种解决方案是嵌套 switch 语句,如下所示:
switch (getState ()) {
case IDLE:
switch (getDirection()) {
case UP:
setTexture(Textures.PLAYER_IDLE_UP);
break;
case RIGHT:
setTexture(Textures.PLAYER_IDLE_RIGHT);
break;
case DOWN:
setTexture(Textures.PLAYER_IDLE_DOWN));
break;
case LEFT:
setTexture(Textures.PLAYER_IDLE_LEFT);
break;
}
break;
case WALKING:
switch (getDirection()) {
case UP:
setTexture(Textures.PLAYER_WALKING_UP);
break;
case RIGHT:
setTexture(Textures.PLAYER_WALKING_RIGHT);
break;
case DOWN:
setTexture(Textures.PLAYER_WALKING_DOWN);
break;
case LEFT:
setTexture(Textures.PLAYER_WALKING_LEFT);
break;
}
break;
case RUNNING:
...
}
但是对于每个条件,这都会变得越来越复杂,如果有一组稍微不同的状态,我将不得不重写它(例如,我将实现一个僵尸,他无法运行或将具有附加属性等) .
我还考虑过给出所有纹理标签并编写一个算法来尝试找到匹配的纹理,但随着越来越多的纹理/条件,并且所有这些都经常执行,我认为这种方法会非常慢。
我真的不知道该怎么做,或者我是否缺少任何解决此类问题并且代码高效且高性能的数据结构。
最佳答案
我不确定它是否会提高效率,但它肯定会使其对于 future 的变化更加稳健: 我正在考虑类似查找表的东西。这可以是多维数组,甚至是您自己的数据结构。
您可以将状态和方向编码为整数,例如
public static final int IDLE = 0;
public static final int WALKING = 1;
...
public static final int UP = 0;
public static final int LEFT = 1;
...
然后假设您有一个包含所有纹理的二维数组。您可以使用 getState()
和 getDirection()
方法作为数组的索引。所以你的代码可能会变得类似于:
setTexture(texture_array[getState()][getDirection()]);
当然,您必须在某个时刻将所有纹理硬编码到数组中,并且您可能必须将某些单元设置为 null
或类似的值(例如当您不希望纹理设置为某个状态方向组合),但我认为它看起来会更好,并且对于 future 的变化更加稳健。
关于java - 根据各种条件分配纹理的最高效的代码方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61067033/