////////////////////////////////////////// class SceneTargets extends Scene { SceneTargets() { super(); m_iNumTargets = 30; m_aTargets = new Target[m_iNumTargets]; for (int i = 0; i < m_iNumTargets; i++) { m_aTargets[i] = new Target(); } m_iTargetHead = 0; } void Draw() { super.Draw(); viewManager.SetViewType(3); camera(0, 0, 500, 0, 0, 0, 0, 1, 0); noStroke(); for (int i = (m_iTargetHead + 1) % m_iNumTargets; i != m_iTargetHead; i = (i + 1) % m_iNumTargets) { m_aTargets[i].Draw(); } } void SpawnTarget() { if (m_aTargets[m_iTargetHead].m_bActive == false) { m_aTargets[m_iTargetHead].Spawn(); m_iTargetHead = (m_iTargetHead + 1) % m_iNumTargets; } } void FastKick() { super.FastKick(); SpawnTarget(); } int m_iNumTargets; Target[] m_aTargets; int m_iTargetHead; } ////////////////////////////////////////// class Target { Target() { m_bActive = false; } void Spawn() { m_bActive = true; m_iLife = 100; m_fX = random(-width/2, width/2); m_fY = random(-height/2, height/2); m_bDripActive = false; m_iDripTimer = (int)random(10, 200); m_fDripX = random(-60, 60); m_fDripVelocity = random(5.0f, 20.0f); m_fDripHeight = 0.0f; m_iNumSplats = (int)random(0, 30); m_avecSplats = new PVector[m_iNumSplats]; float fX = 0; float fY = 0; for (int i = 0; i < m_iNumSplats; i++) { if (i == 0 || (int)random(2) == 0) { fX = random(-100,100); fY = random(-100,100); } else { fX += random(-10,10); fY += random(-10,10); } m_avecSplats[i] = new PVector(fX, fY, random(10)); } } void Draw() { if (m_bActive == true) { pushMatrix(); float fColourAlpha = 1 - ((float)m_iLife / 100.0); translate(m_fX,m_fY,-100*fColourAlpha); if (m_bDripActive) { m_fDripHeight += m_fDripVelocity; m_fDripVelocity = max(0, m_fDripVelocity * 0.9); strokeWeight(10); stroke(lerp(140,iBackgroundR,fColourAlpha),lerp(150,iBackgroundG,fColourAlpha),lerp(20,iBackgroundB,fColourAlpha)); line(m_fDripX, 0, m_fDripX, -m_fDripHeight); noStroke(); fill(lerp(140,iBackgroundR,fColourAlpha),lerp(150,iBackgroundG,fColourAlpha),lerp(20,iBackgroundB,fColourAlpha)); ellipse(m_fDripX, -m_fDripHeight, 12, 12); } else { m_iDripTimer--; if (m_iDripTimer == 0) { m_bDripActive = true; } } fill(lerp(140,iBackgroundR,fColourAlpha),lerp(150,iBackgroundG,fColourAlpha),lerp(20,iBackgroundB,fColourAlpha)); for (int i = 0; i < m_iNumSplats; i++) { ellipse(m_avecSplats[i].x, m_avecSplats[i].y, m_avecSplats[i].z, m_avecSplats[i].z); } boolean bHighlight = false; for (int i = 30 * 5; i >= 30; i-=30) { if (bHighlight == true) { fill(lerp(30,iBackgroundR,fColourAlpha),lerp(45,iBackgroundG,fColourAlpha),lerp(100,iBackgroundB,fColourAlpha)); } else { fill(lerp(140,iBackgroundR,fColourAlpha),lerp(150,iBackgroundG,fColourAlpha),lerp(20,iBackgroundB,fColourAlpha)); } bHighlight = !bHighlight; ellipse(0, 0, i, i); } m_iLife--; if (m_iLife == 0) { m_bActive = false; } popMatrix(); } } boolean m_bActive; int m_iLife; float m_fX, m_fY; boolean m_bDripActive; int m_iDripTimer; float m_fDripX; float m_fDripVelocity; float m_fDripHeight; int m_iNumSplats; PVector[] m_avecSplats; }