0

これらのゲームの通常の物理法則を使用して、砂が落ちるようなゲームを作成しています。

ファイルからレベルをロードするという事実に基づいて機能します。

そのため、場所が空かどうかを確認するRGBには、ロードされたレベルの値を確認します。

しかし、何らかの理由で、そうでない場合でも、ほぼすべてのセル (同じいくつかのセルを除く) が何かによって占有されていることが返されます。

物理演算は、最初にファイルをロードしてから変更することによって処理されます。

ファイル形式はPNG形式で、BufferedImage種類はTYPE_INT_ARGB

メインクラスのすべての物理処理コードは次のとおりです。

public static void updateParticles()
    {
    for(int i=0;i<100;i++)
        {
        for(int j=0;j<75;j++)
        {
        int rgb = levels.getRGB(i,j);
        int sx = getMappedCoordX(levels.getRGB(i,j));
        int sy = getMappedCoordY(levels.getRGB(i,j));
        try{
            if(materialRGBmap[(i*32)+j]==solRGB)
                {
                int[] coords = physicsRules.getSolidMovableStatic(getFree(i,j+1),getFree(i-1,j),getFree(i+1,j),getFree(i-1,j+1),getFree(i+1,j+1),i*8,j*8);
                levels.setRGB(i,j,map_null.getRGB(0,0));
                levels.setRGB(coords[0]/8,coords[1]/8,rgb);
                }
            if(materialRGBmap[(i*32)+j]==liqRGB)
                {
                int[] coords = physicsRules.getLiquidMovableStatic(getFree(i,j+1),getFree(i-1,j),getFree(i+1,j),i*8,j*8);
                levels.setRGB(i,j,map_null.getRGB(0,0));
                levels.setRGB(coords[0]/8,coords[1]/8,rgb);
                }
            if(materialRGBmap[(i*32)+j]==gasRGB)
                {
                int[] coords = physicsRules.getGasMovableStatic(getFree(i,j+1),getFree(i-1,j),getFree(i+1,j),getFree(i+1,j),i*8,j*8);
                levels.setRGB(i,j,map_null.getRGB(0,0));
                levels.setRGB(coords[0]/8,coords[1]/8,rgb);
                }
            }catch(Exception e){
                System.out.println("lolcat error");
                }
            }
        }
    }

のコードは次のとおりですPhysicsRules。(上記の変数として表示physicsRules)

public int[] getLiquidMovable(boolean onGround, boolean leftFree, boolean rightFree, int x, int y)
{
return onGround?(rand.nextInt(2)==0 && leftFree?new int[]{x-8, y}:(rightFree?new int[]{x+8,y}:new int[]{x,y})):new int[]{x,y+8};
}

public static int[] getLiquidMovableStatic(boolean onGround, boolean leftFree, boolean rightFree, int x, int y)
{
return onGround?(Srand.nextInt(2)==0 && leftFree?new int[]{x-8, y}:(rightFree?new int[]{x+8,y}:new int[]{x,y})):new int[]{x,y+8};
}

public int[] getSolidMovable(boolean onGround, boolean leftFree, boolean rightFree, boolean leftUFree, boolean rightUFree, int x, int y)
{
return onGround?(rand.nextInt(2)==0 && leftFree && leftUFree?new int[]{x-8, y}:(rightFree && rightUFree?new int[]{x+8,y}:new int[]{x,y})):new int[]{x,y+8};
}

public int[] getSolidMovableStatic(boolean onGround, boolean leftFree, boolean rightFree, boolean leftUFree, boolean rightUFree, int x, int y)
{
return onGround?(Srand.nextInt(2)==0 && leftFree && leftUFree?new int[]{x-8, y}:(rightFree && rightUFree?new int[]{x+8,y}:new int[]{x,y})):new int[]{x,y+8};
}

public int[] getGasMovable(boolean leftFree, boolean rightFree, boolean upFree, boolean downFree, int x, int y)
{
int dir = rand.nextInt(4);
return dir==0 && upFree?new int[]{x,y-8}:(dir==1 && leftFree?new int[]{x+8,y}:(dir==2 && downFree?new int[]{x,y+8}:(dir==3 && rightFree?new int[]{x-8,y}:new int[]{x,y})));
}

public static int[] getGasMovableStatic(boolean leftFree, boolean rightFree, boolean upFree, boolean downFree, int x, int y)
{
int dir = Srand.nextInt(4);
return dir==0 && upFree?new int[]{x,y-8}:(dir==1 && leftFree?new int[]{x+8,y}:(dir==2 && downFree?new int[]{x,y+8}:(dir==3 && rightFree?new int[]{x-8,y}:new int[]{x,y})));
}
4

1 に答える 1

0

J は 0 から 75 ですが、i は 32 幅のステップ (32 倍) で使用されるため、J は次の要素の変数フィールドにオーバーラップします。

materialRGBmap[(i*32)+j]

最後の反復で使用されたマップ要素を使用しています。j の制限を 32 に変更すると、i の反復ごとに 32 幅のフィールドのみを計算/使用できます。

さらに、要素ごとの計算を並行して行っているわけではありません。要素を 1 つずつ変更しており、すべてを同時に変更しているわけではありません。結果を保存するには一時的な配列が必要で、最終的にすべてを元の配列にコピーします。

注意: 1000 x 1000 の領域を使用する場合は、単一のドット (ペイント部分) を配置しないでください。画像を編集してから描画する方が高速です。

于 2013-06-30T15:48:02.740 に答える