From 0bb92ced351b7fbba6e2e7036eae92037d08facf Mon Sep 17 00:00:00 2001 From: Comment Date: Sat, 8 Dec 2012 00:38:32 +0000 Subject: working on game logic --- vfg/src/Asterisk.cpp | 30 ++++++++------- vfg/src/Asterisk.h | 11 +++--- vfg/src/Puppet.h | 5 ++- vfg/src/music.cpp | 17 +++++++-- vfg/src/music.h | 2 + vfg/src/testApp.cpp | 104 ++++++++++++++++++++++++++------------------------- vfg/src/testApp.h | 5 ++- 7 files changed, 97 insertions(+), 77 deletions(-) (limited to 'vfg') diff --git a/vfg/src/Asterisk.cpp b/vfg/src/Asterisk.cpp index b78678e..98ffd9d 100755 --- a/vfg/src/Asterisk.cpp +++ b/vfg/src/Asterisk.cpp @@ -62,27 +62,25 @@ void Asterisk::setup(string passcode,int millis){ udpConnection.Bind(5000); udpConnection.SetNonBlocking(true); cmd("ssh 80.93.22.22 'sudo /usr/sbin/asterisk -rx \"database put GAME passcode "+passcode+"\"'"); - state=WAITING; //for acknowledge - isPlaying=false; + state=ASTERISK_WAITING; //for acknowledge statusPollMillis=millis; if (statusPollMillis>0) startThread(true, false); // blocking, verbose } void Asterisk::startGame(){ - if (!isPlaying&&queued) { + if (state==ASTERISK_IDLE&&queued) { cmd("ssh 80.93.22.22 'sudo /usr/sbin/asterisk -rx \"devstate change Custom:GAME NOT_INUSE\"'"); printf("Asterisk: attempting to dequeue\n"); - state=WAITING; + state=ASTERISK_WAITING; } } void Asterisk::endGame(string score){ printf("Asterisk: request hangup %s\n",playerCode.c_str()); - if (isPlaying) { + if (state==ASTERISK_PLAYING) { cmd("ssh 80.93.22.22 'sudo /usr/sbin/asterisk -rx \"database put GAME statuscode "+score+"\"'"); string emsg="ssh 80.93.22.22 'sudo /usr/sbin/asterisk -rx \"hangup request "+playerCode+"\"'"; cmd(emsg); printf("Asterisk: hanging up %s\n",playerCode.c_str()); - state=WAITING; - isPlaying=false; + state=ASTERISK_IDLE; } } void Asterisk::cmd(string s) { @@ -95,7 +93,7 @@ void Asterisk::cmd(string s) { int Asterisk::update(){ //capture stdin response from popen - if (state==WAITING||state==STARTING) { + if (state==ASTERISK_WAITING||state==ASTERISK_STARTING) { char buf[100]; ssize_t r = read(filenum, buf, 1000); //if (r == -1 && errno == EAGAIN) @@ -104,13 +102,12 @@ int Asterisk::update(){ if (r > 0) { pclose(file); string msg=string(buf); - state=IDLE; + state=ASTERISK_IDLE; //received data is always a command ACKNOWLEDGEMENT //can never issue a new one until last one returns? if (msg.compare(0,8,"Changing")==0) { printf("player dequeued\n"); - state==PLAYING; - isPlaying=true; + state=ASTERISK_STARTING; } else { printf("stdin says: %s\n",buf); @@ -127,15 +124,20 @@ int Asterisk::update(){ //printf("Asterisk: %s\n",msg.c_str()); if (msg.length()>3) { //printf("status msg: %s\n",msg.c_str()); - if (msg.substr(0,5)=="Local") { - state=PLAYING; + if (msg.substr(0,6)=="Hangup") { + state=ASTERISK_IDLE; + return ASTERISK_GAMEOVER; + } + if (msg.substr(0,5)=="Local"&&state==ASTERISK_STARTING) { + state=ASTERISK_PLAYING; playerCode=msg.substr(0,msg.length()-1); printf("Asterisk: game started: code %s\n",playerCode.c_str()); - return 1000; + return ASTERISK_GAMESTARTED; } return 0; } else { + //message length of <3 is a key return ofToInt(msg); } } diff --git a/vfg/src/Asterisk.h b/vfg/src/Asterisk.h index 5033a5c..8093213 100755 --- a/vfg/src/Asterisk.h +++ b/vfg/src/Asterisk.h @@ -4,10 +4,12 @@ #include "ofMain.h" #include "ofxNetwork.h" -#define IDLE 0 -#define WAITING 1 -#define STARTING 2 -#define PLAYING 3 +#define ASTERISK_IDLE 0 +#define ASTERISK_WAITING 1 +#define ASTERISK_STARTING 2 +#define ASTERISK_PLAYING 3 +#define ASTERISK_GAMESTARTED 1000 +#define ASTERISK_GAMEOVER 1001 class Asterisk: public ofThread @@ -31,7 +33,6 @@ class Asterisk: public ofThread void endGame(string score); int update(); int state; - bool isPlaying; int queued; protected: diff --git a/vfg/src/Puppet.h b/vfg/src/Puppet.h index 4bebb45..1f6d90a 100755 --- a/vfg/src/Puppet.h +++ b/vfg/src/Puppet.h @@ -8,7 +8,10 @@ /* "base" clip will be drawn unless another clip is playing -TODO: make resolution independent +hoe to create synced anim at time +1) dead reckoning from outside +2) special clip@time method +3) change to timed clips (option?) */ class puppetSprite: public ofxSprite { diff --git a/vfg/src/music.cpp b/vfg/src/music.cpp index a2e7020..c920a02 100755 --- a/vfg/src/music.cpp +++ b/vfg/src/music.cpp @@ -301,6 +301,7 @@ void song::preRoll(long preroll) { notes.start(startTime); isPreroll=true; isPlaying=true; + gameover=false; } void song::drawNotes(float hOffs){ notes.drawNotes(hOffs,&levels); @@ -315,8 +316,11 @@ string song::getName(){ int song::getLength(){ return levels.length; } -bool song::isFinished(){ - return (getCurrentTime()>=getLength()); +bool song::isGameover(){ + return gameover; +} +bool song::isFinished(){ + return (ofGetElapsedTimeMillis()-startTime>=levels.length); } void song::draw(float hOffs,float scale){ int songTime=ofGetElapsedTimeMillis()-startTime; @@ -334,7 +338,8 @@ void song::draw(float hOffs,float scale){ if (levels.getLives(songTime)) { if (notes.missedFlakes>levels.getLives(songTime)) { //work out score - stop(); + //stop(); + gameover=true; } } } @@ -342,9 +347,13 @@ void song::draw(float hOffs,float scale){ if (!isPractice) lyrics.draw(hOffs); if (songTime>levels.length) { printf("stopping: %i (%i)\n",songTime,levels.length); - stop(); + //stop(); + gameover=true; } } + else { + //fade out song + melody :: clean up + } } void song::playerControl(int key){ notes.playerControl(key); diff --git a/vfg/src/music.h b/vfg/src/music.h index 1aa956a..60a35f2 100755 --- a/vfg/src/music.h +++ b/vfg/src/music.h @@ -210,7 +210,9 @@ class song { string getScoreString(); string getName(); int getLength(); + bool isGameover(); bool isFinished(); + bool gameover; musicscore notes; private: diff --git a/vfg/src/testApp.cpp b/vfg/src/testApp.cpp index 0e8d31e..8c701b2 100755 --- a/vfg/src/testApp.cpp +++ b/vfg/src/testApp.cpp @@ -178,9 +178,12 @@ void testApp::exit(){ //-------------------------------------------------------------- void testApp::update(){ int ret=game.update(); - if (ret==1000) { + if (ret==ASTERISK_GAMESTARTED) { activatePractice(); } + else if (ret==ASTERISK_GAMEOVER) { + endGame(); + } else if (ret>48&&ret<52) { songs[currentsong]->playerControl(ret-49); practiceSong.playerControl(ret-49); @@ -257,7 +260,7 @@ void testApp::draw(){ float scale=ofGetHeight()/1080.0f; float bannerscale,aspect,wOffs,seg; //this old chestnut float segamt=((float)(ofGetElapsedTimeMillis()-segmentStartTime)*2.0f)/fadelength; //same variable used in all segments - + int hit,missed; switch(gamestate) { case GAME_STARTINGINTRO: case GAME_INTRO: @@ -352,54 +355,53 @@ void testApp::draw(){ } else break; case GAME_READY: + ofEnableAlphaBlending(); for (int i=0;i<3;i++) { //break up standing around movement if (ofRandom(1.0)<.002) (*playanimal)[i].play("Shuffle"); + (*playanimal)[i].draw(hOffs+(gridX[i+1]*ofGetHeight()),gridY[0]*ofGetHeight(),scale); } - case GAME_PLAYING: + break; case GAME_PRACTICE: ofEnableAlphaBlending(); - if (songs[currentsong]->isPlaying) { - ofSetColor(255,255,255); - if (showVis) songs[currentsong]->drawNotes(hOffs); - int missed=songs[currentsong]->missedNote(); - if (missed>-1) (*playanimal)[missed].playNow("Shudder"); - int hit=songs[currentsong]->hitNote(); - if (hit>-1) (*playanimal)[hit].play("Catch"); - } - else if (gamestate==GAME_PRACTICE) { - int missed=practiceSong.missedNote(); - if (missed>-1) (*playanimal)[missed].playNow("Shudder"); - int hit=practiceSong.hitNote(); - if (hit>-1) (*playanimal)[hit].play("Catch"); - - } + missed=practiceSong.missedNote(); + if (missed>-1) (*playanimal)[missed].playNow("Shudder"); + hit=practiceSong.hitNote(); + if (hit>-1) (*playanimal)[hit].play("Catch"); for (int i=0;i<3;i++) (*playanimal)[i].draw(hOffs+(gridX[i+1]*ofGetHeight()),gridY[0]*ofGetHeight(),scale); - if (songs[currentsong]->isPlaying) { - lyricspanel->draw(ofGetWidth()*0.5,ofGetHeight()*gridY[1],scale); - songs[currentsong]->draw(hOffs,scale); - } - else if (gamestate==GAME_PRACTICE) { - practiceSong.draw(hOffs,scale); - } + practiceSong.draw(hOffs,scale); break; - case GAME_ENDPLAYING: - //6 seconds to walk in / out -> 12 seconds turnaround - //frames to start/cycle/stop walking - //penguin: 11,35,11 - //raccoon: 20,39,43r - ofEnableAlphaBlending(); - seg=((float)(ofGetElapsedTimeMillis()-segmentStartTime))*.001; - wOffs=hOffs+(0.7*ofGetWidth()*seg); - for (int i=0;i<3;i++) (*playanimal)[i].draw(wOffs+(gridX[i+1]*ofGetHeight()),gridY[0]*ofGetHeight(),scale); - break; - case GAME_WALKON: - ofEnableAlphaBlending(); - seg=((float)(ofGetElapsedTimeMillis()-segmentStartTime))*.001; - wOffs=hOffs+(0.7*ofGetWidth()*(1.0f-seg)); - for (int i=0;i<3;i++) (*playanimal)[i].draw(wOffs+(gridX[i+1]*ofGetHeight()),gridY[0]*ofGetHeight(),scale); - break; + case GAME_PLAYING: + ofEnableAlphaBlending(); + if (showVis) songs[currentsong]->drawNotes(hOffs); + missed=songs[currentsong]->missedNote(); + if (missed>-1) (*playanimal)[missed].playNow("Shudder"); + hit=songs[currentsong]->hitNote(); + if (hit>-1) (*playanimal)[hit].play("Catch"); + for (int i=0;i<3;i++) (*playanimal)[i].draw(hOffs+(gridX[i+1]*ofGetHeight()),gridY[0]*ofGetHeight(),scale); + lyricspanel->draw(ofGetWidth()*0.5,ofGetHeight()*gridY[1],scale); + songs[currentsong]->draw(hOffs,scale); + break; + case GAME_ENDPLAYING: + //6 seconds to walk in / out -> 12 seconds turnaround + //frames to start/cycle/stop walking + //penguin: 11,35,11 + //raccoon: 20,39,43r + ofEnableAlphaBlending(); + seg=((float)(ofGetElapsedTimeMillis()-segmentStartTime))*.001; + wOffs=hOffs+(0.7*ofGetWidth()*seg); + for (int i=0;i<3;i++) (*playanimal)[i].draw(wOffs+(gridX[i+1]*ofGetHeight()),gridY[0]*ofGetHeight(),scale); + songs[currentsong]->draw(hOffs,scale);//allows the song to fade its volume out and stop playing + break; + case GAME_WALKON: + ofEnableAlphaBlending(); + seg=((float)(ofGetElapsedTimeMillis()-segmentStartTime))*.001; + wOffs=hOffs+(0.7*ofGetWidth()*(1.0f-seg)); + for (int i=0;i<3;i++) (*playanimal)[i].draw(wOffs+(gridX[i+1]*ofGetHeight()),gridY[0]*ofGetHeight(),scale); + break; } + + //draw tags and logos switch(gamestate) { case GAME_STARTINGADVERT: @@ -494,7 +496,7 @@ void testApp::draw(){ break; case GAME_PLAYING: backgroundmusic.setVolume(max(0.0,1.0-(segamt*2.0))); - if (!songs[currentsong]->isPlaying) { + if (songs[currentsong]->isGameover()) { endGame(); } break; @@ -562,15 +564,15 @@ void testApp::endGame(){ printf("score: %s\n",score.c_str()); game.endGame(score); gamestate=GAME_ENDPLAYING; - tags[6]->play(); - segmentStartTime=ofGetElapsedTimeMillis(); - //6 seconds to walk in / out -> 12 seconds turnaround - //frames to start/cycle/stop walking - //penguin: 11,35,11 - //raccoon: 20,39,43 - //penguins: start + 289 = 8.25 - //raccoons: start + 280 = 7.17 - for (int i=0;i<3;i++) { + tags[6]->play(); + segmentStartTime=ofGetElapsedTimeMillis(); + //6 seconds to walk in / out -> 12 seconds turnaround + //frames to start/cycle/stop walking + //penguin: 11,35,11 + //raccoon: 20,39,43 + //penguins: start + 289 = 8.25 + //raccoons: start + 280 = 7.17 + for (int i=0;i<3;i++) { (*playanimal)[i].play("Walk_start"); for (int j=0;j<9;j++) (*playanimal)[i].play("Walking"); } diff --git a/vfg/src/testApp.h b/vfg/src/testApp.h index 0cc0942..4b369bf 100755 --- a/vfg/src/testApp.h +++ b/vfg/src/testApp.h @@ -144,7 +144,7 @@ public: void draw(); void dragEvent(ofDragInfo dragInfo,ofxFenster* win); void windowMoved(int x, int y); - string levelnames[11]={ + string levelnames[12]={ "STARTINGINTRO", "INTRO", "ENDINGINTRO", @@ -155,7 +155,8 @@ public: "STARTPLAYING", "PRACTICE", "PLAYING", - "ENDPLAYING" + "ENDPLAYING", + "WALKON" }; }; -- cgit v1.2.3