アフィリエイト広告を利用しています

広告

posted by fanblog

2018年05月21日

《その392》はね返るボール(ウィンドウのサイズ取得)


 はね返るボール(ウィンドウのサイズ取得)

 最初に左上にあったボールが、右斜め下に 45度の角度でスタートします。
 単純な直線運動ですが、壁や床にぶつかった場合には はね返ります。アプリは、現時点のウィンドウサイズを認識できるので、ドラッグでサイズ変更しても、ボールは壁や床で適切に はね返ります。

 今回のプログラムは、前回までに出てきた内容しか使っていませんが、念のため、
下記の MainPage.xaml.cpp のコードに説明のためのコメントを詳しく入れました。


 ボールがウィンドウ内を動き回ります(ボールの軌跡はあとから書き加えたものです)
add_d151_2.png


 以下は、MainPage.xaml.cpp です。

//
// MainPage.xaml.cpp
// MainPage クラスの実装。
//


#include "pch.h"
#include "MainPage.xaml.h"

using namespace App10;

using namespace Platform;
using namespace Windows::Foundation;
using namespace Windows::Foundation::Collections;
using namespace Windows::UI::Xaml;
using namespace Windows::UI::Xaml::Controls;
using namespace Windows::UI::Xaml::Controls::Primitives;
using namespace Windows::UI::Xaml::Data;
using namespace Windows::UI::Xaml::Input;
using namespace Windows::UI::Xaml::Media;
using namespace Windows::UI::Xaml::Navigation;


float current_w = 0; // 現在のウィンドウ幅
float current_h = 0; // 現在のウィンドウ高さ
float x = 0; // ボール位置の x座標
float y = 0; // ボール位置の y座標
int vx = 3; // x方向の速度
int vy = 3; // y方向の速度


MainPage::MainPage()
{
// フォームの初期化をします。
InitializeComponent();

// StartTimer関数を呼び出します。
StartTimer();
}


// タイマーのスタート
void MainPage::StartTimer() {

// タイマーオブジェクトを作成します。
auto timer = ref new Windows::UI::Xaml::DispatcherTimer();

// タイマーの設定
TimeSpan span;
span.Duration = 1000;
timer->Interval = span;

// タイマーのスタート
timer->Start();

// 定期的に OnTick関数を呼び出します。
auto rcpt
= timer->Tick +=
ref new EventHandler<Object^>(this, &MainPage::OnTick);
}


// タイマーによって呼び出されたときの作業
void MainPage::OnTick(Object^ sender, Object^ e) {

// ボールが右壁に達していたら x方向の速度を負にします。
if (x > current_w - 80) vx = -vx;

// ボールが床に達していたら y方向の速度を負にします。
// ※ y方向は上が負の向きです。

if (y > current_h - 80) vy = -vy;

// ボールが左壁に達していたら x方向の速度を正に戻します。
if (x < 0) vx = -vx;

// ボールが天井に達していたら y方向の速度を正に戻します。
if (y < 0) vy = -vy;

x += vx; // x座標を変更します。
y += vy; // y座標を変更します。

// ボールの位置を指定します。
img->Margin = Windows::UI::Xaml::Thickness(x, y, 0, 0);
}


// ウィンドウサイズ変更時のイベントハンドラ
void App10::MainPage::
Page_SizeChanged(Platform::Object^ sender,
Windows::UI::Xaml::SizeChangedEventArgs^ e)
{
// 変更後のウィンド幅を current_w に代入します。
current_w = Window::Current->Bounds.Width;

// 変更後のウィンド高さを current_h に代入します。
current_h = Window::Current->Bounds.Height;

// 以下は、
// ボールが範囲外に出てしまうような速さで
// ドラッグによるアプリウィンドウの縮小が
// 行われた場合の対策です。

if (x > current_w - 80)
x = current_w - 80;
if (y > current_h - 80)
y = current_h - 80;
}




この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
https://fanblogs.jp/tb/7682226
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


検索
<< 2018年08月 >>
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
プロフィール
こうすけさんの画像
こうすけ

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


×

この広告は30日以上新しい記事の更新がないブログに表示されております。