需要一种方法来“翻转”此字符数组,以便游戏精灵面向左侧。

3

基本上,我需要找到一种好的方式来"翻转"用于精灵的字符数组,以便使它看起来向左和向右。这是我的数组->

WARRIOR = (

" " +         
 "!!!!!     " +        
 "!!oo! ^   " +
 "!!!!! ^   " +
 "##### ^   " +
 "#######   " +
 "#####     " +
 "** **     ").toCharArray();

显示例程如下:
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    for (int i = 0; i < WARRIOR.length; i++) {
        int x = (i - 1) % 10;
        int y = (i - 1) / 10;
        if (WARRIOR[i] == '!') {
            g.setColor(new Color(0, 0, 204));
            g.fillRect(x_pos + x * 5, y_pos + y * 5, 5, 5);
        }
        else if (WARRIOR[i] == 'o') {
            g.setColor(new Color(204, 0, 0));
            g.fillRect(x_pos + x * 5, y_pos + y * 5, 5, 5);
        }
        // other characters here...
    }
}​

1
你怎么知道他有多少列宽?所有的精灵都是固定宽度吗?另外,单个前导空格是怎么回事? - Dagg Nabbit
2
它是作为二维精灵显示的,对吗?显示程序是否每10个字符断行呢?此外,您可能应该使用.NET或Java标记您的问题,我刚意识到我不知道这是什么语言。 - Dagg Nabbit
1
我想说的是,你的游戏显示的内容与代码中显示的内容差不多,对吗?如果是这样,它是如何知道每一行从哪里开始的呢? - Dagg Nabbit
@user1322905 我认为答案是拥有一个翻转的显示例程,它反向迭代 x(倒数而不是正数)。不要存储翻转的精灵,只需在显示时翻转它。 - Dagg Nabbit
如果您想将上次评论中的显示例程代码添加到问题中,我会进行尝试。 - Dagg Nabbit
显示剩余6条评论
3个回答

2
我建议使用备用显示程序来绘制精灵(sprite)的反向,而不是存储一个反转的复制品。
试着修改这一行:
int x = (i - 1) % 10;

转换为:

int x = 10 - (i - 1) % 10;

这应该是向后绘制精灵。


此外,您可能需要查看XPM格式,它与您正在做的非常相似。


@EranMedan 我必须保持简单,因为我对Java的了解几乎为零 ;) - Dagg Nabbit
@GGG,您好,非常感谢您为我的Java库提供帮助。我现在感到有些疲惫,思维已经变得迟钝。您能否向我解释一下“10 -”的含义呢? - Anwar
@user1322905 在浏览器的控制台中输入以下代码:for (var i = 1; i < 21; ++i) console.log((i - 1) % 10, 10 - (i - 1) % 10),看看输出是否能够澄清问题...我知道的最好方法是将 x 进行“反转”。 - Dagg Nabbit

0

在不改变数据结构的情况下,这里有一个解决方案(我相信它可以被改进但它是有效的):

简短版本

char[] flip = new char[warrior.length];

for(int i=0;i<warrior.length;i++){
    flip[9-i%10+ i/10*10] = warrior[i];   
}

长版

    char[] warrior= (         
             "!!!!!     " +        
             "!!oo! ^   " +
             "!!!!! ^   " +
             "##### ^   " +
             "#######   " +
             "#####     " +
             "** **     ").toCharArray();

    for(int i=0;i<warrior.length;i++){
        if(i%10==0){
            System.out.println();
        }
        System.out.print(warrior[i]);
    }

    char[] flip = new char[warrior.length];

    for(int i=0;i<warrior.length;i++){
        //9-: 0 goes to 9, 1 to 8 etc 
        //i: cycles from 0 to 9
        //i/10: provides the row (e.g. 25/10=2)
        //*10: gives me the 2d row in 1d array  

        flip[9-i%10+ i/10*10] = warrior[i]; 
    }


    for(int i=0;i<flip.length;i++){
        if(i%10==0){
            System.out.println();
        }
        System.out.print(flip[i]);
    }

这将输出

!!!!!     
!!oo! ^   
!!!!! ^   
##### ^   
#######   
#####     
** **     
     !!!!!
   ^ !oo!!
   ^ !!!!!
   ^ #####
   #######
     #####
     ** **

但我会使用不同的数据结构(例如2D数组)或者将其视为矩阵,并使用本文中的示例


1
OP想要在X轴上翻转它,但是你的解决方案会在Y轴上翻转(因为每一行都应该是水平的)。 - Kirk Woll
抱歉,我不熟悉这个,请问您能解释一下这个方法及其变量/参数吗? - Anwar
谢谢,已更新答案。这个问题比我想象的要复杂。 ;) - Eran Medan
在了解显示例程是基于X/Y而不是控制台输出之前,我写了这个。 - Eran Medan

0

你应该考虑以另一种方式处理你的精灵。例如,由于你似乎喜欢 char[],你可以使用 char[][]。 如果你的精灵总是有相同的宽度,你可以考虑像这样:

//Slices your WARRIOR into pieces
final StringBuilder builder = new StringBuilder();
short i = 0;
for (final char a:WARRIOR) {
    if (++i != 10) {    //You should be able to find it
        builder.append(a);
    } else {
        i = 0;
        builder.append('\n');   //Line sep
    }
}

//Print the right oriented WARRIOR
System.out.println(builder);

//And flip it ! yay !
final String [] slicedWarrior = builder.toString().split("\n");   //Line sep
for (final String slice : slicedWarrior) {
    final char [] slicesOfSlice;
    for (int j = (slicesOfSlice = slice.toCharArray()).length - 1; j != 0; j--) {
        System.out.print(slicesOfSlice[j]);
    }
    System.out.print('\n');   //Line sep
}

随着 OP 的更新,即使这个答案能够正常工作,它也不再真正相关了...就像推土机一样。 - Jerome

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接