砖破坏者比赛球弹跳

时间:2014-07-16 23:43:37

标签: android math game-physics

我正在尝试开发我的第一个Android游戏,它的游戏名为" brick breaker"。 我相信大家都知道。

一切都很好,直到我来到球弹跳部分。

为了处理冲突,我使用了这个找到的代码:

    scene.registerUpdateHandler(new IUpdateHandler() {
        public void reset() { }

        public void onUpdate(final float pSecondsElapsed) {
                if(ball.collidesWith(paddle)) {
                    ball.bounceWithRectangle(paddle);
                }
                else if (ball.getY() >= Game.getCAMERA_HEIGHT() - 30) {
                    scene.setBackground(new ColorBackground(255f, 0f, 0f));
                }
                else {
                    for (int i = 0; i < bricks.length; i++) {
                        for (int j = 0; j < bricks[0].length; j++) {
                            scene.setBackground(new ColorBackground(0f, 0f, 0f));
                            if(ball.collidesWith(bricks[i][j])) {
                                bricks[i][j].setPosition(CAMERA_HEIGHT+20, CAMERA_WIDTH+20);
                                scene.getTopLayer().removeEntity(bricks[i][j]);
                                ball.bounceWithRectangle(bricks[i][j]);

                            }
                        }
                    }
                }
        }
    });

这就是Ball.java类的样子:

package com.example.zaidimas;


import org.anddev.andengine.engine.Engine;
import org.anddev.andengine.entity.primitive.Rectangle;
import org.anddev.andengine.entity.sprite.AnimatedSprite;
import org.anddev.andengine.opengl.texture.region.TiledTextureRegion;
import java.lang.Math;

public class Ball extends AnimatedSprite {
    float velocity = 100;
    int i =0;
    private Engine mEngine;

    public Ball(float positionX, float positionY, TiledTextureRegion positionTextureRegion, Engine mEngine) {
        super(positionX, positionY, positionTextureRegion);
        this.mEngine = mEngine;
    }


    protected void onManagedUpdate(final float pSecondsElapsed) {
        if(this.mX < 0) {
            this.setVelocityX(velocity);
        } else if(this.mX + this.getWidth() > Game.getCAMERA_WIDTH()) {
            this.setVelocityX(-velocity);
        }

        if(this.mY < 0) {
            this.setVelocityY(velocity);
        } else if(this.mY + this.getHeight() > Game.getCAMERA_HEIGHT()) {
            this.setVelocityY(-velocity);
        }

        super.onManagedUpdate(pSecondsElapsed);
    }

    public void bounceWithRectangle(Rectangle rectangle){
            this.setVelocityY(-this.getVelocityY());
    }


}

它很有效,而且非常清楚。

但问题是球总是从所有表面以相同的角度反弹。 我认为这个角度是90度。

  • 我很想知道如何以不同的角度让球反弹,怎么样 计算theese角度和所有其他有用的信息 让游戏更加逼真。

我已经找到了一些信息,但我无法对此项目进行调整。

  • 也许有人可以用更详细的方式向我解释,给一些 示例甚至帮助修复此项目?

我希望我的问题很明确。

P.S。游戏基于AndEngine aaand 最重要的是 - 抱歉我的英语不好:D

有一个美好的一天/晚上!

1 个答案:

答案 0 :(得分:2)

这更像是一个物理问题,而不是编程问题,但无论如何我们都去了。

您当前的规则

以下是您在程序中描述的当前规则。

  • 初始X和Y速度为每秒100个单位
  • 当球击中墙壁时,否定X速度
  • 当球击中一个方块或天花板时,否定Y速度

目前,你的速度总是(100,100),(100,-100),( - 100,100)或(-100,-100)。所有这些矢量彼此成90度角,这解释了您所描述的现象。

改进规则

假设你想要一些速度变化。尝试这样的事情:

  • 初始X和Y速度为每秒100个单位。
  • 当球击中墙壁时,否定X速度
  • 当一个球击中一个方块的左侧时,否定Y速度,并将X速度减少一个恒定量
  • 当一个球击中一个方块的右侧时,否定Y速度,并将X速度增加一个恒定量
  • 当一个球击中一个方块或天花板的中间时,否定Y速度

你可以进一步打破这种局面。球越靠近块的左侧,X速度的变化应该越大。对于我们都记得的游戏,这应该更为真实。

最重要的变化是知道何时击中一个街区的左侧,中间或右侧。将砖块存放在“碎片”中是明智的,这样每块砖都可以由三块或更多块组成。这样,当你碰到一块时,你就会确切知道你击中了哪一块。