diff options
Diffstat (limited to 'src/master/intro.cpp')
-rw-r--r-- | src/master/intro.cpp | 202 |
1 files changed, 202 insertions, 0 deletions
diff --git a/src/master/intro.cpp b/src/master/intro.cpp new file mode 100644 index 0000000..f8cf46b --- /dev/null +++ b/src/master/intro.cpp @@ -0,0 +1,202 @@ +#include "master.hpp" +#include "resources.hpp" +#include <cmath> +#include <cstdlib> +#include <ctime> +#include "../ui/menus.hpp" +#define XOFFSET 75 +#define YOFFSET 100 + +extern sceneManager *sceneMgr; +SMELT *introScene::sm=0; +bool introScene::sceneUpdate() +{ + bool done=bcnt>400; + for(int i=0;i<bcnt;++i) + { + pos[i]=pos[i]+vel[i]; + vel[i]=vel[i]+acc[i]; + if(pos[i].x>-40&&pos[i].x<1000&&pos[i].y>-40&&pos[i].y<800)done=false; + if(scale[i]>0.7)scale[i]-=0.1;else scale[i]=0.6; + } + if(done) + { + mainMenuScn=new mainMenuScene; + sceneMgr->activateScene("MainMenu"); + delete this; + } + delay+=sm->smGetDelta(); + if(delay<0.016)return false; + delay=0; + for(int cc=0;cc<3;++cc) + { + ++step; + if(ch==0)//C + { + float angle=(60-step)/45.*PI+PI/3.; + pos[bcnt]=smvec2d(100+XOFFSET+80*cos(angle),200+YOFFSET+80*sin(angle)); + vel[bcnt]=smvec2d(0,0);acc[bcnt]=smvec2d(0,0);scale[bcnt]=1.5;++bcnt; + if(step>=60){++ch;step=0;} + } + if(ch==1)//h + { + if(step<=40) + { + pos[bcnt]=smvec2d(180+XOFFSET,120+YOFFSET+step*4); + vel[bcnt]=smvec2d(0,0);acc[bcnt]=smvec2d(0,0);scale[bcnt]=1.5;++bcnt; + } + if(step>40&&step<70) + { + float angle=(step-40)/30.*PI+PI; + pos[bcnt]=smvec2d(210+XOFFSET+30*cos(angle),220+YOFFSET+30*sin(angle)); + vel[bcnt]=smvec2d(0,0);acc[bcnt]=smvec2d(0,0);scale[bcnt]=1.5;++bcnt; + } + if(step>=70) + { + pos[bcnt]=smvec2d(240+XOFFSET,220+YOFFSET+(step-70)*4); + vel[bcnt]=smvec2d(0,0);acc[bcnt]=smvec2d(0,0);scale[bcnt]=1.5;++bcnt; + if(step>=85){++ch;step=0;} + } + } + if(ch==2)//r + { + if(step<=20) + { + pos[bcnt]=smvec2d(280+XOFFSET,200+YOFFSET+step*4); + vel[bcnt]=smvec2d(0,0);acc[bcnt]=smvec2d(0,0);scale[bcnt]=1.5;++bcnt; + } + if(step>20) + { + float angle=(step-20)/30.*PI+PI; + pos[bcnt]=smvec2d(310+XOFFSET+30*cos(angle),230+YOFFSET+30*sin(angle)); + vel[bcnt]=smvec2d(0,0);acc[bcnt]=smvec2d(0,0);scale[bcnt]=1.5;++bcnt; + if(step>=45){++ch;step=0;} + } + } + if(ch==3)//i + { + if(step<=20) + { + pos[bcnt]=smvec2d(360+XOFFSET,200+YOFFSET+step*4); + vel[bcnt]=smvec2d(0,0);acc[bcnt]=smvec2d(0,0);scale[bcnt]=1.5;++bcnt; + } + if(step>20) + { + pos[bcnt]=smvec2d(360+XOFFSET,180+YOFFSET); + vel[bcnt]=smvec2d(0,0);acc[bcnt]=smvec2d(0,0);scale[bcnt]=1.5;++bcnt; + ++ch;step=0; + } + } + if(ch==4)//s + { + if(step<=30) + { + float angle=(30-step)/30.*PI+2*PI/3.; + pos[bcnt]=smvec2d(450+XOFFSET+40*cos(angle),170+YOFFSET+40*sin(angle)); + vel[bcnt]=smvec2d(0,0);acc[bcnt]=smvec2d(0,0);scale[bcnt]=1.5;++bcnt; + } + if(step>30) + { + float angle=(step-30)/30.*PI+5*PI/3.; + pos[bcnt]=smvec2d(410+XOFFSET+40*cos(angle),239.282+YOFFSET+40*sin(angle)); + vel[bcnt]=smvec2d(0,0);acc[bcnt]=smvec2d(0,0);scale[bcnt]=1.5;++bcnt; + if(step>60){++ch;step=0;} + } + } + if(ch==5) + { + float angle=-step/30.*PI+3*PI/2.; + pos[bcnt]=smvec2d(520+XOFFSET+40*cos(angle),240+YOFFSET+40*sin(angle)); + vel[bcnt]=smvec2d(0,0);acc[bcnt]=smvec2d(0,0);scale[bcnt]=1.5;++bcnt; + if(step>60){++ch;step=0;} + } + if(ch==6) + { + if(step<=30) + { + float angle=(30-step)/30.*PI+PI; + pos[bcnt]=smvec2d(620+XOFFSET+30*cos(angle),160+YOFFSET+30*sin(angle)); + vel[bcnt]=smvec2d(0,0);acc[bcnt]=smvec2d(0,0);scale[bcnt]=1.5;++bcnt; + } + if(step>30&&step<=55) + { + pos[bcnt]=smvec2d(590+XOFFSET,160+YOFFSET+(step-30)*5); + vel[bcnt]=smvec2d(0,0);acc[bcnt]=smvec2d(0,0);scale[bcnt]=1.5;++bcnt; + } + if(step>55) + { + pos[bcnt]=smvec2d(570+XOFFSET+(step-55)*4,190+YOFFSET); + vel[bcnt]=smvec2d(0,0);acc[bcnt]=smvec2d(0,0);scale[bcnt]=1.5;++bcnt; + if(step>75){++ch;step=0;} + } + } + if(ch==7) + { + if(step<=20) + { + pos[bcnt]=smvec2d(700+XOFFSET,160+YOFFSET+step*5); + vel[bcnt]=smvec2d(0,0);acc[bcnt]=smvec2d(0,0);scale[bcnt]=1.5;++bcnt; + } + if(step>25&&step<=55) + { + float angle=(55-step)/30.*PI; + pos[bcnt]=smvec2d(730+XOFFSET+30*cos(angle),260+YOFFSET+30*sin(angle)); + vel[bcnt]=smvec2d(0,0);acc[bcnt]=smvec2d(0,0);scale[bcnt]=1.5;++bcnt; + } + if(step>55) + { + pos[bcnt]=smvec2d(680+XOFFSET+(step-55)*4,190+YOFFSET); + vel[bcnt]=smvec2d(0,0);acc[bcnt]=smvec2d(0,0);scale[bcnt]=1.5;++bcnt; + if(step>75){++ch;step=0;} + } + } + if(ch==8) + {if(step>120){++ch;step=0;}} + if(ch==9) + { + for(int i=0;i<bcnt;++i) + { + do{acc[i]=smvec2d(rand()%100-50.,rand()%100-50.);acc[i].normalize(); + }while(acc[i].l()<1E-6); + acc[i]=(rand()%100/400.+0.2)*acc[i]; + } + ++ch; + } + if(ch==10) + {if(step>180){++ch;step=0;}} + } + return false; +} +bool introScene::sceneRender() +{ + if(ch!=11) + sm->smClrscr(0xFF000000); + else + {int c=step*4>255?255:step*4;sm->smClrscr(ARGB(255,c,c,c));} + for(int i=0;i<bcnt;++i) + blt->render(pos[i].x,pos[i].y,0,scale[i],scale[i]); + return false; +} +introScene::introScene() +{ + sm=smGetInterface(SMELT_APILEVEL); + pos=new smvec2d[1024];vel=new smvec2d[1024]; + scale=new float[1024];acc=new smvec2d[1024]; + extern const char* bsnames[]; + smTexInfo *ti=ssanm.getTextureInfo(bsnames[rand()%8]); + blt=new smEntity2D(ti->tex,ti->rect); + blt->setCentre(12,12); + blt->setColor(0xC0FFFFFF); + sceneMgr->registerScene(this,"Intro",1000); +} +void introScene::introInit() +{ + bcnt=step=ch=0; + sceneMgr->activateScene("Intro"); +} +introScene::~introScene() +{ + sceneMgr->deactivateScene("Intro"); + delete[] pos;delete[] vel;delete[] acc;delete[] scale;delete blt; + sm->smRelease(); +} |