根据各种条件分配纹理的最有效代码方式?
Most code-efficient way of assigning textures based on varios conditions?
我目前正在使用自己的引擎编写游戏。但是,有一个问题,我不确定如何以最高效的代码方式解决它:
对于游戏中的很多对象,我需要根据不同的条件/状态分配不同的纹理(我为此使用枚举)。一个例子:
玩家需要根据自己注视的方向、是行走还是等待、生命值等来改变它的贴图
一个解决方案是嵌套开关语句,如下所示:
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:
...
}
但是这会随着每种情况变得越来越复杂,如果有一组稍微不同的状态,我将不得不重写它(例如,我会实现一个僵尸,但他不能 运行 或者会有额外的属性等)。
我还考虑过给我所有的纹理标签并编写一个算法来尝试找到匹配的纹理,但是随着越来越多的纹理/条件并且所有这些都经常执行,我认为这种方法会非常慢。
我真的不知道该怎么做,或者我是否遗漏了任何解决此类问题并且代码效率和性能都很高的数据结构。
我不确定它是否会提高效率,但它肯定会使其在未来的变化中更加健壮:
我在想像 lookup-table 这样的东西。这可以是一个多维数组,甚至是你自己的数据结构。
您可以将您的州和方向编码为整数,例如
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
或类似的(比如当你不希望纹理是设置在某个状态-方向-组合),但我认为它看起来会更好,并使它对未来的变化更健壮。
我目前正在使用自己的引擎编写游戏。但是,有一个问题,我不确定如何以最高效的代码方式解决它: 对于游戏中的很多对象,我需要根据不同的条件/状态分配不同的纹理(我为此使用枚举)。一个例子:
玩家需要根据自己注视的方向、是行走还是等待、生命值等来改变它的贴图
一个解决方案是嵌套开关语句,如下所示:
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:
...
}
但是这会随着每种情况变得越来越复杂,如果有一组稍微不同的状态,我将不得不重写它(例如,我会实现一个僵尸,但他不能 运行 或者会有额外的属性等)。
我还考虑过给我所有的纹理标签并编写一个算法来尝试找到匹配的纹理,但是随着越来越多的纹理/条件并且所有这些都经常执行,我认为这种方法会非常慢。
我真的不知道该怎么做,或者我是否遗漏了任何解决此类问题并且代码效率和性能都很高的数据结构。
我不确定它是否会提高效率,但它肯定会使其在未来的变化中更加健壮: 我在想像 lookup-table 这样的东西。这可以是一个多维数组,甚至是你自己的数据结构。
您可以将您的州和方向编码为整数,例如
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
或类似的(比如当你不希望纹理是设置在某个状态-方向-组合),但我认为它看起来会更好,并使它对未来的变化更健壮。