当前位置:首页 » 编程语言 » c语言两个精灵发生碰撞
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言两个精灵发生碰撞

发布时间: 2022-05-13 04:23:34

1. 用c语言在funcode上做黄金矿工的游戏 求发整个文件

//funcode黄金矿工源文件
#include"CommonAPI.h"
#include"stdio.h"
#include"string.h"
voidDrawHookLine();
intg_fGoldBornMinX=0;
intg_fGoldBornMaxX=0;
intg_fGoldBornMinY=0;
intg_fGoldBornMaxY=0;
intg_iGoldCount=20;
intg_iGameState=2;
intflag=1;
floatScore=0.f;
intflagnum=0;
charszGotGoldName[20];//当前抓到金子的名称
floatg_fHookRotation=0.f;
floatg_fEmptyHookSpeed=35.f;
floatfTimeDelta;
floatg_fHookStartPosX;//存储钩子的初始X位置
floatg_fHookStartPosY;//存储钩子的初始Y位置
///////////////////////////////////////////////////////////////////////////////////////////
//
//主函数入口
//
//////////////////////////////////////////////////////////////////////////////////////////
intPASCALWinMain(HINSTANCEhInstance,
HINSTANCEhPrevInstance,
LPSTRlpCmdLine,
intnCmdShow)
{
//初始化游戏引擎
if(!dInitGameEngine(hInstance,lpCmdLine))
return0;
//游戏初始化代码
dSetWindowTitle("黄金矿工");
g_fGoldBornMinX=dGetScreenLeft()+5;//金子左边界
g_fGoldBornMaxX=dGetScreenRight()-5;//金子右边界
g_fGoldBornMinY=dGetScreenTop()+20;//金子上边界
g_fGoldBornMaxY=dGetScreenBottom()-5;//金子下边界
g_fHookStartPosX=dGetSpritePositionX("GoldHook");//获取钩子的初始X坐标
g_fHookStartPosY=dGetSpritePositionY("GoldHook");//获取钩子的初始Y坐标
dSetSpriteCollisionSend("goldHook",1);
dSetSpriteCollisionReceive("goldTemplate",1);
constfloatfRotateSpeed=45.f;//摇摆速度,单位度/秒
intiHookRotToLeft=1;//钩子摆动的方向:1←;0→
floatfTimeDelta=dGetTimeDelta();
//引擎主循环,处理屏幕图像刷新等工作
while(dEngineMainLoop())
{
//获取两次调用之间的时间差,传递给游戏逻辑处理
floatfTimeDelta=dGetTimeDelta();
DrawHookLine();
//执行游戏主循环
if(g_iGameState==0)
{
floatfThisRotate=fRotateSpeed*fTimeDelta;
if(iHookRotToLeft)
{
g_fHookRotation+=fThisRotate;
if(g_fHookRotation>=180.f)
{
g_fHookRotation=180.f;
iHookRotToLeft=0;
}
}
else
{
g_fHookRotation-=fThisRotate;
if(g_fHookRotation<=0.f)
{
g_fHookRotation=0.f;
iHookRotToLeft=1;
}
}
dSetSpriteRotation("GoldHook",g_fHookRotation);
}
elseif(g_iGameState==1)
{
dSetTextValue("Score",Score);
//播放拉金块的动作
dAnimateSpritePlayAnimation("goldMan","GolderManAnimation3",1);//获取钩子X方向的速度
floatfSpeedX=dGetSpriteLinearVelocityX("GoldHook");
//获取钩子Y方向的速度
floatfSpeedY=dGetSpriteLinearVelocityY("GoldHook");
//当速度接近为0时,即可判定其已到达初始点
if(fSpeedX<0.00001f&&fSpeedX>-0.00001f&&
fSpeedY<0.00001f&&fSpeedY>-0.00001f)
{
//解除金块与钩子的锚定
dSpriteDismount(szGotGoldName);
//删除获取的金块
dDeleteSprite(szGotGoldName);
//回拉结束,设定状态为0
g_iGameState=0;
if(flagnum)
{g_iGoldCount--;
}
}
}
//播放挖金者的动作(恢复初始守候动作)
dAnimateSpritePlayAnimation("goldMan","GolderManAnimation2",1);
if(g_iGoldCount==0)
{
g_iGameState=0;
Score=0;
dSetSpriteVisible("GameBegin",1);
g_iGoldCount=20;
flag=1;
}
};
dAnimateSpritePlayAnimation("goldMan","GolderManAnimation2",1);

//关闭游戏引擎
dShutdownGameEngine();
return0;
}
//==========================================================================
//
//引擎捕捉鼠标移动消息后,将调用到本函数
voiddOnMouseMove(constfloatfMouseX,constfloatfMouseY)
{
//可以在此添加游戏需要的响应函数
}
//==========================================================================
//
//引擎捕捉鼠标点击消息后,将调用到本函数
voiddOnMouseClick(constintiMouseType,constfloatfMouseX,constfloatfMouseY)
{
//可以在此添加游戏需要的响应函数
}
//==========================================================================
//
//引擎捕捉键盘按下消息后,将调用到本函数
//分别为判断Shift,Alt,Ctrl当前是否也处于按下状态。比如可以判断Ctrl+E组合键
voiddOnKeyDown(constintiKey,constintiAltPress,constintiShiftPress,constintiCtrlPress)
{
//可以在此添加游戏需要的响应函数
if(iKey==KEY_SPACE)
{
g_iGameState=1;//初始化之后,将游戏状态设置为进行中
dSetSpriteVisible("GameBegin",0);
//生成金子
intiLoop=0;//循环变量控制
intiSize=4,iPosX=0,iPosY=0;//iSize表示金块大小的变量
if(flag)
{
for(iLoop=0;iLoop<g_iGoldCount;iLoop++)
{
if(iLoop<10)//生成10个小金块,大小为4
{
iSize=4;
}
elseif(iLoop>=10&&iLoop<16)//生成6个中金块,大小为6
{
iSize=6;
}
else//生成4个大金块,大小为8
{
iSize=8;
}//初始化金子精灵实例
char*tmpName;
//生成金块名字
tmpName=dMakeSpriteName("GoldBlock",iLoop);
dCloneSprite("goldTemplate",tmpName);
//设置金块的宽度
dSetSpriteWidth(tmpName,(float)iSize);
//设置金块的高度
dSetSpriteHeight(tmpName,(float)iSize);
//设置金子精灵位置
iPosX=dRandomRange(g_fGoldBornMinX,g_fGoldBornMaxX);
iPosY=dRandomRange(g_fGoldBornMinY,g_fGoldBornMaxY);
dSetSpritePosition(tmpName,(float)iPosX,(float)iPosY);
flag=0;
}
}
if(g_iGoldCount==0)
{
flag=1;
g_iGoldCount=20;
}
}
if(iKey==KEY_S&&g_iGameState==0)
{//按下↓并且游戏状态为"0"
g_iGameState=2;//置游戏状态为2,可用于控制钩子是否摆动
//以当前朝向给钩子一个向前的速度
dSetSpriteLinearVelocityPolar("GoldHook",g_fEmptyHookSpeed,g_fHookRotation);
//播放挖金者的动作(一个胳膊往下压的动作)
dAnimateSpritePlayAnimation("goldMan","GolderManAnimation1",0);
//0表示播放一次,这里胳膊往下压就是一次
}
}
//==========================================================================
//
//引擎捕捉键盘弹起消息后,将调用到本函数
voiddOnKeyUp(constintiKey)
{
//可以在此添加游戏需要的响应函数
}
//===========================================================================
//
//引擎捕捉到精灵与精灵碰撞之后,调用此函数
voiddOnSpriteColSprite(constchar*szSrcName,constchar*szTarName)
{
//发起者为GoldHook,接受者含有GoldBlock字段

if(strcmp(szSrcName,"GoldHook")==1&&strstr(szTarName,"GoldBlock")!=NULL)
{
//将金块锚定在钩子上
dSpriteMountToSpriteLinkPoint(szTarName,"GoldHook",2);
//使钩子向初始位置移动,即会拉
dSpriteMoveTo("GoldHook",g_fHookStartPosX,g_fHookStartPosY,g_fEmptyHookSpeed,1);
//复制并保存当前抓取到金块的名称
strcpy(szGotGoldName,szTarName);
//发起者为GoldHook,接受者含有GoldBlock字段
//根据金子大小,计算钩子的往回收的速度,越大的越慢。
//算法:之前设置的金子大小为4,6,8,用10减去该大小再除以10,得到3个小数:0.6,0.4,0.2.该小数乘以空钩子的速度即得到挂接不同金子后的实际速度
floatfWidth=dGetSpriteWidth(szTarName);
floatfSpeed=((10.f-fWidth)/10.f)*g_fEmptyHookSpeed;
Score+=fWidth;
//钩子往初始位置移动
dSpriteMoveTo("goldhook",g_fHookStartPosX,g_fHookStartPosY,fSpeed,1);
//播放拉金块的动作
dAnimateSpritePlayAnimation("goldMan","GolderManAnimation1",0);
g_iGameState=1;
flagnum=1;
}
}
//===========================================================================
//
//引擎捕捉到精灵与世界边界碰撞之后,调用此函数.
//iColSide:0左边,1右边,2上边,3下边
voiddOnSpriteColWorldLimit(constchar*szName,constintiColSide)
{
if(strcmp(szName,"GoldHook")!=0)
{
//碰到边界的为钩子时
//同样设置为回拉,只是没有碰到金子
dSpriteMoveTo(szName,g_fHookStartPosX,g_fHookStartPosY,g_fEmptyHookSpeed,1);
//播放拉金块的动作
dAnimateSpritePlayAnimation("goldMan","GolderManAnimation3",0);g_iGameState=1;
flagnum=0;
}
}
voidDrawHookLine()
{
//首先,从矿工精灵上获取一个缆绳链接点作为绳子的起始点
floatfStartX=dGetSpriteLinkPointPosX("GoldMan",1);
floatfStartY=dGetSpriteLinkPointPosY("GoldMan",1);
//绳子终点在钩子精灵上获取
floatfEndX=dGetSpriteLinkPointPosX("GoldHook",1);
floatfEndY=dGetSpriteLinkPointPosY("GoldHook",1);
//在这两点之间划线.线的颜色红绿蓝值都为50,即灰色
dDrawLine(fStartX,fStartY,fEndX,fEndY,2.f,0,50,50,50,255);
}

2. 用c语言编写小球动态碰撞的程序

你是想用OpenGl还是Direct Draw的图形开发库。

3. 如何用c语言编写一个三个小球碰撞的程序啊

#include <stdio.h>
#include <graphics.h>
int main()
{
int i,j,gdriver,gmode,size;
void *buf;
gdriver=DETECT;
initgraph(&gdriver,&gmode,"d:\\tc2\\bgi");
setbkcolor(BLUE);
cleardevice();
setcolor(LIGHTRED);
setlinestyle(0,0,1);
setfillstyle(1,10);
circle(31,200,30);
floodfill(31,200,12);
size=imagesize(0,169,62,231);
buf=malloc(size);
getimage(0,169,62,231,buf);
putimage(500,269,buf,COPY_PUT);
putimage(320,170,buf,COPY_PUT);

while(1)
{
for(j=0;j<4;j++)
for(i=0;i<260;i++)
{
if(kbhit()) {closegraph();exit(0);}
switch(j)
{
case 0:
putimage(i,170,buf,COPY_PUT);
break;
case 1:
putimage(321+i,170,buf,COPY_PUT);
break;
case 2:
putimage(581-i,170,buf,COPY_PUT);
break;
case 3:
putimage(260-i,170,buf,COPY_PUT);
break;
}
}
}
}

4. cocos2d c++ 使用boundingBox()两个精灵碰撞出现内存出错

这句有问题FruitType[i]->boundingBox()
这样写 for循环内

CCSprite*apple=dynamic_cast<CCSprite*>FruitType[i];
if(apple!=NULL&&(apple->boundingBox()).intersectsRect(man->boundingBox()))
{apple->stopAllActions();
apple->removeFromParentAndCleanup(true);
apple=NULL;
}


FruitType[i]里面存的是一个指针。

5. c语言实现两小球碰撞

我没有TC,没办法画。说一下原理。
画两个圆,表示小球。
半径比k,半径r1,r2,
圆沿两条直线,速度v1,v2
时间步长dt
画圆:
loop:
setcolor(WHITE); // 绘图色
circle(x1, y1, r1);
circle(x2, y2, r2);
停0.05秒
setcolor(BLUE); // 背景色
circle(x1, y1, r1);
circle(x2, y2, r2);
更新x1, y1,x2, y2
goto loop;

画直线用:
line(int x0, int y0, int x1, int y1);

写字用
settextstyle(1, 0, 0);
outtextxy(120, 120, "Very Good");

---------------------------------
#include<stdio.h>
#include<math.h>
#include<graphics.h>

int main()
{
int gdirver, gmode;
gdriver=DETETC;
initgraph(&gdriver, &gmode, "");
setbkcolor(BLUE); // 设屏幕底色
cleardevice();
画圆:
loop:
setcolor(WHITE); // 绘图色
circle(x1, y1, r1); // 画新圆
circle(x2, y2, r2);
停0.05秒
setcolor(BLUE); // 用背景色涂掉圆
circle(x1, y1, r1);
circle(x2, y2, r2);
更新x1, y1,x2, y2
判断相碰,是碰则 break;
goto loop;
用上面方法画碰后的圆,区别在于
更新x1, y1,x2, y2
getch();
closegraph();
}

6. c语言三维碰撞的算法

我是这样想的,先判断两个物体是否接触,如果相互接触,则先把两个物体的速度按x,y,z方向分解,然后对应的方向上,运用动量守恒,能量守恒,决定碰撞后的速度,然后在把得到的x,y,z方向上的速度进行合成就行了。

7. funcodeC语言实训平台上怎样实现大鱼吃小鱼的功能或者是怎样实现精灵与精灵碰撞的试验。

游戏里的精灵(sprite)一般不直接通过其图像本身实现碰撞检测,大多时候通过定义该sprite的单位的位置和逻辑形状(方形,圆形,多边形等)来判断两两碰撞。其中方形、圆形计算简单适合对碰撞检测要求不高的游戏。
个人以为最简单的是圆形检测,在这个检测方法下不管sprite形状如何,其碰撞区域均以给定半径的圆形考虑。
比如有A,B两个单位,它们的圆心坐标分别是(A.x,A.y);(B.x,B.y),那么圆心之间的距离就是sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)(A.y-B.y))。如果该值比两单位的半径和A.r+B.r大则无碰撞,否则则碰撞。

8. 如何用c语言实现两运动物体碰撞后其中一个不动 另一个被弹开的程序

将动量、能量和摩擦力等因素考虑进去,先把函数关系列出来,然后再用C语言计算结果,把结果画出来就行了。

9. 用C语言编程2小球在屏幕上随机碰撞,能给代码的最好,事后重谢!

你的程序有三个错误:
1.
main
应改为
main()

2.
scanf("%d%d",a,b);
应改为
scanf("%d%d",&a,&b);

3.
sum=a+b; 应该写在scanf("%d%d",&a,&b);的后面

程序修改如下:

#include<stdio.h>
main()
{
int a,b,sum;
scanf("%d%d",&a,&b);
sum=a+b;
printf("sum is %d",sum);
}

一个更标准的程序如下:

#include<stdio.h>
int main(void)
{
int a,b,sum;
scanf("%d%d",&a,&b);
sum=a+b;
printf("sum is %d",sum);
return 0;
}

**********************************************
#include<stdio.h>

int main(void)
{
float a,b;
scanf("%f%f",&a,&b);
printf("%g+%g=%g",a,b,a+b);
return 0;
}

10. c语言 和按键精灵是什么

按键精灵是一款模仿键盘和鼠标操作的软件。 比如说挖矿,每10秒钟点一下道具或技能什么的,如果想挖个1万次,那交给按键精灵就可以啦。 它不修改游戏,不破坏游戏平衡,好处是把玩家从枯燥的练功动作中解放出来,但有些杀毒软件会误报,有些网游公司不支持按键精灵. 按键精灵官方网址: http://www.vrbrothers.com/cn/qmacro/index.html 按键精灵官方教程: http://www.vrbrothers.com/cn/qmacro/usermanual_local/