>  > ピーエムシー PMC YSS ツイン リアショック スポーツライン Z362 ZRX400 360mm 黒/赤 25N 116-421031S5 HD店

ピーエムシー PMC YSS ツイン リアショック スポーツライン Z362 ZRX400 360mm 黒/赤 25N 116-421031S5 HD店

インプレッサ(96.09~97.08)GC8-D47D[16inch](WRX Type-RA) アクレブレーキローター スタンダード フロント左右セット■適合詳細要確認■後払い・代引き不可■

ピーエムシー [チューブ&LED]NSP175G PMC YSS ツイン リアショック スポーツライン Z362 ZRX400 360mm 黒/赤 GD8RF 25N 116-421031S5 HD店

祢次金 佑
エンジニア

2010-11-29 14:06:40

X’masが刻一刻と迫っています。祢次金です。

前回、「クリエイティブなC++ライブラリ “Cinder” の紹介」と題して、Cinderをご紹介しました。今回はそのCinderを使って、iPad上で動作するパーティクル生成アプリケーションを実装してみたいと思います。

前回同様、環境はMacOSXを想定し 【2018年製】 165/55R15 ダンロップ ウインターマックス02 WM02 スタッドレスタイヤ ホイールセット 4本 DUNLOP WINTERMAXX02 シュナイダー スタッグ (SG) 15-4.5J 車種例 NBOX Nワゴン NONE タント eKワゴン キャスト ワゴンR、iOS SDKのバージョンは4.2、iPadのiOSは4.2.1とします。
なお、旧バージョンのiOS SDKの場合、iPad simulatorではFrameworkのリンクに一部失敗しているようで、うまくアプリケーションが起動しませんでした。旧バージョンでビルドしたものでも実機では問題なく動作しますが オデッセイ RA1/2/3/4/ フロントバンパー L.A.U BROSTAR/ブロスター、実装される場合は最新SDKの利用をおすすめします。

雛形の作成と修正

TinderBoxを使ってプロジェクトの雛形をつくります。名前を “TouchTest” とし、Targetは “Cocoa Touch” を選択します。TouchTestAppクラスが定義されるTouchTestApp.cppという名前のソースが生成されているはずです。前回のエントリではTouchTestAppクラスはAppBasicを継承していましたが、TargetをCocoa Touchにしているので今回はAppCocoaTouchを継承しています。

デフォルトのままではiPhone向けの設定になっているので、ここでプロジェクト設定をいじります。ベースSDKをiOS 4.2、Targeted Device FamilyをiPadに変更しておきましょう。
(Base SDK Missingとなってビルドできない場合はXcodeを再起動してみてください。)

以上の設定で、とりあえずビルドしてSimulatorで実行してみると以下のようになります。

カラフルな立方体が中央でぐるぐる回っています。

Cinderでのタッチイベントの処理

今回実装するアプリでは、タッチした位置にパーティクルを生成させます。マウス押下を拾う場合はmouseDownメソッドをオーバーライドしていましたが、タッチ関連のイベントを拾う場合はtouchesBegan、touchesMoved、touchesEndedというメソッドをオーバーライドします。iOSアプリではおなじみのメソッドですね。指が触れタッチが始まった時にtouchesBegan RSR ダウンサス ネイキッド L750S リア2本 新品 RS-R D061DR、タッチが移動した時にtouchesMoved、指が離れタッチが終了した時にtouchesEndedが呼ばれます。それぞれのメソッドにはTouchEventが渡され、タッチの位置やIDを知ることができます。

void TouchTestApp::touchesBegan(TouchEvent event) {}
void TouchTestApp::touchesMoved(TouchEvent event) {}
void TouchTestApp::touchesEnded(TouchEvent event) {}

また、デフォルトではマルチタッチを処理してくれないので、以下のようにprepareSettingsというメソッドをオーバーライドしてマルチタッチを有効にしておきます。

void TouchTestApp::prepareSettings(Settings *settings)
{
settings->enableMultiTouch();
}

パーティクル生成アプリ

それではアプリの実装です。複数のタッチに対応し、タッチした位置に色とりどりのパーティクルを発生させます。雛形生成でできたデフォルトの実装はほとんど使いません。まずはTouchTestApp.cppファイルにある、メインとなるTouchTestAppクラスから。

#include <map>
#include <vector>
#include "cinder/app/AppCocoaTouch.h"
#include "cinder/app/Renderer.h"
#include "cinder/Rand.h"
#include "ParticleSource.h"
using namespace std;
using namespace ci;
using namespace ci::app;
class TouchTestApp : public AppCocoaTouch {
 public:
void prepareSettings(Settings* settings);
void touchesBegan(TouchEvent event);
void touchesMoved(TouchEvent event);
void touchesEnded(TouchEvent event);
void setup();
void update();
void draw();
map<uint32_t, ParticleSource> particleSources;
};
void TouchTestApp::prepareSettings( Settings *settings )
{
settings->enableMultiTouch();
}
void TouchTestApp::setup()
{
gl::setMatricesWindow(getWindowWidth(), getWindowHeight());
}
void TouchTestApp::touchesBegan(TouchEvent event)
{
for (vector<TouchEvent::Touch>::const_iterator touchIter = event.getTouches().begin();
touchIter != event.getTouches().end();
touchIter++) {
Color color(CM_HSV, Rand::randFloat(), 1.0f, 1.0f);
particleSources[touchIter->getId()] = ParticleSource(touchIter->getPos(), color);
}
}
void TouchTestApp::touchesMoved(TouchEvent event)
{
for (vector<TouchEvent::Touch>::const_iterator touchIter = event.getTouches().begin();
touchIter != event.getTouches().end();
touchIter++)
particleSources[touchIter->getId()].setLocation(touchIter->getPos());
}
void TouchTestApp::touchesEnded(TouchEvent event)
{
for (vector<TouchEvent::Touch>::const_iterator touchIter = event.getTouches().begin();
touchIter != event.getTouches().end();
touchIter++)
particleSources[touchIter->getId()].close();
}
void TouchTestApp::update()
{
for (map<uint32_t, ParticleSource>::iterator sourceIter = particleSources.begin();
 sourceIter != particleSources.end();) {
sourceIter->second.update();
if (sourceIter->second.hasParticle())
sourceIter++;
else
particleSources.erase(sourceIter++);
}
}
void TouchTestApp::draw()
{
gl::clear(Color::white());
for (map<uint32_t, ParticleSource>::iterator sourceIter = particleSources.begin();
 sourceIter != particleSources.end();
 sourceIter++)
sourceIter->second.draw();
}
CINDER_APP_COCOA_TOUCH( TouchTestApp, RendererGl )

タッチ毎にParticleSourceというクラスのインスタンスを生成し、タッチのIDに紐付けて追跡します。タッチが続いている間は、ParticleSourceからParticleが発生し続けます。1つ注意点があり MOTORAGE サファリ Y60 フロントレンズ 1994/9以前車 12V、iOSではOpenGLの座標系がデフォルトでxy方向とも-1.0から1.0の範囲になっているようなので、setupメソッドでスクリーンの大きさに設定し直しています。

続いて、

ピーエムシー PMC YSS ツイン リアショック スポーツライン Z362 ZRX400 360mm 黒/赤 25N 116-421031S5 HD店

■DIXCEL(ディクセル) インスパイア セイバー UA2 UA3 INSPIRE SABER 95/2~98/10 リア ブレーキパッド RD タイプ, 【バタフライシステム】HONDA 【HONDA車用】ダイアフロアマット【ピンク】軽・コンパクト2列 レッド フィット【GE6~9 H19/10 ~ 全車共通】, 【エントリーでポイント5倍】195/65R15 91H BRIDGESTONE ブリヂストン Playz PX-RV プレイズ PX-RV WEDS RIZLEY XS ウェッズ ライツレーXS サマータイヤホイール4本セット, 【メーカー在庫あり】 S&Sサイクル S&S Cycle スリップオン マフラー サイドスラッシュ 14年以降 XL 550-0378 JP店, PMC 【ピーエムシー】 YSS (ワイエスエス) Z362 380mm XL230 銀/白 【116-4913903】 サマータイヤ 215/60R17 96H ヨコハマ ブルーアース・エース AE50 & レオニス WX BKミラーカット 7.0-17 タイヤホイール4本セット, ヘッドライト 03-06 Silverado Foglamps Roof Cab Lamp Signal Headlights Rear Brake Lights Euro 03-06 Silverado FoglampsルーフキャブランプシグナルヘッドライトリアブレーキライトEuro, clazzio シートカバー クラッツィオ リアルレザータイプ トヨタ ヴィッツ ビッツ 型式 NSP130/NSP135 NCP131 年式 H26/5-H28/12 ≪ フロントヘッドレスト分離式/運転席アームレスト有/リア背面4:6分割&中央ヘッドレスト有車 ≫※サイドエアバック付不可, CRIMSON(クリムソン) CLUB LINEA L747 (クラブリネア L747) 19インチ 8.0J PCD:120 穴数:5 inset:24 DISK TYPE:LOW カラー:プレミアムホワイトポリッシュ [ホイール1本単位]/H, 【送料無料】 235/35R19 19インチ WEDS ウェッズ クレンツェ グラベン 680EVO 8J 8.00-19 SAFFIRO サフィーロ SF5000(限定) サマータイヤ ホイール4本セット フジコーポレーション CADILLAC キャデラック CTS 年式03.3- 純正交換HID D1S 2nd最新PLUS LinksAuto最強HID 超大光量+50UP 色温度4300k 6000K 8000k選べます 金属台座 車検適合 1年保証 2本セット 新品 税込 送料無料

ピーエムシー PMC YSS ツイン リアショック スポーツライン Z362 ZRX400 360mm 黒/赤 25N 116-421031S5 HD店:205/50R16 87V YOKOHAMA ヨコハマ DNA ECOS ES300 DNA エコス ES300 MILANO SPEED X10 ミラノスピード X10 サマータイヤホイール4本セット プロジェクトミュー NS-C ブレーキパッド フロント ニッサン スカイライン クーペ CPV35 3500cc 2004年11月~

ピーエムシー PMC YSS ツイン リアショック スポーツライン Z362 ZRX400 360mm 黒/赤 25N 116-421031S5 HD店.【代引不可】BELLEZZA(ベレッツァ):SelectionEX セレクションEX シートカバー (ライトグレー) BEEXD749LG1 【T352】ヴェルファイア [H27/2-][AGH30W/AGH35W] セレクション Bellezza ベレッツァシートカバー

TGS3042C460S10 TGS3042C460S10 シート張替サービス ヴェクスター125/150(CG41A/CG42A) ALBA(アルバ) 1個 BERINGER ベルリンガー キャリパーサポート リアキャリパーブラケット スポーツスター系 14-

、ParticleSourceクラスです。ParticleSource.hとParticleSource.cppを作成し、以下のように記述します。

class ParticleSource {
public:
ParticleSource();
ParticleSource(ci::Vec2f location, ci::Color color);
void setLocation(ci::Vec2f location);
void close();
bool hasParticle() const;
void update();
void draw();
protected:
std::list<Particle> particles;
ci::Vec2f location;
ci::Color color;
bool closed;
};
#include "cinder/gl/gl.h"
#include "cinder/app/AppCocoaTouch.h"
#include "ParticleSource.h"
using namespace std;
using namespace ci;
ParticleSource::ParticleSource()
{
}
ParticleSource::ParticleSource(Vec2f _location, Color _color)
{
location = _location;
color = _color;
closed = false;
}
void ParticleSource::setLocation(Vec2f _location)
{
location = _location;
}
void ParticleSource::close()
{
closed = true;
}
bool ParticleSource::hasParticle() const
{
return particles.size() > 0;
}
void ParticleSource::update()
{
for (list<Particle>::iterator iter = particles.begin();
 iter != particles.end();) {
iter->update();
if (iter->isDead())
iter = particles.erase(iter);
else
iter++;
}
if (!closed)
particles.push_back(Particle(location));
}
void ParticleSource::draw()
{
gl::color(color);
for (list<Particle>::iterator iter = particles.begin();
 iter != particles.end();
 iter++)
iter->draw();
}

ParticleSource毎に独立してParticleクラスのインスタンスを管理します。描画の色もParticleSource毎に設定します。Particleクラスについては前回のエントリで用意したものとほぼ同じなのでここでは割愛します。前回ご紹介した内容で、Particle.hとParticle.cppを用意しておいてください。これで完成です。

実機での実行例

それでは実行してみましょう。少々見づらいですが、以下のように画面上に色とりどりのパーティクルが発生します。

おわりに

Cinderを使ってマルチタッチ対応のiPadアプリケーションを実装してみました。ターゲットをiPadにしても、上記程度のものならやはり簡単に実装することができます。

これまでの実装例はすべて2次元での表現ばかりでしたが、OpenGLを利用しているのでもちろん3次元表現も可能です。iPadや最近のiPhone/iPod touchであればOpenGL ES 2.0に対応していますので、ブログラマブルシェーダを使った凝った表現も可能でしょう。私はまだまだOpenGLについては勉強中の身なので、いずれ何か面白いものができましたらご紹介したいと思います!

それでは!

{yahoojp}jpprem01-zenjp40-wl-zd-95759