进击系列2.0:进击的骑士-----用funcode与C语言实现射击游戏制作
funcode实现射击游戏----进击的骑士
相关程序:https://download.csdn.net/download/hidden_sword/86237168
制作软件funcode
funcode为一款可以进行二维游戏制作的软件,可以兼容vc++6.0及codeblocks等C语言编译器。funcode可实现动画制作,地图模板,撞击效果等等。
游戏介绍
这次游戏名称为《进击的骑士》,为2D横版游戏,其中功能实现为W,A,S,D控制人物移动,E键为切换攻击模式,初始模式是法术光球攻击,第二模式是近战攻击模式,会出现刀,具体详情可看B站地址:【FunCode自制明日方舟小游戏-哔哩哔哩】[https://b23.tv/hZ8m5C]
游戏截图
插入图片
部分图片
其中代码主要来源为爱给网(游戏素材),和游戏《明日方舟》的动画截图。
主函数代码
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片
.
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
#include "CommonAPI.h"
#include "LessonX.h"
#include "math.h"
#include "time.h"
//头文件
#pragma comment(lib,"WinMM.lib")//音乐函数头文件
float fSpeedUp = 0,fSpeedDown = 0,fSpeedLeft = 0,fSpeedRight = 0;//速度上,下,左,右
int o=0;//子弹参数
int p=0;//子弹参数
char mybullet[3],enemy1bullet[3];//子弹名称
int timea[5]= {1500,500,1000,1000,500};//敌人CD时间
void enemyattack1( );//敌人攻击函数
void enemymove1( );//敌人移动函数
void enemyattack0( );
void enemyattack2( );
void enemymove0( );
int life;//生命值
int lifeenemy1[3],lifeenemy0[5],lifeenemy2;//敌人生命值
int ya;//敌人死亡数
int fs;//场景模式
int fs1;//场景是否切换
int k=0;//子弹参数
int t;//特效是否隐藏
int ble;//速度参数
int l=0;//子弹参数
int a;//判断场景是否要初始化
///
//
// 主函数入口
//
//
int PASCAL WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{// 初始化游戏引擎if( !dInitGameEngine( hInstance, lpCmdLine ) )return 0;dSetWindowTitle("jin");strcpy(mybullet,"b2");//自己子弹名初始为b2strcpy(enemy1bullet,"b1");//敌人子弹名初始为b1ble=1;//速度除1t=0;dSetSpriteVisible("yan",t); //隐藏精灵dSetSpriteVisible("lei",0); //隐藏精灵dSetSpriteVisible("bin",0); //隐藏精灵dSetSpriteVisible("da",0);//隐藏精灵life=999;//生命999dSetTextValue("te1",life);//设置文字精灵值dSetTextValue("te2",20);a=0;//场景需要初始化for(int j=0; j<5; j++){lifeenemy0[j]=5;}for(int w=0; w<3; w++){lifeenemy1[w]=10;}lifeenemy2=20;//初始化敌人0,1,2生命值fs=-1;//模式初始为-1fs1=-1;PlaySound("game/data/audio/bgm.wav",NULL,SND_FILENAME|SND_ASYNC);//放音乐while( dEngineMainLoop() ){static int qw=1000,mo=1000;if(dIsSpriteVisible("lei")==1)//天雷特效存在期间生命按相应CD减少{if(qw<=0){life--;qw=1000;}else if(qw>0)qw--;}if(dIsSpriteVisible("bin")==1)//冰冻特效存在时间{if(mo<=0){dSetSpriteVisible("bin",0); //隐藏精灵mo=1000;}else if(mo>0)mo--;}ya=0;dSetTextValue("te1",life);dSetTextValue("te2",lifeenemy2);//文字精灵值随时变化float fTimeDelta = dGetTimeDelta();if(fs==-1)//开始界面{dSetSpritePosition("UP",-26.5,26.5);dSetSpritePosition("bac",0,0);dSetSpritePosition("down",28.5,26.5);//设置精灵位置}else if (fs==0)//第一关{if(a==0){strcpy(mybullet,"b2");//自己子弹初始为b2dSetSpritePosition("back",0,0);for(int i=0; i<5; i++)//生成敌人类型与坐标{char *enemy0 = dMakeSpriteName("enemy0",i);dCloneSprite("ene0",enemy0);float tmpY = dRandomRange(-30,30);float tmpX = dRandomRange(-40,40);dSetSpritePosition(enemy0,tmpX,tmpY);//坐标设置dSetSpriteLinearVelocity(enemy0, 0, 0);//速度设置}a=1;//取消初始化}enemyattack0( );//攻击enemymove0();//移动for(int i=0; i<5; i++){if (lifeenemy0[i]<=0)//删除死亡敌人与计算死亡数{char *enemy0 = dMakeSpriteName("enemy0",i);dDeleteSprite(enemy0);ya++;}}if(ya==5)//敌人死亡改变模式参数{fs=1;a=0;Sleep(1000);}}else if (fs==1)//第二关{if(a==0){dSetSpritePosition("back",100,100);dSetSpritePosition("b0",100,100);//移走旧有精灵dSetSpritePosition("back1",0,0);dSetSpritePosition("rj3",-34,18);dSetSpritePosition("rj2",27,-26);dSetSpritePosition("rj1",34,23);//放置新精灵for(int j=0; j<3; j++)//生成敌人{char *enemy1 = dMakeSpriteName("enemy1",j);dCloneSprite("ene1",enemy1);float tmpY = dRandomRange(-30,30);float tmpX = dRandomRange(-40,40);dSetSpritePosition(enemy1,tmpX,tmpY);//随机坐标设置dSetSpriteLinearVelocity(enemy1, 0, 0);//速度设置}a=1;}enemyattack1( );enemymove1();for(int j=0; j<3; j++){if (lifeenemy1[j]<=0){char *enemy1 = dMakeSpriteName("enemy1",j);dDeleteSprite(enemy1);ya++;}//删除已死亡敌人if(ya==3)//敌人死亡改变模式参数{fs=2;a=0;Sleep(1000);//暂停一秒钟}}}else if (fs==2)//第三关,boss关{if(a==0){for(int j=0; j<4; j++){char *qiang = dMakeSpriteName("qiang",j);dCloneSprite("qiang",qiang);}//场景中背景地图进行更换,熔浆特效移走,设置墙的位置dSetSpritePosition("back1",100,100);dSetSpritePosition("back2",0,0);dSetSpritePosition("rj3",100,100);dSetSpritePosition("rj2",100,100);dSetSpritePosition("rj1",100,100);dSetSpritePosition("qiang0",32,-15);dSetSpritePosition("qiang2",32,27);dSetSpritePosition("qiang1",-24,23);dSetSpritePosition("qiang3",-37,-18);//场景切换dSetSpriteVisible("lei",1);//boss第一技能天雷特效显现dSetSpritePosition("enemy2",0,0);dSetSpriteLinearVelocity("enemy2", 0, 0);//boss位置,速度设置dSetSpritePosition("me",-20,0);//我的放置a=1;}enemyattack2( );if (lifeenemy2<=0){dDeleteSprite("enemy2");//boss删除fs=-2;}}else if(fs==-2)//结束界面{//将墙,自己移走,放置结束界面与结束按板dSetSpritePosition("qiang0",100,100);dSetSpritePosition("qiang2",100,100);dSetSpritePosition("qiang1",100,100);dSetSpritePosition("qiang3",100,100);//场景切换dSetSpritePosition("me",100,100);PlaySound(NULL,NULL,SND_FILENAME);//音乐播放dSetSpritePosition("gameover",0,0);dSetSpritePosition("down",0,23.5);}// 执行游戏主循环GameMainLoop( fTimeDelta, life);if(life<=0)fs=-2;//人物死亡进入结束界面}dShutdownGameEngine();return 0;
}//==========================================================================
//
// 引擎捕捉鼠标移动消息后,将调用到本函数
// 参数 fMouseX, fMouseY:为鼠标当前坐标
//
void dOnMouseMove( const float fMouseX, const float fMouseY )
{// 可以在此添加游戏需要的响应函数OnMouseMove(fMouseX, fMouseY );dSetSpritePosition("c1", fMouseX, fMouseY); //特效跟随光标if(fs!=0){for(int j=0;j<k;j++){char *destbullet = dMakeSpriteName("enemybullet0",j);dDeleteSprite(destbullet);}//如果不是第一关删除第一关敌人技能特效}if(fs!=fs1)//判断模式是否改变{for(int j=0;j<l;j++){char *destbullet = dMakeSpriteName("mybulletdaojiw",j);dDeleteSprite(destbullet);//如果关卡改变删除自己残留技能特效}fs1=fs;}}
//==========================================================================
//
// 引擎捕捉鼠标点击消息后,将调用到本函数
// 参数 iMouseType:鼠标按键值,见 enum MouseTypes 定义
// 参数 fMouseX, fMouseY:为鼠标当前坐标
//
void dOnMouseClick( const int iMouseType, const float fMouseX, const float fMouseY )
{// 可以在此添加游戏需要的响应函数if(dIsPointInSprite("UP",fMouseX,fMouseY))//点击开始{Sleep(1000);dSetSpritePosition("UP",100,100);dSetSpritePosition("bac",100,100);dSetSpritePosition("down",100,100);fs=0;}//开始后精灵放置else if(dIsPointInSprite("down",fMouseX,fMouseY)) //点击结束{exit(0);}PlaySound("game/data/audio/biu.wav",NULL,SND_FILENAME|SND_ASYNC);//技能音效OnMouseClick(iMouseType, fMouseX, fMouseY);float tmpX=dGetSpritePositionX("me");float tmpY=dGetSpritePositionY("me");//自己位置float speedX=(fMouseX-tmpX)/sqrt((fMouseX-tmpX)*(fMouseX-tmpX)+(fMouseY-tmpY)*(fMouseY-tmpY));float speedY=(fMouseY-tmpY)/sqrt((fMouseX-tmpX)*(fMouseX-tmpX)+(fMouseY-tmpY)*(fMouseY-tmpY));//鼠标与自己相对距离//根据自己子弹的名称来改变攻击模式,远程法术攻击按鼠标方向,近战特效if(strcmp(mybullet,"b2")==0)//生成b2子弹位置,速度{char *destmybullet = dMakeSpriteName("mybullet",o);o++;dCloneSprite(mybullet,destmybullet);dSetSpritePosition(destmybullet,tmpX,tmpY);dSetSpriteLinearVelocity(destmybullet,30*speedX,30*speedY);}else if(strcmp(mybullet,"da")==0)//生成da子弹位置,方向{if(speedX>=0){char *destmybullet = dMakeSpriteName("mybulletdaojiw",l);l++;dCloneSprite("mybulletdaoji2",destmybullet);dSetSpritePosition(destmybullet,tmpX+12,tmpY);}else{char *destmybullet = dMakeSpriteName("mybulletdaojiw",l);l++;dCloneSprite("mybulletdaoji1",destmybullet);dSetSpritePosition(destmybullet,tmpX-12,tmpY);}}
}
//==========================================================================
//
// 引擎捕捉鼠标弹起消息后,将调用到本函数
// 参数 iMouseType:鼠标按键值,见 enum MouseTypes 定义
// 参数 fMouseX, fMouseY:为鼠标当前坐标
//
void dOnMouseUp( const int iMouseType, const float fMouseX, const float fMouseY )
{// 可以在此添加游戏需要的响应函数OnMouseUp(iMouseType, fMouseX, fMouseY);}
//==========================================================================
//
// 引擎捕捉键盘按下消息后,将调用到本函数
// 参数 iKey:被按下的键,值见 enum KeyCodes 宏定义
// 参数 iAltPress, iShiftPress,iCtrlPress:键盘上的功能键Alt,Ctrl,Shift当前是否也处于按下状态(0未按下,1按下)
//
void dOnKeyDown( const int iKey, const int iAltPress, const int iShiftPress, const int iCtrlPress )
{// 可以在此添加游戏需要的响应函数OnKeyDown(iKey, iAltPress, iShiftPress, iCtrlPress);//按下按钮后,W,A,S,D控制上下左右的速度值变化//E键为切换自己武器//空格键为进入狂暴状态switch(iKey)//按键{case KEY_W:fSpeedUp = -20.f;break;case KEY_A:fSpeedLeft = -20.f;break;case KEY_S:fSpeedDown = 20.f;break;case KEY_D:fSpeedRight = 20.f;//速度值break;case KEY_E://切换攻击模式if(strcmp(mybullet,"da")==0){strcpy(mybullet,"b2");dSetSpriteVisible("da",0);}else{strcpy(mybullet,"da");dSetSpriteVisible("da",1);}break;case KEY_SPACE://切换狂暴状态t=!t;dSetSpriteVisible("yan",t);break;}dSetSpriteLinearVelocity("me", (fSpeedLeft + fSpeedRight)/ble, (fSpeedUp + fSpeedDown)/ble);//速度改变if((fSpeedLeft + fSpeedRight) > 0){dSetSpriteFlipX("me", true);}else if((fSpeedLeft + fSpeedRight) < 0){dSetSpriteFlipX("me", false);//方向改变}}
//==========================================================================
//
// 引擎捕捉键盘弹起消息后,将调用到本函数
// 参数 iKey:弹起的键,值见 enum KeyCodes 宏定义
//
void dOnKeyUp( const int iKey )
{// 可以在此添加游戏需要的响应函数OnKeyUp(iKey);switch(iKey){case KEY_W:fSpeedUp = 0;break;case KEY_A:fSpeedLeft = 0;break;case KEY_S:fSpeedDown = 0;break;case KEY_D:fSpeedRight = 0;break;}//按键放下人物停止移动dSetSpriteLinearVelocity("me", fSpeedLeft + fSpeedRight, fSpeedUp + fSpeedDown);
}
//===========================================================================
//
// 引擎捕捉到精灵与精灵碰撞之后,调用此函数
// 精灵之间要产生碰撞,必须在编辑器或者代码里设置精灵发送及接受碰撞
// 参数 szSrcName:发起碰撞的精灵名字
// 参数 szTarName:被碰撞的精灵名字
//
void dOnSpriteColSprite( const char *szSrcName, const char *szTarName )
{// 可以在此添加游戏需要的响应函数OnSpriteColSprite(szSrcName, szTarName);int shang=0;//伤害数值if(strstr(szTarName,"qiang")!=NULL){dDeleteSprite(szSrcName);}//触碰到墙的子弹进行删除if(strstr(szSrcName,"mybullet")!=NULL){shang=1;}if(strstr(szSrcName,"mybulletdaoji")!=NULL){shang=3;}if(dIsSpriteVisible("yan")==1){shang*=3;}//法术攻击值为1,近战为3,狂暴模式下翻3倍if(strstr(szSrcName,"enemybullet")!=NULL)//判断敌人子弹与自己相遇{if(strstr(szSrcName,"enemybullet0")!=NULL){ble=2;dSetSpriteVisible("bin",1); }//碰到第一关的敌人的攻击触发冰冻效果if(strcmp(szTarName,"me")==0){life--;//生命减少if(strstr(szSrcName,"enemybullet0")==NULL)dDeleteSprite(szSrcName);}}else if(strstr(szSrcName,"mybullet")!=NULL)//判断自己子弹与三种敌人相遇{if(strstr(szTarName,"enemy1")!=NULL){if(strcmp(szTarName,"enemy11")==0){lifeenemy1[1]-=shang;//生命减少}else if(strcmp(szTarName,"enemy12")==0){lifeenemy1[2]-=shang;}else if(strcmp(szTarName,"enemy10")==0){lifeenemy1[0]-=shang;}}else if(strstr(szTarName,"enemy0")!=NULL){if(strcmp(szTarName,"enemy01")==0){lifeenemy0[1]-=shang;}else if(strcmp(szTarName,"enemy02")==0){lifeenemy0[2]-=shang;}else if(strcmp(szTarName,"enemy00")==0){lifeenemy0[0]-=shang;}else if(strcmp(szTarName,"enemy04")==0){lifeenemy0[4]-=shang;}else if(strcmp(szTarName,"enemy03")==0){lifeenemy0[3]-=shang;}}else if(strstr(szTarName,"enemy2")!=NULL){lifeenemy2-=shang;}if(strstr(szTarName,"enemy")!=NULL)dDeleteSprite(szSrcName);//删除自己碰到敌人的子弹}if(strstr(szSrcName,"rj")!=NULL)//场景中火焰柱攻击人物{if(strcmp(szTarName,"me")==0){life-=2;}}
}//===========================================================================
//
// 引擎捕捉到精灵与世界边界碰撞之后,调用此函数.
// 精灵之间要产生碰撞,必须在编辑器或者代码里设置精灵的世界边界限制
// 参数 szName:碰撞到边界的精灵名字
// 参数 iColSide:碰撞到的边界 0 左边,1 右边,2 上边,3 下边
//
void dOnSpriteColWorldLimit( const char *szName, const int iColSide )
{// 可以在此添加游戏需要的响应函数OnSpriteColWorldLimit(szName, iColSide);if(strstr(szName, "enemy") !=NULL)//敌人遇到世界边界反弹{if(iColSide == 0){dSetSpriteLinearVelocity(szName, 10, 0);dSetSpriteFlipX(szName,false);}else if(iColSide == 1){dSetSpriteLinearVelocity(szName, -10, 0);dSetSpriteFlipX(szName,true);}}}
void enemyattack1( )//第二关敌人攻击函数
{int timeam[3]= {1000,500,800};//技能CD默认值for(int i=0; i<3; i++){if(lifeenemy1[i]>0)//未死亡状态下{char *destbullet = dMakeSpriteName("enemybullet1",p);p++;char *enemy1 = dMakeSpriteName("enemy1",i);//子弹生成if(timea[i]<=0){float fMouseX=dGetSpritePositionX("me");float fMouseY=dGetSpritePositionY("me");float speedX;float speedY;dCloneSprite(enemy1bullet,destbullet);//复制子弹float tmpX=dGetSpritePositionX(enemy1);float tmpY=dGetSpritePositionY(enemy1);speedX=(fMouseX-tmpX)/sqrt((fMouseX-tmpX)*(fMouseX-tmpX)+(fMouseY-tmpY)*(fMouseY-tmpY));speedY=(fMouseY-tmpY)/sqrt((fMouseX-tmpX)*(fMouseX-tmpX)+(fMouseY-tmpY)*(fMouseY-tmpY));dSetSpriteRotation(destbullet,-speedX*180/3.14);dSetSpritePosition(destbullet,tmpX,tmpY);dSetSpriteLinearVelocity(destbullet,15*speedX,15*speedY);//子弹方向,位置,速度设置,使得子弹朝自己方向攻击,并且朝向始终对准自己timea[i]=timeam[i];}else if(timea[i]>0){timea[i]--;}}}
}
void enemymove1( )//第二关敌人移动函数
{for(int i=0; i<3; i++){char *enemy1 = dMakeSpriteName("enemy1",i);float fMouseX=dGetSpritePositionX("me");float fMouseY=dGetSpritePositionY("me");float tmpX=dGetSpritePositionX(enemy1);float tmpY=dGetSpritePositionY(enemy1);dSpriteMoveTo(enemy1, fMouseX, fMouseY, 5, 1);//敌人朝自己移动if((tmpX-fMouseX) > 0)dSetSpriteFlipX(enemy1, false);elsedSetSpriteFlipX(enemy1, true);//方向设置}
}
void enemyattack0( )//第一关敌人攻击函数
{int timeam[5]= {1000,500,800,500,1000};//技能CD默认值for(int i=0; i<5; i++){if(lifeenemy0[i]>0){char *enemy0 = dMakeSpriteName("enemy0",i);if(timea[i]<=0){float fMouseX=dGetSpritePositionX("me");float fMouseY=dGetSpritePositionY("me");float tmpX=dGetSpritePositionX(enemy0);float tmpY=dGetSpritePositionY(enemy0);float s=sqrt((fMouseX-tmpX)*(fMouseX-tmpX)+(fMouseY-tmpY)*(fMouseY-tmpY));if(s<=6){life--;char *bullet0 = dMakeSpriteName("enemybullet0",k);//子弹生成k++;dCloneSprite("enemybulletb0",bullet0);dSetSpritePosition(bullet0,fMouseX,fMouseY);//子弹方向,位置,速度设置//在距离小于等于6的情况下第一关敌人对人物触发攻击效果timea[i]=timeam[i];}}else if(timea[i]>0){timea[i]--;}}}
}
void enemymove0( )//第一关敌人移动函数
{for(int i=0; i<5; i++){char *enemy0 = dMakeSpriteName("enemy0",i);float fMouseX=dGetSpritePositionX("me");float fMouseY=dGetSpritePositionY("me");float tmpX=dGetSpritePositionX(enemy0);float tmpY=dGetSpritePositionY(enemy0);dSpriteMoveTo(enemy0, fMouseX, fMouseY, 5, 1);//敌人朝自己移动if((tmpX-fMouseX) > 0)dSetSpriteFlipX(enemy0, false);elsedSetSpriteFlipX(enemy0, true);//方向设置}
}
void enemyattack2( )//第三关敌人攻击函数
{int timeam[2]= {1500,500};//技能CD默认值if (timea[1]<=0){char *enemybullet2 = dMakeSpriteName("enemybullet2",p);//子弹生成p++;float fMouseX=dGetSpritePositionX("me");float fMouseY=dGetSpritePositionY("me");float speedX;float speedY;dCloneSprite("b3",enemybullet2);float tmpX=dGetSpritePositionX("enemy2");float tmpY=dGetSpritePositionY("enemy2");speedX=(fMouseX-tmpX)/sqrt((fMouseX-tmpX)*(fMouseX-tmpX)+(fMouseY-tmpY)*(fMouseY-tmpY));speedY=(fMouseY-tmpY)/sqrt((fMouseX-tmpX)*(fMouseX-tmpX)+(fMouseY-tmpY)*(fMouseY-tmpY));dSetSpritePosition(enemybullet2,tmpX,tmpY);dSetSpriteLinearVelocity(enemybullet2,15*speedX,15*speedY);//子弹方向,位置,速度设置//boss第二技能朝人物进行快速攻击timea[1]=timeam[1];}else{timea[1]--;}if(timea[0]<=0){for(int j=0; j<8; j++){char *enemybullet2 = dMakeSpriteName("enemybullet2di1",j);//子弹生成float speedX;float speedY;dCloneSprite("dici",enemybullet2);dSetSpritePosition(enemybullet2,0,0);}dSetSpriteLinearVelocity("enemybullet2di10",14,14);dSetSpriteLinearVelocity("enemybullet2di11",14,-14);dSetSpriteLinearVelocity("enemybullet2di12",-14,14);dSetSpriteLinearVelocity("enemybullet2di13",-14,-14);dSetSpriteLinearVelocity("enemybullet2di14",20,0);dSetSpriteLinearVelocity("enemybullet2di15",-20,0);dSetSpriteLinearVelocity("enemybullet2di16",0,20);dSetSpriteLinearVelocity("enemybullet2di17",0,-20);//子弹方向,位置,速度设置//boss第二技能向四周固定发射地刺timea[0]=timeam[0];}else{timea[0]--;}
}
游戏编写感想
用funcode编写游戏代码是学校的要求,而且只有三天(其实是两天),但是在此过程中,出现的bug和问题确实不是一般的多,时间上的压力也不是一般的大,但重要的是坚持,和团队合作,我很感谢我的队友的帮助与支持,这次编写游戏让我重拾相隔一个学期C语言,编写过程显得生疏,但编写完游戏后让我有种成就感与快乐,一种游戏从我和队友的手中完成。
进击系列2.0:进击的骑士-----用funcode与C语言实现射击游戏制作相关推荐
- python的pygame游戏开始结束信息_从0开始学python第14.8节-pygame射击游戏(一)
我们在pycharm里新建一个工程,起名字为star-wars.工程创建好后,我们新建一个src文件夹用来存放代码.接下来在src下创建Main.py,代码如下:import pygame from ...
- 【C++FunCode】基于Funcode使用C++语言编写小游戏(小鲨鱼历险记)
一.前言 大一暑假参加了山东省软件设计大赛,基于FunCode平台使用C++语言编写了大鱼吃小鱼游戏,其美名曰小鲨鱼历险记,哈哈.比赛成绩惨烈,只拿了一个省三,赛后也进行了分析总结,主要还是太不重视比 ...
- 怎样学习计算机动漫与游戏设计6,计算机动漫与游戏制作专业系列教材·动画设计软件应用:Flash CS6(第3版)...
<计算机动漫与游戏制作专业系列教材·动画设计软件应用:FlashCS6(第3版)>是计算机动漫与游戏制作专业系列教材,根据<中等职业学校计算机动漫与游戏制作专业教学标准>编写. ...
- STM32 基础系列教程 0 - CubeMX 下载与安装
前言 学习STM32CUBEMX工具的下载与安装,学会从st官网(www.st.com)查找与下载资料. 示例详解 STM32CUBEMX 下载 进入st官网(www.st.com),在官网的网页搜索 ...
- java 多线程 最优_Java多线程与并发系列从0到1全部合集,强烈建议收藏!
在过去的时间中,我写过Java多线程与并发的整个系列. 为了方便大家的阅读,也为了让知识更系统化,这里我单独把Java多线程与并发的整个系列一并罗列于此,希望对有用的人有用,也希望能帮助到更多的人. ...
- Java自动化测试系列[v1.0.0][TestNG测试开发环境配置]
基于之前写的一篇文章Java自动化测试系列[v1.0.0][Maven开发环境]的基础上,阐述如何配置单元测试框架TestNG的测试开发环境 创建Maven项目 启动IDEA,点击Create New ...
- Salesforce系列(0):Salesforce注册开发者账号!
Salesforce系列(0):Salesforce进行注册开发者账号! 前言 今天博主将为大家分享:Salesforce系列(0):Salesforce进行注册开发者账号!不喜勿喷,如有异议欢迎讨论 ...
- Salesforce系列(0):利用salesforce(sfdc)自带的IDE来编写并调试Apex类(入门级-调试篇)
Salesforce系列(0):利用salesforce(sfdc)自带的IDE来编写并调试Apex类(入门级-调试篇) 前言 今天博主将为大家分享:Salesforce系列(0):利用salesfo ...
- 【凯立德】2012最新凯立德春季版导航C-Car系列 V3.0 地图编号2821J0A
凯立德公司于2012年4月1日发布春季版C-Car系列 V3.0(地图编号2821J0A),该版本是基于C-Car版本研发而来的新一代车载专用导航系统.该产品配备了全新的3D城市功能,通过全景3D建筑 ...
- 蓝桥杯算法竞赛系列第0章——蓝桥必考点及标准模板库STL(上)(万字博文,建议抱走)
欢迎来到:遇见蓝桥遇见你,不负代码不负卿! 目录 一.蓝桥必考点剖析 二.什么是STL 三.vector的常见用法详解 1.vector的定义 2.vector容器内元素的访问 (1).通过下标访 ...
最新文章
- 获取当前元素在兄弟元素节点中的索引
- v-for中为什么要有key属性
- ubuntu16.04安装UR3/UR5/UR10机械臂的ROS驱动并实现gazebo下Moveit运动规划仿真以及真实UR3机械臂的运动控制(2)
- vue的数组如何存储数据
- leetcode 368. Largest Divisible Subset | 368. 最大整除子集(动态规划详解)
- 去掉WinLicense文件效验的方法
- python2中的unicode_在python 3和2中工作的Unicode文字
- 快速入门系列之 Rust 语言 GitChat连接
- arm-2009q1-203-arm-none-linux-gnueabi.bin执行错误解决
- 科普:Flutter应用打包、修改图标、修改启动页和app名字、加固后重新V1V2签名
- 判断char*是否为utf8编码
- 产品设计需求分析研究
- 共识算法 —— PoA
- 【密码资料】纳瓦霍密码
- 阿里云发布首台云电脑“无影”,传统 PC 已“末路”?
- textarea 只显示内容,禁止输入或编辑
- 图片 EXIF 问题
- oracle 批量列转行,oracle 批量列转行 逗号分隔
- VB数据库经典实例总结(一)
- go libp2p kad dht