2018年05月21日
《その392》はね返るボール(ウィンドウのサイズ取得)
はね返るボール(ウィンドウのサイズ取得)
最初に左上にあったボールが、右斜め下に 45度の角度でスタートします。
単純な直線運動ですが、壁や床にぶつかった場合には はね返ります。アプリは、現時点のウィンドウサイズを認識できるので、ドラッグでサイズ変更しても、ボールは壁や床で適切に はね返ります。
今回のプログラムは、前回までに出てきた内容しか使っていませんが、念のため、
下記の MainPage.xaml.cpp のコードに説明のためのコメントを詳しく入れました。
ボールがウィンドウ内を動き回ります(ボールの軌跡はあとから書き加えたものです)。
以下は、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
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック