Funcode怎么让精灵随着vscode鼠标是黑的的移动而转动

Funcode怎么让精灵随着鼠标的移动而转动_百度知道
Funcode怎么让精灵随着鼠标的移动而转动
我有更好的答案
这··很简单啊···· 首先你要明确是相对移动还是绝对移动,然后在确定你当前运行的程序支持不支持按键精灵(因为部分游戏或者软件针对按键屏蔽了它的功能)。如果什么都不考虑的话就是以下内容
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。用c语言在funcode上做黄金矿工的游戏 求发整个文件-
用c语言在funcode上做黄金矿工的游戏 求发整个文件
作者:本站编辑
&&&&&投稿日期:
//funcode黄金矿工源文件#include&&CommonAPI.h&#include&&stdio.h&#include&&string.h&void&&&DrawHookLine();int&g_fGoldBornMinX&=&0;int&g_fGoldBornMaxX&=&0;int&g_fGoldBornMinY&=&0;int&g_fGoldBornMaxY&=&0;int&g_iGoldCount&=&&20;int&g_iGameState=2;int&flag=1;&float&Score=0.f;int&flagnum=0;&char&szGotGoldName[20]&;&//当前抓到金子的名称float&g_fHookRotation&=&0.f;float&g_fEmptyHookSpeed&=35.f;float&fTimeDfloat&g_fHookStartPosX;&//存储钩子的初始X位置float&g_fHookStartPosY;&//存储钩子的初始Y位置///////////////////////////////////////////////////////////////////////////////////////////////&主函数入口////////////////////////////////////////////////////////////////////////////////////////////int&PASCAL&WinMain(HINSTANCE&hInstance,&&&&&&&&&&&&&&&&&&&HINSTANCE&hPrevInstance,&&&&&&&&&&&&&&&&&&&LPSTR&&&&&lpCmdLine,&&&&&&&&&&&&&&&&&&&int&&&&&&&nCmdShow){&//&初始化游戏引擎&if(&!dInitGameEngine(&hInstance,&lpCmdLine&)&)&&return&0;&//&游戏初始化代码&&&&&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);&const&float&fRotateSpeed&=&45.f;&&//&&摇摆速度,单位&度/秒&int&iHookRotToLeft&=&1;&&&//钩子摆动的方向:1&←&;0&→&float&fTimeDelta&=&dGetTimeDelta();&&&&//&引擎主循环,处理屏幕图像刷新等工作&while(&dEngineMainLoop()&)&{&&//&获取两次调用之间的时间差,传递给游戏逻辑处理&&float&fTimeDelta&=&dGetTimeDelta();&&DrawHookLine();&&&&&&&&//&执行游戏主循环&&if(g_iGameState&==&0)&&{&&&&&&float&fThisRotate&=&fRotateSpeed&*&fTimeD&&&&&&&&&&&&&&&if(&iHookRotToLeft&)&&&{&&&&g_fHookRotation&+=&fThisR&&&&if(&g_fHookRotation&&=&180.f&)&&&&{&&&&&g_fHookRotation&&=&180.f;&&&&&iHookRotToLeft&=&0;&&&&}&&&}&&&&&&else&&&{&&&&&&&&g_fHookRotation&-=&fThisR&&&&&&&if(&g_fHookRotation&&=&0.f&)&&&&{&&&&&g_fHookRotation&&=&0.f;&&&&&iHookRotToLeft&=&1;&&&&}&&&}&&&&&&dSetSpriteRotation(&GoldHook&,g_fHookRotation);&&}&&else&if(g_iGameState&==&1)&&{&&&&dSetTextValue(&Score&,Score);&&&//播放拉金块的动作&&&dAnimateSpritePlayAnimation(&goldMan&,&GolderManAnimation3&,&1&);&&&&&&&&&&&&&//获取钩子X方向的速度&&&&&&float&fSpeedX&=&dGetSpriteLinearVelocityX(&GoldHook&);&&&&&&&&&&&&&//获取钩子Y方向的速度&&&&&&&float&fSpeedY&=&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();&return&0;}//==========================================================================////&引擎捕捉鼠标移动消息后,将调用到本函数void&dOnMouseMove(&const&float&fMouseX,&const&float&fMouseY&){&//&可以在此添加游戏需要的响应函数}//==========================================================================////&引擎捕捉鼠标点击消息后,将调用到本函数void&dOnMouseClick(&const&int&iMouseType,&const&float&fMouseX,&const&float&fMouseY&){&//&可以在此添加游戏需要的响应函数}//==========================================================================////&引擎捕捉键盘按下消息后,将调用到本函数//&iAltPress&iShiftPress&iCtrlPress&分别为判断Shift,Alt,Ctrl当前是否也处于按下状态。比如可以判断Ctrl+E组合键void&dOnKeyDown(&const&int&iKey,&const&int&iAltPress,&const&int&iShiftPress,&const&int&iCtrlPress&){&//&可以在此添加游戏需要的响应函数&&if(iKey==KEY_SPACE)&&{&&&&&&&g_iGameState&=&1;&//&初始化之后,将游戏状态设置为进行中&&&&&&&dSetSpriteVisible(&GameBegin&,0);&&&&//生成金子&&&&&int&iLoop&=&0;&//循环变量控制&&&&&&&&&&&int&iSize&=&4,&iPosX&=&0,&iPosY&=&0;&//iSize表示金块大小的变量&&&&&if(flag)&&&{&&&&&&&for(&iLoop&=&0;&iLoop&&&g_iGoldC&iLoop++&)&&&&{&&&&&&&&&&&&&&if(&iLoop&&&10&)//生成10个小金块,大小为4&&&&&{&&&&&&&&&&&&&&&&iSize&=&4;&&&&&}&&&&&&&&&&&&&&else&if(&iLoop&&=&10&&&&iLoop&&&16&)//生成6个中金块,大小为6&&&&&{&&&&&&&&&&&&&&&&iSize&=&6;&&&&&}&&&&&&&&&&&&&&else//生成4个大金块,大小为8&&&&&{&&&&&&&&&&&&&&&&&&&iSize&=&8;&&&&&}//初始化金子精灵实例&&&&&&&&&&&&&&&&&&&&char*&tmpN&&&&&//生成金块名字&&&&&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&表示播放一次,这里胳膊往下压就是一次&&}&}//==========================================================================////&引擎捕捉键盘弹起消息后,将调用到本函数void&dOnKeyUp(&const&int&iKey&){&//&可以在此添加游戏需要的响应函数}//===========================================================================////&引擎捕捉到精灵与精灵碰撞之后,调用此函数void&dOnSpriteColSprite(&const&char&*szSrcName,&const&char&*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.该小数乘以空钩子的速度即得到挂接不同金子后的实际速度&&&&&&&&&&&&&float&fWidth&=&dGetSpriteWidth(&szTarName&);&&&&&&&&&&&&&float&fSpeed&=&((10.f&-&fWidth)&/&10.f)&*&g_fEmptyHookS&&&Score+=fW&&&&&&&&&&&&//&钩子往初始位置移动&&&&&&&&&&&&&&dSpriteMoveTo(&&goldhook&,&g_fHookStartPosX,&g_fHookStartPosY,&fSpeed,&1);&&&//播放拉金块的动作&&&dAnimateSpritePlayAnimation(&goldMan&,&GolderManAnimation1&,&0&);&&&&g_iGameState&=&1;&&&flagnum=1;&&}}//===========================================================================////&引擎捕捉到精灵与世界边界碰撞之后,调用此函数.//&iColSide&:&0&左边,1&右边,2&上边,3&下边void&dOnSpriteColWorldLimit(&const&char&*szName,&const&int&iColSide&){&if(strcmp(szName,&GoldHook&)!=0)&{&&&&&&&&//碰到边界的为钩子时//同样设置为回拉,只是没有碰到金子&dSpriteMoveTo(szName,g_fHookStartPosX,g_fHookStartPosY,&g_fEmptyHookSpeed,&1);//播放拉金块的动作&&&&&&&&dAnimateSpritePlayAnimation(&goldMan&,&GolderManAnimation3&,&0);&&&&g_iGameState&=&1;&&&&&flagnum=0;&}&}void&DrawHookLine(){&//&首先,从矿工精灵上获取一个缆绳链接点作为绳子的起始点&&&&float&fStartX&=&dGetSpriteLinkPointPosX(&&GoldMan&,&1&);&float&fStartY&=&dGetSpriteLinkPointPosY(&&GoldMan&,&1&);&//&绳子终点在钩子精灵上获取&float&fEndX&=&dGetSpriteLinkPointPosX(&&GoldHook&,&1&);&float&fEndY&=&dGetSpriteLinkPointPosY(&&GoldHook&,&1&);&//&在这两点之间划线.线的颜色红绿蓝值都为50,即灰色&dDrawLine(&fStartX,&fStartY,&fEndX,&fEndY,&2.f,&0,&50,&50,&50,&255&);}
跪求C语言 funcode 弹弹堂代码:
public int getSalary(int month){ return this.salar...
用c语言在funcode上做黄金矿工的游戏 求发整个文件:
//funcode黄金矿工源文件#include &CommonAPI.h&#include &st...
funcode拼图游戏C语言代码,急求:
你好! 拼图游戏用VC6编写代码可以吗?可以尝试完成
funcode c语言代码 迷你高尔夫:
是没有这样的函数的,你为了能够循环,你在主函数里加上一个大的while()语句,是其能够循环,但是你...
同求funcode平台下拼图游戏的C语言代码:
//第一题:#includevoidfun(char*a[],char*b[]){/*获取...
求funcode环境下c语言坦克大战,要实现所有功能,有谢:
写一个遍历循环,检察所有碰撞层的矩形,跟每发已发射未消失的子弹做判断,看子弹所在的x,y是否在矩形内...
求C语言funcode坦克大战文件代码:
你邮箱多少,,,我发给你当前位置: >>
01 FunCode C 入门
FunCode C 语言实验教学指南入门篇目 录入 门 ......................................................................................................................................... 3 创建第一个项目 ................................................................................................................... 3 运行 FunCode.................................................................................................................... 3 创建新项目 ....................................................................................................................... 4 导入静态精灵 ................................................................................................................... 6 导入动画精灵 ................................................................................................................... 7 删除精灵 ........................................................................................................................... 9 设计界面初步 ................................................................................................................... 9 运行游戏 ......................................................................................................................... 13 项目改进 ............................................................................................................................. 14 打开项目 ......................................................................................................................... 14 安装目录及内容 ............................................................................. 错误!未定义书签。 给精灵起名称 ................................................................................................................. 15 设置精灵的速度 ............................................................................................................. 17 设置精灵的层次 ............................................................................................................. 17 精灵与世界边界的碰撞 ................................................................................................. 19 精灵与精灵的碰撞 ......................................................................................................... 20 导入地图模板 ................................................................................................................. 21 编写第一个小程序 ............................................................................................................. 22 打开 VC++工程................................................................................................................ 22 文件的管理 ..................................................................................................................... 22 代码文件的组成 ............................................................................................................. 24 主函数 ............................................................................................................................. 25 用代码让鱼游起来 ......................................................................................................... 26 6 个事件函数 .................................................................................................................. 28 键盘的按下事件 ............................................................................................................. 28 键盘的弹起事件 ............................................................................................................. 29 鼠标的移动事件 ............................................................................................................. 30 鼠标的点击事件 ............................................................................................................. 31 精灵与世界边界碰撞事件 ............................................................................................. 32 精灵与精灵碰撞事件 ..................................................................................................... 33 入创建第一个项目运行 FunCode门双击桌面FunCode快捷方式(如下图),打开FunCode。FunCode 会记录上一次打开项目的绝对路径,打开程序后,FunCode 会根据该路径自动 载入实验项目。 如果 FunCode 记录的绝对路径正好有 FunCode 实验项目,FunCode 打开后的界面类似 下图:如果 FunCode 记录的绝对路径没有 FunCode 实验项目,FunCode 打开后的界面类似下 图: 创建新项目根据打开后界面的不同,有两种方式创建新的 FunCode 项目。 对应第一种打开方式,点击软件的“项目”菜单,如果要创建 C 语言实验项目,点击 “创建 C 语言工程” ,如下图:对应第二种打开方式,点击“创建”窗口,如下:跳出一个窗口,选择项目相应的编程语言。比如,我们要创建一个 C 语言的实验项目, 选择如下: 点击确定,跳出如下窗口: (以下步骤,两种方式都相同)“工程名”只能由字母和数字组成,且不能用数字开头(否则可能导致图片处理出现问 题) 。我们给该项目取名为 seafish。 “工程路径”是实验项目的文件夹位置,可任意设置。 开发工具支持 VC6.0,2008 和 2010 三个版本,根据需要选择。 点击“确定” ,出现如下界面:如果我们忘记项目的保存路径,或者需要复制工程文件或者整个工程时,点击“项目” 面板中的“打开工程文件夹” ,可以打开该项目所在的文件夹。 项目面板工程文件中的内容导入静态精灵创建 FunCode 项目后,我们首先需要给这个项目添加各种资源,用于游戏界面设计。 精灵是游戏中的一种术语,一切游戏资源都称为精灵,如图片、动画、特效、文字、声 音等。静态精灵即静态图片。 首先,点击软件右侧的“资源”面板,如下:在“资源”面板下方是一排工具按钮,点击第一个按钮“添加一个新的图片资源” ,如 下:点击按钮后,跳出一个“图片资源”窗口,该窗口展示了 FunCode 自带的图片资源, 窗口左侧是显示图片的名称,右侧是图片预览。用鼠标点击某个名称,右侧会出现图片的预 览。用上下方向键可方便选择不同的图片。点击左侧第一个名称 backgroundImage,如下图:点击“添加到工程”按钮,图片就会被添加到工程中,出现资源面板的“静态精灵”框 中。如下: 一张图片被导入后,相应名称会在“图片资源”窗口中消失,避免被两次选中。练 习:按上述操作,把名称为 rocksfarImage 和 rocksnearImage 的图片导入到工程中。效果如 下:导入动画精灵点击第二个按钮“添加一个新的动画” ,可以从 FunCode 自带的动画资源库中寻找合适 的动画导入到工程项目中。如下图:点击按钮后,跳出一个窗口,点击名称“seahorse2sheetImageMapAnimation” ,如下图:导入动画精灵的操作与导入静态精灵的操作相同。导入的精灵会出现在“资源”面板的 “动画精灵”框中,如下图(在软件中,下图的海马是活动的) :与此同时,构成该动画精灵一组图片也会出现在“资源”面板的“动画精灵”框中,如 下图: 画红圈的 1/4 说明海马动画是由四张静态图片组成的。 在后面我们会进一步讲解静态图 片和动画之间关系,以及如何利用静态图片制作动画。 在这个工程中,我们既可以使用海马的动画,也可以使用海马的图片。练 习:将名为“ angelfish1sheetImageMapAnimation ” “ angelfish2sheetImageMapAnimation ”的 动画添加到工程中,效果如下:导入项目模板因为每次添加精灵都十分的繁琐,所以 FunCode 提供了一种比较简单的方式来添加精 灵,那就是导入模板,模板中不仅给出了我们在实验中所需要的精灵,而且还给精灵起好了 名字,这就方便简单了我们的操作。 具体的方式如下: 首先打开软件,找到“项目”选项,如下图:然后点击“导入地图模板” ,就会弹出如下对话框,选中你所需要的地图模板就可以了。 当然,你也可以制作自己的地图模板,将你想要添加的精灵添加进去之后,就可以点击 “项目” , 在“导入地图模板”的下边有一个“保存地图为模板” ,点击这个就可以将自己 做好的地图保存为模板了。删除精灵如果我们要删除某些导入的工程中的资源,操作方法如下: 鼠标左键点击“资源”面板中的某个精灵图标不放,然后拖曳到最后一个按钮“拖曳一 个图片到此删除” ,如下:删除按钮 删除过程如下: 鼠标左键点击要删除的精灵图标,如下:按住鼠标左键不放,拖动到删除按钮位置上,如下:放开鼠标后,跳出一个图片按钮,如下:点击“确定” ,删除该精灵图片,相应资源从面板中消失。练 习:导入一个静态精灵和一个动画精灵到 FunCode 工程中,然后将它们删除。设计界面初步在软件中间是“场景预览”区域(以下简称为“场景区域” ) ,要在工程中实际使用的精 灵必须拖曳到该区域,如下图.。其中,红色箭头所指的暗绿色方框所包围的区域为游戏运 行时的可见区域 (以下简称为 “可见区域” ) 。 场景区域中方框以外区域在游戏运行时不可见, 称为“不可见区域” 。 只有拖放到场景区域中的精灵,代码才能进行控制。 用鼠标左键点击 “资源” 面板中的某个精灵图标不放, 然后拖曳到场景区域。 操作如下: Step 1: 鼠标左键点击某张精灵图标。Step 2:按住鼠标左键不放,拖到场景区域Step3:放开鼠标左键,精灵恢复实际大小。 Step 4:点击鼠标左键选中精灵不放,可以随意布置精灵的位置Step 5:鼠标左键点击下图红圈标识的 8 个节点,拖动鼠标可以放到和缩小精灵图片。 如果同时按照 shift 键,则可以保持精灵图片的长宽比不变。step6:改变精灵图片大小,使其刚好与游戏可见区域大小相等。step 7:在设计过程中,我们可以通过鼠标上的滚动滑轮,放大或缩小游戏可见区域, 从而方便界面设计。 缩 小放 大 step8:当界面设计涉及到多张图片时,直接在场景区域点击图片,容易点击到其他图 片,通过点击“精灵列表”中精灵的名称,也可以选中场景区域中的图片。练 习:将静态精灵中的两张图片拖到场景区域中,并按照上述操作步骤, 布置成如下场景。运行游戏软件菜单栏下方有一排菜单栏,其中有一个按钮为“运行游戏”按钮,如下图:点击该按钮,可运行该游戏。运行时,会跳出一个游戏窗口。如下图:其中 Lesson 是 游戏窗口的名称,后面我们会讲到如何修改游戏窗口的名称。练 习:将两个动画精灵,如右图,拖到场景区域中。其中黄色的鱼放在可见区域,蓝色的与放在不可见区域,并适当调整鱼的大小,如下图。运行程序,看看是什么 效果。 项目改进打开项目如果我们要使用已经创建好的实验项目,对应也有两种方式: 第一种、当打开 FunCode 出现如下界面:点击“打开”,跳出一个文件窗口,找到实验项目的文件夹。 第二种、当打开FunCode出现如下界面: 点击菜单“文件”-&“打开项目…”,如下图:跳出文件窗口,寻找实验项目的文件夹。 当在文件窗口中打开一个实验项目的文件夹后,文件夹的内容如下图。project.funProj 是工程文件,SourceCode目录包含实验项目的源代码,Bin目录包含游戏资源。选择project 文件打开,FunCode就打开相应的实验项目。练 习:关闭 FunCode,然后重新打开,找到 seafish 项目重新载入。给精灵起名称通过设置精灵属性,我们可以实现更多的界面设计效果。选中某个精灵,然后点击“编 辑”面板,可以设置精灵的属性。 点击选中场景区域中的某个精灵图片,展开“编辑”面板的“程序接口”栏,在“名称” 一框中给精灵取名。精灵名称只能用英文和数字,且不能用数字开头。如下:给精灵起名称有两个作用: 一、 用代码操作精灵时,需要用到精灵名称。这点我们在后续会详细讲述。 二、 当场景区域中有多个精灵时,通过鼠标点击的方式选择精灵就不太方便。当给精 灵起了名字后,该名字会出现在“精灵列表”面板中。通过点击列表中相应的名 称,也就相应选择了场景区域里的精灵。练 习:给蓝色的鱼取名为给对应的精灵取名为给对应的精灵取名为给对应的精灵取名为 rocksfront。 设置精灵的速度选择精灵 yellowfish,打开“编辑”面板,展开“物理”框,其中“速度”是用来设置 精灵 x 轴和 y 轴方向线性速度。如下图:这里, 我们了解一下 FunCode 的坐标知识。 FunCode 的可见区域的中心点位坐标原点(0, 0), X 坐标从左到右逐渐变大, Y 坐标从上到下逐渐变大。 角度按顺时针方向从 0 到 360 度。 如下图:因此,如果我们希望 yellowfish 斜向下游动,应该给该精灵的 x 轴和 y 轴方向速度均设 为正值。设置如下图:每次对场景区域中精灵进行修改,包括:删除精灵(选择该精灵,点击 Delete 键) ,修 改精灵属性,改变精灵大小等,应该点击工具栏中的“保存”按钮,然后再运行程序。练 习:选择 bluefish, 在 “编辑” 面板的 “基本属性” 框中的选中 “水平翻转” , 如右图 看看 bluefish 会如何变化? 让 bluefish 以 10 的速度,从右向左水平游动。 。设置精灵的层次当精灵被拖放到场景区域中,精灵的基本属性中,有个“层”的属性,缺省被设置为 0。 如右图: 。 场景区域中有多张图片重叠时, 先拖进场景区域的精灵放置在后面, 后拖进场景区域的 精灵放置在前面。如果我们想改变精灵的前后顺序,可以使用基本属性中后置/前置按钮。 如右图: 。将 yellowfish 和 bluefish 相互重叠,如下方左图。选择 bluefish,然后点击“后置” ,效 果如下方右图。更灵活的办法不同的精灵设置为不同的层。层数越大,精灵越显示在后方。比如,将 yellowfish 的层设为 0, bluefish 的层设为 5, 将两个精灵重合在一起, yellowfish 显示在前方, bluefish 显示在后方。如下图:练 习:要实现下方的效果,图层设置从后往前依次应该是 sea,rocksback,bluefish,rocksfront 和 yellowfish。设置完毕后运行程序,查看动画效果。 精灵与世界边界的碰撞FunCode提供了六个事件,用来实现复杂的游戏效果。精灵与世界边界的碰撞就是其中 之一。 选择bluefish,然后将鼠标停留在bluefish上,这时在bluefish上方会出现一排按 钮,如下图:其中,最后一个按钮是“更改此精灵的世界边界设置”,点击该按钮,场景区域发生 变化,如下图:深色被方框框中的区域就是bluefish的世界,带有8个矩形小节点的方框就是世界边 界。任何精灵的初始世界边界的正好与屏幕重合。用鼠标拖动那8个矩形小节点,可以改变 精灵的世界边界。给精灵设置好合适的世界边界后,按ESC键,场景区域又恢复原状,精灵 的新的世界边界就保存下来。 给精灵设置了世界边界以后,当精灵活动到它的世界边界时,FunCode就会发出一个 “精灵与世界边界碰撞”的事件。注意:当精灵的世界边界设置好以后,它是一个固定区 域,并不会随精灵的活动而移动。另外,精灵的世界边界必须比精灵图片本身大。 不过,精灵单有世界边界还不能起任何作用,我们还需要设置事件发生后的处理模 式。仍然选择bluefish,展开“编辑”模板中的“世界边界限制”框,如下图:限制模式的选项有六个,意义如下: OFF ―― 世界边界关闭。世界边界不起任何作用。 NULL ―― 当精灵碰到世界边界时,精灵的响应由用户的程序决定。我们在后续编 程时,主要使用这个选项。 CLAMP ―― 当精灵碰到世界边界时,精灵逐步停止下来。 BOUNCE ―― 当精灵碰到世界边界时,精灵以相同速度按相反方向游动 STICKY ―― 当精灵碰到世界边界时,精灵停在边界不动。在一般情况下,认为与 CLAMP选项的效果相同。 KILL ―― 当精灵碰到世界边界时,精灵被删除。 给bluefish选择STICKY选项,运行程序,看看游戏效果。练 习:改变bluefish的世界边界大小,分别比屏幕小或者比屏幕大,看看游戏运行效果。 给yellowfish设置世界边界,然后选择不同限制模式,看看游戏运行效果。精灵与精灵的碰撞精灵与精灵的碰撞也是FunCode提供的六个事件之一。比如:当两条鱼碰在一起,其中 较小的一条鱼消失,从而实现大鱼吃小鱼的游戏效果。这里就必须要用到精灵与精灵的碰 撞这个事件。 FunCode中,当一个精灵具有“发出碰撞”的属性,另外一个精灵具有“接受碰撞”的 属性,这两个精灵图片碰在一起时,就发出一个“精灵与精灵碰撞”事件。 选择yellowfish,打开“编辑”模板,展开“碰撞”框,把“发送碰撞”勾上,如右 图: 。选择bluefish,同样操作,但是把“接受碰撞”选上。说明:哪个是发送方,哪个是接受方,并不重要。只要其中一个是发送方,一个是接受方即可。 在以后的练习中,我们是通过程序代码来响应精灵与精灵碰撞事件,上面的处理就已 经够了。不过如果我们需要由FunCode来响应该事件,我们还需要将其中一个精灵设置为 “发送物理碰撞”,另外一个精灵设置为“接受物理碰撞”。该属性设置也在“碰撞”框 中。 最后,我们要给精灵设置物理碰撞响应。如下图:物理碰撞反应的选项有六个,意义如下: OFF ―― 关闭。物理碰撞不起任何作用。 CLAMP ―― 当该精灵与其他精灵碰撞时,该精灵渐渐停止不动。 BOUNCE ―― 当该精灵与其他精灵碰撞时,该精灵以相同速度按相反方向游动 STICKY ―― 当该精灵与其他精灵碰撞时,该精灵停止不动。在一般情况下,认为与 CLAMP选项的效果相同。 KILL ―― 当该精灵与其他精灵碰撞时,该精灵被删除。 RIGID ―― 当该精灵与其他精灵碰撞时,该精灵被刚性反弹。 CUSTOM ―― 当该精灵与其他精灵碰撞时,该精灵按原来的。 把yellowfish的物理碰撞反应设置为KILL,bluefish的设为STICKY,运行程序观看结 果。练 习:因为物理碰撞的最终效果,取决于两方精灵反应的叠加。随意设置两方精灵的碰撞反 应,看看碰撞的最终效果。导入地图模板点击“项目”菜单中的“导入地图模板”,如下:跳出一个对话框,点击其中一个名称,点击“导入到工程”按钮,可以直接将事先制 作好的游戏地图 (游戏界面) 导入到新工程中。使用该功能,可以最快速设计一个新游戏的 界面。如下:我们制作的游戏地图,通过点击“项目”菜单中的“保存地图为模板”保存到软件当 中,可供下次开发别的程序时,快速使用。 编写第一个小程序打开 VC++工程FunCode 支持 VC++ 6.0,2008 和 2010 三种版本编写 C 语言实验项目。有两种方式可以 打开实验项目对应的 VC++工程。 操作步骤如下: 1) 打开 FunCode,并打开相应的实验项目。这里,我们打开 seafish 项目。 2) 点击“项目”面板中的“创建 VC 工程”按钮,如下图。当我们创建 FunCode 项目 时,会相应选择一个 VC 工程版本(具体参考第一章第一节“创建第一个项目” ) 。 如果我们要使用 VC 版本与创建时一致,可以跳过这步。seafish 创建时,使用的是 VC++ 6.0。假设我们要创建 2010 版本,点击“VC2010”按 钮。跳出如下窗口,点击“确定”即可。3) 点击“项目”面板中的“设置启动 VC 工程” ,选择 6.0,2008 还是 2010 版本。第 一次使用时设置。以后只要不更换 VC 工程的版本,就无需在操作该步骤。说明: 在学校的机房中,学生机的硬盘都是写保护的。因此,电脑一旦重启,之前的设置 就作废了,必须重新设置。 4) 点击“项目”面板中的“启动 VC 工程” ,它会根据第三步中设置 VC 工程的版本, 用相应版本的 VC++打开工程代码文件。比如启动 VC 工程设置为 VC6.0,以后我 们每次打开 FunCode 后,只需要直接点击“启动 VC 工程” ,都能打开 VC6.0,从 而简化了操作步骤。文件的管理VC6.0 中“工作区”窗口是用来管理 VC++工程各种资源的,包括各种文件。窗口如下 图: 工作区底部有三个 tab 页, 点击 “FileView” , 该页面通过文件夹的形式来管理工程文件。 展开“Source Files” ,其中 Main.cpp 是 FunCode 事先创建好的,实验项目的程序框架(或初 始代码)就写在该文件中。 如果打开 VC6.0 没有看到工作区窗口,点击“查看”菜单中的“工作区” ,该窗口就会 出现在 VC 中。如下图:如果是 VC2008 或 2010, “工作区”改名为“解决方案资源管理器” , “FileView”也称 为为“解决方案资源管理器” ,其他则基本相同,如下方左图。 如果打开 VC2008 或 2010, “解决方案资源管理器”看不见,点击“视图”菜单的“解 决方案资源管理器” ,如下方右图。 代码文件的组成FunCode C 语言程序包含 2 个文件:Main.cpp 和 CommonAPI.h。其中,Main.cpp 文件 包含程序的主函数以及 6 个事件函数。CommonAPI.h 声明了 FunCode 的 C 语言 API 库。 Main.cpp文件顶部:#include &CommonAPI.h&这样,在该文件能够使用 FunCode 提供的 API。学习程序框架双击 Source Files 中的 Main.cpp 图标, 打开 Main.cpp 文件。 一个未经修改过的 Main.cpp 文件包含 3 个方面的代码。 1、预编译指令 在文件顶部有一句:#include “CommonAPI.h”。其中,CommonAPI.h 是个头文件,它包 含了 FunCode API 的函数声明,从而让用户可以直接调用 FunCode 事先预定义的一些函数, 这些函数提供了一系列对图形、 图像、 声音进行操作的功能, 从而简化用户开发游戏的难度。 这些预定义,从而方便程序员进行开发的函数又称为 API(Application Programming Interface 应用程序接口) 。 CommonAPI.h 文件路径如下,与使用什么版本的 VC 无关: \实验项目路径\SourceCode\Header 用记事本等编辑工具可以打开该文件,可查看所需 API 的函数声明和注释。 2、主函数 任何一个 C 语言程序都有一个主函数作为程序入口。FunCode 主函数名称为 WinMain, 名称虽然不叫 main,但作用是一样的。该函数的参数的具体含义我们不需要关心。 我们在后续章节中会做进一步了解主函数中的代码。 3、6 个事件函数 在主函数下方,定义了 6 个事件函数,分别是 dOnMouseMove , dOnMouseClick , dOnKeyDown,dOnKeyUp,dOnSpriteColSprite 和 dOnSpriteColWorldLimit。 其中, dOnSpriteColSprite 和 dOnSpriteColWorldLimit 分别对应精灵与精灵碰撞事件、 精 灵与世界边界碰撞事件。这两个事件,我们在“项目改进”一节中已经讲过。另外四个函数 分别对应鼠标滑动、鼠标点击、键盘按下、键盘弹起事件。主函数在 Main.cpp 文件中定义了 WinMain 函数,该函数是工程的主函数。其结构如下: int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {// 初始化游戏引擎1if( !dInitGameEngine( hInstance, lpCmdLine ) ) return 0;// To do : 在此使用 API 更改窗口标题dSetWindowTitle(&Lesson&);// 引擎主循环,处理屏幕图像刷新等工作2while( dEngineMainLoop() ) { float fTimeDelta };// 关闭游戏引擎3 dGetTimeDelta();// 获取两次调用之间的时间差,传递给游戏逻辑处理=4dShutdownGameEngine(); return 0; } 其中 1、调用 dInitGameEngine 函数初始化游戏引擎。如果失败,直接 return,程序不再执行。 因此,我们写的必须在该函数下方。只有游戏引擎启动以后,执行的代码才有意义。 2、 调用 dSetWindowTitle 函数用来修改游戏的名称, 只需要将 “Lesson” 中的字符修改, 就可以变成你想要的游戏的名称。本项目中,我们修改成“seafish” 3、游戏主循环。每循环一次,执行一次 dEngineMainLoop 函数。该函数的功能是运行 游戏引擎,刷新游戏屏幕,将最新结果展示在游戏屏幕上。此外,当发生鼠标移动、鼠标点 击 、键 盘按下 、键 盘弹起 、精 灵与精 灵碰撞 、精 灵与 世界边 界碰撞 这六 个事 件时, dEngineMainLoop 会调用相应的事件函数。这个我们在下一节会具体介绍。 游戏单线程的程序,比如游戏上有 100 辆坦克在移动,程序依次移动这 100 辆坦克,移 动完毕后,就刷新一次屏幕,也就是 while 循环执行一次。而不是我们感觉的多线程游戏, 100 辆坦克运动,就有一百个线程在并发执行。 4、当游戏运行时,dEngineMainLoop 函数始终返回一个 true 值,游戏一直在 while 循 环中运行。当我们关闭游戏屏幕时,dEngineMainLoop 返回 false 值,循环结束。然后执行 dShutGameEngine 函数做清理工作,并关闭游戏引擎,整个游戏结束。用代码让鱼游起来我们通过一个简单例子,来了解一下程序应该怎么写。 Step1: 创建一个 FunCode C 语言工程,导入一条鱼命名为“yellowfish” ,我们的目标,是让 yellowfish 从左向右以 10 个单位的速度水平游动。界面如下:Step2: 在 dSetWindowTitle 的上面或者下面添加以下语句: //设置 yellowfish 的 X 方向速度为 20,Y 方向速度为 0 dSetSpriteLinearVelocity(&yellowfish&, 20, 0); 该函数的意思是设置精灵的线性速度,在 CommonAPI.h 中可以查找到相关函数。 /* dSetSpriteLinearVelocity:设置精灵移动速度 * 参数 szName:精灵名字 * 参数 fVelX:X 方向速度 * 参数 fVelY:Y 方向速度 */ extern void dSetSpriteLinearVelocity( const char *szName, const float fVelX, const float fVelY ); Step3: :编译运行即可看到 yellowfish 以速度为 20 在 x 方向上运动。这样是不是很简单啊! 函数命名规则: 1、望文生义,通过函数名称了解函数功能; 2、函数名称中,除名称首字母外,每个单词的第一个字母要大写,便于识别。 FunCode API 的命名规则,以 dOnSpriteColSprite 为例说明: d: 前缀,表明是 FunCode 提供的函数。目的是避免与用户自定义的函数名称重复。 On:Windows 编程中,习惯用 On 表示“当某某事件发生” Sprite:精灵 Col:collision 的缩写,碰撞。 因此,该名称的含义的就是:当精灵与精灵发生碰撞事件发生。所有的 FunCode API 通过这种读法,都能从字面上了解函数的功能。通过单词首字母大写,虽然该名称由多个单 词组成,也能一眼识别。 变量命名规则: 在游戏设计中,变量的命名一般采用“匈牙利命名法” 。基本原则是: 变量名 = 属性 + 类型 + 对象描述。 常用的属性有: g_: 全局变量(global) c_: 常量(const) s_: 静态变量(static) 常用的类型: 浮点型(float) f 字符串(String) sz 其中 z 表示 zero,因为在 c 中任何字符串的结束标记为’\0’ 双精度浮点(double) d 字符(char) ch 整型(Integer) i 一些描述: 最大 Max 最小 Min 初始化 Init 临时变量 T(或 Temp) 源对象 Src 目的对象 Dest 举例说明: szName - 这个变量是用来保存精灵名称的,名称一般都用字符串来表示。sz就指明了 这个变量指向一个字符串,Name则说明他是一个名字。 iColSide - i表示integer,即整型,ColSide是描述部分,Collsion Side的缩写,表示 碰撞的边界,组合在一起表示: 该变量的类型为整型,它用来表示精灵与世界边界碰撞的 方位。 掌握上述命名规则, 可以增强我们的程序代码的可读性, 也会显得程序员更加的 “专业” , 希望同学们在以后的编程实践中逐步养成这种习惯。练 习:1、 让 yellowfish 水平从左往右游动; 2、 yellowfish 放置到屏幕右侧,头朝向左方,从右往左水平游动; 3、 yellowfish 放置到屏幕右上角,头朝向左方,向屏幕左下角游动。6 个事件函数主函数下方,定义了 6 个事件函数,分别是 dOnMouseMove 鼠标移动事件 dOnMouseClick 鼠标点击事件 dOnKeyDown 键盘按下事件 dOnKeyUp 键盘弹起事件 dOnSpriteColSprite 精灵与精灵碰撞事件 dOnSpriteColWorldLimit 精灵与世界边界碰撞事件 主函数执行游戏主循环时,dEngineMainLoop 函数会判断是否有这六个事件发生,如果 有就调用相应的事件函数。因此,要处理相应事件时,我们只需要把代码写在相应的事件函 数内容。当事件发生后,程序会调用并执行相应事件函数内的代码。键盘的按下事件当按下一个键盘时,dEngineMainLoop 调用 dOnKeyDown 函数。 实验要求 按下 D 键,鱼向右移动。 思路阐述 在 dOnKeyDown 函数中判断是否按下 D 键。如果是,给 yellowfish 设置一个向右的速 度,则 yellowfish 向右游动。 在 CommonAPI.h 中找到相应的键盘按下事件函数: /* dOnKeyDown:键盘被按下后将被调用的函数,可在此函数体里(Main.cpp)增加自己 * 的响应代码 * 参数 iKey:被按下的键,值见 enum KeyCodes 宏定义 * 参数 iAltPress, iShiftPress,iCtrlPress:键盘上的功能键 Alt,Ctrl,Shift 当前是否 * 也处于按下状态(0 未按下,1 按下) */ extern void dOnKeyDown( const int iKey, const int iAltPress, const int iShiftPress, const int iCtrlPress ); 代码详解 Step1: 将前面设置鱼的速度的语句屏蔽掉 //设置 yellowfish 的 X 方向速度为 20,Y 方向速度为 0 //dSetSpriteLinearVelocity(&yellowfish&, 20, 0); Step2: 在 Main.cpp 中 dOnKeyDown 事件函数中添加代码: if(KEY_D == iKey) { //当按下 D 键,设置 yellowfish 的 X 方向速度为 20,Y 方向速度为 0 dSetSpriteLinearVelocity(&yellowfish&, 20, 0); } Step3: 编译运行程序,当我们按下 D 键时,就可以看到黄鱼从左向右游动。 键盘的常量定义: 打开 CommonAPI.h,找到 enum KeyCodes,它定义了键盘上的按键对应的常量定义。 这里说明常用的按键及其命名规则 所有的按键都以 KEY_开头,然后跟上相应键所对应标识,常用的介绍如下: 英文字母与数字: 变量 键盘上的键 KEY_A A KEY_2 2 功能键: KEY_SPACE 空格键键盘的弹起事件按下的键盘松开时,产生键盘的弹起事件,程序调用 dOnKeyUp 函数。 实验要求 松开 D 键,鱼停止移动。 思路阐述 在 dOnKeyUp 函数判断松开的键是否是 D 键。如果是,给 yellowfish 设置为 0 的速度, 则 yellowfish 停止游动。 在 CommonAPI.h 中找到相应的键盘弹起事件函数: /* dOnKeyUp:键盘按键弹起后将被调用的函数,可在此函数体里(Main.cpp)增加自 * 己的响应代码 * 参数 iKey:弹起的键,值见 enum KeyCodes 宏定义 */ extern void dOnKeyUp( const int iKey ); 代码详解 Step1: 保持原来的代码不用改变; Step2: 在 Main.cpp 中的 dOnKeyUp 事件函数中添加代码: if(KEY_D == iKey) { //当弹起 D 键,设置 yellowfish 的 X 方向速度为 0,Y 方向速度为 0 dSetSpriteLinearVelocity(&yellowfish&, 0, 0); } Step3: 重新编译运行程序, 当我们按下D键的时候会看到鱼向右移动, 当松开时小鱼就停下了。鼠标的移动事件当移动鼠标时,dEngineMainLoop 调用 dOnMouseMove 函数。 实验要求 当鼠标移动到哪里,鱼跟着移动到哪里。 思路阐述 由于鼠标在游戏中一直都有一个坐标, 只要在 dOnMouseMove 函数中将 yellowfish 移向 鼠标坐标的位置,即可实现 yellowfish 跟着鼠标移动的效果。 在 CommonAPI.h 中找到相应的鼠标移动事件函数: /* dOnMouseMove:鼠标移动后将被调用的函数,可在此函数体里(Main.cpp)增加自 * 己的响应代码 * 参数 fMouseX, fMouseY:为鼠标当前坐标 */ extern void dOnMouseMove( const float fMouseX, const float fMouseY ); 精灵移动函数 /* dSpriteMoveTo:让精灵按照给定速度移动到给定坐标点 * 参数 szName:精灵名字 * 参数 fPosX:移动的目标 X 坐标值 * 参数 fPosY:移动的目标 Y 坐标值 * 参数 fSpeed:移动速度 * 参数 iAutoStop:移动到终点之后是否自动停止, 1 停止 0 不停止 */ extern void dSpriteMoveTo( const char *szName, const float fPosX, const float fPosY, const float fSpeed, const int iAutoStop ); 代码详解 Step1: 将键盘按下事件函数和鼠标弹起事件函数中设置 yellowfish 的语句屏蔽掉: /* if(KEY_D == iKey) * { * //当按下 D 键,设置 yellowfish 的 X 方向速度为 20,Y 方向速度为 0 * * dSetSpriteLinearVelocity(&yellowfish&, 20, 0); * } */ /* if(KEY_D == iKey) * { * //当弹起 D 键,设置 yellowfish 的 X 方向速度为 0,Y 方向速度为 0 * * dSetSpriteLinearVelocity(&yellowfish&, 0, 0); * } */ Step2: 在 Main.cpp 中的 dOnMouseMove 事件函数中添加代码: dSpriteMoveTo(“yellowfish”, fMouseX, fMouseY, 30, 1); Step3: 重新编译运行程序,即可以看到鼠标移动到哪里鱼就跟着在哪里。鼠标的点击事件当点击鼠标的时,dEngineMainLoop 调用 dOnMouseClick 函数 实验要求 当点击鼠标时,鱼消失。 思路阐述 在 dOnMouseClick 函数中将鱼精灵删除或者隐藏,都可以实现鱼消失。 在 CommonAPI.h 中找到相应的鼠标点击事件函数: // 参数 iMouseType:鼠标按键值,见 enum MouseTypes 定义 // 参数 fMouseX, fMouseY:为鼠标当前坐标 void CSystem::OnMouseClick( const int iMouseType, const float fMouseX, const float fMouseY ) { } 精灵显示函数: /* dSetSpriteVisible:设置精灵隐藏或者显示(可见不可见) * 参数 szName:精灵名字 * 参数 iVisible:1 可见 0 不可见 */ extern void dSetSpriteVisible( const char *szName, const int iVisible ); 精灵删除函数 /* dDeleteSprite:在地图中删除一个精灵 * 参数 szName:要删除的精灵名字 */ extern void dDeleteSprite( const char *szName ); 代码详解 Step1: 屏蔽前面的关于 yellowfish 设置的代码: //dSpriteMoveTo(“yellowfish”, fMouseX, fMouseY, 30, 1); Step2: 在 Main.cpp 中的 dOnMouseClick 中添加代码: dDeleteSprite( “yellowfish” ) ; //删除精灵 或者 dSetSpriteVisible( “yellowfish” , 0) ; //隐藏精灵 Step3: 重新编译运行,当我们点击鼠标时鱼消失。精灵与世界边界碰撞事件当鱼碰到世界边界时,dEngineMainLoop 调用 dOnSpriteColWorldLimit 函数。 实验要求 鱼开始以 10 的速度向右移动,碰到右世界边界时以同样的速度 10 返回。 思路阐述 先在 FunCode 中设置鱼精灵的世界边界, 并且把碰撞模式设为 WORLD_LIMIT_NULL, WORLD_LIMIT_NULL 表示精灵与世界边界碰撞之后的事情交由程序员来处理,系统不做 任何处理。 在 dOnSpriteColWorldLimit 函数中判断,碰到的边界是否为右边界。如果是,设定鱼的 速度为-10,并使于水平翻转。 在 CommonAPI.h 中找到相应精灵与世界边界碰撞事件函数: // 参数 szName:碰撞到边界的精灵名字 // 参数 iColSide:碰撞到的边界 0 左边,1 右边,2 上边,3 下边 void dOnSpriteColWorldLimit( const char *szName, const int iColSide ) { } 设置精灵的世界边界碰撞模式函数 /* dSetSpriteWorldLimitMode:设置精灵的世界边界碰撞模式 * 参数 szName:精灵名字 * 参数 Limit:碰撞到世界边界之后的响应模式,如果为 OFF,则是关闭世界边界碰 * 撞。其它值见 EWorldLimit */ extern void dSetSpriteWorldLimitMode( const char *szName, const EWorldLimit Limit ); 设置精灵水平翻转的模式 /* dSetSpriteFlipX:设置精灵图片 X 方向翻转显示 * 参数 szName:精灵名字 * 参数 iFlipX:1 翻转 0 不翻转(恢复原来朝向) */ extern void dSetSpriteFlipX( const char *szName, const int iFlipX ); 设置精灵的水平速度 /* dSetSpriteLinearVelocityX:设置精灵 X 方向移动速度 * 参数 szName:精灵名字 * 参数 fVelX:X 方向速度 */ extern void dSetSpriteLinearVelocityX( const char *szName, const float fVelX ); 代码详解 Step1: 屏蔽以前写过的代码: 在 Main.cpp 中的 dOnMouseClick 中屏蔽代码: //dDeleteSprite( “yellowfish” ) ; Main.cpp 中的 dOnMouseMove 事件函数中屏蔽代码: //dSpriteMoveTo(“yellowfish”, fMouseX, fMouseY, 30, 1); Step2: 在 dSetWindowTitle 函 数后初 始 化 yellowfish 碰 撞世 界边界的 模式,并且初 始化 yellowfish 的速度,代码如下: dSetSpriteLinearVelocity(&yellowfish&, 20, 0); //初始化 yellowfish 速度 并且在 dOnSpriteColWorldLimit 中添加代码: void dOnSpriteColWorldLimit( const char *szName, const int iColSide ) { if(iColSide == 1) //碰到右墙 { dSetSpriteFlipX(1); //设置水平翻转 dSetSpriteLinearVelocityX(“yellowfish”, -10); //设置速度为左方向 } else if(iColSide == 0) //碰到左墙 { dSetSpriteFlipX(0); //设置水平不翻转 dSetSpriteLinearVelocityX(“yellowfish”, 10); //将速度设为向右 } } Step3: :重新编译运行游戏,鱼开始向右移动,当碰到右世界边界即屏幕右方时鱼向左移动。精灵与精灵碰撞事件当两条鱼(一条发送碰撞,另外一条接收碰撞)碰在一起时,dEngineMainLoop 调用 dOnSpriteColSprite 函数。 实验要求 创建两条鱼,当两条鱼相互碰撞时,两条鱼同时停止。 思路阐述 重建一条蓝鱼 bluefish,两条鱼中,一条为发送碰撞,另一条为接收碰撞。新添加的 bluefish 从右向左移动,当两条鱼发生碰撞时,在 dOnSpriteColSprite 函数中设置两条鱼的速 度为 0。 函数定义 // 参数 szSrcName:发起碰撞的精灵名字 // 参数 szTarName:接受碰撞的精灵名字 void dOnSpriteColSprite( const char *szSrcName, const char *szTarName ) { } 界面设置 屏幕中放置两条鱼,其中蓝鱼的的基本属性中勾选“水平翻转” ,如下图:黄鱼的碰撞属性设为“发送碰撞” ,蓝鱼的碰撞属性设为“接受碰撞” ,如下图:最终界面如下:代码详解 Step1: 要在 yellowfish 速度初始化处初始化 bluefish 的速度: dSetSpriteLinearVelocityX(&yellowfish&, 20); dSetSpriteLinearVelocityX( “bluefish” , -10) ; Step2: 直接在 Main.cpp 中的 dOnSpriteColSprite 事件函数中添加代码: dSetSpriteLinearVelocityX(&yellowfish&, 0); dSetSpriteLinearVelocityX(&bluefish&, 0); Step3: 重新编译运行游戏, 黄鱼向右移动, 蓝鱼向左移动, 当他们发生碰撞时两条鱼同时停止。 到此处,FunCode 的六个事件函数还有基本入门操作已经完成。
02 FunCode C 实验教学指南_教学案例/设计_教学研究...在“练习 2”的基础上,实现球的斜向随机交换 实验...添加 Project01_Gunfire,拖入屏幕中并取名为”explode...FunCode C 开发常用 API C 语言标准库函数在实验中,我们需要用到一些 C 语言...02 FunCode C 实验教学指... 93页 1下载券
01 FunCode C 入门 35页 1下载...C语言课程设计_拼图游戏_工学_高等教育_教育专区。funcode C 语言课程设计--拼图游戏一、实验内容玩家通过鼠标单击相邻位有空位的方块来移动方块, 从而最终将一副...funcode C++课程设计_坦克大战_工学_高等教育_教育专区。课程设计一 坦克大战一...01 FunCode C 入门 35页 1下载券
10 C语言课程设计_坦克大... 17页 1下载...c语言程序设计_坦克大战(提高篇)(funcode环境) - C 语言课程设计--坦克大战 一、游戏介绍 玩家坦克与敌方坦克在街道中进行巷战, 玩家坦克被击中、 玩家指挥部被...C 语言课程设计--海底世界本实验主要用于 C 语言课程设计的教学讲解。可根据...一、FunCode 基础概念精 灵(Sprite) :游戏中所有图片都称为精灵,我们最主要...在这几天最令我感慨的就是团队的力量,三个人从零 基础到独立编写一个游戏,没...funcode 平台编一个小游戏,其间我们的 C 语言知识、程序思维能力等从理论阶段 ...图(一) 图(二) 二、实验指南实验一 开始实验【实验任务】 步骤一、打开 FunCode,创建一个的 C 语言项目; 步骤二、导入 Goldman 模板。 【实验思路】 按实验...C语言课程设计_桌球_工学_高等教育_教育专区。funcode程序实训C 语言课程设计--...百度认证-大数据营销01 优秀产品经理指南 DTCC2014:百分点内存数... 百度认证SEM...C 语言课程设计--打飞碟一、游戏介绍打飞碟游戏是玩家通过鼠标控制大炮发射炮弹...(const char *s1,const char * s2); FunCode API 函数原型 float dGetScreen...
All rights reserved Powered by
www.tceic.com
copyright &copyright 。文档资料库内容来自网络,如有侵犯请联系客服。}

我要回帖

更多关于 鼠标hs code 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信