73660


[Ultimate Guide to the Processing Language Part II: Building a Simple
Game](https://www.toptal.com/game/ultimate-guide-to-processing-simple-
game)を参考に、プログラムを書いております。  
しかしながら、frictionを導入し実行したところ、ボールの速さは０に近づいていくのですが、ある一定のところでボールの速さの絶対値の減少はストップし、ボールが床で止まりません。  
以下のようなコードです。どこが問題なのでしょうか。

[code]

    int gameScreen = 0;
    int ballX, ballY;
    int ballSize = 20;
    int ballColor = color(0);
    
    float gravity = 1;
    float ballSpeedVert = 0;
    float airfriction = 0.0001;
    float friction = 0.1;
    
    void setup() {
        size(500,500);
        ballX = width/4;
        ballY = height/5;
    }
    
    void draw() {
        //Display the contents of the current scree
        if (gameScreen == 0){
            initScreen();
        }else if (gameScreen == 1){
            gameScreen();
        }else if (gameScreen == 2){
            gameOverScreen();
        }
    
    }
    
    // SCREEN CONTENTS
    
    void initScreen(){
        background(0);
        textAlign(CENTER);
        text("Click to start.", height/2, width/2);
    }
    void gameScreen(){
        background(255);
        drawBall();
        applyGravity();
        keepInScreen();
    }
    void gameOverScreen(){
    
    }
    
    // INPUTS
    public void mousePressed() {    
        //If we are on the initial screen when clicked, start the game
        if (gameScreen == 0) {
            startGame();
        }
    }
    
    //OTHER FUNCTION
    void startGame(){
        gameScreen = 1;
    }
    
    void drawBall(){
        fill(ballColor);
        ellipse(ballX, ballY,ballSize,ballSize);
    }
    
    void applyGravity() {
      ballSpeedVert += gravity;
      ballY += ballSpeedVert;
    //   ballSpeedVert -= (ballSpeedVert * airfriction);
    }
    
    void makeBounceBottom(int surface){
        ballY = surface - (ballSize/2);
        ballSpeedVert *= -1; 
        ballSpeedVert -= (ballSpeedVert * friction); <-床にあたったときの摩擦による速度の変化
    }
    
    void makeBounceTop(int surface){
        ballY = surface + (ballSize/2);
        ballSpeedVert *= -1;
        ballSpeedVert -= (ballSpeedVert * friction);
    }
    
    void keepInScreen(){
        // ball hits floor
        if(ballY + (ballSize/2) > height){
            makeBounceBottom(height);
        }
        // ball hits ceiling
        if(ballY - (ballSize/2) < 0){
            makeBounceTop(0);
        }
    }
    
[/code]


CC BY-SA 4.0
2021-01-28T09:31:20.053
73644
2021-01-30T08:20:44.490
2021-01-29T00:13:40.050
3060
30396
question
processing
ボールの弾みを徐々に０に近づけたい


`int ballX, ballY;`

のところの型を `float` に書き直してみてください。  
つまり下記のように修正してください。

`float ballX, ballY;`

参考にされている記事中も `int` になっていますので、本回答を作るのに私もだいぶ苦労して発見しました。

記事中の記述が間違っているようなので、どうやって私が発見したかというと、

> The full Processing game code can be found
> [here](https://gist.github.com/oguzgelal/a2a8db8b2da0e864d1d0#file-
> flappy_pong-pde).

と書かれているところに完成のコードがあるようですので、こちらと見比べながら発見しました（実際にコードをすこし変更するなどもしながら）。

今後もつまった場合は完成品の中から違いを見つけていくとよいと思います。  
（こういう完成品コードへのリンクは記事の最後にあることが多く、最初からあるのを知っているのであれば見ておけばよかった...と思うような記事が世の中に多いです。参考記事では記事的に中くらいのところにリンクが記載されてますので、このリンクを発見するのがそもそも難しい）

コメントを受けて

> ballYはballSpeedVertに変化を与えないように思えるのですが、なぜfloatにすることできちんと止まるようになるのでしょうか...
[code]

    void drawBall(){
        fill(ballColor);
        println(ballY);
        ellipse(ballX, ballY,ballSize,ballSize);
    }
    
[/code]

というようにして ballY の中身を実際に確認してみてください。  
より理解が進むと思います。

ballYはボールの位置を描画するための情報です。  
コード的には `ellipse(ballX, ballY,ballSize,ballSize);` の部分です。

たしかに、ballYはballSpeedVertに変化を与えてはいませんが、逆に ballSpeedVert から影響を受けています。

`ballY += ballSpeedVert;`

の部分です。

[code]

    void setup() {
        size(500,500);
        
        int hoge = 0;
        float foo = 1.1;
    
        hoge += foo;
        println("hoge is");
        println(hoge);
    }
    
[/code]

とすると `hoge`が`1`と表示され、`1.1`にならないことが確認できます。これと同じことが起こっています。

（ちなみにProcessingは画面下方向がY軸の正の方向なので、今回の場合 ballY が 490
になることによって画面下に止まっているように見えるコードになっていました。）

`+=`を使わない `hoge = hoge + foo;`だと `can not convert from float to
int`というエラーになったので、もしかしたら、 `+=`
を使わないほうがより安全にコーディングできるかもしれません（`+=`がなぜエラーにならないのかちょっと発見することができませんでした）。

（こういった型が勝手に変換されることを「暗黙の型変換」というのでもしかしたら調べ続けると情報がでるかもしれません。個人的には暗黙の型変換はこのようにハマることが多いので何かあったときはコンパイルエラーになってくれて気付ける書き方を推奨します）

追記：  
`+=`について発見しました。  
<https://stackoverflow.com/a/7456548/1979953>


CC BY-SA 4.0
2021-01-28T13:44:09.840
73660
2021-01-30T08:20:44.490
2021-01-30T08:20:44.490
9008
9008
73644
answer