Montag, 21. September 2015

Interactive Art - Homework 3

This game uses a small physics engine I coded.

I seperated the main functions into an update() function for physics and a render() function for visual stuff.
If some performance issues would occur you simply could lower the rate of for example physics update each second.

I am happy with Bob's bouncing animation, but there is no real gameplay yet. Right now, there only is collission with the floor. If there were to add more objects, which would all be affected by phyisics and by collission with each other a good data structure would probably be a quadtree. 





class Object
{
  float   posX, posY, posZ, sizeX, sizeXInit, sizeYInit, sizeY, colorR, colorG, colorB;
  
  public Object(int posX, int posY, int posZ, float sizeX, int sizeY, int colorR, int colorG, int colorB)
  {
    this.posX    = posX;
    this.posY    = posY;
    this.posZ    = posZ;
    this.sizeX   = sizeX;
    sizeXInit    = sizeX;
    this.sizeY   = sizeY;
    sizeYInit    = sizeY;
    this.colorR  = colorR;
    this.colorG  = colorG;
    this.colorB  = colorB;
  }
}





Object   cubes[];
float    velocityY, velocityJumpEnd, velocityAdd, gravity;
float    easing, easingJump, jumpTargetX, jumpDistanceX, rotationTarget;
int      timeLastJump, timeJumpEnd, bubbleStart;
boolean  bubbleShow, isJump;




void setup()
{
  size(800, 500, P3D);

  //====================
  //Creating Font
  //==================== 
  
  PFont myFont = createFont("Arial", 36, false);
  textFont(myFont);


  //====================
  //Setting up cubes
  //==================== 
  
  cubes = new Object [2];

  for (int i = 0; i < cubes.length; i++)
  {
    cubes[i] = new Object(width/2, height/2, 250, 5, 20, 255, 255, 255);
  }
  cubes[0].colorG = 0;
  cubes[0].colorB = 0;
  cubes[0].sizeX = 2; 
  cubes[0].sizeY = 2;   
  cubes[1].sizeY = 19;
  

  cubes[1].colorR = random(100,255);
  cubes[1].colorG = random(100,255);
  cubes[1].colorB = random(100,255);
 
  
  //====================
  //Initialising other
  //====================  
  
  velocityY       = 0;
  velocityJumpEnd = 0;
  velocityAdd     = 0;
  gravity         = 0.00155;
  rotationTarget  = 0.5;  
  timeLastJump    = 0;
  easing          = 0.25;
  easingJump      = 0.025;
  timeJumpEnd     = 0;
  isJump          = true;
  jumpTargetX     = cubes[1].posX;
  bubbleStart     = 0;
  bubbleShow      = false;
}




void draw()
{
  update();
  render();
}



public void render()
{
  //====================
  //Basic Lightning, Background, etc.
  //====================

  background(45);
  directionalLight(255, 255, 255, 25, 20, -100);
  ambientLight(50, 50, 50);

  //====================
  //Draw Name
  //====================
  
  pushStyle();
    textAlign(CENTER);
    textSize(6);
    textLeading(6);
    fill(cubes[1].colorR, cubes[1].colorG, cubes[1].colorB, 255);
    text("<Ultra>\nBob", cubes[1].posX, cubes[1].posY-cubes[1].sizeY*2 - 14, cubes[1].posZ);
  popStyle();
  
 
  //====================
  //Draw Shadow
  //====================  

    pushStyle();
    fill(0,0,0,255);
      pushMatrix();
        noStroke();
        beginShape();
        vertex(cubes[1].posX-cubes[1].sizeX*1.2, 331, cubes[1].posZ-cubes[1].sizeX*1.8-5);
        vertex(cubes[1].posX+cubes[1].sizeX*1.2, 331, cubes[1].posZ-cubes[1].sizeX*1.8-5);
        vertex(cubes[1].posX+cubes[1].sizeX*1.2, 331, cubes[1].posZ+cubes[1].sizeX*1.8-5);
        vertex(cubes[1].posX-cubes[1].sizeX*1.2, 331, cubes[1].posZ+cubes[1].sizeX*1.8-5);
        endShape();    
      popMatrix();
    popStyle();
  
  
  //====================
  //Draw Bubble
  //====================
  
  if(bubbleShow)
  {
    pushStyle();
      pushMatrix();
        fill(0);
        beginShape();
          vertex(floor(cubes[1].posX)+10, cubes[1].posY-27+20-cubes[1].sizeY,  floor(cubes[1].posZ)-5); 
          vertex(floor(cubes[1].posX)+15, cubes[1].posY-30+20-cubes[1].sizeY, floor(cubes[1].posZ)-5);
          vertex(floor(cubes[1].posX)+15, cubes[1].posY-24+20-cubes[1].sizeY, floor(cubes[1].posZ)-5);   
        endShape();
        beginShape();
          vertex(floor(cubes[1].posX)+15, cubes[1].posY-36+20-cubes[1].sizeY, floor(cubes[1].posZ)-5); 
          vertex(floor(cubes[1].posX)+55, cubes[1].posY-36+20-cubes[1].sizeY, floor(cubes[1].posZ)-5);
          vertex(floor(cubes[1].posX)+55, cubes[1].posY-18+20-cubes[1].sizeY, floor(cubes[1].posZ)-5);
          vertex(floor(cubes[1].posX)+15, cubes[1].posY-18+20-cubes[1].sizeY, floor(cubes[1].posZ)-5);    
        endShape();
        fill(255, 255, 255);
        textAlign(CENTER);
        textSize(6);
        text("123", cubes[1].posX+35,cubes[1].posY-25+20-cubes[1].sizeY,cubes[1].posZ-4 );
      popMatrix();
    popStyle();  
  }
  
  //====================
  //Draw Cubes
  //====================
  
  for (int i = 0; i < cubes.length; i++)
  {
    pushStyle();
      noStroke();
        pushMatrix();  
        if(i == 0)
        {
          translate(cubes[i].posX,cubes[i].posY+cubes[i].sizeY,cubes[i].posZ);
            rotateX(rotationTarget);
            rotateY(rotationTarget);
          translate(-cubes[i].posX,-cubes[i].posY+cubes[i].sizeY,-cubes[i].posZ);
        }   
        fill(cubes[i].colorR, cubes[i].colorG, cubes[i].colorB);
        //TOP
        beginShape();
          vertex(cubes[i].posX-cubes[i].sizeX, cubes[i].posY-cubes[i].sizeY*2, cubes[i].posZ-cubes[i].sizeX);
          vertex(cubes[i].posX+cubes[i].sizeX, cubes[i].posY-cubes[i].sizeY*2, cubes[i].posZ-cubes[i].sizeX);
          vertex(cubes[i].posX+cubes[i].sizeX, cubes[i].posY-cubes[i].sizeY*2, cubes[i].posZ+cubes[i].sizeX);
          vertex(cubes[i].posX-cubes[i].sizeX, cubes[i].posY-cubes[i].sizeY*2, cubes[i].posZ+cubes[i].sizeX);
        endShape();
        //BOTTOM
        beginShape();
          vertex(cubes[i].posX-cubes[i].sizeX, cubes[i].posY, cubes[i].posZ-cubes[i].sizeX);
          vertex(cubes[i].posX+cubes[i].sizeX, cubes[i].posY, cubes[i].posZ-cubes[i].sizeX);
          vertex(cubes[i].posX+cubes[i].sizeX, cubes[i].posY, cubes[i].posZ+cubes[i].sizeX);
          vertex(cubes[i].posX-cubes[i].sizeX, cubes[i].posY, cubes[i].posZ+cubes[i].sizeX);
        endShape();    
        //LEFT
        beginShape();
          vertex(cubes[i].posX-cubes[i].sizeX, cubes[i].posY-cubes[i].sizeY*2, cubes[i].posZ-cubes[i].sizeX);
          vertex(cubes[i].posX-cubes[i].sizeX, cubes[i].posY-cubes[i].sizeY*2, cubes[i].posZ+cubes[i].sizeX);
          vertex(cubes[i].posX-cubes[i].sizeX, cubes[i].posY, cubes[i].posZ+cubes[i].sizeX);
          vertex(cubes[i].posX-cubes[i].sizeX, cubes[i].posY, cubes[i].posZ-cubes[i].sizeX);
        endShape();    
        //RIGHT
        beginShape();
          vertex(cubes[i].posX+cubes[i].sizeX, cubes[i].posY-cubes[i].sizeY*2, cubes[i].posZ-cubes[i].sizeX);
          vertex(cubes[i].posX+cubes[i].sizeX, cubes[i].posY-cubes[i].sizeY*2, cubes[i].posZ+cubes[i].sizeX);
          vertex(cubes[i].posX+cubes[i].sizeX, cubes[i].posY, cubes[i].posZ+cubes[i].sizeX);
          vertex(cubes[i].posX+cubes[i].sizeX, cubes[i].posY, cubes[i].posZ-cubes[i].sizeX);
        endShape();   
        //FRONT
        beginShape();
          vertex(cubes[i].posX-cubes[i].sizeX, cubes[i].posY-cubes[i].sizeY*2, cubes[i].posZ+cubes[i].sizeX);
          vertex(cubes[i].posX+cubes[i].sizeX, cubes[i].posY-cubes[i].sizeY*2, cubes[i].posZ+cubes[i].sizeX);
          vertex(cubes[i].posX+cubes[i].sizeX, cubes[i].posY, cubes[i].posZ+cubes[i].sizeX);
          vertex(cubes[i].posX-cubes[i].sizeX, cubes[i].posY, cubes[i].posZ+cubes[i].sizeX);
        endShape(); 
        //BACK
        beginShape();
          vertex(cubes[i].posX-cubes[i].sizeX, cubes[i].posY-cubes[i].sizeY*2, cubes[i].posZ-cubes[i].sizeX);
          vertex(cubes[i].posX+cubes[i].sizeX, cubes[i].posY-cubes[i].sizeY*2, cubes[i].posZ-cubes[i].sizeX);
          vertex(cubes[i].posX+cubes[i].sizeX, cubes[i].posY, cubes[i].posZ-cubes[i].sizeX);
          vertex(cubes[i].posX-cubes[i].sizeX, cubes[i].posY, cubes[i].posZ-cubes[i].sizeX);    
        endShape();
      popMatrix();
    popStyle();
  }
}




public void update()
{
  
  //====================
  //Bounding to Screen
  //==================== 
  
  rotationTarget+= 0.05;
  
  cubes[0].posX = mouseX;
  if(cubes[0].posX > 550)
  {
    cubes[0].posX = 550;
  }
  else if(cubes[0].posX < 245)
  {
    cubes[0].posX = 245;
  }
  
  cubes[0].posY = 315; 


  //====================
  //Jump Movement Left Right
  //====================
  
  jumpDistanceX  = jumpTargetX - cubes[1].posX; 
  cubes[1].posX  += jumpDistanceX * easingJump;  

  
  //====================
  //Physics and Stuff
  //====================
  int time             = millis() - timeLastJump;  
       
  if (cubes[1].posY < 330)
  {
    isJump             = true;
    cubes[1].posY      += velocityY;
    velocityY          += gravity * time;
  } 
  else
  {
    if(isJump)
    {  
      timeJumpEnd      = millis();
      velocityJumpEnd  = velocityY;
    }
    isJump             = false;
    cubes[1].posY      = 330;
    jumpTargetX        = cubes[1].posX;
    timeLastJump       = millis();
  }
  if (!isJump && velocityY > 0)
  {
    velocityY          -= (velocityJumpEnd/20);

    if (velocityY < 0)
    {
      velocityY        = 0;
    }
  }

    
  //====================
  //Bump Effect
  //====================
  
  if (!isJump && cubes[1].sizeY > 7 && velocityY > velocityJumpEnd / 3)
  {
    float targetSize   = 7;
    float dx           = targetSize - cubes[1].sizeY; 
    cubes[1].sizeY     += dx * easing;
    cubes[1].sizeX     -= dx / 3 * easing;
    
    velocityAdd        += (velocityJumpEnd/20);
    if(velocityAdd > 6.2)
    {
      velocityAdd = 6.2;
    }
    
  } 
  if (velocityY <= velocityJumpEnd / 3 && cubes[1].sizeY < cubes[1].sizeYInit )
  {
    float targetSize   = cubes[1].sizeYInit;
    float dx           = targetSize - cubes[1].sizeY; 
    cubes[1].sizeY     += dx * easing;
    cubes[1].sizeX     -= dx / 3 * easing;
    
    velocityAdd        -= (velocityJumpEnd/20);
    if(velocityAdd < 0)
    {
      velocityAdd = 0;
    }
    
    if (cubes[1].sizeY > cubes[1].sizeYInit-0.5)
    {
      cubes[1].sizeY   = cubes[1].sizeYInit;
      cubes[1].sizeX   = cubes[1].sizeXInit;
    }
  }
}


void mouseReleased()
{
  if (!isJump)
  {
    //====================
    //Jump Velocity
    //====================  
    cubes[1].posY = 329;
    //velocityY = - 2.0 - (velocityY / 4);
    velocityY = - 2.0 - velocityAdd;
    
    //====================
    //Jump Target X
    //====================
    
    jumpTargetX = cubes[0].posX;
    
    if(abs(cubes[0].posX - cubes[1].posX) > 65)
    {
      if(cubes[0].posX < cubes[1].posX)
      {
        jumpTargetX = cubes[0].posX - 65;
      }
      else
      {
        jumpTargetX = cubes[0].posX + 65;
      }      
    }
  }
}












Keine Kommentare:

Kommentar veröffentlichen