Grip / mouseReleased()
- Description
This function is called when the mouse is released. Note that this event is broadcast to all Grips, so you must specify when they react with isHovering(), isTheHover() or isTheActive().
- Syntax
class FancyGrip extends Grip { void mouseReleased() { statements } }- Parameters
- None
- Returns
- None
- Usage
- Web & Applications
- Related
import compose.grips.*;
import traer.physics.Particle;
import traer.physics.ParticleSystem;
import traer.physics.Spring;
import compose.util.DampenedWave;
GripDispatcher grips;
PFont vagrb;
public void setup() {
size(720, 380);
smooth();
grips = new GripDispatcher(this);
vagrb = loadFont("vagrb.vlw");
hint(ENABLE_NATIVE_FONTS);
new EventSpewingGrip(1 * width / 3, height / 2, 100, false);
new EventSpewingGrip(2 * width / 3, height / 2, 100, true);
}
public void draw() {
background(230);
// There are three particle systems responsible for "bubbles"
// that need to be updated (traer physics)
noGravity.tick();
heavy.tick();
light.tick();
grips.update();
grips.draw();
}
public class EventSpewingGrip extends Grip {
public static final float MIN_RADIUS = 30, MAX_RADIUS = 200;
public float radius;
public float x, y;
private StatusBubble isTheActiveBubble, isTheHoverBubble, isHoveringBubble, isSelectableBubble;
public EventSpewingGrip(float x, float y, float radius, boolean selectable) {
this.x = x;
this.y = y;
this.radius = radius;
this.selectable = selectable;
isTheActiveBubble = new StatusBubble(this, "isTheActive()", theActiveColor, 2 / 5f);
isTheHoverBubble = new StatusBubble(this, "isTheHover()", theHoverColor, 2 / 5f);
isHoveringBubble = new StatusBubble(this, "isHovering()", isHoveringColor, 1.5f / 5f);
isSelectableBubble = new StatusBubble(this, "selectable", selectableColor, 1.5f / 5f);
}
public boolean isHovering() {
return dist(x, y, mouseX, mouseY) < radius + strokeWeight / 2;
}
public void update() {
if (isTheActive())
isTheActiveBubble.show();
else
isTheActiveBubble.hide();
if (isTheHover())
isTheHoverBubble.show();
else
isTheHoverBubble.hide();
if (isHovering())
isHoveringBubble.show();
else
isHoveringBubble.hide();
if (selectable)
isSelectableBubble.show();
else
isSelectableBubble.hide();
}
/**
* This draw method only takes care of the EventSpewer's ellipse (the
* ring) and its name. The classes EventBubble and StatusBubble each
* have their own draw methods.
*/
public void draw() {
pushStyle();
colorMode(RGB, 255, 255, 255, 255);
stroke(0);
strokeWeight(strokeWeight);
if (isTheActive()) {
fill(red(theActiveColor), green(theActiveColor), blue(theActiveColor), opacity);
} else if (isTheHover()) {
fill(red(theHoverColor), green(theHoverColor), blue(theHoverColor), opacity);
} else if (isHovering()) {
fill(red(isHoveringColor), green(isHoveringColor), blue(isHoveringColor), opacity);
} else {
fill(255, opacity);
}
if (selectable) {
stroke(selectableColor);
}
ellipse(x, y, radius * 2, radius * 2);
if (selectable) {
fill(selectableColor);
} else {
fill(0);
}
textFont(vagrb);
pushMatrix();
textAlign(CENTER);
translate(x, y + textAscent() / 4);
scale(1 / 2f);
text("GRIP", 0, 0);
popMatrix();
popStyle();
}
public void focus() {
new EventBubble(this, "focus()", true, focusColor, 2 / 5f);
}
public void blur() {
new EventBubble(this, "blur()", true, blurColor, 2 / 5f);
}
public void mousePressed() {
if (isTheActive()) {
new EventBubble(this, "mousePressed()", true, mousePressedColor, 2.5f / 5f);
}
}
public void mouseReleased() {
if (isTheActive()) {
new EventBubble(this, "mouseReleased()", true, mouseReleasedColor, 2.5f / 5f);
}
}
public void mouseFirstDragged() {
if (isTheActive()) {
new EventBubble(this, "mouseFirstDragged()", true, mouseFirstDraggedColor, 2 / 5f);
}
}
public void mouseDragged() {
if (isTheActive()) {
new EventBubble(this, "mouseDragged()", false, mouseDraggedColor, 1.2f / 5f);
this.x += mouseX - pmouseX;
this.y += mouseY - pmouseY;
}
}
public void mouseMoved() {
// That'd be a little much.
}
public void mouseClicked() {
new EventBubble(this, "mouseClicked()", true, mouseClickedColor, 3f / 5f);
}
public void mouseDoubleClicked() {
new EventBubble(this, "mouseDoubleClicked()", true, mouseDoubleClickedColor, 3f / 5f);
}
public void mouseEntered() {
new EventBubble(this, "mouseEntered()", true, mouseEnteredColor, 2 / 5f);
}
public void mouseExited() {
new EventBubble(this, "mouseExited()", true, mouseExitedColor, 2 / 5f);
}
public void mouseWheeled(int steps) {
if (isTheHover()) {
radius += steps * 2;
radius = max(MIN_RADIUS, radius);
radius = min(MAX_RADIUS, radius);
}
}
public void keyTyped(char c) {
if (isTheActive()) {
new EventBubble(this, "keyTyped(" + c + ")", true, keyTypedColor, 4 / 5f);
}
}
}
public class EventBubble extends Grip {
String message;
PVector acceleration = new PVector(), velocity = new PVector();
traer.physics.Particle p;
int color = 0xFF000000;
float rotation;
float scale = 1;
int age = 0;
ParticleSystem system;
EventSpewingGrip spewedFrom;
public EventBubble(EventSpewingGrip spewedFrom, String message, boolean useHeavyPhysics, int color, float scale) {
this.spewedFrom = spewedFrom;
pushStyle();
textFont(vagrb);
float tr = spewedFrom.radius + textWidth(message) / 2 * scale;
popStyle();
this.system = useHeavyPhysics ? heavy : light;
this.message = message;
this.color = color;
this.scale = scale;
this.rotation = random(minAngle, maxAngle);
this.p = system.makeParticle(bubbleMass * scale, spewedFrom.x + tr * cos(rotation), spewedFrom.y + tr * sin(rotation), 0);
for (int i = 0; i < system.numberOfParticles(); i++) {
Particle cur = system.getParticle(i);
if (cur != p) {
system.makeAttraction(p, cur, -repulsion, 1f);
}
}
float initialVelocity = random(minInitialVelocity, maxInitialVelocity);
this.velocity = new PVector(initialVelocity * cos(rotation), initialVelocity * sin(rotation));
p.velocity().set(velocity.x, velocity.y, 0f);
}
public void update() {
if (age >= bubbleLife) {
system.removeParticle(p);
grips.remove(this);
}
age++;
}
public void draw() {
if (p == null)
return;
pushMatrix();
pushStyle();
textFont(vagrb);
textAlign(CENTER);
translate(p.position().x(), p.position().y());
rotate(rotation);
float i = map(age, 0, bubbleLife, 0, 1);
i = map(i, beginScaleOut, 1, 0, 1);
i = constrain(i, 0, 1);
// Scale out
float s = map(i, 0, 1, scale, 0);
s = min(s, scale);
scale(s);
// Draw bubble
fill(color);
noStroke();
rectMode(CENTER);
rect(0, textOffset, textWidth(message) + textPadding, textAscent() + textDescent() + textPadding);
triangle(-(textWidth(message) + textPadding) / 2 - 30 + 2, 0 + textOffset, -(textWidth(message) + textPadding) / 2 + 2,
10 + textOffset, -(textWidth(message) + textPadding) / 2 + 2, -10 + textOffset);
// Draw message
fill(255);
text(message, 0, 0);
popStyle();
popMatrix();
}
}
public class StatusBubble extends Grip {
String message;
int color = 0xFF000000;
Particle anchor, p;
float scale;
DampenedWave size;
float tr;
Spring tether;
EventSpewingGrip spewedFrom;
public StatusBubble(EventSpewingGrip spewedFrom, String message, int color, float scale) {
this.spewedFrom = spewedFrom;
this.message = message;
this.anchor = noGravity.makeParticle(1, spewedFrom.x, spewedFrom.y, 0);
anchor.makeFixed();
this.p = noGravity.makeParticle(1, spewedFrom.x, spewedFrom.y, 0);
this.color = color;
this.scale = scale;
tr = spewedFrom.radius + 20;
tether = noGravity.makeSpring(anchor, p, 1, 0.4f, tr);
for (int i = 0; i < noGravity.numberOfParticles(); i++) {
Particle cur = noGravity.getParticle(i);
if (cur != p && cur.isFree()) {
noGravity.makeAttraction(p, cur, -300, 0.1f);
}
}
size = new DampenedWave();
p.position().add(random(-2), random(-1), 0);
}
public void show() {
this.size.setRestPosition(1);
}
public void hide() {
this.size.setRestPosition(0);
}
public void update() {
size.update();
anchor.position().set(spewedFrom.x, spewedFrom.y, 0);
tether.setRestLength(spewedFrom.radius + 20);
}
public void draw() {
pushStyle();
noFill();
float a = atan2(p.position().y() - anchor.position().y(), p.position().x() - anchor.position().x());
if (size.getRestPosition() != 0) {
stroke(color);
strokeWeight(4);
line(spewedFrom.x + (spewedFrom.radius + strokeWeight / 2) * cos(a), spewedFrom.y + (spewedFrom.radius + strokeWeight / 2) * sin(a), p.position().x(), p.position().y());
}
pushMatrix();
textFont(vagrb, 48);
textAlign(CENTER);
translate(p.position().x(), p.position().y());
rotate(a);
rotate(PI / 2);
noStroke();
scale(max(scale * size.getPosition(), 0));
scale(0.85f);
fill(color);
rectMode(CENTER);
rect(0, textOffset, textWidth(message) + textPadding, textAscent() + textDescent() + textPadding);
fill(255);
if (a > 0) {
rotate(PI);
text(message, 0, 22);
} else {
text(message, 0, 0);
}
popMatrix();
popStyle();
}
}
/* Physics variables */
public float minAngle = -PI / 6;
public float maxAngle = PI / 6;
public float bubbleMass = 2;
public float minInitialVelocity = 10, maxInitialVelocity = 20;
public float repulsion = 20;
public int bubbleLife = 40;
public float textOffset = -11, textPadding = 30;
public float beginScaleOut = 0.9f;
ParticleSystem noGravity = new ParticleSystem(0f, 0.5f);
ParticleSystem heavy = new ParticleSystem(0, 0.2f);
ParticleSystem light = new ParticleSystem(0.85f, 0.4f);
/* Colors */
float strokeWeight = 12;
int opacity = 210;
int theActiveColor = 0xFF00AAFF,
theHoverColor = 0xFF00E8BB,
isHoveringColor = 0xFF00B290,
selectableColor = 0xFF004E89;
public int focusColor = theActiveColor,
blurColor = theActiveColor,
mousePressedColor = 0xFF000000,
mouseReleasedColor = 0xFF000000,
mouseFirstDraggedColor = 0xFF666666,
mouseDraggedColor = mouseFirstDraggedColor,
mouseClickedColor = 0xFFFF003C,
mouseDoubleClickedColor = mouseClickedColor,
mouseExitedColor = 0xFF00E8BB,
mouseEnteredColor = mouseExitedColor,
keyTypedColor = 0,
mouseWheeledColor = 0;
No Comments
You must be logged in to post a comment.