日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

项目: 实现弹跳小球动画

發布時間:2025/3/20 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 项目: 实现弹跳小球动画 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 一、項目描述和最終成果展示
  • 二、實現一個移動的球
  • 三、彈跳一個小球
  • 四、彈跳一個小球(改進版)
  • 五、多個球碰撞
  • 六、多個球碰撞(升級版)

一、項目描述和最終成果展示

項目描述: 一個球來回的跳動

效果圖如下:

二、實現一個移動的球

代碼如下:

#include<graphics.h> #include<conio.h> int main(void) {int x;initgraph(640,480);for(x=100;x<540;x=x+20){setcolor(YELLOW);//繪制黃線,綠色填充的圓setfillcolor(GREEN);fillcircle(x,100,20);Sleep(320);//延時/*setcolor(BLACK);//繪制黑線,黑色填充的圓//目的清除以前的圓,達到小球動態移動的效果//等價于清屏函數setfillcolor(BLACK);fillcircle(x,100,20);*/cleardevice();}closegraph();return 0; }

三、彈跳一個小球

代碼如下:

#include<graphics.h> #include<conio.h> #define High 480 //游戲畫布尺寸 #define Width 640 int main(void) {float ball_x,ball_y;//小球的坐標float ball_vx,ball_vy;//小球的速度float radius;//小球的半徑initgraph(Width,High);ball_x=Width/2;ball_y=High/2;ball_vx=1;ball_vy=1;radius=20;while(1){setcolor(BLACK);//繪制黑色,黑色填充的圓//不用清屏函數的好處:不會閃屏setfillcolor(BLACK);fillcircle(ball_x,ball_y,radius);//更新圓的坐標ball_x=ball_x+ball_vx;ball_y=ball_y+ball_vy;if( (ball_x<=radius) || (ball_x>=Width-radius) )ball_vx=-ball_vx;if( (ball_y<=radius) || (ball_y>=High-radius) )ball_vy=-ball_vy;//繪制黃線,綠色填充的圓setcolor(YELLOW);setfillcolor(GREEN);fillcircle(ball_x,ball_y,radius);Sleep(3);}closegraph();return 0; }

效果圖如下:

四、彈跳一個小球(改進版)

代碼如下:

#include<graphics.h> #include<conio.h> #define High 480 //游戲畫布尺寸 #define Width 640 int main(void) {float ball_x,ball_y;//小球的坐標float ball_vx,ball_vy;//小球的速度float radius;//小球的半徑initgraph(Width,High);ball_x=Width/2;ball_y=High/2;ball_vx=1;ball_vy=1;radius=20;BeginBatchDraw();while(1){setcolor(BLACK);//繪制黑色,黑色填充的圓//不用清屏函數的好處:不會閃屏setfillcolor(BLACK);fillcircle(ball_x,ball_y,radius);//更新圓的坐標ball_x=ball_x+ball_vx;ball_y=ball_y+ball_vy;if( (ball_x<=radius) || (ball_x>=Width-radius) )ball_vx=-ball_vx;if( (ball_y<=radius) || (ball_y>=High-radius) )ball_vy=-ball_vy;//繪制黃線,綠色填充的圓setcolor(YELLOW);setfillcolor(GREEN);fillcircle(ball_x,ball_y,radius);FlushBatchDraw();Sleep(3);}EndBatchDraw();closegraph();return 0; }

效果圖如下:

五、多個球碰撞

代碼如下:

#include<graphics.h> #include<conio.h> #define High 480 //游戲畫布尺寸 #define Width 640 #define BallNum 5 //小球的個數 int main(void) {float ball_x[BallNum],ball_y[BallNum];//小球的坐標float ball_vx[BallNum],ball_vy[BallNum];//小球的速度float radius=20;//小球的半徑int i;for(i=0;i<BallNum;i++){ball_x[i]=(i+2)*radius*3;ball_y[i]=High/2;ball_vx[i]=1;ball_vy[i]=1;}initgraph(Width,High);BeginBatchDraw();while(1){setcolor(BLACK);//繪制黑色,黑色填充的圓//不用清屏函數的好處:不會閃屏setfillcolor(BLACK);for(i=0;i<BallNum;i++){fillcircle(ball_x[i],ball_y[i],radius);}//更新圓的坐標for(i=0;i<BallNum;i++){ball_x[i]=ball_x[i]+ball_vx[i];ball_y[i]=ball_y[i]+ball_vy[i];}//判斷是否和墻壁碰撞for(i=0;i<BallNum;i++){if( (ball_x[i]<=radius) || (ball_x[i]>=Width-radius) )ball_vx[i]=-ball_vx[i];if( (ball_y[i]<=radius) || (ball_y[i]>=High-radius) )ball_vy[i]=-ball_vy[i];}//繪制黃線,綠色填充的圓setcolor(YELLOW);setfillcolor(GREEN);for(i=0;i<BallNum;i++){fillcircle(ball_x[i],ball_y[i],radius);}FlushBatchDraw();Sleep(3);}EndBatchDraw();closegraph();return 0; }

效果圖如下:

六、多個球碰撞(升級版)

增加了球與球之間的碰撞

代碼如下:

#include<graphics.h> #include<conio.h> #include<math.h> #define High 480 //游戲畫面大小 #define Width 640 #define BallNum 15//小球的個數int main(void) {float ball_x[BallNum],ball_y[BallNum];//小球的坐標float ball_vx[BallNum],ball_vy[BallNum];//小球的速度float radius;//小球的半徑int i,j;radius=20;for(i=0;i<BallNum;i++)//數據的初始化{ball_x[i]=rand()%int(Width-4*radius)+2*radius;ball_y[i]=rand()%int(High-4*radius)+2*radius;ball_vx[i]=(rand()%2)*2-1;ball_vy[i]=(rand()%2)*2-1;}initgraph(Width,High);BeginBatchDraw();while(1){setcolor(BLACK);//繪制黑色,黑色填充的圓//不用清屏函數的好處:不會閃屏setfillcolor(BLACK);for(i=0;i<BallNum;i++){fillcircle(ball_x[i],ball_y[i],radius);}//更新小球的坐標for(i=0;i<BallNum;i++){ball_x[i]=ball_x[i]+ball_vx[i];ball_y[i]=ball_y[i]+ball_vx[i];//把超出邊界的小球拉回來if(ball_x[i]<radius)ball_x[i]=radius;if(ball_y[i]<radius)ball_y[i]=radius;if(ball_x[i]>Width-radius)ball_x[i]=Width-radius;if(ball_y[i]>High-radius)ball_y[i]=High-radius;}//判斷是否和墻壁碰撞for(i=0;i<BallNum;i++){ if( (ball_x[i]<=radius) || (ball_x[i]>=Width-radius) )ball_vx[i]=-ball_vx[i];if( (ball_y[i]<=radius) || (ball_y[i]>=High-radius) )ball_vy[i]=-ball_vy[i];}float minDistances2[BallNum][2];//記錄某個小球和與它最近小球的距離,以及這個小球的坐標for(i=0;i<BallNum;i++){minDistances2[i][0]=999999;minDistances2[i][1]=-1;}//求所有小球兩兩之間的距離的平方for(i=0;i<BallNum;i++){for(j=0;j<BallNum;j++){if(i!=j)//和自己不比{float dist2;dist2=(ball_x[i]-ball_x[j])*(ball_x[i]-ball_x[j])+(ball_y[i]-ball_y[j])*(ball_y[i]-ball_y[j]);if(dist2<minDistances2[i][0]){minDistances2[i][0]=dist2;minDistances2[i][1]=j;}}}}//判斷小球之間是否碰撞for(i=0;i<BallNum;i++){if(minDistances2[i][0]<=4*radius*radius)//若最小距離小于閾值,發生碰撞{j=minDistances2[i][1];//交換速度int temp;temp=ball_vx[i];ball_vx[i]=ball_vx[j];ball_vx[j]=temp;temp=ball_vy[i];ball_vy[i]=ball_vy[j];ball_vy[j]=temp;minDistances2[j][0]=9999999;//避免交換兩次速度,又回去了minDistances2[j][1]=-1;}} //繪制黃線,綠色填充的圓setcolor(YELLOW);setfillcolor(GREEN);for(i=0;i<BallNum;i++){fillcircle(ball_x[i],ball_y[i],radius);}FlushBatchDraw();Sleep(3);}EndBatchDraw();closegraph();return 0; }

效果圖如下:

總結

以上是生活随笔為你收集整理的项目: 实现弹跳小球动画的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。