#include "trapdoor.h" trapdoor::trapdoor(ofVec2f _boundTR,ofVec2f _boundBR,ofVec2f _doorSize) { surround=morphmesh("trapdoor-surround.xml"); lid=morphmesh("trapdoor-lid.xml"); if (!surround.isLoaded()||!lid.isLoaded()) printf("problem loading trap door mesh.\n"); texture.loadImage("TextureTrapdoor.jpg"); sounds=new ofSoundPlayer[4]; sounds[0].loadSound("creeky door short1.wav"); sounds[1].loadSound("creeky door short2.wav"); sounds[2].loadSound("creeky door short3.wav"); sounds[3].loadSound("voice falling down hole.wav"); splashFrames=new ofImage[3]; splashFrames[0].loadImage("Drops_1.tga"); splashFrames[1].loadImage("Drops_2.tga"); splashFrames[2].loadImage("Drops_3.tga"); for (int i=0;i<3;i++) { splashFrames[i].setAnchorPercent(0.5,0.5); } boundTR=_boundTR; boundBR=_boundBR; size=_doorSize; start(); } trapdoor::~trapdoor() { } void trapdoor::start(){ //place trapdoor within bounds float u=ofRandom(-0.9,0.9); //(-1 to 1) float v=ofRandom(0.05,0.95); float mx=ofGetWidth()/2; float x=mx+((boundTR.x-mx)*u*(1-v))+((boundBR.x-mx)*u*v); float y=boundTR.y+((boundBR.y-boundTR.y)*v); startPos(ofVec2f(x,y)); } void trapdoor::startPos(ofVec2f pos){ caught.clear(); caughtTime.clear(); position=pos; setBoundingRect(pos.x, pos.y,size.x,size.y); startTime=ofGetElapsedTimef(); doorAngle=0; doorSpeed=0; opening=false; triggeredTime=-1; //for (int i=0;i<4;i++) sounds[i].stop(); } vector trapdoor::getCorners(){ vector corners; corners.push_back(ofVec2f(position.x-(size.x/2),position.y-(size.y/2))); corners.push_back(ofVec2f(position.x+(size.x/2),position.y-(size.y/2))); corners.push_back(ofVec2f(position.x+(size.x/2),position.y+(size.y/2))); corners.push_back(ofVec2f(position.x-(size.x/2),position.y+(size.y/2))); return corners; } void trapdoor::setBoundingRect(float x,float y, float width,float height){ boundingRect=ofRectangle(x,y,width,height); } ofRectangle trapdoor::getBoundingRect(){ return boundingRect; } ofRectangle trapdoor::getInnerRect() { //return ofRectangle(boundingRect.x-(boundingRect.width/4),boundingRect.y-(boundingRect.height/4),boundingRect.width/2,boundingRect.height/2); return ofRectangle(position.x-(size.x/3),position.y-(size.y/3),(2*size.x)/3,(2*size.y)/3); } void trapdoor::trigger() { triggeredTime=ofGetElapsedTimef(); startTime=ofGetElapsedTimef()-10; } ofVec2f trapdoor::bounds2UV(ofVec2f point){ //returns the 0-1 UV coords of a point on the ground plane relative to its bounds. float v=(point.y-boundTR.y)/(boundBR.y-boundTR.y); float mx=ofGetWidth()/2; float u=((point.x-mx)/(((boundTR.x-mx)*(1-v))+((boundBR.x-mx)*v)))+0.5; return ofVec2f(u,v); } float trapdoor::getFalldist(){ if (triggeredTime>0) return ((ofGetElapsedTimef()-triggeredTime)*.01); else return 0; } bool trapdoor::checkUpdate(map& players) { map::iterator it; for (it=players.begin();it!=players.end();it++) { if (it->second.active) { ofVec3f p=it->second.getWorldPosition(); ofRectangle r=getInnerRect(); if (getInnerRect().inside(p.x,p.y)&&!it->second.isCaught) { trigger(); it->second.caught(); printf("caught!\n"); caught.push_back(&(it->second)); caughtTime.push_back(ofGetElapsedTimef()); sounds[3].play(); //falling down hole } } } for (int i=0;isetCatchTransform(ofVec3f(0,0,0),ofVec3f(sc,sc,sc)); } float segTime=(ofGetElapsedTimef()-startTime); if (segTime>10) { doorSpeed=(doorSpeed+((cos(doorAngle*0.0174532925)/ofGetFrameRate())*50))*0.95; doorAngle-=doorSpeed; if (!opening) { int whichsound=(int)ofRandom(2.9999999); sounds[whichsound].play(); //sound.play(); opening=true; } } if (segTime>13) { start(); return true; } else return false; } void trapdoor::drawDebug() { ofSetHexColor(0xff0000); glBegin(GL_LINES); glVertex3f(getInnerRect().x,getInnerRect().y,0); glVertex3f(getInnerRect().x+(getInnerRect().width),getInnerRect().y,0); glVertex3f(getInnerRect().x+(getInnerRect().width),getInnerRect().y,0); glVertex3f(getInnerRect().x+(getInnerRect().width),getInnerRect().y+(getInnerRect().height),0); glVertex3f(getInnerRect().x+(getInnerRect().width),getInnerRect().y+(getInnerRect().height),0); glVertex3f(getInnerRect().x,getInnerRect().y+(getInnerRect().height),0); glVertex3f(getInnerRect().x,getInnerRect().y+(getInnerRect().height),0); glVertex3f(getInnerRect().x,getInnerRect().y,0); glEnd(); } void trapdoor::draw() { glEnable(GL_DEPTH_TEST); ofSetHexColor(0xffffff); bindTexture(texture); ofPushMatrix(); ofTranslate(ofVec3f(position.x,position.y,0)); ofPushMatrix(); ofRotate(90,-1,0,0); ofScale(.15,.15,.15); surround.draw(); ofPushMatrix(); ofTranslate(90,0,0); ofRotate(doorAngle,0,0,-1); lid.draw(); ofPopMatrix(); ofPushMatrix(); ofTranslate(-90,0,0); ofRotate(180,0,1,0); ofRotate(doorAngle,0,0,-1); lid.draw(); ofPopMatrix(); ofPopMatrix(); ofPopMatrix(); unbindTexture(texture); glDisable(GL_DEPTH_TEST); } void trapdoor::drawSplash(float angle) { for (int i=0;i0.3) { ofPushMatrix(); ofTranslate(ofVec3f(position.x,position.y,0)); ofRotate(angle,-1,0,0); ofScale(0.3,0.3,0.3); if (splashTime<0.5) splashFrames[0].draw(0,0,0); else if (splashTime<0.7) splashFrames[1].draw(0,0,0); else if (splashTime<0.9) splashFrames[2].draw(0,0,0); ofPopMatrix(); } } }