| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 816 人关注过本帖
标题:编写大蜈蚣的小游戏 图片界面出来了但是子弹出不来也打不了咋办
只看楼主 加入收藏
eikasia
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2015-11-11
收藏
 问题点数:0 回复次数:1 
编写大蜈蚣的小游戏 图片界面出来了但是子弹出不来也打不了咋办


#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;
}
搜索更多相关主题的帖子: include 小游戏 加速度 结构体 图片 
2015-11-11 21:02
eikasia
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2015-11-11
收藏
得分:0 
求助。。。
2015-11-16 14:22
快速回复:编写大蜈蚣的小游戏 图片界面出来了但是子弹出不来也打不了咋办
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019794 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved