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関連 第2回 「Cocos2d-xで作ろう!!~画像の表示処理」

いきなり知らない単語が!Cocos2d-x?Cocos2d-xで画像を表示しよう!     Cocos2d-xって? 今回はCocos2d-xを使用してゲームを作ります。 Coco …

cocos2dx

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

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

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

こんにちは。akiです。 この記事ではCocos2d-xでのアプリ名(アプリのアイコン名)のローカライズについて説明します。デバイスの環境に応じて一つのアプリのタイトル名を、日本語と英語でそれぞれ表示 …

ゲーム制作 Cocos2d-x関連 第16回 「パズル要素を実装する」

ちょっと待って、パズル要素はどこなの???   ・・・ですよね・・・「パズル&ストライク」ですもんね・・・   それではパズル要素の仕様を決めていきましょう。   仕様の …

動作確認画像

Cocos2d-x アプリ起動画面(スプラッシュ画像)の変更方法について

この記事では、アプリの起動画面(スプラッシュ画像)の変更のやり方について説明します。     このスプラッシュ画像、どうやって変更するのか結構わかりづらいと思います。私もしばらくや …