DNF类游戏动作实现(C语言)

这篇具有很好参考价值的文章主要介绍了DNF类游戏动作实现(C语言)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

没有接触制作小游戏前,感觉做游戏很不可思议,游戏里的人物是怎么移动的,怎么攻击,释放技能。。。。。。现在逐渐了解到之后,发现2d游戏人物的动作更多是图片的拼接,动作是否精细,由这个动作的帧数决定。这篇博客会简单实现2d人物的动作,效果如下。

2d人物动作展示

想实现这个效果其实很简单,思路如下:
1.创建图形库程序

#include<graphics.h>
	initgraph(int宽, int高);
	closegraph();//关闭窗口


2.导入图片素材

将装图片素材的文件导入到程序的同一文件夹下,需要素材的小伙伴可以私信我

DNF类游戏动作实现(C语言)

 这是导入图片的步骤

给图片起一个名字
	IMAGE 图片名字;
加载图片
	loadimage(&图片名字,"图片路径",显示的宽,显示的高);
显示图片
	putimage(int x,int y,int w,int h,&图片名字,int xx,int yy);
	xx,yy表示在图片中取区域的起始位置
	w,h表示取的图片区域的大小
	x,y表示在图形界面显示的坐标

这里拿导入背景举例

#include<stdio.h>
#include<conio.h>//防止闪屏
#include<graphics.h>
int main()
{

	initgraph(1000, 650);
	IMAGE background;
	loadimage(&background, "Background\\background.bmp");
	putimage(0, 0, &background);
	_getch();
	closegraph();
	return 0;

}

DNF类游戏动作实现(C语言)

 导入人物需要用到透明贴图技术(原理大家可以自行搜索,这里就不写了)

        背景图:黑色实物

DNF类游戏动作实现(C语言)
        掩码图:白底黑洞

DNF类游戏动作实现(C语言)
    具体过程
        先贴掩码图 AND方式 SRCAND

        putimage(int x,int y,&图片名,SRCAND);


        再贴背景图 PAINT方式 SRCPAINT

      putimage(int x,int y,&图片名,SRCAND);

因为我们的图片是长条形的,我们只需要取一部分,这里取宽400px,高300px的第一部分

DNF类游戏动作实现(C语言)

 在上面背景图的代码中加入人物站立的代码,其中role.position控制人物的朝向

#include<stdio.h>
#include<conio.h>//防止闪屏
#include<graphics.h>
IMAGE background;
IMAGE standImg[2];//这里是2的原因是,我们人物需要左右各有一个站立的动作 背景图:0表示左边 1表示右边
IMAGE standImgY[2];//掩码图
struct actor {
	int x;
	int y;
	int position;//人物朝向
};
struct actor role = { 0,250,1 };

void loadResource()
{

	loadimage(&standImg[0], "Stand\\left.bmp");
	loadimage(&standImg[1], "Stand\\right.bmp");
	loadimage(&standImgY[0], "Stand\\lefty.bmp");
	loadimage(&standImgY[1], "Stand\\righty.bmp");
}

void drawRoleStand()
{
	putimage(0, 0, &background);
	putimage(role.x, role.y, 400, 300, &standImgY[role.position], 0, 0, SRCAND);
	putimage(role.x, role.y, 400, 300, &standImg[role.position], 0, 0, SRCPAINT);
}
int main()
{

	initgraph(1000, 650);

	loadimage(&background, "Background\\background.bmp");
	putimage(0, 0, &background);
	loadResource();
	drawRoleStand();
	_getch();
	closegraph();
	return 0;

}

DNF类游戏动作实现(C语言)

3.给图片做位移:左右移动,挥砍,跳跃这些动作其实都是图片变换,这里拿左右移动举例

加上这部分代码实现人物左右移动,其余动作都是同理,关键部分已经在代码中注释

IMAGE moveImg[2];
IMAGE moveImgY[2];

void loadResource()//加载左右移动图片
{

	loadimage(&moveImg[0], "Move\\left.bmp");
	loadimage(&moveImg[1], "Move\\right.bmp");
	loadimage(&moveImgY[0], "Move\\lefty.bmp");
	loadimage(&moveImgY[1], "Move\\righty.bmp");
}


void moveRole()//当role.position=0时,每次向左移动5像素 向右同理
{
	switch (role.position)
	{
	case 0:
			role.x -= 5;
		break;
	case 1:
		role.x += 5;

		break;

	}
}

void drawRoleMove(int zhenshu)//根据position的值向左或者向右移动 因为我们的图片有8帧,每次选图片中400*(i-1)px开始的位置
{
	for (int i = 0; i < zhenshu; i++)
	{
		BeginBatchDraw();//双缓冲绘图防止闪屏
		putimage(0, 0,  &background);
		putimage(role.x, role.y, 400, 300, &moveImgY[role.position], 400 * i, 0, SRCAND);
		putimage(role.x, role.y, 400, 300, &moveImg[role.position], 400 * i, 0, SRCPAINT);
		moveRole();
		Sleep(20);//设置延迟
		EndBatchDraw();//双缓冲绘图
	}
}



void keyDown()//这里输入键盘按键和程序交互
{
	char userKey = _getch();  //C语言的原本的函数是getch() VS对它做了优化
	switch (userKey)
	{

	case'A':
	case'a':
	case 75:
		role.position = 0;
		drawRoleMove(8);//drawRoleMove(8)里面8的原因是,我们move的图片素材有8帧
		printf("左");//为了程序思路更清楚,可以不要
		break;
	case'd':
	case'D':
	case 77:
		role.position = 1;
		drawRoleMove(8);
		printf("右");
		break;
	}
}
int main()
{

	initgraph(1000, 650);

	loadimage(&background, "Background\\background.bmp");
	putimage(0, 0, &background);
	loadResource();
	while (true)
	{
		drawRoleStand();
		keyDown();
	}
	_getch();
	closegraph();
	return 0;

}

 DNF类游戏动作实现(C语言)

 加上上面代码,人物实现左右移动

DNF类游戏动作实现(C语言)

剩余的跳跃,攻击......代码与移动基本无差(所以素材很重要,有素材基本就是换皮哈哈)

看到这的小伙伴记得点赞,收藏哦

下面附上完整代码,需要素材的小伙伴可以评论或者私信联系我文章来源地址https://www.toymoban.com/news/detail-444284.html

#include<stdio.h>
#include<conio.h>//防止闪屏
#include<graphics.h>
#include<easyx.h>
//数据设计-->基础知识+资源+游戏分析(角色的要素)
//透明贴图
IMAGE background;
IMAGE standImg[2];//背景图:0表示左边 1表示右边
IMAGE standImgY[2];
IMAGE moveImg[2];
IMAGE moveImgY[2];
IMAGE jumpImg[2];
IMAGE jumpImgY[2];
IMAGE jumpCut[2];
IMAGE jumpCutY[2];
IMAGE cutImg[2];
IMAGE cutImgY[2];
//角色属性
struct actor {
	int x;
	int y;
	int position;//人物朝向
};
//背景属性
struct bground

{
	int x;
	int y;
};
struct bground bgInfo = { 0,0 };
struct actor role = { 0,250,1 };
//初始化变量
void loadResource()
{
	//加载资源
	loadimage(&background, "Background\\background.bmp");//loadimage(&图片名字, "图片路径",1000,650); 加载图片
	loadimage(&standImg[0], "Stand\\left.bmp");
	loadimage(&standImg[1], "Stand\\right.bmp");
	loadimage(&standImgY[0], "Stand\\lefty.bmp");
	loadimage(&standImgY[1], "Stand\\righty.bmp");

	loadimage(&moveImg[0], "Move\\left.bmp");
	loadimage(&moveImg[1], "Move\\right.bmp");
	loadimage(&moveImgY[0], "Move\\lefty.bmp");
	loadimage(&moveImgY[1], "Move\\righty.bmp");

	loadimage(&jumpImg[0], "Jump\\left.bmp");
	loadimage(&jumpImg[1], "Jump\\right.bmp");
	loadimage(&jumpImgY[0], "Jump\\lefty.bmp");
	loadimage(&jumpImgY[1], "Jump\\righty.bmp");

	loadimage(&jumpCut[0], "JumpCut\\left.bmp");
	loadimage(&jumpCut[1], "JumpCut\\right.bmp");
	loadimage(&jumpCutY[0], "JumpCut\\lefty.bmp");
	loadimage(&jumpCutY[1], "JumpCut\\righty.bmp");

	loadimage(&cutImg[0], "Cut\\left.bmp");
	loadimage(&cutImg[1], "Cut\\right.bmp");
	loadimage(&cutImgY[0], "Cut\\lefty.bmp");
	loadimage(&cutImgY[1], "Cut\\righty.bmp");
}
//布局
void drawRoleStand()
{
	putimage(0, 0,1000,650, &background,bgInfo.x,bgInfo.y);
	putimage(role.x, role.y, 400, 300, &standImgY[role.position], 0,0,SRCAND);
	putimage(role.x, role.y, 400, 300, &standImg[role.position],0,0, SRCPAINT);
}
//逻辑-->用户逻辑

//根据人物方向做位移变化
void moveRole()
{
	switch (role.position)
	{
	case 0:
		if (role.x > -160)
		{
			role.x -= 5;
		}
		else
		{
			role.x = -160;
		}
		if (bgInfo.x > 0)
		{
			bgInfo.x -= 10;
		}
		else
		{
			bgInfo.x = 0;
		}
		break;
	case 1:
			role.x += 5;

			bgInfo.x += 10;

		break;

	}
}
//描述人物动作
void drawRoleMove(int zhenshu)
{
	for (int i = 0; i < zhenshu; i++)
	{
		BeginBatchDraw();
		putimage(0, 0, 1000, 650, &background, bgInfo.x, bgInfo.y);
		putimage(role.x, role.y, 400, 300, &moveImgY[role.position], 400*i, 0, SRCAND);
		putimage(role.x, role.y, 400, 300, &moveImg[role.position], 400*i, 0, SRCPAINT);
		moveRole();
		Sleep(20);
		EndBatchDraw();
	}
}
//跳跃
void drawRoleJump(int zhenshu)
{
	for (int i = 0; i < zhenshu; i++)
	{
		BeginBatchDraw();
		putimage(0, 0, 1000, 650, &background, bgInfo.x, bgInfo.y);
		putimage(role.x, role.y, 400, 300, &jumpImgY[role.position], 400 * i, 0, SRCAND);
		putimage(role.x, role.y, 400, 300, &jumpImg[role.position], 400 * i, 0, SRCPAINT);
		moveRole(); //跳跃时不做横向位移就不写这行
		Sleep(20);
		EndBatchDraw();
	}
}
void drawRoleCut(int franmeNum)
{
	for (int i = 0; i < franmeNum; i++)
	{
		BeginBatchDraw();
		putimage(0, 0, 1000, 650, &background, bgInfo.x, bgInfo.y);
		putimage(role.x, role.y, 400, 300, &cutImgY[role.position], 400 * i, 0, SRCAND);
		putimage(role.x, role.y, 400, 300, &cutImg[role.position], 400 * i, 0, SRCPAINT);
		moveRole();  //跳跃不做位移变化
		Sleep(50);
		EndBatchDraw();
	}
}
void drawRoleJumpCut(int frameNum)
{
	for (int i = 0; i < frameNum; i++)
	{
		BeginBatchDraw();
		putimage(0, 0, 1000, 650, &background, bgInfo.x, bgInfo.y);
		putimage(role.x, role.y, 400, 300, &jumpCutY[role.position], 400 * i, 0, SRCAND);
		putimage(role.x, role.y, 400, 300, &jumpCut[role.position], 400 * i, 0, SRCPAINT);
		moveRole();  //跳跃不做位移变化
		Sleep(50);
		EndBatchDraw();
	}
}
//操作游戏-->按键操作
//鼠标操作
void keyDown()
{
	char userKey = _getch();  //C语言的原本的函数是getch() VS对它做了优化
	switch (userKey)
	{

	case'A':
	case'a':
	case 75:
		role.position = 0;
		drawRoleMove(8);
		printf("左");
		break;
	case'd':
	case'D':
	case 77:
		role.position = 1;
		drawRoleMove(8);
		printf("右");
		break;
	case'j':
	case'J':
		drawRoleJumpCut(6);
		printf("跳砍");
		break;
	case'k':
		drawRoleCut(7);
		printf("跳砍");
		break;
	case' ':
		drawRoleJump(8);
		printf("跳");
		break;
	}
}
int main()
{
	loadResource();
	initgraph(1000, 650);
	while (true)
	{
		drawRoleStand();
		keyDown();
	}
	closegraph();
	return 0;
	
}

到了这里,关于DNF类游戏动作实现(C语言)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C】C语言实现三子棋小游戏

    今天带大家用C语言来实现我们的一个小游戏—— 三子棋 也是用我们之前所学的知识学实现一些有价值的东西。 在开始之前要跟大家声明一下我们这个项目需要三个文件: game.h —— 主要来声明和游戏相关的函数 game.c —— 主要来实现和游戏相关的函数 test.c —— 主函数所在

    2024年02月11日
    浏览(36)
  • C语言从零实现贪吃蛇小游戏

    制作不易,点赞关注一下呗!!! 文章目录 前言 一.  技术要点 二、 WIN32API介绍 三、 贪吃蛇游戏设计与分析         1.游戏开始前的初始化         2.游戏运行的逻辑  总结 当我们掌握链表这样的数据结构之后,我们就可以用它来做一些小项目,比如童年小游戏贪吃蛇

    2024年02月20日
    浏览(32)
  • 使用c语言与EASYX实现弹球小游戏

    eg1:小球碰到窗体的四个墙实现反弹效果 实现弹球小游戏的具体代码 使用c语言的库函数和控制台函数指针与结构体

    2024年02月08日
    浏览(28)
  • C语言之实现贪吃蛇小游戏篇(2)

    目录 🎇测试游戏test.c 🎇游戏头文件包含函数声明snake.h 🎇游戏实现snake.c 屏幕录制 2023-12-02 204515   ✔✔✔✔✔最后感谢大家的阅读,若有错误和不足,欢迎指正!乖乖敲代码哦!  代码---------→【唐棣棣 (TSQXG) - Gitee.com】 联系---------→【邮箱:2784139418@qq.com】

    2024年02月05日
    浏览(47)
  • 【C语言实现扫雷小游戏——可展开一片】

    学习完了函数和数组,让我们做个扫雷小游戏巩固一下所学的知识把! 使用控制台操作 通过菜单实现选择 棋盘为9×9 默认随机布置10个雷 排查雷 如果排查的位置不是雷,就显示周围有几个雷 排查位置是雷,游戏结束,玩家失败 把10个雷全部排除,游戏结束,玩家成功 扫雷

    2024年02月08日
    浏览(36)
  • C语言之扫雷小游戏的实现【含递归展开】

    扫雷游戏是1992年发行的一款大众类益智游戏,对于许多80后、90后来说都是童年的回忆。如今三十年过去了,这款游戏依旧受到很多网友的喜爱,今天我们一起来模拟实现一下扫雷游戏。 本文所用的编译器是VS2022 这里我们使用模块化设计,模块化设计就是把各个模块的代码分

    2024年02月02日
    浏览(33)
  • 小游戏贪吃蛇的实现之C语言版

    找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏:C语言 目录 游戏前期准备: 设置控制台相关的信息  GetStdHandle GetConsoleCursorInfo  SetConsoleCursorInfo SetConsoleCursorPosition GetAsyncKeyState 贪吃蛇游戏设计与分析  本地化 地图,食物

    2024年04月23日
    浏览(31)
  • C语言实现五子棋小游戏(内附源码)

    游戏中有人机,双人两种模式。五子棋作为一个平面游戏,很明显用二维数组来写最合适不过。为了让代码看起来更有条理,我们用三个.c文件,分别是:text.c 用来测试我们的游戏;game.c 游戏功能的实现;is_win.c 判断输赢的版块。另外,还有一个game.h 文件来放我们的函数声

    2024年02月09日
    浏览(35)
  • 带你实现初阶扫雷小游戏—【C语言】

      目录 1. 扫雷游戏实现的思路 注意点1  注意点2  2. 函数实现扫雷功能 2.1 初始化棋盘 2.2 显示棋盘 2.3 设置雷 2.4 排查雷 2.5 返回附近雷的个数 3.源码 3.1 game.h 3.2 game.c  3.3 test.c 我们这里拿9*9的棋盘(其中包含10个雷)来实现(这里也可以自定义棋盘大小和雷的个数 》我们这

    2024年02月05日
    浏览(86)
  • C语言小项目——小游戏贪吃蛇的实现

    我们可以使用 mode命令来设置控制台的大小,使用title命令来设置控制台标题。 在C语言中调用库函数 system来使用这些作用于控制台的命令 。使用代码如下: 采用该命令后控制台界面大概如下:   控制台坐标系以控制台左上角为原点从上往下y轴坐标增大,从左往右x轴坐标增

    2024年04月27日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包