From cb9ac6e110adda0f39c6001c0140bdd7e05313be Mon Sep 17 00:00:00 2001 From: gauthiier Date: Thu, 5 Mar 2015 14:53:49 +0100 Subject: [PATCH] creature creature exmaple --- micro/creature_creature_behavior/Creature.pde | 41 ++++++++++- .../ColonyBehavior.pde | 59 +++++++++++++++ .../Creature.pde | 73 +++++++++++++++++++ .../CreatureBehavior.pde | 11 +++ .../TriangleCreature.pde | 36 +++++++++ .../creature_creature_behavior_example.pde | 65 +++++++++++++++++ .../sketch.properties | 2 + 7 files changed, 285 insertions(+), 2 deletions(-) create mode 100644 micro/creature_creature_behavior_example/ColonyBehavior.pde create mode 100644 micro/creature_creature_behavior_example/Creature.pde create mode 100644 micro/creature_creature_behavior_example/CreatureBehavior.pde create mode 100644 micro/creature_creature_behavior_example/TriangleCreature.pde create mode 100644 micro/creature_creature_behavior_example/creature_creature_behavior_example.pde create mode 100644 micro/creature_creature_behavior_example/sketch.properties diff --git a/micro/creature_creature_behavior/Creature.pde b/micro/creature_creature_behavior/Creature.pde index 65f8302..890187f 100644 --- a/micro/creature_creature_behavior/Creature.pde +++ b/micro/creature_creature_behavior/Creature.pde @@ -4,6 +4,7 @@ import mathematik.Vector3f; class Creature extends BehaviorParticle { float _scale; + float _rotation; public Creature(int x, int y, int r) { super(); @@ -11,26 +12,62 @@ class Creature extends BehaviorParticle { maximumInnerForce(100); radius(r); _scale = 1.0; + _rotation = 0; } + /////////////////////////////////// + // display method + // + applies transformations + // + draws shape of the subclass + public void display() { pushMatrix(); translate(position().x, position().y); - rotate(getRotation()); + if(_rotation != 0) + rotate(_rotation); + else + rotate(getRotation()); scale(_scale); draw_shape(); popMatrix(); } + ///////////////////////////////// + // (absolute) transforms + + public void rotate_to(float r) { + _rotation = r; + } + + public void scale_to(float s) { + _scale = s; + } + + /////////////////////////////////// + // (incremental) transforms + + public void rotate_increment(float r) { + _rotation += r; + } + + public void scale_increment(float s) { + _scale += s; + } + private float getRotation() { if(velocity().isNaN() || velocity().magnitude() == 0) return 0; Vector3f v = new Vector3f(-1, 0, 0); return velocity().angle(v); } + /////////////////////////////////// + // ** METHODS FOR SUBCLASSES ** + + // draws a (subclass) shape (in own coordinates) public void draw_shape() {} + // evaluates if mx and my are inside the (subclass) shape public boolean inside(int mx, int my){return false;} - + }; diff --git a/micro/creature_creature_behavior_example/ColonyBehavior.pde b/micro/creature_creature_behavior_example/ColonyBehavior.pde new file mode 100644 index 0000000..270a93a --- /dev/null +++ b/micro/creature_creature_behavior_example/ColonyBehavior.pde @@ -0,0 +1,59 @@ +import teilchen.Physics; +import teilchen.util.CollisionManager; +import teilchen.behavior.Arrival; + +class ColonyBehavior implements CreatureBehavior { + + ArrayList _colons = new ArrayList(); + Arrival _leader; + CollisionManager _collision; + + Physics _physics; + + public ColonyBehavior(Physics p, CollisionManager c) { + _colons = new ArrayList(); + _leader = new Arrival(); + _leader.position().set(random(width), random(height)); + _physics = p; + _collision = c; + } + + public void add(Creature c) { + + _physics.add(c); + _collision.collision().add(c); + + Colon colon = new Colon(c); + if(_colons.size() >= 1) { + colon.a.setPositionRef(_colons.get(_colons.size()-1).creature.position()); + } else if(_colons.isEmpty()) { + colon.a.setPositionRef(_leader.position()); + } + _colons.add(colon); + } + + public void event(int x, int y) { + _leader.position().set(x, y); + } + + public void event(int c) { + if(c == 'q') { + _leader.position().set(random(width), random(height)); + } + } + + public void update(float dt) {;} + + class Colon { + Creature creature; + Arrival a; + public Colon(Creature colon) { + creature = colon; + a = new Arrival(); + a.breakforce(creature.radius() * 5); + a.breakradius(creature.radius() * 5); + creature.behaviors().add(a); + } + } + +} diff --git a/micro/creature_creature_behavior_example/Creature.pde b/micro/creature_creature_behavior_example/Creature.pde new file mode 100644 index 0000000..890187f --- /dev/null +++ b/micro/creature_creature_behavior_example/Creature.pde @@ -0,0 +1,73 @@ +import teilchen.BehaviorParticle; +import mathematik.Vector3f; + +class Creature extends BehaviorParticle { + + float _scale; + float _rotation; + + public Creature(int x, int y, int r) { + super(); + position().set(x, y); + maximumInnerForce(100); + radius(r); + _scale = 1.0; + _rotation = 0; + } + + /////////////////////////////////// + // display method + // + applies transformations + // + draws shape of the subclass + + public void display() { + pushMatrix(); + translate(position().x, position().y); + if(_rotation != 0) + rotate(_rotation); + else + rotate(getRotation()); + scale(_scale); + draw_shape(); + popMatrix(); + } + + ///////////////////////////////// + // (absolute) transforms + + public void rotate_to(float r) { + _rotation = r; + } + + public void scale_to(float s) { + _scale = s; + } + + /////////////////////////////////// + // (incremental) transforms + + public void rotate_increment(float r) { + _rotation += r; + } + + public void scale_increment(float s) { + _scale += s; + } + + private float getRotation() { + if(velocity().isNaN() || velocity().magnitude() == 0) return 0; + Vector3f v = new Vector3f(-1, 0, 0); + return velocity().angle(v); + } + + /////////////////////////////////// + // ** METHODS FOR SUBCLASSES ** + + // draws a (subclass) shape (in own coordinates) + public void draw_shape() {} + + // evaluates if mx and my are inside the (subclass) shape + public boolean inside(int mx, int my){return false;} + +}; + diff --git a/micro/creature_creature_behavior_example/CreatureBehavior.pde b/micro/creature_creature_behavior_example/CreatureBehavior.pde new file mode 100644 index 0000000..5340a7f --- /dev/null +++ b/micro/creature_creature_behavior_example/CreatureBehavior.pde @@ -0,0 +1,11 @@ +interface CreatureBehavior { + + public void event(int x, int y); + + public void event(int c); + + public void update(float dt); + + public void add(Creature c); + +} diff --git a/micro/creature_creature_behavior_example/TriangleCreature.pde b/micro/creature_creature_behavior_example/TriangleCreature.pde new file mode 100644 index 0000000..fc4e50b --- /dev/null +++ b/micro/creature_creature_behavior_example/TriangleCreature.pde @@ -0,0 +1,36 @@ +class TriangleCreature extends Creature { + + PVector A, B, C; + + public TriangleCreature(int x, int y, int r) { + super(x, y, r); + + A = new PVector(); + B = new PVector(); + C = new PVector(); + + float theta = TWO_PI/3; + + A.x = cos(0 * theta) * r; + A.y = sin(0 * theta) * r; + + B.x = cos(1 * theta) * r; + B.y = sin(1 * theta) * r; + + C.x = cos(2 * theta) * r; + C.y = sin(2 * theta) * r; + + } + + public void draw_shape(){ + triangle(A.x, A.y, B.x, B.y, C.x, C.y); + line(0, 0, A.x, 0); + } + + public boolean inside(int mx, int my) { + if(dist(mx, my, position().x, position().y) < radius()) return true; + return false; + } + + +}; diff --git a/micro/creature_creature_behavior_example/creature_creature_behavior_example.pde b/micro/creature_creature_behavior_example/creature_creature_behavior_example.pde new file mode 100644 index 0000000..3387f2c --- /dev/null +++ b/micro/creature_creature_behavior_example/creature_creature_behavior_example.pde @@ -0,0 +1,65 @@ +import teilchen.Physics; +import teilchen.util.CollisionManager; + +final int CANVAS_WIDTH = 500; +final int CANVAS_HEIGHT = 500; + +Physics physics; + +CollisionManager collision; + +CreatureBehavior colony; + +ArrayList creatures = new ArrayList(); + +void setup() { + size(CANVAS_WIDTH, CANVAS_HEIGHT); + background(23, 68, 250); + frameRate(30); + + physics = new Physics(); + + collision = new CollisionManager(); + collision.minimumDistance(25); + + colony = new ColonyBehavior(physics, collision); + +} + +void draw() { + + collision.createCollisionResolvers(); + collision.loop(1.0 / frameRate); + + physics.step(1.0 / frameRate); + + background(23, 68, 250); + stroke(255); + noFill(); + + for(int i = 0; i < creatures.size(); i++) { + Creature c = creatures.get(i); + c.display(); + } + + collision.removeCollisionResolver(); + +} + +void mousePressed() { + + Creature c = new TriangleCreature(mouseX, mouseY, 10); + + creatures.add(c); + + colony.add(c); + +} + +void keyPressed() { + + // Inform the colony of the KEY pressed + colony.event(key); + +} + diff --git a/micro/creature_creature_behavior_example/sketch.properties b/micro/creature_creature_behavior_example/sketch.properties new file mode 100644 index 0000000..8630fa2 --- /dev/null +++ b/micro/creature_creature_behavior_example/sketch.properties @@ -0,0 +1,2 @@ +mode.id=processing.mode.java.JavaMode +mode=Java