【问题标题】:How can I make each block move in the opposite direction once they reach a certain point on the side of the screen?一旦它们到达屏幕侧面的某个点,如何使每个块向相反方向移动?
【发布时间】:2015-03-05 02:53:48
【问题描述】:

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

我要指出的另一件事是,在块类的更新方法中,x 值也被反转了。我一开始尝试让它从 PlayState 读取块,然后改变相应的速度,但我得到了一个线程错误。这就是为什么我要把我目前的困境带给你。

这是块类:

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

【问题讨论】:

  • 考虑提供一个runnable example 来证明您的问题。这不是代码转储,而是您正在做的事情的一个例子,它突出了您遇到的问题。这将减少混乱并获得更好的响应
  • @MadProgrammer,我去编辑然后在我的帖子中“添加 sn-p”,只有 JavaScript、CSS 和 HTML 的选项。如何为可运行示例制作 Java sn-p?还是我没有正确理解你?
  • @MadProgrammer 我知道这一点,这就是为什么我要问如果不支持 Java,我如何通过添加可运行的 sn-p 来帮助社区解决我的问题。
  • 制作一个示例程序,将其复制粘贴到人们最喜欢的 IDE 中后,就可以编译和运行了 ;)

标签: java object block velocity


【解决方案1】:

抱歉,我没有浏览您的整个代码。但我会这样做:

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 相乘。这将改变它的方向。

【讨论】:

  • 感谢 Kedar,这就是我已经实现的。我只是在获取数组中的每个块并给它们单独的速度时遇到了麻烦。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-20
  • 1970-01-01
  • 1970-01-01
  • 2021-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多