ege如何让任务栏显示在游戏界面面下落出现

用c语言还有ege图形库能做出一个跳上一百层的游戏吗,,求解_百度知道
用c语言还有ege图形库能做出一个跳上一百层的游戏吗,,求解
我有更好的答案
直接到我的网盘下载吧!/s/1skl7nwL是我的C语言的作业,可以运行,是控制台界面的!
需要什么游戏呢?
为您推荐:
其他类似问题
c语言的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。EGE_1.2.3.2358_FULL
说明:&& sourceforge 上的 游戏引擎 值得学习(game engine on sourceforge worth learning)
文件列表:
v1.2.3.2358\EasyGameEngine\BuildShaders.bat
v1.2.3.2358\EasyGameEngine\EGE_Engine.android\jni\Android.mk
v1.2.3.2358\EasyGameEngine\EGE_Engine.android\jni\Application.mk
v1.2.3.2358\EasyGameEngine\EGE_Engine.sln
v1.2.3.2358\EasyGameEngine\EGE_Engine.xcworkspace\contents.xcworkspacedata
v1.2.3.2358\EasyGameEngine\Engine\EGEDatabase\EGEDatabase.rc
v1.2.3.2358\EasyGameEngine\Engine\EGEDatabase\EGEDatabase.vcxproj
v1.2.3.2358\EasyGameEngine\Engine\EGEDatabase\EGEDatabase.vcxproj.filters
v1.2.3.2358\EasyGameEngine\Engine\EGEDatabase\resource.h
v1.2.3.2358\EasyGameEngine\Engine\EGEEngine\EGEEngine.rc
v1.2.3.2358\EasyGameEngine\Engine\EGEEngine\EGEEngine.vcxproj
v1.2.3.2358\EasyGameEngine\Engine\EGEEngine\EGEEngine.vcxproj.filters
v1.2.3.2358\EasyGameEngine\Engine\EGEEngine\EGEEngine.xcodeproj\project.pbxproj
v1.2.3.2358\EasyGameEngine\Engine\EGEEngine\resource.h
v1.2.3.2358\EasyGameEngine\Engine\EGEGraphic\EGEGraphic.rc
v1.2.3.2358\EasyGameEngine\Engine\EGEGraphic\EGEGraphic.vcxproj
v1.2.3.2358\EasyGameEngine\Engine\EGEGraphic\EGEGraphic.vcxproj.filters
v1.2.3.2358\EasyGameEngine\Engine\EGEGraphic\EGEGraphic.xcodeproj\project.pbxproj
v1.2.3.2358\EasyGameEngine\Engine\EGEGraphic\resource.h
v1.2.3.2358\EasyGameEngine\Engine\EGEGUI\EGEGUI.rc
v1.2.3.2358\EasyGameEngine\Engine\EGEGUI\EGEGUI.vcxproj
v1.2.3.2358\EasyGameEngine\Engine\EGEGUI\EGEGUI.vcxproj.filters
v1.2.3.2358\EasyGameEngine\Engine\EGEGUI\resource.h
v1.2.3.2358\EasyGameEngine\Engine\EGEHelpDLL\EGEHelperDLL.rc
v1.2.3.2358\EasyGameEngine\Engine\EGEHelpDLL\EGEHelperDLL.vcxproj
v1.2.3.2358\EasyGameEngine\Engine\EGEHelpDLL\EGEHelperDLL.vcxproj.filters
v1.2.3.2358\EasyGameEngine\Engine\EGEHelpDLL\resource.h
v1.2.3.2358\EasyGameEngine\Engine\EGEInput\EGEInput.rc
v1.2.3.2358\EasyGameEngine\Engine\EGEInput\EGEInput.vcxproj
v1.2.3.2358\EasyGameEngine\Engine\EGEInput\EGEInput.vcxproj.filters
v1.2.3.2358\EasyGameEngine\Engine\EGEInput\resource.h
v1.2.3.2358\EasyGameEngine\Engine\EGENetwork\EGENetwork.rc
v1.2.3.2358\EasyGameEngine\Engine\EGENetwork\EGENetwork.vcxproj
v1.2.3.2358\EasyGameEngine\Engine\EGENetwork\EGENetwork.vcxproj.filters
v1.2.3.2358\EasyGameEngine\Engine\EGENetwork\resource.h
v1.2.3.2358\EasyGameEngine\Engine\EGEPhysx\EGEPhysx.rc
v1.2.3.2358\EasyGameEngine\Engine\EGEPhysx\EGEPhysx.vcxproj
v1.2.3.2358\EasyGameEngine\Engine\EGEPhysx\EGEPhysx.vcxproj.filters
v1.2.3.2358\EasyGameEngine\Engine\EGEPhysx\EGEPhysx.xcodeproj\project.pbxproj
v1.2.3.2358\EasyGameEngine\Engine\EGEPhysx\resource.h
v1.2.3.2358\EasyGameEngine\Engine\EGEPlatform\EGEPlatform.vcxproj
v1.2.3.2358\EasyGameEngine\Engine\EGEPlatform\EGEPlatform.vcxproj.filters
v1.2.3.2358\EasyGameEngine\Engine\EGEPlatform\EGEPlatform.xcodeproj\project.pbxproj
v1.2.3.2358\EasyGameEngine\Engine\EGEScript\EGEScript.rc
v1.2.3.2358\EasyGameEngine\Engine\EGEScript\EGEScript.vcxproj
v1.2.3.2358\EasyGameEngine\Engine\EGEScript\EGEScript.vcxproj.filters
v1.2.3.2358\EasyGameEngine\Engine\EGEScript\resource.h
v1.2.3.2358\EasyGameEngine\Engine\EGESound\EGESound.rc
v1.2.3.2358\EasyGameEngine\Engine\EGESound\EGESound.vcxproj
v1.2.3.2358\EasyGameEngine\Engine\EGESound\EGESound.vcxproj.filters
v1.2.3.2358\EasyGameEngine\Engine\EGESound\resource.h
v1.2.3.2358\EasyGameEngine\Engine\EGEStorage\EGEStorage.rc
v1.2.3.2358\EasyGameEngine\Engine\EGEStorage\EGEStorage.vcxproj
v1.2.3.2358\EasyGameEngine\Engine\EGEStorage\EGEStorage.vcxproj.filters
v1.2.3.2358\EasyGameEngine\Engine\EGEStorage\EGEStorage.xcodeproj\project.pbxproj
v1.2.3.2358\EasyGameEngine\Engine\EGEStorage\resource.h
v1.2.3.2358\EasyGameEngine\Engine\Win32_Dll_Debug.props
v1.2.3.2358\EasyGameEngine\Engine\Win32_Dll_Release.props
v1.2.3.2358\EasyGameEngine\Engine\Win32_Lib_Debug.props
v1.2.3.2358\EasyGameEngine\Engine\Win32_Lib_Release.props
v1.2.3.2358\EasyGameEngine\Include\EasyGameEngine.h
v1.2.3.2358\EasyGameEngine\Include\EGE_Always.h
v1.2.3.2358\EasyGameEngine\Include\EGE_Config.h
v1.2.3.2358\EasyGameEngine\Include\EGE_DllEntry.h
v1.2.3.2358\EasyGameEngine\Include\EGE_Engine.h
v1.2.3.2358\EasyGameEngine\Include\EGE_Enums.h
v1.2.3.2358\EasyGameEngine\Include\EGE_Events.h
v1.2.3.2358\EasyGameEngine\Include\EGE_Memory.h
v1.2.3.2358\EasyGameEngine\Include\EGE_Messages.h
v1.2.3.2358\EasyGameEngine\Include\EGE_Platform.h
v1.2.3.2358\EasyGameEngine\Include\EGE_Structs.h
v1.2.3.2358\EasyGameEngine\Include\EGE_Template.h
v1.2.3.2358\EasyGameEngine\Include\EGE_Typedef.h
v1.2.3.2358\EasyGameEngine\Include\Interface\Engine\Allocator\IAllocator.h
v1.2.3.2358\EasyGameEngine\Include\Interface\Engine\Application\IAppDelegate.h
v1.2.3.2358\EasyGameEngine\Include\Interface\Engine\Application\IApplication.h
v1.2.3.2358\EasyGameEngine\Include\Interface\Engine\Application\IConsoleApp.h
v1.2.3.2358\EasyGameEngine\Include\Interface\Engine\Application\IConsoleAppDelegate.h
v1.2.3.2358\EasyGameEngine\Include\Interface\Engine\Application\IViewBasedApp.h
v1.2.3.2358\EasyGameEngine\Include\Interface\Engine\Application\IViewBasedAppDelegate.h
v1.2.3.2358\EasyGameEngine\Include\Interface\Engine\Compression\ICompressionDecoder.h
v1.2.3.2358\EasyGameEngine\Include\Interface\Engine\Compression\ICompressionEncoder.h
v1.2.3.2358\EasyGameEngine\Include\Interface\Engine\Device\IDeviceObject.h
v1.2.3.2358\EasyGameEngine\Include\Interface\Engine\Device\IDeviceObjectIterator.h
v1.2.3.2358\EasyGameEngine\Include\Interface\Engine\FileParser\IBaseFile.h
v1.2.3.2358\EasyGameEngine\Include\Interface\Engine\FileParser\IBinaryFile.h
v1.2.3.2358\EasyGameEngine\Include\Interface\Engine\FileParser\IBMPFile.h
v1.2.3.2358\EasyGameEngine\Include\Interface\Engine\FileParser\IDDSFile.h
v1.2.3.2358\EasyGameEngine\Include\Interface\Engine\FileParser\IGLSLFile.h
v1.2.3.2358\EasyGameEngine\Include\Interface\Engine\FileParser\IHashFile.h
v1.2.3.2358\EasyGameEngine\Include\Interface\Engine\FileParser\IImageFile.h
v1.2.3.2358\EasyGameEngine\Include\Interface\Engine\FileParser\IJPGFile.h
v1.2.3.2358\EasyGameEngine\Include\Interface\Engine\FileParser\IJSONFile.h
v1.2.3.2358\EasyGameEngine\Include\Interface\Engine\FileParser\IManifestFile.h
v1.2.3.2358\EasyGameEngine\Include\Interface\Engine\FileParser\IMetaUIFile.h
v1.2.3.2358\EasyGameEngine\Include\Interface\Engine\FileParser\IPackageFile.h
v1.2.3.2358\EasyGameEngine\Include\Interface\Engine\FileParser\IPNGFile.h
v1.2.3.2358\EasyGameEngine\Include\Interface\Engine\FileParser\IPSDFile.h
v1.2.3.2358\EasyGameEngine\Include\Interface\Engine\FileParser\IShaderFile.h
v1.2.3.2358\EasyGameEngine\Include\Interface\Engine\FileParser\ITXTFile.h
近期下载者:
相关文件: 上传我的文档
 下载
 收藏
粉丝量:279
所发布文档来源于互联网和个人收集,仅用于分享交流使用,版权为原作者所有。如有侵犯您的版权,请来邮件联系,我将立即删除相关资料.如有其它问题也欢迎与本人联系,谢谢!
 下载此文档
正在努力加载中...
下载积分:800
内容提示:ege
文档格式:PDF|
浏览次数:191|
上传日期: 20:00:39|
文档星级:
全文阅读已结束,如果下载本文需要使用
 800 积分
下载此文档
该用户还上传了这些文档
关注微信公众号C/C++用EGE简单实现别踩白块游戏 - 简书
C/C++用EGE简单实现别踩白块游戏
本项目已开源:
介绍:EGE(Easy Graphics Engine),是windows下的简易绘图库,是一个类似BGI(graphics.h)的面向C/C++语言新手的图形库,它的目标也是为了替代TC的BGI库而存在。
安装方法二
#include &graphics.h&
int main()
//初始化为640*480大小
initgraph(640, 480);
//等待用户按键
//关闭图形界面
closegraph();
别踩白块 -准备篇
开始之前先介绍一下相关点。
本篇文章假定你已经准备好游戏每个按键对应的音频文件和游戏关卡的歌词按键谱。
setinitmode(RENDER_MANUAL);
//设置窗口模式
这个函数用于设置初始化图形的选项和模式。
void setinitmode(int mode, int x = CW_USEDEFAULT, int y = CW_USEDEFAULT);
初始化模式,是二进制组合的值。如果为INIT_DEFAULT 表示使用默认值。
可以使用的值的组合:
INIT_NOBORDER 为无边框窗口
INIT_CHILD 为子窗口(需要使用attachHWND指定要依附的父窗口,此函数不另说明)
INIT_TOPMOST 使窗口总在最前
INIT_RENDERMANUAL 手动更新标志,即调用delay_fps/delay_ms等会等待操作的函数时会更新窗口,否则保持窗口内容
INIT_WITHLOGO 使initgraph的时候显示开场动画logo
INIT_NOFORCEEXIT 使关闭窗口的时候不强制退出程序,但窗口会消失,需要配合is_run函数
INIT_DEFAULT 默认参数,不调用本函数时即使用此参数
INIT_ANIMATION 是INIT_DEFAULT, INIT_RENDERMANUAL, INIT_NOFORCEEXIT的组合,用于动画编写
初始化时窗口左上角在屏幕的坐标,默认为系统分配。
本函数只能在initgraph前调用。
initgraph(WINDOW_WIDTH, WINDOW_HIGHT, INIT_RENDERMANUAL); //初始化窗口
这个函数用于初始化绘图环境。
void initgraph(
int Width,
int Height,
int Flag = INIT_DEFAULT
void initgraph(
int* gdriver,
int* gmode,
char* path
); // 兼容 Borland C++ 3.1 的重载,不建议使用。
绘图环境的宽度。如果为-1,则使用屏幕的宽度
绘图环境的高度。如果为-1,则使用屏幕的高度
请留空,为保留参数
setbkcolor(EGERGB(0xff, 0xff, 0xff)); //背景色
这个函数用于设置当前背景色。并且会把当前图片上是原背景色的像素,转变为新的背景色。
color_t color,
PIMAGE pimg = NULL
指定要设置的背景颜色。注意,该设置会同时影响文字背景色。
setfillstyle(SOLID_FILL, Blank_COLOR);
//设置方块颜色
这个函数用于设置当前填充类型。该函数的自定义填充部分尚不支持。
int pattern,
color_t color,
PIMAGE pimg = NULL
填充类型,可以是以下宏或值:
NULL_FILL 不填充
SOLID_FILL 固实填充
填充颜色。
fillpoly(4, point, totalimg); //绘制方块
这个函数用于画填充的多边形。边线颜色由setcolor函数决定,填充颜色由setfillstyle函数决定
int numpoints,
const int *polypoints,
PIMAGE pimg = NULL
多边形点的个数。
polypoints
每个点的坐标,数组元素个数为 numpoints * 2。
该函数会自动连接多边形首尾。
setfont(40, 0, "宋体");
//设定字体样式
这个函数用于设置当前字体样式。
void setfont(
int nHeight,
int nWidth,
LPCSTR lpszFace,
PIMAGE pimg = NULL
void setfont(
int nHeight,
int nWidth,
LPCSTR lpszFace,
int nEscapement,
int nOrientation,
int nWeight,
bool bItalic,
bool bUnderline,
bool bStrikeOut,
PIMAGE pimg = NULL
void setfont(
int nHeight,
int nWidth,
LPCSTR lpszFace,
int nEscapement,
int nOrientation,
int nWeight,
bool bItalic,
bool bUnderline,
bool bStrikeOut,
BYTE fbCharSet,
BYTE fbOutPrecision,
BYTE fbClipPrecision,
BYTE fbQuality,
BYTE fbPitchAndFamily,
PIMAGE pimg = NULL
void setfont(
const LOGFONT *font,
PIMAGE pimg = NULL
sprintf(mCharsScore, "%d", mScore);
//int转char*
setfontbkcolor(EGERGB(0xff, 0x00, 0x00)); //设置字体背景色
outtextxy(WINDOW_WIDTH / 2, 0, mCharsScore);
//在窗口输出字体
这个函数用于在指定位置输出字符串。
void outtextxy(
LPCSTR textstring,
PIMAGE pimg = NULL
void outtextxy(
PIMAGE pimg = NULL
void outtextxy(
LPCWSTR textstring,
PIMAGE pimg = NULL
void outtextxy(
PIMAGE pimg = NULL
字符串输出时头字母的 x 轴的坐标值
字符串输出时头字母的 y 轴的坐标值。
textstring
要输出的字符串的指针。
要输出的字符。
cleardevice();
setcaption("别踩白块");
//设置窗口标题
时间和随机数
api_sleep(500);
//传入参数为延时多少毫秒,注意只有该函数可在线程中使用
delay_fps(FPS)
//根据FPS设置延迟
randomize();
//初始化随机数
random(max);
//产生[0,max)的随机数,注意不包括最大值
mp3音频播放
filename 为要播放的文件的路径名
方法一:mciSendString
mciSendString(filename, NULL, 0, NULL); //低效播放方式
方法二:mciSendCommand
//高效率无阻塞播放
ThreadParameter *tp = (ThreadParameter *)pP
MCI_OPEN_PARMS//定义打开结构体变量
open.lpstrElementName =//填充参数
mciSendCommand(0, MCI_OPEN, MCI_OPEN_ELEMENT, DWORD_PTR(&open));//打开
MCI_PLAY_PARMS//定义播放结构题变量
mciSendCommand(open.wDeviceID, MCI_PLAY, 0, DWORD_PTR(&play));//非阻塞式播放
typedef struct ThreadParameter {
//音频播放线程参数
char filename[200];
char key[30];
//音频播放线程传参结构体&全局变量&
DWORD WINAPI music_play(LPVOID pParam)
//播放音乐
//高效率无阻塞播放
ThreadParameter *tp = (ThreadParameter *)pP
MCI_OPEN_PARMS//定义打开结构体变量
open.lpstrElementName = tp-&//填充参数
mciSendCommand(0, MCI_OPEN, MCI_OPEN_ELEMENT, DWORD_PTR(&open));//打开
MCI_PLAY_PARMS//定义播放结构题变量
mciSendCommand(open.wDeviceID, MCI_PLAY, 0, DWORD_PTR(&play));//非阻塞式播放
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)music_play, &tpp, 0, NULL);
//启动音乐播放线程
解释如下:
结构体是用来传参数的,线程函数返回值类型必须为DWORD WINAPI,函数参数必须为LPVOID 类型。形式如下:
DWORD WINAPI ==functionName==(LPVOID pParam){}
启动函数第四个参数传入传参结构体指针,此处为&tpp。形式如下:
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)==functionName==, &tpp, 0, NULL);
//启动音乐播放线程
FILE *fp = NULL;
fp = fopen(filename, "r");
//filename为要打开的文件路径
无回显读取按键
//返回值为按下的键对应ASII码
别踩白块 -启程
我已经准备好每个按键的音频文件和每个关卡对应音乐的键谱了,相关定义如下
#define Path_Music_resPiano "..//resplus//piano"
//载入键音
#define Path_Music_Fail "..//resplus//fail.mp3"
#define Path_Music_Launch "..//resplus//chuanshao.mp3"
#define Path_pre "..//resplus//piano//" //音频路径前缀
#define Path_end ".mp3" //音频路径后缀
//每个关卡对应键谱
char Path_A_Breeze_From_Alabama[] = "..//resplus//A Breeze From Alabama.txt";
char Path_Happy_New_Year[] = "..//resplus//Happy New Year.txt";
char Path_Jasmine[] = "..//resplus//Jasmine.txt";
char Path_Little_Star[] = "..//resplus//Little Star.txt";
char Path_lyricwaltz[] = "..//resplus//lyricwaltz.txt";
char Path_Merry_Christmas[] = "..//resplus//Merry Christmas.txt";
整体思路(这可能是最简便的方法了)
启动时读入相关的音乐键谱,记录总按键数
别踩白块可看成竖向的四条平行轨道
根据总按键数创建一个尺寸为 窗口宽度(按键数黑块高度)的PIMAGE对象(此处代称总画布)
生成1到4的随机数,对应的数为所在的轨道。并且记录随机数,为后面评判做准备
按照所在轨道在总画布上错位绘制黑块
游戏启动后,使总画布左下角定点与窗口(0,0)顶点对齐
使总画布在可见区域由底向上绘制,并记录下移坐标。
根据下移的坐标除以黑块的高度可确定是哪个方块
根据按键以及之前的随机数数组即答案来计分
下面代码已有注解
int main()
//--------播放启动音乐----------begin
strcpy(tp.filename, Path_Music_Launch);
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)music_play, &tp, 0, NULL);
//--------播放启动音乐----------end
//------------初始化------------begin
setinitmode(RENDER_MANUAL);
initgraph(WINDOW_WIDTH, WINDOW_HIGHT, INIT_RENDERMANUAL);
//初始化窗口
strcpy(Path_Music, Path_Jasmine);
//默认关卡
//------------初始化------------end
//----------选择关卡------------begin
setfont(20, 0, "宋体");
outtextxy(10, 10, "按下对应字母进入关卡");
outtextxy(10, 35, "A:
A Breeze From Alabama");
outtextxy(10, 55, "B:
outtextxy(10, 75, "C:
Happy New Year");
outtextxy(10, 95, "D:
Little Star");
outtextxy(10, 115, "E:
lyricwaltz");
outtextxy(10, 135, "F:
Merry Christmas");
switch (getch())
strcpy(Path_Music, Path_A_Breeze_From_Alabama);
strcpy(Path_Music, Path_Jasmine);
strcpy(Path_Music, Path_Happy_New_Year);
strcpy(Path_Music, Path_Little_Star);
strcpy(Path_Music, Path_lyricwaltz);
strcpy(Path_Music, Path_Merry_Christmas);
//----------选择关卡------------end
initFile(); //读入相关文件
creatView();
//创建地图
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)GameControl, NULL, 0, NULL);
//启动键盘控制线程
GameView(); //绘图
//防止游戏结束后退出
键谱文件中的内容(片段供参考)
d2 d2 #f2 e2 a1 #c2 e2 d2 d (#f.a) (#f.a) d (#f.a) (#f.a) d (#f.a) (#f.a) A-1 (e.g) (e.g)
对应的音频文件名为黄色部分
==d2== ==d== (==#f==.==a==)
char track[1024][12];
int mLength = 0;
void initFile() //初始化文件资源
FILE *fp = NULL;
fp = fopen(Path_Music, "r");
if (fp != NULL)
while (fscanf(fp, "%s", track[mLength]) != EOF)
//读入所有键
mLength++;
fclose(fp);
从文件中读入每个按键的标识码存到数组track中,并记录有多少个键存到变量mLength中。
绘制总画布
根据总按键数创建一个尺寸为窗口宽度(按键数黑块高度)的PIMAGE对象。生成1到4的随机数,对应的数为所在的轨道。按照所在轨道在总画布上错位绘制黑块
//总画布存储对象 &全局变量&
int randtrack[3000] = { -1000 };
//存轨道的随机数
void creatView()
int point[8];
//四边形点集
int x = 0, y = 0;
//基定点坐标
randomize();
//初始化随机数
totalimg = newimage(WINDOW_WIDTH, Blank_HIGHT*mLength); //初始化总画布
setbkcolor(COLOR_WHITE, totalimg);
//设置总画布背景
cleardevice(totalimg);
//清空总画布
for (int i = 0; i & mL i++)
randtrack[i] = random(4) + 1;
//参数0-3的随机数,加一后为轨道位置
y = inter_y;
x = (randtrack[i] - 1) * Blank_WIDTH;
point[0] =
point[1] =
point[2] = x + Blank_WIDTH;
point[3] =
point[4] = x + Blank_WIDTH;
point[5] = y + Blank_HIGHT;
point[6] =
point[7] = y + Blank_HIGHT;
setfillstyle(SOLID_FILL, Blank_COLOR);
//设置方块颜色
fillpoly(4, point, totalimg);
//绘制方块
inter_y += Blank_HIGHT; //设置滑块公共高度
启动监听按键线程
根据按键以及之前的随机数数组即答案来计分
由于监听按键和绘制动画是异步操作的,所有我们给按键控制单独开一个线程来监听。线程的使用在上面已经介绍过了,下面来看看代码。
DWORD WINAPI GameControl()
int curr = 0;
int k = 0, index = 0;
strcpy(tp.filename, Path_Music_Fail);
//给线程传参结构体赋值失败音乐路径
for (; k != key_)
if (kbhit())
k = getch();
if (k == 'S')
if (randtrack[mLength - curr - 1] == 1)
music_play_control(track[index++]);
//将键音传入音乐处理函数
//得分加一
drawCountText();
//刷新计分标签
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)music_play, &tp, 0, NULL);
//播放失败音乐线程
failplay =
//设定失败标志为真
else if (k == 'D')
if (randtrack[mLength - curr - 1] == 2)
music_play_control(track[index++]);
drawCountText();
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)music_play, &tp, 0, NULL);
failplay =
else if (k == '4')
if (randtrack[mLength - curr - 1] == 3)
music_play_control(track[index++]);
drawCountText();
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)music_play, &tp, 0, NULL);
failplay =
else if (k == '5')
if (randtrack[mLength - curr - 1] == 4)
music_play_control(track[index++]);
drawCountText();
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)music_play, &tp, 0, NULL);
failplay =
accelerate = mScore / 25;
//设定滑块每25分增加速度
if (failplay)
api_sleep(500); //等待播放音乐线程启动
代码中用大写字母S、D和数字键4、5分别控制四条轨道,可随意修改。
failpaly为游戏失败标志,若为真则播放失败音乐,延迟500毫秒后结束线程。
游戏窗口中有显示得分情况,以下是绘制得分函数,其中mScore为int型变量,程序中通过改变mScore变量的值来改变得分。
void drawCountText()
//绘制计数器
sprintf(mCharsScore, "%d", mScore);
//int转char*
setfont(40, 0, "宋体");
//设定字体样式
setfontbkcolor(EGERGB(0xff, 0x00, 0x00));
//设置字体背景色
outtextxy(WINDOW_WIDTH / 2, 0, mCharsScore);
//在窗口输出字体
该部分分为两个函数,一个是预处理一个是播放。
预处理(写法比较暴力哈)
void music_play_control(char key[]) //控制音乐播放
int flage = 0;
char copy[30];
char buff[10][30];
//同时按下的键值
char temp[200];
memset(temp, '\0', sizeof(temp));
//按照特定格式读入每个键符
if (key[0] != '(')
strcat(temp, Path_pre);
strcat(temp, key);
strcat(temp, Path_end);
strcpy(tpp.filename, temp);
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)music_play, &tpp, 0, NULL);
memset(buff, '\0', sizeof(buff));
strcpy(copy, key);
for (int i = 0; i & strlen(copy); i++)
if (copy[i] == '.')
copy[i] = ' ';
else if (copy[i] == '(' || copy[i] == ')')
copy[i] = ' ';
if (flage == 0)
sscanf(copy, "%s", buff[0]);
else if (flage == 1)
sscanf(copy, "%s %s", buff[0], buff[1]);
else if (flage == 2)
sscanf(copy, "%s %s %s", buff[0], buff[1], buff[2]);
else if (flage == 3)
sscanf(copy, "%s %s %s %s", buff[0], buff[1], buff[2], buff[3]);
for (int i = 0; i & i++)
strcat(temp, Path_pre);
strcat(temp, buff[i]);
strcat(temp, Path_end);
strcpy(tpp.filename, temp);
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)music_play, &tpp, 0, NULL);
//启动音乐播放线程
api_sleep(200);
实际播放音乐的线程函数
DWORD WINAPI music_play(LPVOID pParam)
//播放音乐
//mciSendString(tp-&filename, NULL, 0, NULL); //低效播放方式
//高效率无阻塞播放
ThreadParameter *tp = (ThreadParameter *)pP
MCI_OPEN_PARMS//定义打开结构体变量
open.lpstrElementName = tp-&//填充参数
mciSendCommand(0, MCI_OPEN, MCI_OPEN_ELEMENT, DWORD_PTR(&open));//打开
MCI_PLAY_PARMS//定义播放结构题变量
mciSendCommand(open.wDeviceID, MCI_PLAY, 0, DWORD_PTR(&play));//非阻塞式播放
启动时绘制窗口函数
void GameView() //
randomize();
//初始化随机数
cleardevice();
setcaption("别踩白块 - ");
//窗口标题
setbkcolor(EGERGB(0xff, 0xff, 0xff));
ThreadDrawTrack();
游戏开始后画面绘制线程函数
游戏启动后,使总画布左下角定点与窗口(0,0)顶点对齐
使总画布在可见区域由底向上绘制,并记录下移坐标。
根据下移的坐标除以黑块的高度可确定是哪个方块
DWORD WINAPI ThreadDrawTrack()
setrendermode(RENDER_MANUAL);
int y = inter_y;
int addh = 0;
strcpy(tp.filename, Path_Music_Fail);
for (; is_run(); delay_fps(FPS))
if (failplay)
cleardevice();
sprintf(mCharsScore, "%d", mScore);
setfont(100, 0, "宋体");
setfontbkcolor(EGERGB(0xff, 0x00, 0x00));
outtextxy(WINDOW_WIDTH / 2 + 20, WINDOW_HIGHT / 2, mCharsScore);
outtextxy(0, WINDOW_HIGHT / 2, "得分:");
if (-1 * y &= 0)
putimage(0, -1 * y, totalimg);
below = addh - mScore*Blank_HIGHT - 160;
if (below &= WINDOW_HIGHT)
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)music_play, &tp, 0, NULL);
failplay =
addh += 2;
drawCountText();
//更新显示得分
个人感觉EGE绘制效率确实有点低,这是我写的五总方法中画面最流畅,且最简单的方法。缺点也很明显,不能单独控制每个按键。
我也是初学者,代码上有很多不足欢迎提出指正,感谢阅览。
完整实现代码如下
#include &graphics.h&
#include &math.h&
#include&string.h&
#include&stdio.h&
#include &windows.h&
#pragma comment(lib, "Winmm.lib")
//For MCI(Media Control Interface,媒体控制接口)
#define Path_Music_resPiano "..//resplus//piano"
//载入键音
#define Path_Music_Fail "..//resplus//fail.mp3"
#define Path_Music_Launch "..//resplus//chuanshao.mp3"
#define Path_pre "..//resplus//piano//" //音频路径前缀
#define Path_end ".mp3" //音频路径后缀
#define WINDOW_HIGHT 800
//窗口高度
#define WINDOW_WIDTH 480
//窗口宽度
#define Blank_HIGHT 160
//方块高度
#define Blank_WIDTH 120
//方块宽度
#define Blank_COLOR EGERGB(00,00,00)
//方块颜色
#define COLOR_WHITE EGERGB(0xFF, 0xFF, 0xFF)
#define FPS 100
#define SLEEP 10
//-------函数声明--------
void drawCountText();
//绘制计数器
void initFile();
//初始化文件资源
DWORD WINAPI music_play(LPVOID pParam);
//播放音乐
void music_play_control(char key[]);
//控制音乐播放
DWORD WINAPI GameControl();
void GameView();
void creatView();
//创建地图
//-------全局变量--------
int mScore = 0; //分数
char mCharsScore[50];
//分数字符串
char track[1024][12];
int mLength = 0;
int below = 0;
//最下面一个方块定点的y轴
int randtrack[3000] = { -1000 };
//存轨道的随机数
int inter_y = 0;
//生成图片时用到的y
bool failplay =
int accelerate = 0;
char Path_A_Breeze_From_Alabama[] = "..//resplus//A Breeze From Alabama.txt";
char Path_Happy_New_Year[] = "..//resplus//Happy New Year.txt";
char Path_Jasmine[] = "..//resplus//Jasmine.txt";
char Path_Little_Star[] = "..//resplus//Little Star.txt";
char Path_lyricwaltz[] = "..//resplus//lyricwaltz.txt";
char Path_Merry_Christmas[] = "..//resplus//Merry Christmas.txt";
char Path_Music[50];
typedef struct ThreadParameter {
//音频播放线程参数
char filename[200];
char key[30];
//音频播放线程传参结构体
int main()
//--------播放启动音乐----------begin
strcpy(tp.filename, Path_Music_Launch);
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)music_play, &tp, 0, NULL);
//--------播放启动音乐----------end
//------------初始化------------begin
setinitmode(RENDER_MANUAL);
initgraph(WINDOW_WIDTH, WINDOW_HIGHT, INIT_RENDERMANUAL);
//初始化窗口
strcpy(Path_Music, Path_Jasmine);
//默认关卡
//------------初始化------------end
//----------选择关卡------------begin
setfont(20, 0, "宋体");
outtextxy(10, 10, "按下对应字母进入关卡");
outtextxy(10, 35, "A:
A Breeze From Alabama");
outtextxy(10, 55, "B:
outtextxy(10, 75, "C:
Happy New Year");
outtextxy(10, 95, "D:
Little Star");
outtextxy(10, 115, "E:
lyricwaltz");
outtextxy(10, 135, "F:
Merry Christmas");
switch (getch())
strcpy(Path_Music, Path_A_Breeze_From_Alabama);
strcpy(Path_Music, Path_Jasmine);
strcpy(Path_Music, Path_Happy_New_Year);
strcpy(Path_Music, Path_Little_Star);
strcpy(Path_Music, Path_lyricwaltz);
strcpy(Path_Music, Path_Merry_Christmas);
//----------选择关卡------------end
initFile(); //读入相关文件
creatView();
//创建地图
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)GameControl, NULL, 0, NULL);
//启动键盘控制线程
GameView(); //绘图
//防止游戏结束后退出
void initFile() //初始化文件资源
FILE *fp = NULL;
fp = fopen(Path_Music, "r");
if (fp != NULL)
while (fscanf(fp, "%s", track[mLength]) != EOF)
//读入所有键
mLength++;
fclose(fp);
DWORD WINAPI ThreadDrawTrack()
setrendermode(RENDER_MANUAL);
int y = inter_y;
int addh = 0;
strcpy(tp.filename, Path_Music_Fail);
for (; is_run(); delay_fps(FPS))
if (failplay)
cleardevice();
sprintf(mCharsScore, "%d", mScore);
setfont(100, 0, "宋体");
setfontbkcolor(EGERGB(0xff, 0x00, 0x00));
outtextxy(WINDOW_WIDTH / 2 + 20, WINDOW_HIGHT / 2, mCharsScore);
outtextxy(0, WINDOW_HIGHT / 2, "得分:");
if (-1 * y &= 0)
putimage(0, -1 * y, totalimg);
below = addh - mScore*Blank_HIGHT - 160;
if (below &= WINDOW_HIGHT)
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)music_play, &tp, 0, NULL);
failplay =
addh += 2;
drawCountText();
//更新显示得分
void GameView() //
randomize();
//初始化随机数
cleardevice();
setcaption("别踩白块 -
//窗口标题
setbkcolor(EGERGB(0xff, 0xff, 0xff));
ThreadDrawTrack();
DWORD WINAPI GameControl()
int curr = 0;
int k = 0, index = 0;
strcpy(tp.filename, Path_Music_Fail);
//给线程传参结构体赋值失败音乐路径
for (; k != key_)
if (kbhit())
k = getch();
if (k == 'S')
if (randtrack[mLength - curr - 1] == 1)
music_play_control(track[index++]);
//将键音传入音乐处理函数
//得分加一
drawCountText();
//刷新计分标签
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)music_play, &tp, 0, NULL);
//播放失败音乐线程
failplay =
//设定失败标志为真
else if (k == 'D')
if (randtrack[mLength - curr - 1] == 2)
music_play_control(track[index++]);
drawCountText();
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)music_play, &tp, 0, NULL);
failplay =
else if (k == '4')
if (randtrack[mLength - curr - 1] == 3)
music_play_control(track[index++]);
drawCountText();
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)music_play, &tp, 0, NULL);
failplay =
else if (k == '5')
if (randtrack[mLength - curr - 1] == 4)
music_play_control(track[index++]);
drawCountText();
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)music_play, &tp, 0, NULL);
failplay =
accelerate = mScore / 25;
//设定滑块每25分增加速度
if (failplay)
api_sleep(500); //等待播放音乐线程启动
void drawCountText()
//绘制计数器
sprintf(mCharsScore, "%d", mScore);
//int转char*
setfont(40, 0, "宋体");
//设定字体样式
setfontbkcolor(EGERGB(0xff, 0x00, 0x00));
//设置字体背景色
outtextxy(WINDOW_WIDTH / 2, 0, mCharsScore);
//在窗口输出字体
void creatView()
int point[8];
//四边形点集
int x = 0, y = 0;
//基定点坐标
randomize();
//初始化随机数
totalimg = newimage(WINDOW_WIDTH, Blank_HIGHT*mLength); //初始化总画布
setbkcolor(COLOR_WHITE, totalimg);
//设置总画布背景
cleardevice(totalimg);
//清空总画布
for (int i = 0; i & mL i++)
randtrack[i] = random(4) + 1;
//参数0-3的随机数,加一后为轨道位置
y = inter_y;
x = (randtrack[i] - 1) * Blank_WIDTH;
point[0] =
point[1] =
point[2] = x + Blank_WIDTH;
point[3] =
point[4] = x + Blank_WIDTH;
point[5] = y + Blank_HIGHT;
point[6] =
point[7] = y + Blank_HIGHT;
setfillstyle(SOLID_FILL, Blank_COLOR);
//设置方块颜色
fillpoly(4, point, totalimg);
//绘制方块
inter_y += Blank_HIGHT; //设置滑块公共高度
void music_play_control(char key[]) //控制音乐播放
int flage = 0;
char copy[30];
char buff[10][30];
//同时按下的键值
char temp[200];
memset(temp, '\0', sizeof(temp));
//按照特定格式读入每个键符
if (key[0] != '(')
strcat(temp, Path_pre);
strcat(temp, key);
strcat(temp, Path_end);
strcpy(tpp.filename, temp);
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)music_play, &tpp, 0, NULL);
memset(buff, '\0', sizeof(buff));
strcpy(copy, key);
for (int i = 0; i & strlen(copy); i++)
if (copy[i] == '.')
copy[i] = ' ';
else if (copy[i] == '(' || copy[i] == ')')
copy[i] = ' ';
if (flage == 0)
sscanf(copy, "%s", buff[0]);
else if (flage == 1)
sscanf(copy, "%s %s", buff[0], buff[1]);
else if (flage == 2)
sscanf(copy, "%s %s %s", buff[0], buff[1], buff[2]);
else if (flage == 3)
sscanf(copy, "%s %s %s %s", buff[0], buff[1], buff[2], buff[3]);
for (int i = 0; i & i++)
strcat(temp, Path_pre);
strcat(temp, buff[i]);
strcat(temp, Path_end);
strcpy(tpp.filename, temp);
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)music_play, &tpp, 0, NULL);
//启动音乐播放线程
api_sleep(200);
DWORD WINAPI music_play(LPVOID pParam)
//播放音乐
//mciSendString(tp-&filename, NULL, 0, NULL); //低效播放方式
//高效率无阻塞播放
ThreadParameter *tp = (ThreadParameter *)pP
MCI_OPEN_PARMS//定义打开结构体变量
open.lpstrElementName = tp-&//填充参数
mciSendCommand(0, MCI_OPEN, MCI_OPEN_ELEMENT, DWORD_PTR(&open));//打开
MCI_PLAY_PARMS//定义播放结构题变量
mciSendCommand(open.wDeviceID, MCI_PLAY, 0, DWORD_PTR(&play));//非阻塞式播放
pdf下载地址:Java面试宝典 第一章内容介绍 20 第二章JavaSE基础 21 一、Java面向对象 21 1. 面向对象都有哪些特性以及你对这些特性的理解 21 2. 访问权限修饰符public、private、protected, 以及不写(默认)时的区别(201...
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金相信有很多朋友...
在前面一篇文章中,我们分析了Android应用程序窗口的绘图表面的创建过程。Android应用程序窗口的绘图表面在创建完成之后,我们就可以从上到下地绘制它里面的各个视图了,即各个UI元素了。不过在绘制这些UI元素之前,我们还需要从上到下地测量它们实际所需要的大小,以及对它们...
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金 相信有很多...
在Android系统中,有一种特殊的视图,称为SurfaceView,它拥有独立的绘图表面,即它不与其宿主窗口共享同一个绘图表面。由于拥有独立的绘图表面,因此SurfaceView的UI就可以在一个独立的线程中进行绘制。又由于不会占用主线程资源,SurfaceView一方面...
离过年越来越近了,时间越来越少了,可是我还是没有什么进展。好在我已经能够知道要学习。 今天眼睛疼,所以没有安心学习,也不想多说,看会浮生六记,待会就睡觉,把闹钟往前调一点,明天早起,希望眼睛不要再肿了。加油。
看了一个朋友讲到关于《你的知识需要整理》一书后,果断买入,因为感觉自己的知识实在太需要整理了。朋友说她现在的知识一盘散沙,是该打地基的时候了,那自己更甚了。就如古典老师在一篇文章中讲到的那样:我们自己要搭建自己的知识架构,这样今后每一次新知识的汲取都可以对应的放到“知识大厦...
随景而变 我们每个人都有自己的一个可以独处的状态,也有可以保持安静的时刻,但每当从一个特定的时刻或是地点发生变换,往往就随着场景的更替而随之而变,该浮躁还是浮躁,该着急还是着急,比如从长假归来上班堵在路上的抓急情况,比如在人潮拥挤中也不管不顾的随着大家一起跨越了斑马线,^_...
什么是多线程下载 举例: 一个装有水的水桶(要下载的资源),出水口(下载线程),出水口越多,水流的越快。即多个线程同时去下载一个文件,效率更高。 需求分析 对下载资源分块(对应下载线程的个数) 每一块下载资源的大小对应为:block_size = total_size / ...
5.1产品经理的目标管理能力 5.1.1 什么是目标管理 目标管理:MBO(Management by Objective)定义:目标管理是以目标为导向,以人为中心,以成果为标准,而使组织和个人取得最佳业绩的现代管理方法. 目标管理又可以成为&成果管理& 今天,我们主要针对...

我要回帖

更多关于 王者荣耀游戏界面 的文章

 

随机推荐