EasyX 有一个演示鼠标操作的范例程序,这里,我们尝试通过 Windows API 获取鼠标信息。关于 API 的使用都以注释形式写到了程序中,故不再详细讲解,代码如下:
// 程序名称:通过 API 获取鼠标状态
// 编译环境:Visual C++ 6.0 / 2008 / 2010,EasyX 2011惊蛰版
//
#include <graphics.h>
#include <stdio.h>
void main()
{
initgraph(640, 480); // 初始化绘图窗口
HWND hwnd = GetHWnd(); // 获取绘图窗口句柄
POINT point;
TCHAR s[10];
while(true)
{
GetCursorPos(&point); // 获取鼠标指针位置(屏幕坐标)
ScreenToClient(hwnd, &point); // 将鼠标指针位置转换为窗口坐标
// 获取鼠标按
...
Turbo C(简称tc)是 dos 时代经典的编译器,学习编程时,有很多图形类和游戏类的程序都是用 tc 编写的。由于 c 语言标准的不完善,这些程序大多数都不能直接在 vc 里面编译。本文就讲解怎样将 tc 程序移植到 vc 下。
注:本文以 VC 6.0 为范例(高版本的 vc 大同小异),同时请安装最新版本的 EasyX 图形库。
移植前请注意:
- 确保 tc 代码可以正确运行。
- 将 tc 代码复制粘贴到 vc 里面。注意,vc 里面代码文件的扩展名要用 .cpp,不能用 .c。
- 以下解决办法不分先后顺序,哪条对应就按照哪条修改。
- 如果没找到对应的解决办法,可以暂时跳过,先改后面的。可能修改了第 3 条错误,第 2 条错误也就没有了。
- 可能解决一个问题后,会出现 10 个新问题,这不要紧。细心、耐心一些,一个一个问题慢慢处理,并不复杂。
以下正文:
错误提示:fatal error C1083: Cannot
...
通常我们使用 initgraph 创建绘图窗口,然后在里面绘图。
除此之外,我们还可以直接在 IMAGE 对象中绘图,这样就可以实现在不创建绘图窗口的前提下,直接生成图片文件。
为此,需要使用两条命令:
SetWorkingImage
该命令用于设定绘图目标。当设置为 IMAGE 对象时,之后所有的绘图操作都会针对该 IMAGE 对象。
saveimage
该命令用于保存图片。
实际上并不复杂,请看下面例子:
#include <graphics.h>
#include <stdio.h>
#include <conio.h>
void main()
{
// 创建一个 300 x 300 的 IMAGE 对象
IMAGE img(300, 300);
// 设定 img 为绘图操作的目标
SetWorking
...
由于 windows 下的 viewport 概念和过去有了很大的区别,为了避免大家混淆,EasyX 从 2011-2-24 起取消了这个函数。
下面解释一下怎样用其他函数替代 setviewport 的功能。
先说说过去的 setviewport() 的功能:
- 设置矩形区域
- 将矩形区域左上角设置为原点坐标
- 可以选择是否裁剪
对于设置裁剪,可以先定义一个区域,然后将该区域设置为裁剪区。区域的概念不仅局限于矩形,在 Windows GDI 函数中有很多定义区域的语句。下面代码定义一个矩形的区域,并设置为裁剪区:
HRGN rgn = CreateRectRgn(100, 100, 200, 200); // 定义矩形区域
setcliprgn(rgn); // 设置区域 rgn 为裁剪区
DeleteObject(rgn); // 不再使用 rgn,清理 rgn 占用的系统资源
...
刚开始用 EasyX,编译却出现上百个错误,例如:
error C2143: syntax error : missing ')' before '='
error C2072: 'initgraph' : initialization of a function
error C2059: syntax error : ')'
warning C4028: formal parameter 1 different from declaration
warning C4028: formal parameter 2 different from declaration
warning C4028: formal parameter 3 different from declaration
error C2143: syntax error : missing ')' before ''
error C2081: 'bool' : name in formal parameter
...
【错误描述】
一些程序在 VC6 下运行好好地,但是放到 VC2008 及更高版本 VC 下编译却报错误(以下仅以 VC2008 举例,高版本 VC 类似),例如使用如下语句:
outtextxy(10, 20, "Hello World");
在 VC6 下可以成功编译,但在 VC2008 下编译后会有错误。
中文版错误提示如下:
error C2665: “outtextxy”: 2 个重载中没有一个可以转换所有参数类型
英文版错误提示如下:
error C2665: 'outtextxy' : none of the 2 overloads could convert all the argument types
同样的,对于其他一些包含字符串调用的函数,例如 loadimage、drawtext 等,也会遇到类似问题。
【错误原因】
简单来说,这是由于字符编码问题引起的。
VC6 默认使用的 MBCS
...
简单来说,LPCTSTR 就表示字符串指针。
那么和 char* 又有什么区别呢?
大家用 char 表示字符时,英文占用一个字节,中文站用两个字节。这样有一个严重的问题:两个字节,究竟是两个英文字符,还是一个中文字符?为了解决这个问题,unicode 编码诞生了。
常见的 unicode 编码不管中文英文都用两个字节表示,用 wchar_t 来定义。
为了让代码适应 char 和 wchar_t 两种情况,可以用 TCHAR 宏,这个宏当项目定义为 unicode 时表示 wchar_t,否则表示 char。
对应的,还有 _T("") 宏用来表示字符串,例如 _T("abc") 在项目为 unicode 时表示 L"abc",否则表示 "abc"。
然后再看 LPCTSTR,它是以下几个概念的缩写:Long Point Const Tchar STRing,这样意思就明确了吧。
目前,点 EasyX 绘图窗口的“关闭”,会直接退出整个程序。有时候,程序需要执行完整的流程,因此,禁止关闭按钮就是一个很需要的方法。
可以通过 initgraph 函数的第三个参数禁用关闭按钮,确保程序按实际流程完整执行。
以下代码禁用关闭按钮(VC6 / VC2010 编译通过):
#include <graphics.h>
#include <conio.h>
void main()
{
initgraph(640, 480, NOCLOSE);
circle(320, 240, 100);
_getch();
closegraph();
}
关于什么是 midi 音乐文件,请参考百度百科:http://baike.baidu.com/view/7969.htm 。
这里简单说一说:
midi 是一种音乐文件,通常扩展名为 mid。不同于 mp3 的地方是:mp3 保存的是声音的波形数据,而 mid 保存的是乐器、音符、音调等。所以从文件体积上来说,mp3 的体积是 mid 体积的几十倍甚至上百倍。
鉴于 midi 的特点,早期很多游戏的都使用 midi 音乐。所以,本文讲怎样使用 midi 音乐。
【1. 素材获取】
网上搜索吧,网上有很多 mid 资源。但是不要尝试将 mp3 转换为 mid,由于原理不同,暂时无法实现 mp3 -> mid 的转换。
【2. 播放】
能播放 mp3 的方法,一般都可以用来播放 mid。所以,可以参考这些文章:
《在游戏中播放音乐》 http://www.easyx.cn/skills/View.aspx?id=44
《将 mp3 以资源形式嵌入 exe
...
从 C 语言,到常见的 setup.exe 安装程序,究竟有多远?怎样实现双击 .xls 文件会自动启动 excel 并加载?这篇文章就解释这个问题。
请跟随以下步骤:
编写应用程序。为了叙述方便,暂且叫 test.exe 吧。通常 test.exe 中会用若干 scanf 或 cin 来读取用户输入的参数,并根据参数来执行程序,这是大家在学习 C 语言的过程中见到的。
要规定程序所需数据的格式。例如,word 需要使用 .doc 格式的数据,photoshop 需要使用 .psd 格式的数据。不管这些数据文件是文本的还是二进制的,只有格式确定下来,程序才能按照原定意图解释数据。数据格式就是将用户输入的全部数据都放进一个文件中,然后将 scanf 语句修改为读取该文件(读文件的程序部分请参考相关书籍)。
设置文件关联。在上一步我们规定了一个我们需要的数据格式,现在给这个格式的文件自定一个扩展名,比如叫 .abc,然后双击该文件,Windows 会提示用户选择打开该类型
...
本文适用读者:已经学完 C 语言基本知识,并对 EasyX 略有了解。
本文范例实现的功能:文字在背景上移动,并且不破坏背景。
本文范例编译平台:VC6 / VC2010 + EasyX 20140321(beta)。
本文并不直接写出最终代码,而是从最开始绘制背景,一步步拓展到我们需要的功能。希望这个过程能对初学者有所启发。
一、绘制背景
为了实现文字移动而不破坏背景的效果,我们先画个背景。做法很简单,就是画一连串的竖线,并且每次变换颜色,这样就能弄一个渐变色的背景,代码如下:
#include <graphics.h>
#include <conio.h>
// 主函数
void main()
{
// 创建绘图窗口
initgraph(640, 480);
// 绘制背景
for(int i = 0; i < 640; i++)
{
setlinecolor(i);
line(i,
...
在 Turbo C 时代的图形编程有“调色板”的概念,但在真彩色时代,调色板的概念已经不完全相同了。
EasyX 模拟了 Turbo C 的大部分功能。由于上述原因,调色板并没有实现。如果要使用调色板,可以通过 Windows GDI 函数实现。
以下范例程序演示了这一过程:
(由于是动画程序,贴图无法展现效果,因此省略了贴图)
///////////////////////////////////////////////////
// 程序名称:基于 EasyX 的调色板动画程序
// 编译环境:VC6.0 / VC2010,EasyX 2011惊蛰版
// 作 者:krissi <zh@easyx.cn>
// 最后修改:2012-1-4
//
#include <graphics.h>
#include <conio.h>
#include <math.h>
#define WIDTH 640
#define
...
先说一个程序的实现过程:
- 随机生成 3 个点 P[0]、P[1]、P[2];
- 随机生成 1 个点 P;
- 绘制点 P;
- 随机生成 [0, 2] 内的整数 n;
- 令 P = P 与 P[n] 的中点;
- 重复执行步骤 3~5 三万次。
这个程序很简单,虽然随机性很大,但是结果几乎是完全相似的,会是一个很有趣的图案,也就是传说中的谢宾斯基三角形。以上步骤就是生成谢宾斯基三角形的随机迭代法。
程序代码如下:
(注:为了效果,将步骤(1)的三个点手动指定了。喜欢的话,可以将其修改为随机产生)。
// 程序名称:谢宾斯基(Sierpinski)三角形,也叫垫片
// 编译环境:Visual C++ 6.0,EasyX 2011惊蛰版
// 最后更新:2010-11-16
//
#include <graphics.h>
#include <
...
这是贪吃蛇游戏的双人对战版。
游戏双方分别控制蓝色和红色两条小蛇的前进,碰壁或咬到蛇身体算输。
这个对战版的贪吃蛇游戏网上有不少源代码,这个代码的特点就是为两个游戏者分别增加了命令队列,以实现更舒服的控制。
完整的游戏源代码如下:
///////////////////////////////////////////////////
// 程序名称:贪吃蛇游戏的双人对战版
// 编译环境:Visual C++ 6.0 / 2010,EasyX_20130322(beta)
// 作 者:yangw80 <yw80@qq.com>
// 最后修改:2012-7-23
//
#include <graphics.h>
#include <conio.h>
#include <time.h>
#include <queue>
using namespace std;
#define WIDTH 64 /
...