2012年

9月

12日

07)オブジェクトの動的生成:問題3

問題2

2次元のカラーチャートを作成せよ。

(配列の使用方法をチェック)

 

解答案:
(設定)
Form1(ClientWidth:400,ClientHeight:400)

 

(プログラム)

TForm1 *Form1;
TShape *s[20][20];
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
 for(int i=0; i<13; i++){
  for(int j=0; j<13; j++){
   s[i][j]=new TShape(this);
   s[i][j]->Parent=this;
   s[i][j]->Width=20;
   s[i][j]->Height=20;
   s[i][j]->Top=40+25*i;
   s[i][j]->Left=40+25*j;
  }
 }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClick(TObject *Sender)
{
 for(int i=0; i<13; i++){
  for(int j=0; j<13; j++){
   int red=255;
   int green=255/13*(i+1);
   int blue=255/13*(j+1);
   s[i][j]->Brush->Color=TColor RGB(red, green, blue);
  }
 }
}
 

疑問点:

特になかったです。

 

0 コメント

2012年

9月

10日

06)矩形の内部を塗りつぶす:問題2

問題2
矩形のわくがある。内部を全部、青色で塗りつぶすと矩形が消える。
(BitmapDataをどう扱うのかのチェック)

 

解答案(ドロー部分はいいかげんです):
(設定)
Form1(ClientWidth:400,ClientHeight:400)<-- Client..の方がグッドです。
Image1(Width:100,Height:100)
Timer1(全部default)

 

(プログラム)
__fastcall TForm1::TForm1(TComponent* Owner)
 : TForm(Owner)
{
 Image1->Canvas->Rectangle(0,0,100,100);
 Image1->Canvas->Pen->Color = TColor(0xFF0000);
 Image1->Canvas->Pen->Width = 20;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
 int ch = 0;
 for(int x=1; x<Image1->Width-1; x++){
  for(int y=1; y<Image1->Height-1; y++){
   if(Image1->Canvas->Pixels[x][y] == TColor(0xFF0000))
    continue;
   else{
    ch = 999;
    break;
   }
  }
 }
 if(!ch) Image1->Visible = false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{
 Image1->Canvas->MoveTo(X, Y);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y)
{
 Image1->Canvas->LineTo(X, Y);
}

 

疑問点:

1)Rectangleのわくの線を太くする方法

2)この問題を矩形でなく、任意の閉曲線でできるのかどうか?

 

0 コメント

2012年

9月

10日

05)XE3で再スタートします:問題1

夏前にインストールしたC++ Builder XE2体験版は1週間ほどで使えなくなってしまったため、中断となってしまいました(アンインストールして別のPCにインストールするとだめなようです)。先日、XE3が出ましたので、気分あらたに再スタートします。成果だけをつづっていくのは多少ハードですので、作成した問題と、出てきた疑問点を書いていきます。C++ Builderの使い手の皆さん、教えて下さい!

 

問題1(基礎)

マウスダウンの状態で、線をドローすると、同時に左右対称の線も表示される。

(Spriteに相当するものは何か、というのがテーマです)

 

解答案:

(設定)

Form1(Width:400,Height:400)
PaintBox1(Width:384,Height:362,Left:0,Top:0)
PaintBox2(Width:384,Height:362,Left:0,Top:0)

 

(プログラム) 

TForm1 *Form1;
Boolean dFlag = false;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
 : TForm(Owner)
{
 PaintBox1->Canvas->Pen->Width = 10;
 PaintBox1->Canvas->Pen->Color = TColor(0xFF0000);
 PaintBox2->Canvas->Pen->Width = 10;
 PaintBox2->Canvas->Pen->Color = TColor(0x0000FF);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::PaintBox2MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{
 dFlag = true;
 PaintBox1->Canvas->MoveTo(X, Y);
 PaintBox2->Canvas->MoveTo(384-X, Y);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::PaintBox2MouseMove(TObject *Sender, TShiftState Shift, int X, int Y)
{
 if(!dFlag) return;
 PaintBox1->Canvas->LineTo(X, Y);
 PaintBox2->Canvas->LineTo(384-X, Y);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::PaintBox2MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{
 dFlag = false;
}

 

疑問点:

1)removeEventListenerに相当するものは何でしょうか?

2)PaintBox1とPaintBox2の重なり順を変える方法

 

0 コメント

2012年

5月

30日

04)FireMonkeyを使う

今日、エンバカデロ・デベロッパーキャンプ大阪に行ってきました。

 

FireMonkeyという新しいフレームワークが去年の秋に出ているようです。C++ Builderのブログであれば、本当はこのことを一番はじめに書くべきでした。全く知りませんでした!

 

単発のアニメーションの場合、FireMonkeyのAnimateFloatというメソッドを使うのがいいです。AS3ではeasingのパッケージがこれにあたりますが、AnimateFloatの方が設定は簡単です。03)の投稿で取り上げた画像エフェクト作成の件ですが、たぶん、FireMonkeyを使うことで大部分が解決すると思います。

 

C++Builderの次期バージョンでAndroidデバイス(スマートフォン等)にも対応するようですので、リッチな描画+高速性が要求される場合、今後、C++Builderが大きな選択肢となります。Android/javaでは、描画の部分が不満ですし、Android/as3では、センサ制御が不満、Android/C++Builderが、リッチな描画+高速+センサ制御を3つともクリアしてくれることを楽しみにして待ちましょう。

 

以下、FireMonkeyアプリケーションで、AnimateFloatを試してみました。

//---------------------------------------------------------------------------
void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, float X, float Y){
  int r = Button1->RotationAngle;
  Button1->AnimateFloat("rotationangle", r+=90, 0.3);

 

  int w = Button1->Width;
  Button1->AnimateFloat("width", 50);
  Button1->AnimateFloat("width", w, 1);

 

  Button1->AnimateFloat("Position.X", X, 1);
  Button1->AnimateFloat("Position.Y", Y, 1);
}

 

ところで、VCLアプリケーションの中で、FireMonkeyを使うことはできるのでしょうか?

いずれ、FireMonkeyがVCLの全部を含むことになるのでしょうが、現状はそうではないみたいですので、VCL+FireMonkeyという使い方ができればと。この件の解説をしているサイトあるでしょうか。知っている人、URLを教えてもらえませんか。

2 コメント

2012年

5月

25日

03)画像処理の方法(その1)

画像処理を調べてみました。as3の画像エフェクトAPIと比べてどうなのか、という点が最終目標ですが、まず、基本的なところからおさえていきます。

 

CanvasプロパティがBitmapDataのようです。各ピクセルの色は、Pixels[X][Y]で取ることができます。次の例はモザイクを作る方法のテストです。FillRectメソッドもあります。

 

TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
 : TForm(Owner)
{
 Image1->AutoSize=true;
 Image1->Picture->LoadFromFile("..\\..\\柿.bmp");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
          int X, int Y)
{
 Image1->Canvas->Brush->Color = Image1->Canvas->Pixels[X][Y];
 Image1->Canvas->FillRect(Rect(X, Y, X+30, Y+50));
}

 

次の例は、drawメソッドの確認です。CopyModeプロパティが、as3のBlendModeにあたります。Graphics::TBitmapクラスが、as3のBitmapクラスです。Ms.bmpはdrawするための小さな画像です。

 

TForm1 *Form1;
Graphics::TBitmap *b;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
 : TForm(Owner)
{
 Image1->AutoSize = true;
 Image1->Picture->LoadFromFile("..\\..\\柿.bmp");
 b=new Graphics::TBitmap;
 b->LoadFromFile("..\\..\\Ms.bmp");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
          int X, int Y)
{
 Image1->Canvas->CopyMode = cmSrcCopy;

 Image1->Canvas->Draw(X, Y, b);
}

 

0 コメント

2012年

5月

25日

02)配列の使用・色の表現

基本的にオブジェクトはポインタで宣言するみたいですので、配列もポインタで宣言します。色は、用意されている色の定数を使うよりは、TColor RGB(r,g,b)という使い方が便利です。Formのサイズはコンポーネントのプロパティのリスト(Object Inspector)の方に記入しました。


TForm1 *Form1;
TShape *s[10][10];
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
 : TForm(Owner)
{
 for(int i=0; i<10; i++){
  for(int j=0; j<10; j++){
   s[i][j] = new TShape(this);
   s[i][j]->Parent = this;
   s[i][j]->Width = 30;
   s[i][j]->Height = 30;
   s[i][j]->Top = 30+j*32;
   s[i][j]->Left = 30+i*32;
   s[i][j]->Brush->Color = TColor RGB(255, 255-i*25, j*25);
  }
 }
}

 

0 コメント

2012年

5月

24日

01)クラスの継承・アニメーションの作成

今日は、まず、次の2点を確認しました。

1)クラスの継承

2)アニメーションの作成方法

 

Flash Builderとの比較で説明していきたいと思いますが、例となるソースコードは下のとおりです。TImageクラスを継承してTImage1クラスを作りました。addCheidに相当するのは、Parentプロパティです。アニメーションは単振動の例です。描画イベントはないかも知れません。タイマーイベントでアニメーションを作りました。Image1.hをincludeすることを忘れずに(入力補完してくれません)。TImage1クラスを作る=カスタムコンポーネントを作る、ということですが、コンポーネントまでは作りませんので、Image1.cppに追加部分を書くだけです。何かわからないコードが自動生成されてついてきますが、そのままにしておいて問題ないようです。次の例では、Picture、Left、TopをTImage1クラスに入れただけです。


#include <vcl.h>
#include "Image1.h"  // <--- 注意!
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TImage1 *image;
double k = 0.03;  // 単振動の復元力を決める
double vx = 0;  // x方向の速度
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
 : TForm(Owner){
 image = new TImage1(this);
 image->Parent = this;  // <-- 注意!
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender){
 vx += -k*(image->Left - 200);
 image->Left += vx;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClick(TObject *Sender){
 Timer1->Enabled = true;
}

 

クラスの継承とアニメーションの作成については、Flash Builderとほぼ同じと考えていいかと思います。上の例で、タイマーのソースは書いていません。コンポーネントを使いました。こういう点は、つまり、Flashと同じです。Webサイトを検索してみると、多くの人は、C++BuilderをFlash Builder的に使っているのではなく、Flash的に使っているようです。もったいない!

 

 

0 コメント

2012年

5月

23日

00)C++Builderのブログを始めます

C++Builderのブログを始めます。ブログ多すぎかもですが。。。

1ヶ月の期間限定でいきます。1ヶ月=体験版の試用期間ということです。

1ヶ月いっしょにやりましょう!

 

1ヶ月使ってみて、C++Builderがvery goodな場合、買いますので、このブログはずっと続きます。よろしくお願いします。

 

0 コメント