Cocos2d-x ゲーム制作

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

投稿日:2016年7月2日 更新日:

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

 

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

 

 

プログラム実装

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

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

 

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話 「ボールとドロップの衝突検知と跳ね返り 」

 

PrainGoogleAdSense

PrainGoogleAdSense

-Cocos2d-x, ゲーム制作
-,

執筆者:


comment

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

関連記事

メモリー

Cocos2d-x アニメーションをバッファリングして、高速で安定した処理を行う方法

この記事では、Cocos2d-xにおけるアニメーションのバッファリングについて説明します。   【前回まで】 ・第1回 : アニメーションを利用した回復エフェクトの表示方法 ・第2回 : 加 …

cocos2dx

ゲーム制作 Cocos2d-x関連 第1回 「ゲームを作ろう!!」

ゲーム制作をやってみたい!   誰もが一度はちらっと考えることなのではないでしょうか。しかし一度はそう思うものの、でもやっぱり難しそうだし・・・と思いとどまる方も少なくないはず。 &nbsp …

シミュレータ

ゲーム制作 Cocos2d-x関連 第5回 「ボールを動かそう」

今回はCocos2d-xのupdateメソッドでボールを動かしていきます。   さて前回の続きですが、 ボールをタップすると矢印画像を表示する。 そのままタップを移動することで、矢印画像を3 …

エフェクトサムネ

ゲーム制作 Cocos2d-x関連 第12回 「ボールヒットエフェクトの表示」

派手なヒットエフェクトが欲しい!   この回では、派手では無いですが、ボールがドロップにヒットしたタイミングでヒットエフェクトを表示していきたいと思います。 一口にエフェクトと言っても色々な …

Cocos2d-x モーダルレイヤーの作り方

この記事ではCocos2d-xによるモーダルレイヤー実装のやり方について説明します。     モーダルレイヤーとは モーダルとは操作が完了するまで親への操作を受け付けなくさせるとい …