gpt4 book ai didi

Java Brick Breaker - 从数组中删除砖 block 而不移动

转载 作者:行者123 更新时间:2023-12-02 13:22:47 27 4
gpt4 key购买 nike

我最近一直在制作一款打砖 block 游戏,但是遇到了一些问题。我遇到的问题是尝试从数组列表中删除一 block 砖。我首先使用bricks.remove(i)(i代表我想要删除的砖 block )来做到这一点,但是这当然会导致问题,因为它使数组向左移动,这意味着其余的部分砖头被弄脏了。我尝试的第二个想法是将其设置为空,但这只会导致游戏在要销毁砖 block 时崩溃。

有人有一个解决方案可以帮助我在不移动数组的情况下移除砖 block 吗?

这是将砖 block 创建到数组中的方法:

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));

}

}
}

此方法从砖 block 的数组列表中声明 Gameobj,并检测球击中砖 block 。 (这是我努力去除砖 block 的方法):

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() );
}
}

上述方法中我尝试移除砖 block 的部分如下例所示:

if ( ball.hitBy(brick1)){
ball.changeDirectionY();
if (alreadyHit1 == true){
bricks.remove(0);
addToScore( HIT_BRICK );
counter = counter - 1;
Debug.trace(counter1);

}
}

alreadyHit1 是一个 boolean 值,当该砖 block 上方的蓝砖被摧毁时,该 boolean 值将变为 true,从而允许该砖 block 被摧毁。

谢谢您,希望能帮到您詹姆斯·霍利迪

最佳答案

当您在列表中添加/删除元素时,列表的大小将会调整。您可以使用数组代替。该数组是固定长度的。因此,您可以通过将元素设置为 null 来“删除”砖 block 。

如果您最初不知道砖 block 的数量,您可以通过填充 ArrayList 创建数组,然后调用 toArray

编辑:另外,现在我看到您已经对每 block 砖 block 分别被击中的情况进行了硬编码。您需要退后一步并了解循环/迭代。

例如,这是一个迭代所有砖 block 的方法(假设您有一个名为 bricksList 的砖 block 列表):

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
}
}

关于Java Brick Breaker - 从数组中删除砖 block 而不移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43518207/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com