📄 game.c
字号:
#include <ansi_c.h>
#include <utility.h>
#include "game.h"
static int i = 0;
static char *data ;
static int hh = 9;
static int vv = -8;
//定义ball,bar,panel1为结构体类型变量
struct porperty{
int left;
int top;
int width;
int height;
}ball,bar,panel1;
static int setpanelhandle;
static int panelHandle;
int main (int argc, char *argv[])
{
if (InitCVIRTE (0, argv, 0) == 0)
return -1; /* out of memory */
if ((panelHandle = LoadPanel (0, "game.uir", PANEL)) < 0)
return -1;
DisplayPanel (panelHandle);
//获得面板的高,并将其值传给panel1.height
GetPanelAttribute (panelHandle, ATTR_HEIGHT, &panel1.height);
//设置bar的高为panel的高减去20
SetCtrlAttribute (panelHandle, PANEL_BAR, ATTR_TOP, panel1.height-20);
RunUserInterface ();
DiscardPanel (panelHandle);
return 0;
}
int CVICALLBACK panelcb (int panel, int event, void *callbackData,
int eventData1, int eventData2)
{
int lowerasc;
int vk;
int asc;
int barleft;
switch (event)
{
//响应键盘事件
case EVENT_KEYPRESS:
//按键ASCII码值
vk=eventData1 & VAL_VKEY_MASK;
//虚拟键的键值
asc=eventData1 & VAL_ASCII_KEY_MASK;
//如果按键为大写字母则将其转换为小写
lowerasc = tolower (asc);
switch (vk)
{
//如果按键为虚拟键→,则将bar右移40
case VAL_RIGHT_ARROW_VKEY:
GetCtrlAttribute (panelHandle, PANEL_BAR, ATTR_LEFT, &barleft);
SetCtrlAttribute (panelHandle, PANEL_BAR, ATTR_LEFT, barleft+40);
break;
//如果按键为虚拟键←,则将bar左移40
case VAL_LEFT_ARROW_VKEY:
GetCtrlAttribute (panelHandle, PANEL_BAR, ATTR_LEFT, &barleft);
SetCtrlAttribute (panelHandle, PANEL_BAR, ATTR_LEFT, barleft-40);
break;
}
switch (lowerasc)
{
//如果按下的键为"d",则将bar右移40
case 'd':
GetCtrlAttribute (panelHandle, PANEL_BAR, ATTR_LEFT, &barleft);
SetCtrlAttribute (panelHandle, PANEL_BAR, ATTR_LEFT, barleft+40);
break;
//如果按下的键为"a",则将bar左移40
case 'a':
GetCtrlAttribute (panelHandle, PANEL_BAR, ATTR_LEFT, &barleft);
SetCtrlAttribute (panelHandle, PANEL_BAR, ATTR_LEFT, barleft-40);
break;
}
break;
case EVENT_CLOSE:
QuitUserInterface (0);
break;
case EVENT_PANEL_SIZE:
//当面板的尺寸发生改变,则重新获取面板的高度,将bar的高度改为当前面板的高度减去20
GetPanelAttribute (panelHandle, ATTR_HEIGHT, &panel1.height);
SetCtrlAttribute (panelHandle, PANEL_BAR, ATTR_TOP, panel1.height-20);
break;
}
return 0;
}
int CVICALLBACK timer (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_TIMER_TICK:
i++;
//每隔设定的时间,对bar、ball、panel重新获得位置属性
GetCtrlAttribute (panelHandle, PANEL_BAR, ATTR_LEFT, &bar.left);
GetCtrlAttribute (panelHandle, PANEL_BAR, ATTR_TOP, &bar.top);
GetCtrlAttribute (panelHandle, PANEL_BAR, ATTR_HEIGHT, &bar.height);
GetCtrlAttribute (panelHandle, PANEL_BAR, ATTR_WIDTH, &bar.width);
GetCtrlAttribute (panelHandle, PANEL_BALL, ATTR_LEFT, &ball.left);
GetCtrlAttribute (panelHandle, PANEL_BALL, ATTR_TOP, &ball.top);
GetCtrlAttribute (panelHandle, PANEL_BALL, ATTR_HEIGHT, &ball.height);
GetCtrlAttribute (panelHandle, PANEL_BALL, ATTR_WIDTH, &ball.width);
GetPanelAttribute (panelHandle, ATTR_WIDTH, &panel1.width);
GetPanelAttribute (panelHandle, ATTR_HEIGHT, &panel1.height);
//如果ball弹到面板的左右两臂则按相反方向弹回
if ((ball.left <= 0) || ((ball.left+ball.width) >= panel1.width))
{
//改变方向
hh = hh * (-1);
//响声
Beep();
}
//如果ball弹到面板的上部或是谈到bar上面,则按相反方向弹回
if ((ball.top <= 0) || ((ball.top >= bar.top-10) && (ball.left >= bar.left) && (ball.left <= bar.left+bar.width)) )
{
vv = vv * (-1);
Beep();
}
ball.left = ball.left+hh;
ball.top = ball.top+vv;
SetCtrlAttribute (panelHandle, PANEL_BALL, ATTR_LEFT, ball.left);
SetCtrlAttribute (panelHandle, PANEL_BALL, ATTR_TOP, ball.top);
//当ball未被bar接住,而弹出面板,则弹出面板PANEL_SET
if (ball.top > bar.top + 40)
{
SetCtrlAttribute (panelHandle, PANEL_TIMER, ATTR_ENABLED, 0);
//将面板PANEL_SET载入
setpanelhandle = LoadPanel (0, "game.uir", PANEL_SET);
//弹出面板PANEL_SET
InstallPopup (setpanelhandle);
//将当前timer回调函数所执行的次数计作分数赋值给PANEL_SET_NUMERIC
SetCtrlVal (setpanelhandle, PANEL_SET_NUMERIC, (int) (i / 20));
//获取当前的日期
data = DateStr ();
SetCtrlVal (setpanelhandle, PANEL_SET_STRING, data );
}
break;
}
return 0;
}
int CVICALLBACK ok (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
hh = 9;
vv = -8;
SetCtrlAttribute (panelHandle, PANEL_BALL, ATTR_TOP, 50);
SetCtrlAttribute (panelHandle, PANEL_BALL, ATTR_LEFT, 50);
SetCtrlAttribute (panelHandle, PANEL_TIMER, ATTR_ENABLED, 1);
DiscardPanel (setpanelhandle);
break;
}
return 0;
}
int CVICALLBACK exitsys (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
QuitUserInterface (0);
break;
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -