Prainブログ

ゲーム開発とかIT小話とかその他雑記のブログ

*

ゲーム制作 Cocos2d-x関連 第6回 「画面端でのボールの跳ね返り」

      2016/07/10

今回は画面端でのボールの跳ね返りを製作していきましょう。

 

前回ではボールを弾くと、二度と触れられないところまで去って行ってしまいましたね。それでは早速やっていきましょう。

 

 

スポンサーリンク

 

 

プログラム実装

ここではボールの跳ね返り処理を追加します。

以下のプログラムを追記もしくは変更して下さい。

 

HelloWorldScene.h

 // キャラクター関連
 cocos2d::Sprite* _ball; // プレイヤーが操作するボール
 cocos2d::Sprite* _allow; // ボールの侵攻方向を表す矢印画像
 cocos2d::Sprite* _enemy; // 敵キャラ

ハイライト部分を追記します。

 

 

HelloWorldScene.cpp HelloWorld::init

 // 敵
 _enemy = Sprite::create("enemy.png");
 _enemy->setPosition(Vec2(visibleSize.width / 2, visibleSize.height - _enemy->getContentSize().height / 2));
 this->addChild(_enemy, 1, 7);

※前回のball同様、enemyをクラス変数にします。

 

 

HelloWorldScene.cpp HelloWorld::update

void HelloWorld::update(float dt){

    if(_isBallMoving){
        float x = _ball->getPosition().x - _speed*cosf(CC_DEGREES_TO_RADIANS(_degree));
        float y = _ball->getPosition().y + _speed*sinf(CC_DEGREES_TO_RADIANS(_degree));
        _ball->setPosition(Vec2(x, y));


        // 画面端に接触した場合の跳ね返りの処理
        Size visibleSize = Director::getInstance()->getVisibleSize();

        // 画面下端
        if(_ball->getPosition().y - _ball->getContentSize().height / 2 <= 0){
            _degree = _degree * -1;
            y = _ball->getContentSize().height / 2;
        }

        // 画面上端
        if(_ball->getPosition().y + _ball->getContentSize().height / 2 >= visibleSize.height - _enemy->getContentSize().height){
            _degree = _degree * -1;
            y = visibleSize.height - _ball->getContentSize().width / 2 - _enemy->getContentSize().height;
        }

        // 画面左端
        if(_ball->getPosition().x - _ball->getContentSize().width / 2 <= 0){
            _degree = 180 - _degree;
            x = _ball->getContentSize().width / 2;
        }

        // 画面右端
        if(_ball->getPosition().x + _ball->getContentSize().width / 2 >= visibleSize.width){
            _degree = 180 - _degree;
            x = visibleSize.width - _ball->getContentSize().width / 2;
        }

        _ball->setPosition(Vec2(x, y));
    }
}

ハイライト部分を追記します。

 

 

プログラム解説

1.画面端にぶつかった時の角度の更新

画面隅4方向の何れかに到達したらボールの進行方向である角度を更新しています。例えば画面右端では下図のようなイメージです。

【画面端(壁)にぶつかる直前】

hanekaeri

 

【画面端(壁)にぶつかった直後】

hanekaeri2

 

これらの処理を上下左右4方向に対して行います。

 

2.画面端にぶつかった時のめりこみ回避

ボールが画面端へめり込むのを防ぐため、ボールの位置座標を画面端に到達した時点で更新しています。例えば画面右端では下図のようなイメージです。

 

merikomi

 

これらの処理を上下左右4方向に対して行います。

 

 

シミュレータの起動

シミュレータを起動して、画面端でボールが跳ね返るようになっていたらOKです。

6_sc_simu

静止画なのでわかりづらいですが、きちんと動いています。

 

次はボールがドロップにあたった時、ボールが跳ね返るようにしましょう。

 

次回

第7話 「ボールとドロップの衝突検知と跳ね返り 」

 

 - ,

        

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

  関連記事

cocos2dx
Cocos2d-x クライアント側のHttpレスポンス処理

この記事は「Cocos2d-x セーブデータをサーバに送信して保存する」の続きに …

Cocos2d-x iOS アプリ名(アプリのアイコン名)のローカライズ方法

こんにちは。akiです。 この記事ではCocos2d-xでのアプリ名(アプリのア …

cocos2dx
Cocos2d-x クライアント側の処理とデータ送信(Httpリクエスト)

この記事は「Cocos2d-x セーブデータをサーバに送信して保存する」の続きに …

エフェクト
Cocos2d-x 加算合成を利用して、背景が黒い画像をアニメーションで使えるようにする方法

アニメーションを利用してエフェクト表示するときに、以下のようなエフェクト素材を目 …

遊びを繋げ新たな地平へ プレイン Prain
ゲーム制作 Cocos2d-x関連 第9回 「移動しているボールの減速」

この辺りで大体折り返し地点です。   さて、弾いたボールはだんだんと減 …