これらのゲームの通常の物理法則を使用して、砂が落ちるようなゲームを作成しています。
ファイルからレベルをロードするという事実に基づいて機能します。
そのため、場所が空かどうかを確認する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})));
}