読者です 読者をやめる 読者になる 読者になる

vaguely

和歌山に戻りました。ふらふらと色々なものに手を出す毎日。

2Dでゲームを作ってみる 2

openFrameworks

昨日の続きです。今日はボールを作ってみます。

内容は、画面上、左右の端に到達したとき、昨日作成したパッドに当たったときに跳ね返ることです。

bool isStarted;
float fltPadX;
float fltPadY;
float fltPadWidth;
float fltBallX;
float fltBallY;
float fltBallEngineX;
float fltBallEngineY;

void PlayApp::setup() {
isStarted = false;

fltPadX = (float)ofGetWidth()/2;
fltPadY = (float)ofGetHeight() - 30;
fltPadWidth = 40;
fltBallX =  ((float)ofGetWidth() + fltPadWidth) / 2;
fltBallY = (float)ofGetHeight() - 35;
fltBallEngineX = 1.2f;
fltBallEngineY = 1.2f;
}

void PlayApp::update(){
if(isStarted){
    moveBall();
}
}
void PlayApp::moveBall(){
fltBallX += fltBallEngineX;
fltBallY -= fltBallEngineY;

// 画面横端に行ったら+-を逆にする
if(((float)ofGetWidth() < fltBallX)||(fltBallX < 0)){
fltBallEngineX = fltBallEngineX * -1;
}
// Y座標は天井のみ跳ね返す
if(fltBallY < 0){
fltBallEngineY = fltBallEngineY * -1;
}
// PadにぶつかったらY軸の+-を逆にする
if((fltPadX <= fltBallX)&&(fltBallX <= fltPadX + fltPadWidth)
    &&(fltBallY == fltPadY)){
fltBallEngineY = fltBallEngineY * -1;
}
}

void PlayApp::draw() {
ofSetColor(0,0,255);
ofCircle(fltBallX, fltBallY, 5);
}

void PlayApp::touchDown(ofTouchEventArgs &touch){
isStarted = true;
}

関係あるところだけ抜き出しています。
なお作成中のファイルは以下に上げてみました。
https://github.com/masanori840816/blockBreaker4study

主にupdate()から呼び出しているmoveBall()でボール(Circle)の位置を指定しています。

またボールは最初は停止していて、画面をタップ(touchDown)した時点で移動を開始するようにしています。
このisStartedをfalseにしてやれば一時停止が実現できますが、昨日作ったパッドを動かすところと競合するため、別途ボタンなどを作った方が良さそうですね。

さて、次はブロックの作成です。
たくさんのブロックを一つ一つ作るのは手間なので、ループなどを利用してシンプルに作成したいところですが、うまくいくでしょうか。