废话不多说直接上视频
参考库easyx
环境devC++
球于球之间的碰撞尚未完成,期待大佬重构。
项目16 2024-02-06 17-54-17
#include <graphics.h>
#include <math.h>
#include <time.h>
#include<stdio.h>
#include <pthread.h>
DWORD* pBuffer;
int width=1000;//宽
int height=700;//高
int x[100];//物体的x轴
int y[100];//物体的y轴
int r[100];//物体的半径
int Vx[100] ;//物体的x轴速度
int Vy[100] ;//物体的y轴速度
int ax[100];//物体的x轴加速度
int ay[100];//物体等待y轴加速度
int fa=1; //空气阻力
int N=1;//当前物体数量
int w=1200;
int h=500;
int stop=0;
int sellps_x=0;//延时因子
MOUSEMSG msg;//鼠标事件
void cycle();//生命周期多线程模拟
void create() ;//创建一列物体
void delup() ;//删除一列物体
void change();//改变物体轨迹 碰撞
void setstate();//改变状态
void draw();//开始绘画物体
void delups();
void delay(DWORD ms)
{
static DWORD oldtime = GetTickCount();
while(GetTickCount() - oldtime < ms)
Sleep(1);
oldtime = GetTickCount();
}
void create(){//创建物体
for(int i=0;i<N;i++) {
solidcircle(x[i],y[i],r[i]) ;
}
}
void delup(){//删除上一个物体
for(int i=0;i<N;i++) {
fillcircle(x[i],y[i],r[i]);
}
}
void change(){//改变运动轨迹
//计算碰撞时的初速度
//联立动量守恒和能量守恒得知v1=v2速度互换符号不变
for(int i=0;i<N;i++) {//碰撞时反弹加一个加速度
for(int i1=i+1;i1<N;i++){
if((y[i]+r[i])<y[i1]&&i!=i1){//y轴发生碰撞了
int V=Vy[i] ;
Vy[i]=Vy[i1];
Vy[i1]=V;
}
if((x[i]=r[i])<=x[i1]&&i!=i1) {//x轴发生了碰撞
int V=Vx[i] ;
Vx[i]=Vx[i1];
Vx[i1]=V;
}
}
}
}
void setstate(){//多物体运动
for(int i=0;i<N;i++) {
x[i]+=Vx[i];
y[i]+=Vy[i];
if(x[i]>=w){
Vx[i]=-Vx[i];
}
if(y[i]>=h){
Vy[i]=-Vy[i];
}if(x[i]<=0){
Vx[i]=-Vx[i];
}
Vx[i]+=ax[i]-fa;
Vy[i]+=ay[i]-fa;
}stop=2;
}
void* pthraed_1_Code(void* arg){
while(1){
msg = GetMouseMsg();
if(msg.uMsg==WM_LBUTTONDOWN){
stop=1;
delups();cleardevice();
for(int i=0;i<N;i++) {
x[i]=msg.x+rand()%100;
x[i]-=5;
y[i]=msg.y+rand()%100;
}
}
while(msg.uMsg == WM_RBUTTONDOWN){
stop=1;
cleardevice();
for(int i=0;i<N;i++) {
x[i]=msg.x+rand()%100;
x[i]-=5;
y[i]=msg.y+rand()%100;
}
msg = GetMouseMsg();
if(msg.uMsg == WM_RBUTTONUP)break;
}
stop=0;
}
}
void draw(){//绘画
stop=0;
for(int i=0;i<N;i++) {
setfillcolor(BLUE);
fillcircle(x[i],y[i],r[i]);
}
}
void delups(){//开始删除
for(int i=0;i<N;i++) {
clearcircle(x[i],y[i],r[i]+1);
}
}
void initialization(int n){//初始化
int random_number = rand();
srand(time(0));
for(int i=0;i<n;i++){
// 使用当前时间作为随机数生成器的种子
x[i]= rand()%100;
y[i]= rand()%100;
r[i]=5;
Vx[i]=2;
Vy[i]=2;
ax[i]=2;
ay[i]=2;
}
}
void run(){//启动
initialization(100);//创建100个物体
N=90;
BeginBatchDraw();
while(1)
{
delups() ;//删除
setstate();//改变物理量
draw();//绘画
FlushBatchDraw();
delay(20);//等待100ms
EndBatchDraw();
// change() ;//如果发生碰撞
}
}
void* pthread_2_Code(void* arg){
run();
}
void pthread_test(int argc,char** args){
//创建两个线程
pthread_t p1,p2;
//初始化线程1(无参)
pthread_create(&p1,NULL,pthraed_1_Code,NULL);
//初始化线程2(有参)
int a = 100;
pthread_create(&p2,NULL,pthread_2_Code,&a);
//主线程等待线程1和2执行完毕,否则可能进程1和2还未执行完毕主进程就就结束了
pthread_join(p1,NULL);
pthread_join(p2,NULL);
}
int main(int argc,char** args){
initgraph(w,h);
pthread_test(argc,args);
getchar() ;
return 0;
}