We are about to switch to a new forum software. Until then we have removed the registration on this forum.
I want to draw the image and morph it. I read all reference but not found how to draw simple 2D texture on shader.
First of all: hi!
I'm quite new to processing and my first encounter with it was during a course. But now the actual question:
I have produced a script regarding a rock-paper-scissors game (in Bacteria) in which we also tried to involve a spatial effect, more specifically: the amount of neighbours from the same strain of bacteria will improve your chances on victory. But I believe the code is more less okay. Now the - actual -thing is, in order to come up with something usefull I will need multiple runs (i.e. replicates) of this simulation (so that I can graph it afterwards in R with confidence intervals). At the moment my code runs one time and does 400 time-steps and this is printed in a .txt-file in the folder. Now I would like to run my code several times (e.g. 50 or 100 times) and have all of these as output but under a different name (e.g. Morph_abundances_Test[i].txt, where i is 1,2,3,4,....,50 or even 100).
I figured that my I could declare my output as follows: output = createWriter("C:/.../Morph_abundances_Test" + i + .txt")
and I was guessing a for-loop in which I declare i and say it should end at 50 (/100), but this doesn't work. Also it's important that every time the code runs every well is assigned randomly (so not that I would just use more than 400 time steps and just divide these).
I know my code it a little long, but the main thing is the "looping" in order to get some replicates in my folder, so that I won't have to change my code manually every time I run it, because in the end I will run multiple scenario's with different parameters (e.g. different initial percentages of morphs)
int cellSize = 5;
float Red;
float Blue;
float Yellow;
long maximumTime = 400;
float Time;
float dt;
int neighbours = 0;
float nchance;
float Redshare;
float Blueshare;
float Yellowshare;
float totalCells;
PrintWriter output;
// Colors for three different morphs
color RedColor = color(255, 0, 0);
color BlueColor = color(0, 0, 255);
color YellowColor = color(255, 255, 0);
// Array of cells
individual[][] cells;
// Buffer to record the state of the cells and use this while changing the others in the interations
individual[][] cellsBuffer;
int numCellsX, numCellsY;
// Pause
boolean pause = false;
void setup() {
size (500, 500);
numCellsX = width/cellSize;
numCellsY = height/cellSize;
totalCells = numCellsX*numCellsY;
Time = 0;
dt = 1;
// Instantiate arrays
cells = new individual[numCellsX][numCellsY];
cellsBuffer = new individual[numCellsX][numCellsY];
// This stroke will draw the background grid
stroke(48);
noSmooth(); // Initialization of cells
for (int x=0; x<numCellsX; x++) {
for (int y=0; y<numCellsY; y++) {
individual thisind = new individual();
cells[x][y] = thisind;
}
}
background(0); // Fill in black in case cells don't cover all the windows
output = createWriter("C:/.../Morph_abundances_Test.txt"); // Creates the stream
output.println("Time\tRed\tBlue\tYellow"); // Create the header of the data file
}
void draw() {
//Draw grid
for (int x=0; x<numCellsX; x++) {
for (int y=0; y<numCellsY; y++) {
if (cells[x][y].morph == 2) {
fill(RedColor);
}
else if (cells[x][y].morph == 1) {
fill(BlueColor);
}
else if (cells[x][y].morph == 0) {
fill(YellowColor);
}
rect (x*cellSize, y*cellSize, cellSize, cellSize);
}
}
for (int x=0; x<numCellsX; x++) {
for (int y=0; y<numCellsY; y++) {
cellsBuffer[x][y] = cells[x][y];
}
}
// Visit each cell:
for (int x=0; x<numCellsX; x++) {
for (int y=0; y<numCellsY; y++) {
int minx = 0;
int maxx = 3;
int miny = 0;
int maxy = 3;
if(x ==numCellsX-1) { maxx = 2;}
if(x ==0 ) { minx = 1;}
if(y ==numCellsY-1) { maxy = 2;}
if(y ==0 ) { miny = 1;}
// Draw random neighbour
int randx = 0;
int randy = 0;
while(randx == 0 && randy == 0){
randx = floor(random(minx,maxx) -1);
randy = floor(random(miny,maxy) -1);
}
// PLUS check the strain of every neighbour of focal cell
for (int xx=x-1; xx<=x+1;xx++) {
for (int yy=y-1; yy<=y+1;yy++) {
if (((xx>=0)&&(xx<numCellsX))&&((yy>=0)&&(yy<numCellsY))) { // Make sure you are not out of bounds
if (!((xx==x)&&(yy==y))) { // Make sure to not check against self
if (cellsBuffer[x][y].morph == cellsBuffer[xx][yy].morph){
neighbours ++; //
}
}
}
}
}
cellsBuffer[x][y].neighbours = neighbours;
//attach chance to the amount of neighbours of the same strain
cellsBuffer[x][y].nchance = (neighbours / 8) * 100;
//PLUS every neighbour of the randomly picked cell
for (int xx=x-1; xx<=x+1;xx++) {
for (int yy=y-1; yy<=y+1;yy++) {
if (((xx>=0)&&(xx<numCellsX))&&((yy>=0)&&(yy<numCellsY))) { // Make sure you are not out of bounds
if (!((xx==x)&&(yy==y))) { // Make sure to not check against self
if (cellsBuffer[x+randx][y+randy].morph == cellsBuffer[xx][yy].morph){
neighbours ++; //
}
}
}
}
}
cellsBuffer[x+randx][y+randy].neighbours = neighbours;
//attach chance to the amount of neighbours of the same strain
cellsBuffer[x+randx][y+randy].nchance = (neighbours / 8) * 100;
//Interaction (Rock-paper-scissors game incl. spatial effects)
if (cellsBuffer[x][y].morph == 2 && cellsBuffer[x+randx][y+randy].morph == 0 &&
cellsBuffer[x][y].neighbours <= cellsBuffer[x+randx][y+randy].neighbours &&
ceil(random(100)) <= cellsBuffer[x+randx][y+randy].nchance ){
cells[x][y].morph = 0; //Red vs Yellow (Yellow wins)
}
else if (cellsBuffer[x][y].morph == 1 && cellsBuffer[x+randx][y+randy].morph == 2 &&
cellsBuffer[x][y].neighbours <= cellsBuffer[x+randx][y+randy].neighbours &&
ceil(random(100)) <= cellsBuffer[x+randx][y+randy].nchance){
cells[x][y].morph = 2; //Red vs Blue (Red wins)
}
else if (cellsBuffer[x][y].morph == 0 && cellsBuffer[x+randx][y+randy].morph == 1 &&
cellsBuffer[x][y].neighbours <= cellsBuffer[x+randx][y+randy].neighbours &&
ceil(random(100)) <= cellsBuffer[x+randx][y+randy].nchance){
cells[x][y].morph = 1; //Blue vs Yellow (Blue wins)
}
else {
cells[x][y].morph = cellsBuffer[x][y].morph;
}
} //for x
} //for y
// Visit each cell:
for (int x=0; x<numCellsX; x++) {
for (int y=0; y<numCellsY; y++) {
if (cellsBuffer[x][y].morph == 2){
Red += 1;
}
if (cellsBuffer[x][y].morph == 1){
Blue += 1;
}
if (cellsBuffer[x][y].morph == 0){
Yellow += 1;
}
} //for x
} //for y
Redshare = Red/totalCells;
Blueshare = Blue/totalCells;
Yellowshare = Yellow/totalCells;
println ("Time: " + Time + "\t Red: " + Redshare + "\t Blue: " + Blueshare + "\t Yellow: " + Yellowshare);
String growthDataStr = Time + "\t" + Redshare*100 + "\t" + Blueshare*100 + "\t" + Yellowshare*100; //*100 to get it the percentage
output.println(growthDataStr);
//Every morphcount should be brought back to 0
Red = 0;
Blue = 0;
Yellow = 0;
Time = Time + dt;
if(Time >= maximumTime){
output.flush();
output.close();
exit();
}
}
and then there's also my class:
class individual {
int morph;
float state;
int neighbours;
int nchance;
float yellow_prob = 0.333333; // % chance of yellow color
float blue_prob = 0.333333; // % chance of blue color
float red_prob = 0.333333; // % chance of red color
individual(){
//morph
state = random(1);
if (state < yellow_prob) {
morph = 0; //Yellow
}
else if (state < yellow_prob + blue_prob) {
morph = 1; //Blue
}
else {
morph = 2; //Red
}
}
}
Thanks in advance! And my apologies might this be too complex, other comments/suggestions regarding my code are more than welcome too!
Hi everyone
I'm a total novice to Processing so maybe this is a simple Question, although it is quite difficult to frame: Is it possible to automatically complete the steps between one shape and a second shape? For example in the image below i have two drawings, and i would like to automatically fill in the gap so that the first form transforms into the second. Like you can do it with the blend tool in illustrator.
Thank you for any help and happy new year!
This code was given to us in class as an example, but my prof has a rough accent and its hard to understand her. here is the code:
/* Colour Morph
Example for COMP 1010
Draw a bar across the centre of the window, with height
BAR_HEIGHT, that consists of NUM_STEPS rectangles of
equal width, with the left one having the colour set by
INIT_RED, INIT_GREEN, INIT_BLUE, and the right one set by
FINAL_RED, FINAL_GREEN, and FINAL_BLUE, and changing
smoothly in between.
*/
size(700,200); //Make it wide but not too tall.
final int NUM_STEPS = 8; //The number of different coloured bars to use
final int BAR_HEIGHT = 150; //The height of the bar
final float BAR_WIDTH = (float)width/NUM_STEPS; //The width of each small slice
final float INIT_RED=156, INIT_GREEN=63, INIT_BLUE=178; //Initial colour
final float FINAL_RED=25, FINAL_GREEN=162, FINAL_BLUE=159; //Final colour
for(int i=0; i<NUM_STEPS; i++){
//i will be 0,1,...,NUMSTEPS-1
float position = i/(NUM_STEPS-1.0); //A value from 0.0 to 1.0
float redValue = INIT_RED+(FINAL_RED-INIT_RED)*position;
float greenValue = INIT_GREEN+(FINAL_GREEN-INIT_GREEN)*position;
float blueValue = INIT_BLUE+(FINAL_BLUE-INIT_BLUE)*position;
fill(redValue,greenValue,blueValue);
stroke(redValue,greenValue,blueValue); //Make the outline match, too.
rect(i*BAR_WIDTH,(height-BAR_HEIGHT)/2,BAR_WIDTH,BAR_HEIGHT);
}//for
In the loop, why do we use those operations? If I was asked to code this on an exam, how would I know to do that?? I dont get the logic behind it
Have you looked at the morph example?
I'm starting to mess with this but my first question is what points are returned by PShape getVertex? Is there a way to generate more points along the paths of an SVG shape?
Does it even make sense to try and preserve the paths that connect points in the shapes or should I just connect all the dots linearly?
Thanks for any help on this, I'm still fairly new to this stuff so I'm trying to wrap my head around it.
I am using a recursive trig function to make super high definition symmetrical spiral shapes that morph into one another, but because of the computation involved, it is very slow: ~6 hours for a minute of footage (1440 frames) on my mbp.
The P2D renderer doesn't make it go that much faster on my computer, but I thought there might be a way to make use of a GPU instance on EC2 via OpenGL?
Thanks to one of Daniel Shiffman's tutorials, I managed to get a sketch running on EC2 and exporting .png files using the default renderer - would I just be better off getting a compute instance and using the default renderer? I was curious so I hired a larger compute instance, but it rendered the frames only very slightly faster than the free tier instance.
Any advice / pointers / resources wrt rendering headless on EC2 would be amazing!!
For face morphing, see the Shiffman "Face-It" workshop materials on faces in Processing:
...in particular, the Face Morphing demo sketches:
...you can also find previous discussions of this just by searching the forum!
I want to be able to make a code using my live camera, and detectiong facial features so i can expand on that and morph or manipulate facial features, anyone know anything about that? do i need to download a library?
Simple question...I have a triangle made with triangle() and I would like to morph / tween it into 2 rectangles when you click on it...think play / pause button...any suggestions on how I should proceed with this?
I am using p5.js and not processing btw.
Thanks!
i´m starting with 2 images, and i wanna morph them
https://forum.processing.org/two/search?Search=morph
Say more about what you are trying to accomplish. Do you mean cross-fade two images, e.g. with [tint()]? Or do you mean feature-based morphing, like two-face morphing? How many images, of what kind?
See also:
Hi, is there a simple shader to morph to images?, thanks :)
Not perfect, but this interpolates between 2 polygons of (different) n sides. Quite a complicated way of setting out spokes, then limiting the magnitude for those ones not needed, but used in interpolating the next shape.
// this interpolates from a shape of random sides to a shape of a different, random number of sides
int tileX, tileY;
int tileDistance = 60;
float tileNumber = 0;
PolygonN shapeone, shapetwo;
int maxSides = 6;
float amt = 0;
int n, maxN, n2;
PVector origin;
int radius = 20;
int originX, originY;
void setup() {
size (800, 600);
background(0);
stroke(255);
strokeWeight(2);
originX = width / 2;
originY = height / 2;
n = (int)random(maxSides) + 3;
n2 = (int)random(maxSides) + 3;
if (n == n2) {
n2 = n + 1;
}
maxN = n * n2 * 20;
shapeone = new PolygonN(n, maxN, radius);
shapetwo = new PolygonN(n2, maxN, radius);
shapeone.setupPolygon();
shapetwo.setupPolygon();
} // end setup
void draw() {
for (tileY = tileDistance / 2; tileY < height; tileY += tileDistance) {
for (tileX = tileDistance / 2; tileX < width; tileX += tileDistance) {
pushMatrix();
translate(tileX, tileY);
amt = map(dist(tileDistance, tileDistance, tileX, tileY), 0, dist(tileDistance, tileDistance, width - tileDistance, height - tileDistance), 0, 1);
stroke(lerpColor(color(255, 0, 0), color(0, 0, 255), amt));
PVector[] morph = new PVector[maxN];
noFill();
beginShape();
for (int i = 0; i < maxN; i ++) {
morph[i] = PVector.lerp(shapeone.v[i], shapetwo.v[i], amt);
vertex(morph[i].x, morph[i].y);
}
endShape(CLOSE);
popMatrix();
}
}
noLoop();
} // end draw
class PolygonN {
int sides;
int spokes;
int radius;
PVector[] v; // all spokes from origin
PVector[] spoke; // spokes to each corner ie used spokes
PVector origin = new PVector(0, 0);
PolygonN(int n, int m, int r) {
sides = n;
spokes = m;
radius = r;
}
void setupPolygon() {
float theta = TWO_PI / sides; // angle between sides
float thetaSpokes = TWO_PI / spokes; // angle between spokes
int currentSpoke = 1;
PVector overlap; // working vector to tell if spokes too long
spoke = new PVector[sides+1];
v = new PVector[spokes];
for (int i = 0; i < sides; i ++) { // set up n used spokes
spoke[i] = PVector.fromAngle(theta * i);
spoke[i].setMag(radius);
}
spoke[sides] = spoke[0]; // to loop around
for (int i = 0; i < spokes; i ++) { // set up spokes non used spokes
v[i] = PVector.fromAngle(thetaSpokes * i);
v[i].setMag(radius); // ful length so overlaps side
if ((i * thetaSpokes) > (currentSpoke * theta)) { // if current angle past current used spoke, move on to next spoke
currentSpoke ++;
}
overlap = lineIntersection(spoke[currentSpoke], spoke[currentSpoke-1], origin, v[i]);
if (overlap !=null) {
float distance = dist(overlap.x, overlap.y, 0, 0);
v[i].setMag(distance);
}
}
}
}
PVector lineIntersection(PVector p1, PVector p2, PVector p3, PVector p4) {
PVector b = PVector.sub(p2, p1);
PVector d = PVector.sub(p4, p3);
float b_dot_d_perp = b.x * d.y - b.y * d.x;
if (b_dot_d_perp == 0) {
println("1st overlap error");
return null;
}
PVector c = PVector.sub(p3, p1);
float t = (c.x * d.y - c.y * d.x) / b_dot_d_perp;
if (t < 0 || t > 1) {
println("2nd overlap error");
return null;
}
float u = (c.x * b.y - c.y * b.x) / b_dot_d_perp;
if (u < 0 || u > 1) {
println(u + "<-u 3rd overlap error");
return null;
}
return new PVector(p1.x+t*b.x, p1.y+t*b.y);
}
Is there a way of getting it between to morph between polygons of n sides?
edit - looks like this is how to draw polygon of n sides, next step to lerp betweeen vertices. not tested yet, so bound to have an error or two.
int n = 3;
float radius = 30;
float theta = TWO_PI / n;
beginShape();
for (int i = 0; i < n; i ++) {
float x = radius * cos(theta * i);
float y = radius * sin(theta * i);
vertex (x , y);
}
endShape(CLOSE);
Nice one @TfGuy44 & nice idea @jsr
Been playing with the original code but don't know PVector class well enough.
I'd meant to spend this evening sorting out a drum sequencer in arduino, but really liking Islamic art made this too interesting to miss.
Anyway, this is a simple tiling of code above:
`int tileX, tileY;
int tileDistance = 30;
float tileNumber = 0;
void setup() {
size(640, 360);
noFill();
stroke(255);
}
void draw() {
background(51);
noLoop();
for (tileY = 0; tileY < height; tileY += tileDistance) {
for (tileX = 0; tileX < width; tileX += tileDistance) {
tileNumber ++;
strokeWeight(2);
morph_shape(tileNumber);
}
}
}
void morph_shape(float amt) {
rect(tileX, tileY, tileDistance, tileDistance, amt/5);
}
`
But being able to morph between different shapes would be amazing - PVector looks to be the way to go, but how to deal with polygons of different numbers of sides - how to morph between a square and a triangle?
Hi there,
Im wanting to make a pattern that would have a simple for loop repeating pattern. Im thinking of something that starts on one quadrant and finishes on another quadrant. For sake of discussion a triangle that morphs in to a square?
I saw this https://processing.org/examples/morph.html which helps me think about how to morph a shape, but not sure if the same rule would apply for wanting to make a pattern.
Generative Design has a similar sketch http://www.generative-gestaltung.de/P_2_1_2_03 but I do not need sketch to move, a still image is totally fine.
Any help is much appreciated!
Hi, Is it possible in processing to morph few images from one two another to create something like in the following gif: https://media.giphy.com/media/c8ygOpL64UDuw/giphy.gif
There are plenty of software to to this, but I need to be interactive. I'll have webcam that captures two images, and then should be created video clip from the warping process of those 2 images.
Thanks in advance
I'm making a top down space shooter. Currently I'm having difficulty with two things right now.
When my bullet is shot from the ship (use space key to fire) it moves side to side as it flies, moving on the x-axis the war it did before shooting. I want it to start from the x position of the ship, and then fly straight without interference from the mouse. (it doesn't affect the enemies yet, that's fine)
Array lists. I tried to put my bullets into an array list, but I couldn't get them to respawn where the first bullet spawns. They kept appearing in the top left corner. I also don't want them to shoot right away, I want them to spawn, and wait for the space bar to be pressed again before shooting.
`
float startTime; //# of milliseconds since start of program
float currTime; //# of milliseconds since last drawn ship
float hitTime; //rate ships come onto screen
float follow = 0.05; //rebel's slow
float imgy = 1; //bg img ypos
float imgspeed = 1; //bg image speed
int score; //score
int startscore; //score base
int savedScore; //current score
int moveX, moveY; //mouseX, mouseY
boolean stayDead = false; //You start off alive
boolean mousePress = false; //mouse isn't currently pressed
boolean score_Reset = false; //score isn't reset
boolean space = false;
ArrayList<Ship> ships = new ArrayList<Ship>(); //create array list for ships
class Rebel {
color cc; // rebel colour variable
float x; // rebel x pos
float y; // rebel y pos
float r; // rebel width/ height
boolean hit = false;
Rebel() {
cc = color(#D1E2FF); // define rebel colour
}
boolean checkCollision(Ship sl) { //a yes/no if the rebel has collided with a ship
hit = shipRebel(sl.xpos, sl.ypos, sl.shipwidth, sl.shipheight, x, y, r); //a yes/no for if a ship touches rebel
if (hit == true) return true; //if hit is true, checkCollision is true
else return false; //otherwise checkCollision is false
}
void display() { // rebel display
noStroke(); //no outline
if (hit == true) { //if a ship touches the rebel
fill(#000000); // unused
stayDead = true; //stop displaying
}
else fill(cc); //otherwise, fill normally
ellipse(x, y, r, r); //and create the rebel
imageMode(CENTER);
//image(Rebelpng, x, y);
}
void run() { // rebel movement
float mx = moveX -x; //these two lines create the x variable
x += mx* follow; // basically, mouseX * follow (-x, +x cancel out)
float my = moveY - y; //mouse Y * 0.05
y += my* follow; // -y, +y cancel out
r=30; //rebel width and height
}
}
boolean shipRebel(float sx, float sy, float sw, float sh, float tx, float ty, float diameter) {
//sx = ship xpos, sy = ship ypos, sw = ship width, sh = ship height, tx= rebel xpos, ty = rebel ypos, diameter = rebel diameter
float testX = tx; //testing x positions for collision -- rebel xpos
float testY = ty; //testing y positions for collision -- rebel ypos
/*ship width/height is /2 because ship is in rect(CENTER) mode, displayed from center and not corner*/
if (tx < sx - sw/2) //if rebel xpos is less than ship xpos, - half the ship width
testX = sx - sw/2; //testX will be equal to the ship xpos, - half the ship width
else if (tx > sx + sw/2) //otherwise, if rebel xpos is greater--
testX = sx + sw/2; //testX will be equal to the ship xpos + half the ship width
if (ty < sy - sh/2) //if rebel ypos is less than ship ypos, - half the ship height
testY = sy - sh/2; //testY will be equal to the ship ypos, -half the ship height
else if (ty > sy + sh/2) //otherwise, if rebel ypos is greater--
testY = sy + sh/2; //testY will be equal to the ship ypos, + half the ship height
float distX = tx-testX; //x distance is rebel xpos - testX
float distY = ty-testY; //y distance is rebel ypos - testY
float distance = sqrt( (distX*distX) + (distY*distY) ); //more calculations. I tested this on paper, it works.
/*distance is the square root (a positive number) of
*/
if (distance <= diameter/2) { //if the distance from ship is less than diameter of rebel...
return true; //hit is true
}
return false; //otherwise it's not.
}
class Ship {
color c; // Ship color
float xpos; // ship x pos
float ypos; // ship y pos
float xspeed; // ship speed x direction -- unused
float yspeed; //ship speed y direction
int shipwidth = 40;
int shipheight = 50;
Ship() {
c = color(#5FB277);
xpos = int(random(width)); // x position is random, within the width of the screen
ypos = -shipheight; // y position is top - height of ship
xspeed = 0; // unused
yspeed = int(random(2,6)); // ship speed down screen
}
void display() {
rectMode(CENTER); //rectangle mode is centre positionx, cp y, width, height
noStroke();
fill(c);
rect(xpos, ypos, shipwidth, shipheight);
imageMode(CENTER);
//image(Enemy1png, xpos, ypos); //enemy image file
}
void flight() {
ypos = ypos + yspeed; //place ship at start and add speed
if (ypos > height + 50) {
ypos = -shipheight; //start at top - shipheight
xspeed = 0; //unused
}
}
}
class Bullet {
color cbullet;
float bullx;
float bully;
float bullr;
float bullyspeed;
Bullet () {
cbullet = (#FFFFFF);
bullr = 10;
}
void display() {
noStroke();
ellipse (bullx, bully, bullr, bullr);
}
void follow() {
float mbullx = moveX -bullx; //these two lines create the x variable
bullx += mbullx* follow; // basically, mouseX * follow (-x, +x cancel out)
float mbully = moveY - bully; //mouse Y * 0.05
bully += mbully* follow; // -y, +y cancel out
}
void shoot() {
float mbullx = moveX -bullx; //these two lines create the x variable
bullx += mbullx* follow; // basically, mouseX * follow (-x, +x cancel out)
float mbully = moveY - bully; //mouse Y * 0.05
bully += mbully* follow; // -y, +y cancel out
if (space == true) {
bullyspeed = 10;
bully = (bully - mbully*follow) - bullyspeed;
}
}
}
Ship s; //Ship class shortened to s
Rebel t; //Rebel class shortened to t
Bullet b; //Bullet class shortened to b
void setup() {
size(800, 800, P2D); //screen size
smooth();
s = new Ship(); //add new ship with s
t = new Rebel(); //add player with t
b = new Bullet();
ships.add(s); //add ships to array list
hitTime = 1000; //rate ships come onto screen
startTime = millis(); //# of milliseconds since start of program
startscore = millis() / 100; //score -- 10pts / sec
}
void draw() {
cursor(CROSS); //make cursor cool
background(#000000);
imgy+=imgspeed; //bg y position is y position + speed
imgy%=height;
/* Remember that % is remainders: remainders loop.
4 % has four (0,1,2,3) remainders- height (800) has 800 (0-799)-- thus the image loops)*/
b.display();
if (stayDead == false) { //if still alive
for (int i=0; i < ships.size(); i++) { //for each ship in the array
Ship tempShip = ships.get(i); //check the ship
if (t.checkCollision(tempShip) == true) { //check if it collides with rebel
i = ships.size();
}
t.display(); //display rebel only if alive
}
}
if (mousePressed) { //if the mouse is pressed
stayDead = false; //you're alive
mousePress = true; //you've pressed the mouse
score_Reset = true; //and the score is reset
}
t.run(); //run the rebel ship
for (int i =0; i < ships.size(); i++) { //for each ship in the array
Ship tempShip = ships.get(i); //look at each ship,
tempShip.flight(); //run
tempShip.display(); //and display
}
currTime = millis() - startTime; //millis since draw sequence - millis since start of program
if (currTime >= hitTime) { //if the current milliseconds since start is over 1000 (1 second)
startTime = millis(); //set start time to current millis
Ship s = new Ship(); //create a new ship
ships.add(s); //add ship to arraylist
}
for (int i = 0; i < ships.size(); i++) { //for each ship in the array
if (mousePressed) { //if the mouse is pressed
ships.remove(i); //remove them from array
}
}
score = (millis() / 100) - startscore; //score
if (score_Reset == true) { //if score is reset by mousepress
startscore = millis() /100; //start score is reset
score_Reset = false; //currently score isn't reset
}
if (stayDead == false) { //if you are alive
fill (#FFFFFF); //display text
//textFont(Morph18); //score font
text("Score:", 30, 20); //"Score:"
text(int(score), 70, 20); // score #
} else { //if you are dead
savedScore = score; //saved score is current score
textSize(20);
fill (#FFFFFF);
//textFont(Bofah); //score font
text("GAME OVER", width/2, height/4 - 50); //Game Over text
//textFont(Morph);
text("Double-Click to Play Again", width/2, height/4 +200); //Instructions
//textFont(Bofah); //score font
text(int(savedScore), width/2, height/4);//score when died
noLoop(); //stop running program
}
if (mousePress == false) { //if mouse isn't pressed
fill (#FFFFFF);
textAlign(CENTER);
textSize (12);
//textFont(Morph); //text font
text("AVOID ENEMY SHIPS", width/2, height/3 -60); //Display instructions
text("click to begin", width/2, height/3 +40);
}
if (space == true) {
b.shoot();
}else{
b.follow();
}
}
void mousePressed() { //if mouse is pressed
loop(); //continue running program
}
void mouseMoved() { //if mouse is moved
moveX = mouseX; //Rebel xpos
moveY = mouseY; //Rebel ypos
}
void keyPressed() {
if (key == ' ') {
space = true;
}
}
`
Sure, here are some images where I switch out x2 with x3 and so on with y and z as well. Yeah the slices and stacks are just latitude and longitude.
I feel like I must be close, just can't get it where it doesn't look like its twisting all the way up.
It looks like these: https://www.dropbox.com/sh/5o04zj93ngh15na/AAA2Oqf8OPR7VPpKz2MrN0aYa?dl=0
I want it to look like this, but using the code structure I have because I'd like to morph this sphere using parametric math similar to the morphingbook.com link: