From c4fc08cc7238dfa310ed56e65a24df22c6bbb625 Mon Sep 17 00:00:00 2001 From: Tim Redfern Date: Wed, 18 Apr 2012 17:40:55 +0100 Subject: trapdoor splashes etc --- gaunt01/gaunt01.cbp | 6 +++ gaunt01/src/bird.cpp | 2 +- gaunt01/src/bird.h | 4 ++ gaunt01/src/player.cpp | 41 ++++++++++++--- gaunt01/src/player.h | 20 ++++++-- gaunt01/src/testApp.cpp | 52 +++++++++++++++++-- gaunt01/src/testApp.h | 2 + gaunt01/src/trapdoor.cpp | 108 +++++++++++++++++++++++++++++++++------- gaunt01/src/trapdoor.h | 10 +++- morpher/bin/data/Bird-anim.xml | Bin 3391 -> 2638 bytes morpher/bin/data/Bird-poses.xml | 76 ++++------------------------ 11 files changed, 218 insertions(+), 103 deletions(-) diff --git a/gaunt01/gaunt01.cbp b/gaunt01/gaunt01.cbp index c474946..88aa223 100644 --- a/gaunt01/gaunt01.cbp +++ b/gaunt01/gaunt01.cbp @@ -111,6 +111,12 @@ + + + + diff --git a/gaunt01/src/bird.cpp b/gaunt01/src/bird.cpp index d557d82..69549e0 100644 --- a/gaunt01/src/bird.cpp +++ b/gaunt01/src/bird.cpp @@ -68,7 +68,7 @@ void bird::drawShadow(){ ofRotate(90,0,0,1); ofRotate(90,-1,0,0); ofRotate(heading+90,0,1,0); - ofSetHexColor(0x000000); + ofSetHexColor(0x303030); ofTranslate(0,(-ofGetHeight()/4)+5,0); ofScale(.15,0,.15); model.drawAnimated(); diff --git a/gaunt01/src/bird.h b/gaunt01/src/bird.h index a4ad1f4..abcd66f 100644 --- a/gaunt01/src/bird.h +++ b/gaunt01/src/bird.h @@ -22,6 +22,10 @@ -build basic of time/speed/heading update/draw -basic anim cycle + + + + MAKING THE BIRD CHASE THE PLAYERS */ diff --git a/gaunt01/src/player.cpp b/gaunt01/src/player.cpp index 39c91ac..0ffdcda 100644 --- a/gaunt01/src/player.cpp +++ b/gaunt01/src/player.cpp @@ -2,7 +2,7 @@ player::player() { - //ctor + isCaught=false; } player::~player() @@ -10,12 +10,22 @@ player::~player() //dtor } -void player::setPosition(ofVec3f _pos) { - position.set(_pos); +void player::setWorldPosition(ofVec3f _pos) { + worldPosition.set(_pos); } +void player::setScreenPosition(ofVec2f _pos) { + screenPosition.set(_pos); +} + -ofVec3f player::getPosition() { - return position; +ofVec3f player::getWorldPosition() { + return worldPosition; +} +ofVec2f player::getScreenPosition() { + return screenPosition; +} +ofVec3f player::getCaughtPos(){ + return caughtPos; } void player::update(ofxCvBlob blob) { @@ -28,5 +38,24 @@ void player::update(ofxCvBlob blob) { } void player::draw(){ - billboard.draw(); + ofPushMatrix(); + if (isCaught) { + ofTranslate(caughtPos-screenPosition); + ofTranslate(catchPos); + ofTranslate(screenPosition); + ofScale(catchScale.x,catchScale.y,catchScale.z); + ofTranslate(-screenPosition); + } + billboard.draw(); + ofPopMatrix(); +} + +void player::caught(){ + isCaught=true; + caughtPos=screenPosition; +} + +void player::setCatchTransform(ofVec3f _catchPos,ofVec3f _catchScale){ + catchPos=_catchPos; + catchScale=_catchScale; } \ No newline at end of file diff --git a/gaunt01/src/player.h b/gaunt01/src/player.h index e89c5b8..9167237 100644 --- a/gaunt01/src/player.h +++ b/gaunt01/src/player.h @@ -9,16 +9,28 @@ class player : public ofTessellator public: player(); virtual ~player(); - void setPosition(ofVec3f _pos); - ofVec3f getPosition(); + void setScreenPosition(ofVec2f _pos); + void setWorldPosition(ofVec3f _pos); + ofVec3f getWorldPosition(); + ofVec2f getScreenPosition(); + ofVec3f getCaughtPos(); void update(ofxCvBlob blob); void draw(); + void caught(); + bool isCaught; + void carried(ofVec3f _posOffset); + void setCatchTransform(ofVec3f _catchPos,ofVec3f _catchScale); protected: private: ofMesh billboard; ofPolyline outline; - ofVec3f position; - + ofVec3f worldPosition; + ofVec2f screenPosition; + ofVec2f caughtPos; + ofVec3f catchPos; + ofVec3f catchScale; + ofVec2f posOffset; + }; #endif // PLAYER_H diff --git a/gaunt01/src/testApp.cpp b/gaunt01/src/testApp.cpp index 5f531a6..9e2a574 100644 --- a/gaunt01/src/testApp.cpp +++ b/gaunt01/src/testApp.cpp @@ -91,6 +91,9 @@ void testApp::setup(){ bgnum=1000; firstframe=true; + + light.setPosition(ofGetWidth(),0,ofGetHeight()); + light.enable(); } @@ -254,11 +257,13 @@ void testApp::update(){ ray=projector.castPixel(blobBase.x,blobBase.y); bool hit = plane.intersect(ray,pp); rp=pp.getRotated(cam_angle,ofVec3f(-1,0,0)); - players[blobsManager.blobs.at(i).id].setPosition(rp); + players[blobsManager.blobs.at(i).id].setScreenPosition(blobBase); + players[blobsManager.blobs.at(i).id].setWorldPosition(ofVec3f(rp.x,rp.y,0)); players[blobsManager.blobs.at(i).id].update(blob); //create model } } if (trapDoor.checkUpdate(players)) updatePlane(); + Bird.update(players); } //-------------------------------------------------------------- @@ -280,13 +285,22 @@ void testApp::draw(){ bindTexture(bgImg); ground.draw(); unbindTexture(bgImg); - - Bird.update(players); ofPushMatrix(); ofRotate(cam_angle,1,0,0); Bird.drawShadow(); ofPopMatrix(); + + glDisable(GL_DEPTH_TEST); + ofSetHexColor(0xffffff); + ofPushMatrix(); + ofRotate(cam_angle,1,0,0); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + trapDoor.drawSplash(cam_angle); + //trapDoor.splashFrames[0].draw(ofGetWidth()/2,ofGetHeight()/2); + glDisable(GL_BLEND); + ofPopMatrix(); glDisable(GL_DEPTH_TEST); ofSetHexColor(0xffffff); @@ -324,12 +338,14 @@ void testApp::draw(){ - + glEnable(GL_LIGHTING); ofPushMatrix(); ofRotate(cam_angle,1,0,0); Bird.draw(); ofPopMatrix(); + + glDisable(GL_LIGHTING); break; @@ -364,6 +380,7 @@ void testApp::draw(){ ofPushMatrix(); ofRotate(cam_angle,1,0,0); trapDoor.draw(); + trapDoor.drawDebug(); ofPopMatrix(); @@ -378,7 +395,7 @@ void testApp::draw(){ ofDrawBitmapString(numStr, blob.boundingRect.x, blob.boundingRect.y); ofPushMatrix(); ofRotate(cam_angle,1,0,0); - ofTranslate(players[blobsManager.blobs.at(i).id].getPosition()); + ofTranslate(players[blobsManager.blobs.at(i).id].getWorldPosition()); ofBox(0,-10,0,20); //TODO get this into plane axis ofPopMatrix(); @@ -480,6 +497,31 @@ void testApp::keyPressed(int key){ Bird.currentseq="attack"; } break; + + case 'y': + light.setPosition(light.getX(),light.getY()-100,light.getZ()); + printf("light at %f,%f,%f\n",light.getX(),light.getY(),light.getZ()); + break; + case 'n': + light.setPosition(light.getX(),light.getY()+100,light.getZ()); + printf("light at %f,%f,%f\n",light.getX(),light.getY(),light.getZ()); + break; + case 'g': + light.setPosition(light.getX()-100,light.getY(),light.getZ()); + printf("light at %f,%f,%f\n",light.getX(),light.getY(),light.getZ()); + break; + case 'j': + light.setPosition(light.getX()+100,light.getY(),light.getZ()); + printf("light at %f,%f,%f\n",light.getX(),light.getY(),light.getZ()); + break; + case 'u': + light.setPosition(light.getX(),light.getY(),light.getZ()+100); + printf("light at %f,%f,%f\n",light.getX(),light.getY(),light.getZ()); + break; + case 'b': + light.setPosition(light.getX(),light.getY(),light.getZ()-100); + printf("light at %f,%f,%f\n",light.getX(),light.getY(),light.getZ()); + break; } } diff --git a/gaunt01/src/testApp.h b/gaunt01/src/testApp.h index 7ef1e3a..f2a35c0 100644 --- a/gaunt01/src/testApp.h +++ b/gaunt01/src/testApp.h @@ -91,6 +91,8 @@ class testApp : public ofBaseApp{ bool firstframe; //for background removal float bgnum; + + ofLight light; }; diff --git a/gaunt01/src/trapdoor.cpp b/gaunt01/src/trapdoor.cpp index 29b6147..46151c1 100644 --- a/gaunt01/src/trapdoor.cpp +++ b/gaunt01/src/trapdoor.cpp @@ -13,11 +13,21 @@ trapdoor::trapdoor(ofVec2f _boundTR,ofVec2f _boundBR,ofVec2f _doorSize) 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(); + size=_doorSize; + start(); } trapdoor::~trapdoor() { @@ -37,7 +47,10 @@ void trapdoor::start(){ } 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; @@ -63,7 +76,8 @@ 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(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(); @@ -79,11 +93,30 @@ ofVec2f trapdoor::bounds2UV(ofVec2f point){ } float trapdoor::getFalldist(){ - if (triggerTime>0) return ((ofGetElapsedTimef()-triggeredTime)*.01); + if (triggeredTime>0) return ((ofGetElapsedTimef()-triggeredTime)*.01); else return 0; } -bool trapdoor::checkUpdate(const map& players) { +bool trapdoor::checkUpdate(map& players) { + map::iterator it; + for (it=players.begin();it!=players.end();it++) { + 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; @@ -102,30 +135,67 @@ bool trapdoor::checkUpdate(const map& players) { 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(); + ofSetHexColor(0x0000ff); + glBegin(GL_LINES); + for (int i=0;igetCaughtPos().x,caught[i]->getCaughtPos().y,0); + glVertex3f(caught[i]->getScreenPosition().x,caught[i]->getScreenPosition().y,0); + } + glEnd(); +} + void trapdoor::draw() { glEnable(GL_DEPTH_TEST); ofSetHexColor(0xffffff); bindTexture(texture); ofPushMatrix(); - //ofRotate(90,-1,0,0); ofTranslate(ofVec3f(position.x,position.y,0)); - //ofRotate(180,-1,0,0); - //for now size =40x40 - 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(); + 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(); + } + } + +} \ No newline at end of file diff --git a/gaunt01/src/trapdoor.h b/gaunt01/src/trapdoor.h index d307c2d..6f8b509 100644 --- a/gaunt01/src/trapdoor.h +++ b/gaunt01/src/trapdoor.h @@ -21,8 +21,10 @@ class trapdoor trapdoor(ofVec2f _boundTR=ofVec2f(0,0),ofVec2f _boundBR=ofVec2f(0,0),ofVec2f _doorSize=ofVec2f(10,10)); virtual ~trapdoor(); - bool checkUpdate(const map& players); + bool checkUpdate(map& players); void draw(); + void drawSplash(float angle); + void drawDebug(); void start(); void startPos(ofVec2f pos); @@ -36,7 +38,8 @@ class trapdoor float getoffset(); float getFalldist(); - + + ofImage* splashFrames; //temp public protected: private: morphmesh surround; @@ -59,10 +62,13 @@ class trapdoor ofImage texture; ofSoundPlayer* sounds; + bool opening; float triggeredTime; + vector caught; + vector caughtTime; }; diff --git a/morpher/bin/data/Bird-anim.xml b/morpher/bin/data/Bird-anim.xml index 64d9af5..3c7e0b3 100644 Binary files a/morpher/bin/data/Bird-anim.xml and b/morpher/bin/data/Bird-anim.xml differ diff --git a/morpher/bin/data/Bird-poses.xml b/morpher/bin/data/Bird-poses.xml index 799362d..a4adb92 100644 --- a/morpher/bin/data/Bird-poses.xml +++ b/morpher/bin/data/Bird-poses.xml @@ -6,35 +6,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -48,7 +20,7 @@ - + @@ -62,20 +34,6 @@ - - - - - - - - - - - - - - @@ -132,48 +90,34 @@ - - + + - - + + - - + + - - + + - - - - - - - - - - - - - - -- cgit v1.2.3