我最近一直在制作一个破砖游戏但是我遇到了一些问题。我遇到的问题是试图从arraylist中删除一块砖。我首先使用bricks.remove(i)
(我代表我要移除的砖块)来做到这一点,但当然这会导致问题,因为它会使数组向左移动,这意味着其余的砖块都会被破坏。我尝试的第二个想法是将它设置为null但是这只会导致游戏在砖块意图被摧毁时崩溃。
有没有人有一个解决方案可以帮助我在没有阵列移动的情况下移除砖块?
这是将砖块创建到数组中的方法:
public void createGameObjects()
{
synchronized( Model.class )
{
ball = new GameObj(W/2, H/2, BALL_SIZE, BALL_SIZE, Colour.RED );
bat = new GameObj(210, H - BRICK_HEIGHT*1.5f, BAT_WIDTH,
BRICK_HEIGHT/4, Colour.GRAY);
bricks = new ArrayList<>();
int pos = 50;
int pos2 = 50;
//first row
for ( int i = 0; i < 10; i++){
bricks.add(new GameObj(pos,300, BRICK_HEIGHT, BRICK_WIDTH, Colour.ORANGE));
pos = pos + 50;
}
//Second row
pos = 50;
for ( int i = 0; i < 10; i++){
bricks.add(new GameObj(pos,270, BRICK_HEIGHT, BRICK_WIDTH, Colour.RED));
pos = pos + 50;
}
//Third row
pos = 50;
for ( int i = 0; i < 10; i++){
bricks.add(new GameObj(pos,240, BRICK_HEIGHT, BRICK_WIDTH, Colour.GRAY));
pos = pos + 50;
}
// Blue bricks for bricks to be hit twice
pos = 50;
for ( int i = 0; i < 10; i++){
bricks.add(new GameObj(pos,300, BRICK_HEIGHT, BRICK_WIDTH, Colour.BLUE));
pos = pos + 50;
}
// Greenbreaks out of view to increase the size of array
for ( int i = 0; i < 60; i++){
bricks.add(new GameObj(0,0, BRICK_HEIGHT, BRICK_WIDTH, Colour.GREEN));
}
}
}
此方法从砖块的数组列表中声明Gameobj,并检测球击中砖块。 (这是我努力去除砖块的方法):
public void runAsSeparateThread()
{
final float S = 3; // Units to move (Speed)
try
{
synchronized ( Model.class ) // Make thread safe
{
GameObj ball = getBall(); // Ball in game
GameObj bat = getBat(); // Bat
List<GameObj> bricks = getBricks(); // Bricks
}
while (runGame)
{
synchronized ( Model.class ) // Make thread safe
{
float x = ball.getX(); // Current x,y position
float y = ball.getY();
// Deal with possible edge of board hit
if (x >= W - B - BALL_SIZE) ball.changeDirectionX();
if (x <= 0 + B ) ball.changeDirectionX();
if (y >= H - B - BALL_SIZE) // Bottom
{
ball.changeDirectionY(); addToScore( HIT_BOTTOM );
}
if (y <= 0 + M ) ball.changeDirectionY();
// As only a hit on the bat/ball is detected it is
// assumed to be on the top or bottom of the object.
// A hit on the left or right of the object
// has an interesting affect
String counter1 = "" + counter;
// Yellow Bricks
GameObj brick1 = bricks.get(0);
GameObj brick2 = bricks.get(1);
GameObj brick3 = bricks.get(2);
GameObj brick4 = bricks.get(3);
GameObj brick5 = bricks.get(4);
GameObj brick6 = bricks.get(5);
GameObj brick7 = bricks.get(6);
GameObj brick8 = bricks.get(7);
GameObj brick9 = bricks.get(8);
GameObj brick10 = bricks.get(9);
GameObj brick11 = bricks.get(10);
GameObj brick12 = bricks.get(11);
GameObj brick13 = bricks.get(12);
GameObj brick14 = bricks.get(13);
GameObj brick15 = bricks.get(14);
GameObj brick16 = bricks.get(15);
GameObj brick17 = bricks.get(16);
GameObj brick18 = bricks.get(17);
GameObj brick19 = bricks.get(18);
GameObj brick20 = bricks.get(19);
GameObj brick21 = bricks.get(20);
GameObj brick22 = bricks.get(21);
GameObj brick23 = bricks.get(22);
GameObj brick24 = bricks.get(23);
GameObj brick25 = bricks.get(24);
GameObj brick26 = bricks.get(25);
GameObj brick27 = bricks.get(26);
GameObj brick28 = bricks.get(27);
GameObj brick29 = bricks.get(28);
GameObj brick30 = bricks.get(29);
// Blue Bricks
GameObj brick31 = bricks.get(30);
GameObj brick32 = bricks.get(31);
GameObj brick33 = bricks.get(32);
GameObj brick34 = bricks.get(33);
GameObj brick35 = bricks.get(34);
GameObj brick36 = bricks.get(35);
GameObj brick37 = bricks.get(36);
GameObj brick38 = bricks.get(37);
GameObj brick39 = bricks.get(38);
GameObj brick40 = bricks.get(39);
if ( ball.hitBy(brick1)){
ball.changeDirectionY();
if (alreadyHit1 == true){
bricks.remove(0);
addToScore( HIT_BRICK );
counter = counter - 1;
Debug.trace(counter1);
}
}
if ( ball.hitBy(brick2)){
ball.changeDirectionY();
if (alreadyHit2 == true){
bricks.remove(1);
addToScore( HIT_BRICK );
counter = counter - 1;
Debug.trace(counter1);
}
}
if ( ball.hitBy(brick3)){
ball.changeDirectionY();
if (alreadyHit3 == true){
bricks.remove(2);
addToScore( HIT_BRICK );
counter = counter - 1;
Debug.trace(counter1);
}
}
if ( ball.hitBy(brick4)){
ball.changeDirectionY();
if (alreadyHit4 == true){
bricks.remove(3);
addToScore( HIT_BRICK );
counter = counter - 1;
Debug.trace(counter1);
}
}
if ( ball.hitBy(brick5)){
ball.changeDirectionY();
if (alreadyHit5 == true){
bricks.remove(4);
addToScore( HIT_BRICK );
counter = counter - 1;
Debug.trace(counter1);
}
}
if ( ball.hitBy(brick6)){
ball.changeDirectionY();
if (alreadyHit6 == true){
bricks.remove(5);
addToScore( HIT_BRICK );
counter = counter - 1;
Debug.trace(counter1);
}
}
if ( ball.hitBy(brick7)){
ball.changeDirectionY();
if (alreadyHit7 == true){
bricks.remove(6);
addToScore( HIT_BRICK );
counter = counter - 1;
Debug.trace(counter1);
}
}
if ( ball.hitBy(brick8)){
ball.changeDirectionY();
if (alreadyHit8 == true){
bricks.remove(7);
addToScore( HIT_BRICK );
counter = counter - 1;
Debug.trace(counter1);
}
}
if ( ball.hitBy(brick9)){
ball.changeDirectionY();
if (alreadyHit9 == true){
bricks.remove(8);
addToScore( HIT_BRICK );
counter = counter - 1;
Debug.trace(counter1);
}
}
if ( ball.hitBy(brick10)){
ball.changeDirectionY();
if (alreadyHit10 == true){
bricks.remove(9);
addToScore( HIT_BRICK );
counter = counter - 1;
Debug.trace(counter1);
}
}
if ( ball.hitBy(brick11)){
ball.changeDirectionY();
bricks.remove(10);
addToScore( HIT_BRICK );
counter = counter - 1;
Debug.trace(counter1);
}
if ( ball.hitBy(brick12)){
ball.changeDirectionY();
bricks.remove(11);
addToScore( HIT_BRICK );
counter = counter - 1;
Debug.trace(counter1);
}
if ( ball.hitBy(brick13)){
ball.changeDirectionY();
bricks.remove(12);
addToScore( HIT_BRICK );
counter = counter - 1;
Debug.trace(counter1);
}
if ( ball.hitBy(brick14)){
ball.changeDirectionY();
bricks.remove(13);
addToScore( HIT_BRICK );
counter = counter - 1;
Debug.trace(counter1);
}
if ( ball.hitBy(brick15)){
ball.changeDirectionY();
bricks.remove(14);
addToScore( HIT_BRICK );
counter = counter - 1;
Debug.trace(counter1);
}
if ( ball.hitBy(brick16)){
ball.changeDirectionY();
bricks.remove(15);
addToScore( HIT_BRICK );
counter = counter - 1;
Debug.trace(counter1);
}
if ( ball.hitBy(brick17)){
ball.changeDirectionY();
bricks.remove(16);
addToScore( HIT_BRICK );
counter = counter - 1;
Debug.trace(counter1);
}
if ( ball.hitBy(brick18)){
ball.changeDirectionY();
bricks.remove(17);
addToScore( HIT_BRICK );
counter = counter - 1;
Debug.trace(counter1);
}
if ( ball.hitBy(brick19)){
ball.changeDirectionY();
bricks.remove(18);
addToScore( HIT_BRICK );
counter = counter - 1;
Debug.trace(counter1);
}
if ( ball.hitBy(brick20)){
ball.changeDirectionY();
bricks.remove(19);
addToScore( HIT_BRICK );
counter = counter - 1;
Debug.trace(counter1);
}
if ( ball.hitBy(brick21)){
ball.changeDirectionY();
bricks.remove(20);
addToScore( HIT_BRICK );
counter = counter - 1;
Debug.trace(counter1);
}
if ( ball.hitBy(brick22)){
ball.changeDirectionY();
bricks.remove(21);
addToScore( HIT_BRICK );
counter = counter - 1;
Debug.trace(counter1);
}
if ( ball.hitBy(brick23)){
ball.changeDirectionY();
bricks.remove(22);
addToScore( HIT_BRICK );
counter = counter - 1;
Debug.trace(counter1);
}
if ( ball.hitBy(brick24)){
ball.changeDirectionY();
bricks.remove(23);
addToScore( HIT_BRICK );
counter = counter - 1;
Debug.trace(counter1);
}
if ( ball.hitBy(brick25)){
ball.changeDirectionY();
bricks.remove(24);
addToScore( HIT_BRICK );
counter = counter - 1;
Debug.trace(counter1);
}
if ( ball.hitBy(brick26)){
ball.changeDirectionY();
bricks.remove(25);
addToScore( HIT_BRICK );
counter = counter - 1;
Debug.trace(counter1);
}
if ( ball.hitBy(brick27)){
ball.changeDirectionY();
bricks.remove(26);
addToScore( HIT_BRICK );
counter = counter - 1;
Debug.trace(counter1);
}
if ( ball.hitBy(brick28)){
ball.changeDirectionY();
bricks.remove(27);
addToScore( HIT_BRICK );
counter = counter - 1;
Debug.trace(counter1);
}
if ( ball.hitBy(brick29)){
ball.changeDirectionY();
bricks.remove(28);
addToScore( HIT_BRICK );
counter = counter - 1;
Debug.trace(counter1);
}
if ( ball.hitBy(brick30)){
ball.changeDirectionY();
bricks.remove(29);
addToScore( HIT_BRICK );
counter = counter - 1;
Debug.trace(counter1);
}
//Blue bricks
if ( ball.hitBy(brick31)){
ball.changeDirectionY();
brick31 = new GameObj(50,350, BRICK_HEIGHT, BRICK_WIDTH, Colour.GREEN);
alreadyHit1 = true;
addToScore( HIT_BRICK );
counter = counter - 1;
Debug.trace(counter1);
}
if ( ball.hitBy(brick32)){
ball.changeDirectionY();
bricks.remove(31);
alreadyHit2 = true;
addToScore( HIT_BRICK );
counter = counter - 1;
Debug.trace(counter1);
}
if ( ball.hitBy(brick33)){
ball.changeDirectionY();
bricks.remove(32);
alreadyHit3 = true;
addToScore( HIT_BRICK );
counter = counter - 1;
Debug.trace(counter1);
}
if ( ball.hitBy(brick34)){
ball.changeDirectionY();
bricks.remove(33);
alreadyHit4 = true;
addToScore( HIT_BRICK );
counter = counter - 1;
Debug.trace(counter1);
}
if ( ball.hitBy(brick35)){
ball.changeDirectionY();
bricks.remove(34);
alreadyHit5 = true;
addToScore( HIT_BRICK );
counter = counter - 1;
Debug.trace(counter1);
}
if ( ball.hitBy(brick36)){
ball.changeDirectionY();
bricks.remove(35);
alreadyHit6 = true;
addToScore( HIT_BRICK );
counter = counter - 1;
Debug.trace(counter1);
}
if ( ball.hitBy(brick37)){
ball.changeDirectionY();
bricks.remove(36);
alreadyHit7 = true;
addToScore( HIT_BRICK );
counter = counter - 1;
Debug.trace(counter1);
}
if ( ball.hitBy(brick38)){
ball.changeDirectionY();
bricks.remove(37);
alreadyHit8 = true;
addToScore( HIT_BRICK );
counter = counter - 1;
Debug.trace(counter1);
}
if ( ball.hitBy(brick39)){
ball.changeDirectionY();
bricks.remove(38);
alreadyHit9 = true;
addToScore( HIT_BRICK );
counter = counter - 1;
Debug.trace(counter1);
}
if ( ball.hitBy(brick40)){
ball.changeDirectionY();
bricks.remove(39);
alreadyHit10 = true;
addToScore( HIT_BRICK );
counter = counter - 1;
Debug.trace(counter1);
}
if ( counter < 1){
addToScore( HIT_BRICK );
Debug.trace("Well done! you have completed BreakOut!");
break;
}
if ( ball.hitBy(bat) )
ball.changeDirectionY();
}
modelChanged(); // Model changed refresh screen
Thread.sleep( fast ? 2 : 20 );
ball.moveX(S); ball.moveY(S);
}
} catch (Exception e)
{
Debug.error("Model.runAsSeparateThread - Error\n%s",
e.getMessage() );
}
}
我尝试移除砖块的上述方法中的位显示在下面的示例中:
if ( ball.hitBy(brick1)){
ball.changeDirectionY();
if (alreadyHit1 == true){
bricks.remove(0);
addToScore( HIT_BRICK );
counter = counter - 1;
Debug.trace(counter1);
}
}
alreadyHit1是一个布尔值,当这个砖块上方的蓝色砖块被破坏时,它会变为true,从而可以销毁这块砖块。
谢谢你,希望你能提供帮助 詹姆斯霍利迪
答案 0 :(得分:1)
当您在其中添加/删除元素时,将调整列表的大小。您可以使用数组。该阵列具有固定长度。所以你可以&#34;删除&#34;将元素设置为null。
如果你最初不知道砖的数量,你可以通过填充ArrayList来创建数组,然后调用toArray
编辑:此外,现在我看到你已经硬编码了每个砖被单独击中的情况。您需要退后一步,了解循环/迭代。
例如,这是一种迭代所有砖块的方法(前提是你有一个名为bricksList
的砖块列表):
GameObj[] bricks = bricksList.toArray(new GameObj[bricksList.size()]);
for (int i = 0; i < bricks.length; i++) {
if (ball.hitBy(bricks[i]) {
ball.chageDirectionY();
// more code here
}
}