1.出現五十隻蚊子在畫面上:
//取時間亂數的50隻蚊子X&Y座標
srand(time(NULL));
int x2[50],y2[50],z2[50]; //用三個陣列記XY座標和一個蚊子是否活著
for(int i=0;i<50;i++)
{
x2[i]=rand()%500;
y2[i]=rand()%360;
z2[i]=1; //產生時把五十隻蚊子設1為活著
}
2.拍子可隨膚色移動:
//捕蚊拍跟著膚色走
int sx, sy;
for (int y=1; y<grey->height-1; y++) {
uchar* ptr1=(uchar*) (grey->imageData +y*grey->widthStep);
for (int x=1; x<grey->width-1; x++) {
if (ptr1[x-1]==255 && ptr1[x]==255 && ptr1[x+1]==255) {
sx=x; sy=y;
x1=x;y1=y;
x=grey->width+1; y=grey->height+1;
} } }
3.模擬打蚊子:
//拍子碰到蚊子就消失
if(s<50){
for(int i=0;i<50;i++){
if(x2[i]>sx && sx<x2[i]+80&& sy>y2[i] && sy<y2[i]+80){
z2[i]=0; x2[i]=5000;y2[i]=5000;
s+=1;
} }
for(int i=0;i<50;i++){
if(z2[i]==1){
for (int y=0; y<a->height; y++) {
uchar* ptr1=(uchar*) (a->imageData +y*a->widthStep);
uchar* ptr2=(uchar*) (frame->imageData +(y+y2[i])*frame->widthStep);
for (int x=0; x<a->width; x++) {
ptr2[3*(x+x2[i])]=alpha*ptr1[3*(x)] + (1-alpha)*ptr2[3*(x+x2[i])];
ptr2[3*(x+x2[i])+1]=alpha*ptr1[3*(x)+1] + (1-alpha)*ptr2[3*(x+x2[i])+1];
ptr2[3*(x+x2[i])+2]=alpha*ptr1[3*(x)+2] + (1-alpha)*ptr2[3*(x+x2[i])+2];
} } } }
4.計分:
//分數顯示
cvPutText(frame, "Score ", cvPoint(10,50), &font, cvScalar(0,0,255) );
int2str(s, str); //下面的int轉char
cvPutText(frame, str , cvPoint(120,50), &font, cvScalar(0,0,255) ); //str不能放int
//int轉char
void int2str(int i, char *s) {
sprintf(s,"%d",i);
}
5.過關畫面:
cvPutText(frame, "You Win" , cvPoint(280,250), &font, cvScalar(0,0,255) );
上機考卡住的地方:
已經有五十隻蚊子,拍子也能跟著移動
也寫了"存活"的陣列,用來判斷是不是有打到蚊子
分數也能產生,蚊子一直殺不死(圖沒有消失),分數卻一直在加
考完試後:
冷靜的看了看程式碼,發現顯示初始我的蚊子的迴圈寫在while裡面
造成會
顯示蚊子 --> 做判斷是不是分數還沒到達 --> Z陣列改成0表是蚊子死了 --> 分數加一
--> 在判斷(if(z2[i]==1))蚊子還活著的做顯示 -->但又回到顯示初始的五十隻蚊子
所以我把顯示初始蚊子的迴圈搬到while外面
讓產生蚊子的迴圈在開始while之前就先產生完成
就沒有不斷產生,消不掉蚊子圖形的問題
沒有留言:
張貼留言