3

したがって、基本的には、スプライトに使用されるchar配列を「反転」して、スプライトを左に見せる、またはその逆にするための良い方法を見つける必要があります。これが私の配列です->

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...
    }
}​
4

3 に答える 3

2

スプライトの反転コピーを保存する代わりに、スプライトを逆方向に描画するための代替表示ルーチンを用意することをお勧めします。

この行を変更してみてください:

int x = (i - 1) % 10;

これに:

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

これにより、スプライトが逆方向に描画されます。


また、XPM形式を確認することをお勧めします。これは、現在行っていることと非常によく似ています。

于 2012-05-09T03:18:12.467 に答える
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配列など)を使用するか、それをマトリックスと考えて、この記事の例を使用します

于 2012-05-09T02:35:16.123 に答える
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
}
于 2012-05-09T03:10:27.013 に答える