Java砖块分解器-从阵列中移除砖块而不移动
我最近一直在做一个打破僵局的游戏,但是我遇到了一些问题。我遇到的问题是试图从arraylist中删除一块砖块。首先,我使用了Java砖块分解器-从阵列中移除砖块而不移动,java,arrays,Java,Arrays,我最近一直在做一个打破僵局的游戏,但是我遇到了一些问题。我遇到的问题是试图从arraylist中删除一块砖块。首先,我使用了砖块。remove(I)(I代表我要移除的砖块),但是这当然会导致问题,因为它会使数组向左移动,这意味着剩余的砖块被弄脏了。我尝试的第二个想法是将其设置为null,但这只会导致游戏在砖块被销毁时崩溃 有没有人能帮我在不移动阵列的情况下移除砖块 这是在阵列中创建砖块的方法: public void createGameObjects() { synchronized(
砖块。remove(I)
(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));
}
}
}
alreadyHit1是一个布尔值,当此砖块上方的蓝色砖块被销毁时,它将变为真,从而允许此砖块被销毁
谢谢你,希望你能帮忙
James Holliday当您添加/删除列表中的元素时,列表的大小将调整。您可以改用数组。数组的长度是固定的。因此,您可以通过将元素设置为null来“移除”砖块 如果最初不知道砖块的数量,可以通过填充ArrayList,然后调用 编辑:另外,现在我看到您已经对每个砖块分别被击中的情况进行了硬编码。您需要后退一步,了解循环/iteartions 例如,这是一种迭代所有砖块的方法(前提是您有一个名为
bricksList
的砖块列表):
GameObj[]bricks=bricksList.toArray(新的GameObj[bricksList.size());
对于(int i=0;i
你能不能提供一个例子来说明我是如何做到这一点的?谢谢你看到我的编辑,看看这里:你编辑的例子不起作用。为了使toArray行起作用,我不得不将它改为GameObj[]bricks2=bricks.toArray(新GameObj[bricks.size());
但是当涉及到ball.hitBy(bricks())时[i] )
它抛出一个“所需数组”是的,Brick
实际上不是一个类。而且,由于您已将数组bricks
重命名为bricks2
,因此您需要传递新的变量名。我没有试图修复您的代码,我只是试图向您展示如何使用迭代。请看一下教程。至于您的问题,使用数组而不是列表应该是一个可行的解决方案。除此之外,我不会修复您的代码,至少不会没有薪水;)我会说设置为null
很好,然后您只需要检查en元素是否为null
,然后再对其执行任何操作(或者NullPointerException
,可能是您遇到的情况?)这就是我在将其设置为空时收到的错误,我将如何调整它?请不要破坏您的帖子。
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);
}
}
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
}
}