<< 第6回:Processing + Myron(JMyron)でリアルタイム映像処理 | top | 第8回:既存の作品を解析・改造してみる >>
第7回:オブジェクト指向プログラミング入門
今日の講義では、Proce55ingを通じてオブジェクト指向プログラミング(object-oriented programming, OOP)の基本について学んでいきます。
オブジェクト指向プログラミングとは、プログラムを相互にメッセージを送りあうオブジェクトの集合としてとらえ記述していく方法です。この手法を用いることで開発の効率やその容易さが格段に向上します。
オブジェクト指向の考えかたの枠組みは、プログラミングにとどまらず、システム設計やシステムが対象とする業務のモデリング、システムの分析など、複雑な現実の事象に対応していく際の重要な考えかたともなるでしょう。
オブジェクトとは
オブジェクト(object)はオブジェクト指向プログラミングの中心概念である。オブジェクトの内部は、オブジェクトの動作(メソッド、 method)とその内部に保持するデータから成りたっている。
プログラムは複数のオブジェクトの集合から成りたっている。それぞれのオブジェクトはメッセージ(message)を解して接続されている。オブジェクトは、メッセージ(message)を受け取り、その処理の過程で内部に蓄えたデータを書き換え、必要に応じて他のオブジェクトへメッセージを送るといった動作をする。
クラス
クラスとは、同じ特性を持つオブジェクトの集合に名前をつけたもの。つまりオブジェクトの雛形として、その特性を抽象化したものといえる。例えば、「車」を例に考えると、「車」という言葉自体は「私の車」や「今乗ったバス」というような具体的なオブジェクトを指し示すものではなく、概念一般をあらわしたものである。この「車」がクラスにあたる概念となる。「私の車」というように具体的な車になったもの、つまりあるクラスに属するオブジェクトをインスタンスと呼ぶ。
簡単なプログラムをオブジェクト指向に書き換える
オブジェクト指向でない書きかた
void setup() {
size(200, 200);
background(0);
stroke(200);
fill(127);
}
void draw() {
rect(20, 20, 160, 160);
}
オブジェクト指向な書き方に変更
RectDrawer r1 = new RectDrawer();
void setup() {
size(200, 200);
background(0);
stroke(200);
fill(127);
}
void draw() {
r1.drawRect();
}
class RectDrawer {
void drawRect() {
rect(20, 20, 160, 160);
}
}
オブジェクトにパラメータを渡す
RectDrawer r1 = new RectDrawer(20,20,120);
RectDrawer r2 = new RectDrawer(90,100,80);
void setup() {
size(200, 200);
background(0);
stroke(200);
fill(127);
}
void draw() {
r1.drawRect();
r2.drawRect();
}
class RectDrawer {
float xpos, ypos, rectsize;
RectDrawer(float x, float y, float s){
xpos = x;
ypos = y;
rectsize = s;
}
void drawRect() {
rect(xpos, ypos, rectsize, rectsize);
}
}
「車」というオブジェクトについて考える
車を例に、オブジェクト指向のプログラムについて考えます。ただし車の全ての機能を実現するのは無理ですので、非常に抽象化された車を想定します。
車をひとつのオブジェクトとして捉えた場合、その属性は「属性」と「動作」に分けてそれぞれの車を定義することができます。
属性
- 色
- 形
- 場所
動作
- 加速
- 減速
一般的にオブジェクト指向のプログラムでは、関連する「属性」の集合とそれに対する手続「動作」を一つのまとまった単位「オブジェクト」として扱います。オブジェクトの属性をインスタンス、オブジェクトの動作をメソッドと呼びます。
こうして、様々な車の属性と動作を記述することによって、車という個々のオブジェクトの総体を表わすひとつの雛形が記述されたことになります。同じ特性を持つオブジェクトの集合に名前を付けたものをクラスと言いますです。オブジェクトの特性を抽象化したものともいえます。クラスは一般的に名詞で表現します。
車のクラスをProcessingで定義する
車をあらわすクラスを実際に書いてみます。ここでは車を以下の属性(インスタンス)と動作(メソッド)を定義しています。
属性(インスタンス)
- 色
- X軸上の位置
- Y軸上の位置
- X軸方向の速度
行為(メソッド)
- 描画
- 移動
class Car
{
color c;
int xpos;
int ypos;
int xvel;
// コンストラクタ
Car(color c_, int xp, int yp, int xv) {
c = color(255);
xpos = xp;
ypos = yp;
xvel = xv;
}
void draw () {
fill(c);
rect(xpos,ypos,20,10);
}
void drive () {
xpos = xpos + xvel;
if (xpos > width) { xpos = 0; }
}
}
車のクラスを使ってみる
Car myCar1;
Car myCar2;
void setup() {
size(200,200);
background(0);
framerate(30);
color tempcolor = color(255,0,0);
myCar1 = new Car(tempcolor,0,50,1);
tempcolor = color(0,255,0);
myCar2 = new Car(tempcolor,0,75,2);
}
void draw() {
background(0);
myCar1.draw();
myCar2.draw();
myCar1.drive();
myCar2.drive();
}
class Car
{
color c;
int xpos;
int ypos;
int xvel;
Car(color c_, int xp, int yp, int xv) {
c = c_;
xpos = xp;
ypos = yp;
xvel = xv;
}
void draw () {
fill(c);
rect(xpos,ypos,20,10);
}
void drive () {
xpos = xpos + xvel;
if (xpos > width+20) { xpos = -20; }
}
}
複数の車を同時に操作
int MAX = 200;
Car[] myCars = new Car[MAX];
void setup() {
size(200,200);
framerate(30);
for (int i = 0; i < MAX; i++) {
color tempcolor = color(random(255),random(255),random(255), random(100));
myCars[i] = new Car(tempcolor,random(width),random(height),random(1,5));
}
}
void draw() {
background(0);
for (int i = 0; i < MAX; i++) {
myCars[i].drive();
myCars[i].draw();
}
}
class Car
{
color c;
float xpos;
float ypos;
float xvel;
Car(color c_, float xp, float yp, float xv) {
c = c_;
xpos = xp;
ypos = yp;
xvel = xv;
}
void draw () {
fill(c);
noStroke();
rect(xpos,ypos,20,10);
}
void drive () {
xpos = xpos + xvel;
if (xpos > width+20) {
xpos = -20;
}
}
}
応用:キー入力で文字が3D空間を飛んでいく
import processing.opengl.*;
int MAX = 100;
int count = 0, num = 0, updatenum = 0;
FadeText[] myFadeText = new FadeText[MAX];
void setup()
{
size(200, 200, OPENGL);
PFont myFont;
myFont = createFont("Times", 128);
textFont(myFont);
framerate(30);
}
void keyPressed()
{
count = num%MAX;
color col = color(random(255),random(255),random(255), 100);
myFadeText[count] = new FadeText(10, col, key, random(width), random(height), 20);
if(updatenum<count){
updatenum = count;
}
num++;
}
void draw(){
background(0);
for(int i=0; i<updatenum; i++){
myFadeText[i].update();
}
}
class FadeText{
float speed;
color myCol;
char type;
float xpos;
float ypos;
float zpos;
FadeText(float sp, color cl, char ch, float xp, float yp, float zp) {
speed = sp;
myCol = cl;
type = ch;
xpos = xp;
ypos = yp;
zpos = zp;
}
void update(){
fill(myCol);
zpos -= speed;
text(type, xpos, ypos, zpos);
}
}
オブジェクトとは
オブジェクト(object)はオブジェクト指向プログラミングの中心概念である。オブジェクトの内部は、オブジェクトの動作(メソッド、 method)とその内部に保持するデータから成りたっている。
プログラムは複数のオブジェクトの集合から成りたっている。それぞれのオブジェクトはメッセージ(message)を解して接続されている。オブジェクトは、メッセージ(message)を受け取り、その処理の過程で内部に蓄えたデータを書き換え、必要に応じて他のオブジェクトへメッセージを送るといった動作をする。
クラス
クラスとは、同じ特性を持つオブジェクトの集合に名前をつけたもの。つまりオブジェクトの雛形として、その特性を抽象化したものといえる。例えば、「車」を例に考えると、「車」という言葉自体は「私の車」や「今乗ったバス」というような具体的なオブジェクトを指し示すものではなく、概念一般をあらわしたものである。この「車」がクラスにあたる概念となる。「私の車」というように具体的な車になったもの、つまりあるクラスに属するオブジェクトをインスタンスと呼ぶ。
簡単なプログラムをオブジェクト指向に書き換える
オブジェクト指向でない書きかた
void setup() {
size(200, 200);
background(0);
stroke(200);
fill(127);
}
void draw() {
rect(20, 20, 160, 160);
}
オブジェクト指向な書き方に変更
RectDrawer r1 = new RectDrawer();
void setup() {
size(200, 200);
background(0);
stroke(200);
fill(127);
}
void draw() {
r1.drawRect();
}
class RectDrawer {
void drawRect() {
rect(20, 20, 160, 160);
}
}
オブジェクトにパラメータを渡す
RectDrawer r1 = new RectDrawer(20,20,120);
RectDrawer r2 = new RectDrawer(90,100,80);
void setup() {
size(200, 200);
background(0);
stroke(200);
fill(127);
}
void draw() {
r1.drawRect();
r2.drawRect();
}
class RectDrawer {
float xpos, ypos, rectsize;
RectDrawer(float x, float y, float s){
xpos = x;
ypos = y;
rectsize = s;
}
void drawRect() {
rect(xpos, ypos, rectsize, rectsize);
}
}
「車」というオブジェクトについて考える
車を例に、オブジェクト指向のプログラムについて考えます。ただし車の全ての機能を実現するのは無理ですので、非常に抽象化された車を想定します。
車をひとつのオブジェクトとして捉えた場合、その属性は「属性」と「動作」に分けてそれぞれの車を定義することができます。
属性
- 色
- 形
- 場所
動作
- 加速
- 減速
一般的にオブジェクト指向のプログラムでは、関連する「属性」の集合とそれに対する手続「動作」を一つのまとまった単位「オブジェクト」として扱います。オブジェクトの属性をインスタンス、オブジェクトの動作をメソッドと呼びます。
こうして、様々な車の属性と動作を記述することによって、車という個々のオブジェクトの総体を表わすひとつの雛形が記述されたことになります。同じ特性を持つオブジェクトの集合に名前を付けたものをクラスと言いますです。オブジェクトの特性を抽象化したものともいえます。クラスは一般的に名詞で表現します。
車のクラスをProcessingで定義する
車をあらわすクラスを実際に書いてみます。ここでは車を以下の属性(インスタンス)と動作(メソッド)を定義しています。
属性(インスタンス)
- 色
- X軸上の位置
- Y軸上の位置
- X軸方向の速度
行為(メソッド)
- 描画
- 移動
class Car
{
color c;
int xpos;
int ypos;
int xvel;
// コンストラクタ
Car(color c_, int xp, int yp, int xv) {
c = color(255);
xpos = xp;
ypos = yp;
xvel = xv;
}
void draw () {
fill(c);
rect(xpos,ypos,20,10);
}
void drive () {
xpos = xpos + xvel;
if (xpos > width) { xpos = 0; }
}
}
車のクラスを使ってみる
Car myCar1;
Car myCar2;
void setup() {
size(200,200);
background(0);
framerate(30);
color tempcolor = color(255,0,0);
myCar1 = new Car(tempcolor,0,50,1);
tempcolor = color(0,255,0);
myCar2 = new Car(tempcolor,0,75,2);
}
void draw() {
background(0);
myCar1.draw();
myCar2.draw();
myCar1.drive();
myCar2.drive();
}
class Car
{
color c;
int xpos;
int ypos;
int xvel;
Car(color c_, int xp, int yp, int xv) {
c = c_;
xpos = xp;
ypos = yp;
xvel = xv;
}
void draw () {
fill(c);
rect(xpos,ypos,20,10);
}
void drive () {
xpos = xpos + xvel;
if (xpos > width+20) { xpos = -20; }
}
}
複数の車を同時に操作
int MAX = 200;
Car[] myCars = new Car[MAX];
void setup() {
size(200,200);
framerate(30);
for (int i = 0; i < MAX; i++) {
color tempcolor = color(random(255),random(255),random(255), random(100));
myCars[i] = new Car(tempcolor,random(width),random(height),random(1,5));
}
}
void draw() {
background(0);
for (int i = 0; i < MAX; i++) {
myCars[i].drive();
myCars[i].draw();
}
}
class Car
{
color c;
float xpos;
float ypos;
float xvel;
Car(color c_, float xp, float yp, float xv) {
c = c_;
xpos = xp;
ypos = yp;
xvel = xv;
}
void draw () {
fill(c);
noStroke();
rect(xpos,ypos,20,10);
}
void drive () {
xpos = xpos + xvel;
if (xpos > width+20) {
xpos = -20;
}
}
}
応用:キー入力で文字が3D空間を飛んでいく
import processing.opengl.*;
int MAX = 100;
int count = 0, num = 0, updatenum = 0;
FadeText[] myFadeText = new FadeText[MAX];
void setup()
{
size(200, 200, OPENGL);
PFont myFont;
myFont = createFont("Times", 128);
textFont(myFont);
framerate(30);
}
void keyPressed()
{
count = num%MAX;
color col = color(random(255),random(255),random(255), 100);
myFadeText[count] = new FadeText(10, col, key, random(width), random(height), 20);
if(updatenum<count){
updatenum = count;
}
num++;
}
void draw(){
background(0);
for(int i=0; i<updatenum; i++){
myFadeText[i].update();
}
}
class FadeText{
float speed;
color myCol;
char type;
float xpos;
float ypos;
float zpos;
FadeText(float sp, color cl, char ch, float xp, float yp, float zp) {
speed = sp;
myCol = cl;
type = ch;
xpos = xp;
ypos = yp;
zpos = zp;
}
void update(){
fill(myCol);
zpos -= speed;
text(type, xpos, ypos, zpos);
}
}
<< 第6回:Processing + Myron(JMyron)でリアルタイム映像処理 | top | 第8回:既存の作品を解析・改造してみる >>

Comments
コメントはありません
Add Comment
トップページに戻る