Easyx使用(番外篇)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
前面我们设计了一个程序,就是移动的小球。这个小球可以上下、左右移动。如果是碰到左边,就会向右弹回来;如果碰到右边,就会向左弹回来,上下也是这样。这个小球虽然看上去好玩,但是没有交互性,其实可以以此为基础做成一个小游戏。
1、游戏改进
如果需要改进为游戏,那么需要在下面添加一个横条,这个横条可以左右移动。这样小球快落到底部的时候,就可以用横条接住这个小球,让小球弹回去。如果小球不小心,没有接住,那么游戏结束。
2、设置状态
按照游戏的规则,这里需要增加一个状态。一个是正常运行的状态,一个是结束的状态。结束的时候,可以做的比较简单一点,即显示游戏结束。
// check whether ball already reached groundif ((ball_y + RADIUS) >= 480){state = 1;continue;}
如果state为1,代表游戏结束,
else if (state == 1){outtextxy(280, 220, "Game Over!!!");}
3、添加横条
为了防止小球落下,这里需要添加一个横条,其实就是一个长方形,
// draw rectanglesetfillcolor(BLUE);solidrectangle(bar_x, bar_y, bar_x + 100, bar_y + 10);
横条本身是需要左右移动的,那么这部分就需要引入按键事件。另外,如果按键按下去,我们是希望事件本身可以一直被触发,那么就可以换种其他的写法,
// check press keyboard continuously, adjust x valueif (GetAsyncKeyState(VK_LEFT) & 0x8000){bar_x -= SPEED;}if (GetAsyncKeyState(VK_RIGHT) & 0x8000) {bar_x += SPEED;}if (bar_x < 0){bar_x = 0;}else if (bar_x > (640 - 100)){bar_x = 640 - 100;}
4、更新小球的位置
小球的更新主要就是x和y的更新,所以这部分代码其实和之前是一样的。需要判断x有没有超出范围、y有没有超出范围。唯一需要注意的,就是判断下小球下落的时候,有没有落在横条之上。落在横条上面的话,就可以让小球弹回去,如果不是,就让小球继续往下坠落,直到出错为止。
// collision check, very importantif ((((ball_x - RADIUS) >= bar_x && (ball_x - RADIUS) <= (bar_x + 100)) || ((ball_x + RADIUS) >= bar_x && (ball_x + RADIUS) <= (bar_x + 100))) && \(ball_y + RADIUS) >= 400 && (ball_y + RADIUS) < 410){direction_y = 1;}
接不到,就会结束程序,
5、测试和验证
本身代码的内容不复杂,只需要在原来小球的code之上,稍作修改即可。有兴趣的同学可以参考下这个完整代码。很多的工具和软件,本身不复杂,几百行或者1~2千行代码,就可以解决大问题。
#define _CRT_SECURE_NO_WARNINGS
#include <graphics.h>
#include <conio.h>
#include <stdio.h>#define WIDTH 640
#define HEIGHT 480
#define RADIUS 20
#define START_X 100
#define START_Y 100
#define SPEED 8// main functionint main()
{int bar_x = 10; // position of rectangleint bar_y = 400;int ball_x = START_X; // position of ballint ball_y = START_Y;int direction_x = 0; // direction of ballint direction_y = 0;int state = 0; // game state// init graph hereinitgraph(WIDTH, HEIGHT);// start batch draw BeginBatchDraw();while (1){cleardevice();if (state == 0){// check whether ball already reached groundif ((ball_y + RADIUS) >= 480){state = 1;continue;}// update ball_xif (ball_x <= RADIUS){direction_x = 1;}if (ball_x >= (640- RADIUS)){direction_x = 0;}if (direction_x == 0){ball_x -= SPEED;}else{ball_x += SPEED;}// collision check, very importantif ((((ball_x - RADIUS) >= bar_x && (ball_x - RADIUS) <= (bar_x + 100)) || ((ball_x + RADIUS) >= bar_x && (ball_x + RADIUS) <= (bar_x + 100))) && \(ball_y + RADIUS) >= 400 && (ball_y + RADIUS) < 410){direction_y = 1;}// update ball_yif (ball_y <= RADIUS){direction_y = 0;}if (direction_y == 0){ball_y += SPEED;}else{ball_y -= SPEED;}// draw ballsetfillcolor(RED);solidcircle(ball_x, ball_y, RADIUS);// check press keyboard continuously, adjust x valueif (GetAsyncKeyState(VK_LEFT) & 0x8000){bar_x -= SPEED;}if (GetAsyncKeyState(VK_RIGHT) & 0x8000) {bar_x += SPEED;}if (bar_x < 0){bar_x = 0;}else if (bar_x > (640 - 100)){bar_x = 640 - 100;}// draw rectanglesetfillcolor(BLUE);solidrectangle(bar_x, bar_y, bar_x + 100, bar_y + 10);}else if (state == 1){outtextxy(280, 220, "Game Over!!!");}FlushBatchDraw();Sleep(50);}// ready to close graphEndBatchDraw();closegraph();return 0;
}