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 …

状態遷移

ゲーム制作 Cocos2d-x関連 第13回 「ゲームの状態(プレイヤーのターン 敵のターン、etc・・・)の実装」

ゲームの操作感がわかってきたところで、ゲーム全体の流れの大枠を作っていきましょう。     今回のゲームはターン制を想定しています。つまり、プレイヤーのターンと敵のターンです。 な …

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

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

楽ちん

Cocos2d-x アニメーションの画像追加を楽に行う方法

  この記事では、楽してアニメーション機能を利用する方法について紹介します。   【前回まで】 ・第1回 : アニメーションを利用した回復エフェクトの表示方法 ・第2回 : 加算合成を利用し …

動作確認画像

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

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