0

私の現在のコードは一番下にリストされています。これまでのところ、最終版で見たいと思うガラガ船と、ランダムに現れる星を描くことができました。ここで、唯一の問題、または把握する必要があるのは、配列リストを作成する方法です。たとえば、次のようになります。

arrayList = new Arraylist()

新しいarrayListには変数のセットが割り当てられており、g.drawLineメソッドに関しても同様です。基本的に、配列リスト変数 (x1、y1、x2、y2) を割り当てます。基本的な考え方は、指定されたすべての行がこの配列に割り当てられるということです。また、実際に動かすには、if() ループを使用します。y2+=5; そのため、「右」、「左」、「下」の行が使用されている他の if ループと同様に、上に移動します。どんな助けでも大歓迎です、ありがとう。

import java.awt.*;
import java.applet.*;

public class Galaga extends Applet
{
public void paint(Graphics g)
{
    DrawBackground(g);
    DrawGalaga(g);
}
public void DrawBackground(Graphics g)
{
    g.setColor(Color.black);
    g.fillRect(1,2,3000,4000);
    DrawStars(g);
}
public void DrawGalaga(Graphics g)
{       
    g.setColor(Color.red);
    g.drawLine(42,75,42,80); //Far Left Gun
    g.drawLine(43,75,43,80);
    g.drawLine(44,75,44,80);
    g.drawLine(45,75,45,80);

    g.setColor(Color.white);
    g.drawLine(42,80,42,100); //Far Left Piece
    g.drawLine(43,80,43,100);
    g.drawLine(44,80,44,100);
    g.drawLine(45,80,45,100);

    g.drawLine(46,83,46,96); //From Left, 1st one
    g.drawLine(47,83,47,96);
    g.drawLine(48,83,48,96);
    g.drawLine(49,83,49,96);

    g.drawLine(50,79,50,92); //From Left, 2nd one
    g.drawLine(51,79,51,92);
    g.drawLine(52,79,52,92);
    g.drawLine(53,79,53,92);    

    g.drawLine(54,65,54,89); //From Left, 3rd one
    g.drawLine(55,65,55,89);
    g.drawLine(56,65,56,89);
    g.drawLine(57,65,57,89);

    g.drawLine(58,75,58,89); //From Middle 3rd one
    g.drawLine(59,75,59,89);
    g.drawLine(60,75,60,89);
    g.drawLine(61,75,61,89);

    g.drawLine(62,70,62,85); //From Middle, 2nd Left one
    g.drawLine(63,70,63,85);
    g.drawLine(64,70,64,85);
    g.drawLine(65,70,65,85);

    g.drawLine(66,60,66,95); //From Middle, 1st Left one
    g.drawLine(67,60,67,95);
    g.drawLine(68,60,68,95);
    g.drawLine(69,60,69,95);

    g.drawLine(70,45,70,100); //Big Middle Piece
    g.drawLine(71,45,71,100);
    g.drawLine(72,45,72,100);
    g.drawLine(73,45,73,100);
    g.drawLine(74,45,74,100);
    g.drawLine(75,45,75,100);
    g.drawLine(76,45,76,100);

    g.drawLine(77,60,77,95); //From Middle, 1st Right one
    g.drawLine(78,60,78,95);
    g.drawLine(79,60,79,95);
    g.drawLine(80,60,80,95);

    g.drawLine(81,70,81,85); //From Middle, 2nd Right one
    g.drawLine(82,70,82,85);
    g.drawLine(83,70,83,85);
    g.drawLine(84,70,84,85);

    g.drawLine(85,75,85,89); //From Middle 3rd one
    g.drawLine(86,75,86,89);
    g.drawLine(87,75,87,89);
    g.drawLine(88,75,88,89);

    g.drawLine(88,65,88,89); //From Right, 3rd one
    g.drawLine(89,65,89,89);
    g.drawLine(90,65,90,89);
    g.drawLine(91,65,91,89);

    g.drawLine(92,79,92,92); //From Right, 2nd one
    g.drawLine(93,79,93,92);
    g.drawLine(94,79,94,92);
    g.drawLine(95,79,95,92);

    g.drawLine(96,83,96,96); //From Right, 1st one
    g.drawLine(97,83,97,96);
    g.drawLine(98,83,98,96);
    g.drawLine(99,83,99,96);

    g.drawLine(100,80,100,100); //Far Right Piece
    g.drawLine(101,80,101,100);
    g.drawLine(102,80,102,100);
    g.drawLine(103,80,103,100);

    g.setColor(Color.red);
    g.drawLine(100,75,100,80); //Far Right Gun
    g.drawLine(101,75,101,80);
    g.drawLine(102,75,102,80);
    g.drawLine(103,75,103,80);
}

public void DrawStars(Graphics g)
{
    g.setColor(Color.yellow);
    int x, y;
    for (int s = 0; s < 2000; s++) 
        {
            x = (int)(Math.random()*2000);
            y = (int)(Math.random()*2000); 
            g.drawLine(x, y, x, y);
        }
}
public void delay(int n)
{
    long startDelay = System.currentTimeMillis();
    long endDelay = 0;
    while (endDelay - startDelay < n)
        endDelay = System.currentTimeMillis();
}
}  
4

2 に答える 2

1

あなたは正しい道を進んでいますが、利用する必要があることが 1 つあります。配列を使用して各行の X、Y 値を格納することは素晴らしいアイデアです。ただし、これらの値の変更に関する 2 番目の部分は正しくありません。2D および 3D グラフィックスでは、アニメーション化されていない限り、モデルは変更されません。これは、配列の値が変更されないことを意味します。位置、回転、傾斜を含めて船を動かすには、グラフィックス オブジェクトで変換を使用します。

このチュートリアルをチェックして、私が話していることを理解してください。

http://docs.oracle.com/javase/tutorial/2d/advanced/transforming.html

x1、x2、y1、y2 の値の格納に関しては、別のクラスを作成できます。

public class MyLine
{
    public final int x1;
    public final int x2;
    public final int y1;
    public final int y2;
    public MyLine(int x1, int x2, int y1, int y2)
    {
        this.x1 = x1;
        this.x2 = x2;
        this.y2 = y1;
        this.y2 = y2;
    }
}

次に、次のように配列リストを使用できます

List<MyLine> myLineList = new ArrayList<MyLine>();

myLineList.add(new MyLine(1,2,3,4)); //add as many lines as you'd like.
于 2013-02-19T15:18:41.897 に答える
1

正直なところ、このコードは見栄えがよくありません。

まず、配列オフセットの暗黙の役割の代わりにいくつかのオブジェクトを使用します。

List<Line> lines = new ArrayList<Line>();

これで、各配列要素が有効な行になります。おそらく、コードをさらにリファクタリングしたり、行とその色などを結合したりする必要があります.

質問に戻ります。配列をコピーしないでください。船のポイントを読み取り専用で保存し、x、y オフセットを操作してください。

public void DrawGalaga(Graphics g)
{       
    g.setColor(Color.red);
    g.drawLine(X0+42,Y0+75,X0+42,Y0+80);
    ...
}

ここでX0、 とY0は point へのオフセット(0,0)です。次に、イベント ハンドラーを記述します。

void moveUp(int dx, int dy) { X0 += dx; Y0 += dy; }

と へのマルチスレッド アクセスに注意しX0てくださいY0

于 2013-02-19T15:21:38.150 に答える