1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
#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");
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){
position=pos;
startTime=ofGetElapsedTimef();
doorAngle=0;
doorSpeed=0;
opening=false;
//for (int i=0;i<4;i++) sounds[i].stop();
}
vector<ofVec2f> trapdoor::getCorners(){
vector<ofVec2f> 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;
}
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);
}
bool trapdoor::checkUpdate(const vector<ofVec3f>& players) {
float segTime=(ofGetElapsedTimef()-startTime);
if (segTime>3) {
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>6) {
start();
return true;
}
else return false;
}
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();
ofPopMatrix();
ofPopMatrix();
unbindTexture(texture);
glDisable(GL_DEPTH_TEST);
}
|