弹球游戏有三个主要因素:球,墙,用户输入。
(1)球以一定的速度运行;
(2)球碰到墙或挡板会逆行;
(3)用户输入会改变球的运行状态:加速、减速或退出;向上、向下或斜行(二维)。
程序主要功能设计:
(1)计时器驱动
间隔计时器被设置为产生固定的SIGALRMS信号流。响应一个信号,球向前移动一步。
(2)等待键盘输入
程序阻塞等待键盘输入。根据用户按下的键,采取不同的动作。
(3)状态变量
变量记录了球的速度和方向。用户输入修改的变量值决定了小球的速度。计时器处理函数根据速度和位置变量来决定在何时何处画小球。
一维动画:一个信号,移动一个单位。
二维动画:两个计时器,斜着移动。如当直角边的比值为1/3时,构造两个自己的计时器:一个记录平行移动的计时器信号数,一个记录垂直移动的计时器信号数。每两个计时器信号向右移动一个单位,每六个计时器信号向上移动一个单位。如果时钟间隔单位分别是10和30的话,球移动的路径相同,就是慢些。
实现:为实现二维动画,同时在两个方向移动,用两个计数器充当计时器。每个计数器有两个属性:当前值和间隔。当前值表示在下次重画之前还要等待多少个计时信号。间隔指明两次移动之间所要等待的计时信号个数。分别命名为ttg和ttm。
代码:
/* bounce.h */
#ifndef BOUNCH_H
#define BOUNCH_H
/* some settings for the game */
#define BLANK ' '
#define WALL '.'
#define USER_WALL '='
#define DFL_SYMBOL 'o'
#define TOP_ROW 6
#define BOT_ROW 19
#define LEFT_EDGE 6
#define RIGHT_EDGE 44
#define X_INIT 10 /* starting col */
#define Y_INIT 10 /* starting row */
#define TICKS_PER_SEC 25 /* affects speed */
#define X_TTM 5
#define Y_TTM 8
int score = 0;
int user_wall_pos = 5;
int user_wall_len = 9;
/** the ping pong ball **/
struct ppball {
int y_pos, x_pos,
y_ttm, x_ttm,
y_ttg, x_ttg,
y_dir, x_dir;
char symbol ;
} ;
#endif
#include <stdio.h>
#include <sys/time.h>
#include <signal.h>
/*
* set_ticker.c
*