#pragma once
#define BOUNCE_FACTOR 0.7
#define ACCELEROMETER_FORCE 0.2
#define RADIUS 20
class Ball{
public:
ofPoint pos;
ofPoint vel;
ofColor col;
ofColor touchCol;
bool bDragged;
void init(int id) {
pos.set(ofRandomWidth(), ofRandomHeight(), 0);
vel.set(ofRandomf(), ofRandomf(), 0);
float val = ofRandom( 30, 100 );
col.set( val, val, val, 120 );
if( id % 3 == 0 ){
touchCol.setHex(0x809d00);
}else if( id % 3 == 1){
touchCol.setHex(0x009d88);
}else{
touchCol.setHex(0xf7941d);
}
bDragged = false;
}
void update(const glm::vec3 & accelerometerData) {
vel.x += ACCELEROMETER_FORCE * accelerometerData.x * ofRandomuf();
vel.y += -ACCELEROMETER_FORCE * accelerometerData.y * ofRandomuf();
pos += vel;
if(pos.x < RADIUS) {
pos.x = RADIUS;
vel.x *= -BOUNCE_FACTOR;
} else if(pos.x >= ofGetWidth() - RADIUS) {
pos.x = ofGetWidth() - RADIUS;
vel.x *= -BOUNCE_FACTOR;
}
if(pos.y < RADIUS) {
pos.y = RADIUS;
vel.y *= -BOUNCE_FACTOR;
} else if(pos.y >= ofGetHeight() - RADIUS) {
pos.y = ofGetHeight() - RADIUS;
vel.y *= -BOUNCE_FACTOR;
}
}
void draw() {
if( bDragged ){
ofSetColor(touchCol);
ofDrawCircle(pos.x, pos.y, 80);
}else{
ofSetColor(col);
ofDrawCircle(pos.x, pos.y, RADIUS);
}
}
void moveTo(int x, int y) {
pos.set(x, y, 0);
vel.set(0, 0, 0);
}
};
Comments