今日主題:動畫、存讀檔
1. 改程式碼
- 把上週程式拿來這週用
- 把timer的程式拿掉改用mouse motion
int oldx=0;void mouse(int botton,int x,int y){oldx=x;}void motion(int x,int y){angle[angleID]+= x-oldx;oldx=x;glutPostRedisplay();
}
配合main函式的glutMotionFunc(motion);
執行結果:
2. 動畫、存檔
- 加上指標 FILE * fout = NULL;
- 在motion增加:
if(fout==NULL)fout=fopen("angle.txt","w+");for(int i=0;i<20;i++) fprintf(fout,"%.1f ",angle[i]);fprintf(fout,"\n");for(int i=0;i<20;i++) printf("%.1f ",angle[i]);printf("\n");
執行結果:
- 加上timer
- 先加上指標 FILE * fin = NULL
glutTimerFunc(30,timer,t+1);if(fin==NULL) fin=fopen("angle.txt","r");for(int i=0;i<20;i++) fscanf(fin,"%f",&angle[i]);glutPostResisplay();
- 先註解timer跟存檔的程式碼
- 加上 's' 'r' 'p' key 代表 'save' 'read' 'play'
- 把 fout 的程式碼貼在 key[s]
if(key=='s'){///saveif(fout==NULL)fout=fopen("angle.txt","w+");for(int i=0;i<20;i++) fprintf(fout,"%.1f ",angle[i]);fprintf(fout,"\n");for(int i=0;i<20;i++) printf("%.1f ",angle[i]);printf("\n");}
- 把 fopen 的程式碼貼在 key[r]
if(key=='r'){///readif(fin==NULL) fin=fopen("angle.txt","r");for(int i=0;i<20;i++)fscanf(fin,"%f",&angle[i]);glutPostRedisplay();}
3. 內插
- 改timer
float angleold[20]={},anglenew[20]={};void timer( int t ){glutTimerFunc(30,timer,t+1);if(t%10==0){///10frame 讀新資料for(int i=0;i<20;i++) angleold[i]=anglenew[i];///備份資料if(fin==NULL) fin=fopen("angle.txt","r");for(int i=0;i<20;i++)fscanf(fin,"%f",&anglenew[i]);///讀新資料}float alpha = (t%10)/10.0;for(int i=0;i<20;i++){angle[i]=alpha*anglenew[i]+(1-alpha)*angleold[i];}glutPostRedisplay();}
就會跑出動畫了(原理 to be continue)



沒有留言:
張貼留言