一旦每个块到达屏幕一侧的某个点,我怎样才能让它们向相反的方向移动?

How can I make each block move in the opposite direction once they reach a certain point on the side of the screen?

我正在尝试让三个不同的块从屏幕的一侧来回移动到另一侧。如果最右边的方块达到游戏框架的宽度,它的速度就会反转并开始向左侧移动。但是,我的问题存在于其他两个块中。我在我的代码中输入了一个方法,该方法声明一旦第二个块达到(游戏宽度 - 100),其中 100 只是每个块的宽度,它的速度应该被反转。第三块假设工作相同,除非它到达 x 点(游戏宽度 - 200)。我尝试更改第二个和第三个块的速度可以在下面发布的 PlayState class 的 UpdateBlocks 方法下看到。

我想指出的另一件事是,在块 class 的更新方法中,x 值也被反转了。我首先尝试让它从 PlayState 读取块,然后更改相应的速度,但我遇到了线程错误。这就是为什么我把我现在的困境告诉你。

这是区块 class:

package com.jamescho.game.model;

import java.awt.Rectangle;

import com.jamescho.framework.util.RandomNumberGenerator;
import com.jamescho.game.main.GameMain;
import com.jamescho.game.state.PlayState;

public class Block {
private float x, y;
private int width, height, velX = 700;
private Rectangle rect;
private PlayState play;
private boolean visible;
private static final int UPPER_Y = 275;
private static final int LOWER_Y = 355;

public Block(float x, float y, int width, int height) {
    this.x = x;
    this.y = y;
    this.width = width;
    this.height = height;
    rect = new Rectangle((int) x, (int) y, width, height);
    visible = false;
}

// Note: Velocity value will be passed in from PlayState!
public void update(float delta) {
    x += velX * delta;
    if (x <= 0 || x >= GameMain.GAME_WIDTH - 100) {
        velX = -velX;
    }
    updateRect();
}

public void updateRect() {
    rect.setBounds((int) x, (int) y, width, height);
}

public void invisible() {
    visible = false;
}

public void visible() {
    visible = true;
}

public void stop() {
    velX = 0;
}

public void reverse() {
    velX = -velX;
}
public float getX() {
    return x;
}

public float getY() {
    return y;
}

public boolean isVisible() {
    return visible;
}

public Rectangle getRect() {
    return rect;
}
}

这是所有事情都在进行的 PlayState:

package com.jamescho.game.state;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.util.ArrayList;

import com.jamescho.game.main.GameMain;
import com.jamescho.game.main.Resources;
import com.jamescho.game.model.Block;


public class PlayState extends State {

private ArrayList<Block> row1;
private ArrayList<Block> row2;
private ArrayList<Block> row3;

private Block block;
private Font scoreFont;
private int playerScore = 0;

private static final int BLOCK_HEIGHT = 100;
private static final int BLOCK_WIDTH = 100;
private int blockSpeed = -200;

private static final int PLAYER_WIDTH = 66;
private static final int PLAYER_HEIGHT = 92;

@Override
public void init() {

    row1 = new ArrayList<Block>();
    row2 = new ArrayList<Block>();

    scoreFont = new Font("SansSerif", Font.BOLD, 25);
    for (int i = 0; i < 3; i++) {
        Block b = new Block(i * 105, GameMain.GAME_HEIGHT - 101,
                BLOCK_WIDTH, BLOCK_HEIGHT);
        row1.add(b);
        b.visible();

    for (int h = 0; h < 3; h++) {
        Block b2 = new Block(h * 105, b.getY() - 208,
            BLOCK_WIDTH, BLOCK_HEIGHT);
            row2.add(b2);
            b2.invisible();
            }

    }

}

@Override
public void update(float delta) {

    playerScore += 1;
    if (playerScore % 500 == 0 && blockSpeed > -280) {
        blockSpeed -= 10;
    }

    Resources.runAnim.update(delta);// starts iterating through its frames

    updateBlocks(delta); 
}

private void updateBlocks(float delta) { // time from last update
    for (Block b : row1) { //foreach statement; for each iteration of "b" the     code is executed, one "b" at a time
        if(row1.get(1).getX() == GameMain.GAME_WIDTH - BLOCK_WIDTH - 5) {
            row1.get(1).reverse();
        }
        else if(row1.get(2).getX() == GameMain.GAME_WIDTH - 2 * BLOCK_WIDTH - 5) {
            row1.get(2).reverse();
        }
        b.update(delta);

}
    for (Block c : row2) { //foreach statement; for each iteration of "b" the code is executed, one "b" at a time
        // used with objects; can't use primitive
        c.update(delta);
        if (c.isVisible()) {

        }
    }
}


@Override
public void render(Graphics g) {
    g.setColor(Color.BLACK);
    g.fillRect(0, 0, GameMain.GAME_WIDTH, GameMain.GAME_HEIGHT);
    renderPlayer(g);
    renderBlocks(g);
    renderScore(g);
}

private void renderScore(Graphics g) {
    g.setFont(scoreFont);
    g.setColor(Color.GRAY);
    g.drawString("" + playerScore / 100, 20, 30);
}

private void renderPlayer(Graphics g) {

    }


private void renderBlocks(Graphics g) {
    for (Block b : row1) {
        if (b.isVisible()) {
            g.drawImage(Resources.blue_panel, (int) b.getX(), (int) b.getY(),
                    BLOCK_WIDTH, BLOCK_HEIGHT, null); // change null if you want the object to know about object
        }
    }
    for (Block c : row2) {
        if (c.isVisible()) {
            g.drawImage(Resources.blue_panel, (int) c.getX(), (int) c.getY()+105,
                    BLOCK_WIDTH, BLOCK_HEIGHT, null); // change null if you want the object to know about object
        }
    }
}

@Override
public void onClick(MouseEvent e) {
}

@Override
public void onKeyPress(KeyEvent e) {
    if (e.getKeyCode() == KeyEvent.VK_SPACE) {
        for (Block b : row1) {
            b.stop();
        for (Block c : row2) {
            if (c.isVisible() == true) {
                c.stop();
            }
            }
        }
    }

     else if (e.getKeyCode() == KeyEvent.VK_DOWN) {

    }
}

@Override
public void onKeyRelease(KeyEvent e) {
    if(e.getKeyCode() == KeyEvent.VK_SPACE) {
        for (Block c: row2) {
            c.visible();
        }
    }
}

public float getb1X() {
    return row1.get(1).getX();
}
}

抱歉,我还没有看完你的全部代码。但我会这样做:

int x , int y -- 是屏幕上每个方块的坐标。

一个方块可以在屏幕上以 4 种方式/方向/象限移动:

1) x = x + deltaX, y = y + deltaY  
2) x = x - deltaX, y = y + deltaY  
3) x = x + deltaX, y = y - deltaY
4) x = x - deltaX, y = y - deltaY

因此,为了在块击中任何一侧时改变方向,如果它击中左侧或右侧,则应将 deltaX 乘以 -1,将 deltaY 乘以 -1 如果它触及底部或顶部。这将反转它的方向。