编写大蜈蚣的小游戏 图片界面出来了但是子弹出不来也打不了咋办
#include ".\Inc\cv.h"
#include ".\Inc\cxcore.h"
#include ".\Inc\highgui.h"
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
//帧刷新周期以s为单位
#define T 0.04f
//定义求图像质心的宏
#define CX(img) img->width/2
#define CY(img) img->height/2
//定义该结构体时我们考虑到可以把玛丽奥和蘑菇都抽象为场景中的物体
//它们都具有X轴和Y轴的当前位置、速度、加速度六个属性,以及用于显示
//该物体的图像指针
//不同的地方是蘑菇在Y轴上的速度和加速度恒为零,X轴上的加速度恒为零
//而玛丽奥X轴Y轴上的运动参数都是根据实际情况发生变化的。
struct struct_dawugong{
float xpos;
float ypos;
float xv;
float yv;
float xa;
float ya;
IplImage *pimg;
};
typedef struct struct_dawugong DWG;
//typedef struct struct_object OBJECT;
//读档,这里涉及两个物体玛丽奥和蘑菇的档案
#define WGINDEX 0
#define FEIJIINDEX 1
#define ZIDANINDEX 2
//通过定义宏,我们指定了玛丽奥和蘑菇在数组中的位置
bool LoadData(DWG* pobj)
{
//首先尝试读取文件中的数据
FILE *fp;
fp = fopen("gamdata.dat", "r");
//文件中的数据读取失败,返回的是空指针,说明该文件尚未被创建
//利用默认值初始化数据
if(NULL==fp)
{
//初始蜈蚣的参数
pobj[WGINDEX].xpos = 20;
pobj[WGINDEX].ypos = 20;
pobj[WGINDEX].xv = 0;
pobj[WGINDEX].yv = 0;
pobj[WGINDEX].xa = 0;
pobj[WGINDEX].ya = 300; //重力加速度
//初始化飞机的参数
pobj[FEIJIINDEX].xpos = 50;
pobj[FEIJIINDEX].ypos = 50;
pobj[FEIJIINDEX].xv = 150;
pobj[FEIJIINDEX].yv = 0;
pobj[FEIJIINDEX].xa = 0;
pobj[FEIJIINDEX].ya = 0;
//初始化子弹的参数
pobj[ZIDANINDEX].xpos = 50;
pobj[ZIDANINDEX].ypos = 40;
pobj[ZIDANINDEX].xv = 150;
pobj[ZIDANINDEX].yv = 0;
pobj[ZIDANINDEX].xa = 0;
pobj[ZIDANINDEX].ya = 0;
}
else
{
fread(pobj, sizeof(DWG), 3, fp);
fclose(fp);
}
//pobj中的图像指针只能用载入图像的指针初始化,因此在这里需要全部置为空
pobj[WGINDEX].pimg = NULL;
pobj[FEIJIINDEX].pimg = NULL;
pobj[ZIDANINDEX].pimg = NULL;
return true;
};
//保存数据
bool SaveData(DWG* pobj)
{
FILE *fp;
fp = fopen("gamdata.dat", "w+");
if(NULL==fp)
return false;
else
fwrite(pobj, sizeof(DWG), 2, fp);
return true;
};
//将图像绘制到背景图上,凡是遇到clr颜色不将其颜色值拷贝到背景图上
//参数x,y是要将其绘制到的背景图像中待绘制的位置坐标,该坐标对应被绘制图像的中心点
void DrawImage(IplImage* pimgbackground, IplImage* pimg, int x, int y, CvScalar clr=CV_RGB(0, 0, 255))
{
//i为行标,j为列标
int i,j;
//先行后列遍历各像素,如果其值与clr不一致,将其复制到背景图上
char* pelesrc, * peledes;
for(i=0; i<pimg->height; i++)
{
//定位行指针
pelesrc = pimg->imageData + i*pimg->widthStep;
//根据x,y以及当前图像大小计算指针位置
peledes = pimgbackground->imageData + (i+y-CY(pimg))*pimgbackground->widthStep;
peledes += (x-CX(pimg))*3;
for(j=0; j<pimg->width; j++)
{
//如果与所指定颜色一致,该像素不可以复制到背景图上,不执行复制操作
if(*((byte*)pelesrc)==clr.val[0] && *((byte*)(pelesrc+1))==clr.val[1] && *((byte*)(pelesrc+2))==clr.val[2])
{
//跳过该像素
pelesrc += 3;
peledes += 3;
}
//否则复制当前像素到背景图上
else
{
*peledes++ = *pelesrc++;
*peledes++ = *pelesrc++;
*peledes++ = *pelesrc++;
}
}
}
};
int main()
{
//创建游戏的窗口
cvNamedWindow("dawugong");
//先创建启动画面,通过载入一副背景图和显示文字Start Game
//以及 Quit Game来实现
IplImage* pflashbkimg = cvLoadImage("2.png");
//用于显示当前的有文字的图像
IplImage* pflashimg = cvCloneImage(pflashbkimg);
//正常字体
CvFont fontnormal;
double hScale=0.75;
double vScale=1;
int lineWidth=2;
//初始化字体
cvInitFont(&fontnormal,CV_FONT_HERSHEY_SIMPLEX, hScale,vScale,0,lineWidth);//初始化字体
//高亮字体,用于显示被选中的文字,仅修改字体的粗细
CvFont fonthighlight;
lineWidth=3;
cvInitFont(&fonthighlight,CV_FONT_HERSHEY_SIMPLEX, hScale,vScale,0,lineWidth);//初始化字体
//游戏中用于显示文本字体
CvFont fontgame;
hScale = 0.5;
vScale = 0.8;
lineWidth = 1;
cvInitFont(&fontgame,CV_FONT_HERSHEY_SIMPLEX, hScale,vScale,0,lineWidth);//初始化字体
int mode = 0;
bool bflash = true;
while(bflash)
{
char presskey = cvWaitKey(int(T*1000));
switch(presskey)
{
case '\r':
if(0==mode)
{
//如果mode为0,则当前处于start game被选择状态
//终止循环,执行开始游戏的代码
bflash=false;
break;
}
else if(1==mode)
{
//如果mode为1,则当前处于quit game被选择状态
//直接调用exit(),退出整个程序
exit(0);
}
break;
//向下
case 's':
if(0==mode)
mode=1;
break;
//向上
case 'w':
if(1==mode)
mode=0;
break;
}
//将图像恢复为背景
memcpy(pflashimg->imageData, pflashbkimg->imageData, pflashbkimg->imageSize);
//根据当前模式的不同,显示不同的文字
if(0==mode)
{
cvPutText(pflashimg , "Start Game", cvPoint(228,320), &fonthighlight,CV_RGB(255, 0,0));//在图片中输出字符
cvPutText(pflashimg , "Quit Game", cvPoint(228,360), &fontnormal, CV_RGB(255,255,0));//在图片中输出字符
}
else if(1==mode)
{
cvPutText(pflashimg , "Start Game", cvPoint(228,320), &fontnormal, CV_RGB(255,255,0));//在图片中输出字符
cvPutText(pflashimg , "Quit Game", cvPoint(228,360), &fonthighlight, CV_RGB(255, 0,0));//在图片中输出字符
}
cvShowImage("dawugong", pflashimg);
}
printf("start game...\n");
// 开始游戏
// 通过自定义结构体定义场景中出现的怪物、人物或是其它物体
DWG objs[3];
if(LoadData(objs))
{
printf("load data success\n");
}
// 成功读取数据后,我们分别定义两个指针用于指向飞机和蜈蚣
DWG* pWugong = &(objs[WGINDEX]);
DWG* pFeiji = &(objs[FEIJIINDEX]);
DWG* pZidan = &(objs[ZIDANINDEX]);
pWugong->pimg = cvLoadImage("22.png");
pFeiji->pimg = cvLoadImage("11.png");
pZidan->pimg = cvLoadImage(" 1 .png")
IplImage* pbkimg = cvLoadImage("background.png");
IplImage* pdrawimg = cvCloneImage(pbkimg);
while(true)
{
char presskey = cvWaitKey(int(T*1000));
switch(presskey)
{
case 'a':
//修改坐标值
pFeiji->xpos -= 20;
break;
case 'd':
pFeiji->xpos += 20;
case 'w':
pFeiji->ypos += 20;
case 's':
pFeiji->ypos -= 20;
case 'f':
pzidan->xpos = fp,
//修改坐标值
break;
}
//将图像恢复为背景
memcpy(pdrawimg->imageData, pbkimg->imageData, pbkimg->imageSize);
DrawImage(pdrawimg, pFeiji->pimg, pFeiji->xpos, pFeiji->ypos);
DrawImage(pdrawimg, pWugong->pimg, pWugong->xpos, pWugong->ypos);
DrawImage(pdrawimg, pZidan->pimg, pZidan->xpos, pZidan->ypos);
//显示数据
cvPutText(pdrawimg , "Score Level Time", cvPoint(120, 25), &fontgame,CV_RGB(255, 255, 255));//在图片中输出字符
cvPutText(pdrawimg , "00500 1-1 100", cvPoint(120, 50), &fontgame,CV_RGB(255, 255, 255));//在图片中输出字符
cvShowImage("dawugong", pdrawimg);
}
if(SaveData(objs))
{
printf("save data success\n");
}
// 释放所有图像资源
cvReleaseImage(&pflashimg);
cvReleaseImage(&pflashbkimg);
cvReleaseImage(&pbkimg);
cvReleaseImage(&pdrawimg);
cvReleaseImage(&pFeiji->pimg);
cvReleaseImage(&pWugong->pimg);
return 0;
}