當前位置:首頁 » 編程語言 » 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/