c++ 打飞机游戏开发日志

设计思路:
控制台模式
  初始化:
  建立画面,初始化数据
  游戏过程:
    1.获取操作
    2.修改数据
    3.更新画面
  结束:
    关闭画面,delete动态分配数据

4.29日

  创建游戏背景,实现飞机移动操作,实现子弹飞行

4.30日

  实现游戏数据管理,飞机击落动画,随机出现敌机

代码:

#include<iostream>
#include<list>
#include<time.h>
#include<easyx.h>
#include<graphics.h>
#include"stdio.h"
#include"math.h"
#include "dos.h"
#include<windows.h>
#include<mmsystem.h>
#include<cstdlib>
#define KEY_DOWN(vk_c) (GetAsyncKeyState(vk_c)&0x8000)
using namespace std;
/*
如何设计一个飞机游戏?
    写的不咋地类的处理很一般: 重构:
    FlyingObject{数据:pos,speed,dir  操作:Getpos Setpos Getspeed Set... Move }等
    子类: Bullet Plane
控制台模式
初始化:
    建立画面,初始化数据
游戏过程:
    1.获取操作
    2.修改数据
    3.更新画面
结束:
    关闭画面,delete动态分配数据
    */
double direction[4][2] = { {1,0},{-1,0},{0,1},{0,-1} };
struct pos
{
    double x, y;
};
class bullet
{
public:
    bullet(pos _p,bool _up):p(_p),speed(1),up(_up){}
    inline bool check()
    {
        if (p.x < 0 || p.y < 0 || p.x>768 || p.y>512)
            return false;
        return true;
    }
    void Getimg()
    {
        loadimage(&img, _T("D:\\bullet1.ico"));
    }
    void Move();
    int Getspeed()
    {
        return speed;
    }
    pos Getpos()
    {
        return p;
    }
    IMAGE img;
private:
    pos p;
    int speed;
    bool up;
};
void bullet::Move()
{
    if (up)
        p.y -= Getspeed();
    else
        p.y += Getspeed();
}
IMAGE background,ash;
list<bullet> L;
class plane
{
public:
    ~plane()
    {
    }
    plane(int _x, int _y)
    {
        p.x = _x; p.y = _y; speed = 1;
    }
    void Move(int dir);
    void Setpos(double  x, double y)
    {
        p.x = x; p.y = y;
    }
    void Setspeed(double _s)
    {
        speed = _s;
    }
    void Shoot(bool up);
    void Drawplane();
    pos Getpos()
    {
        return p;
    }
    IMAGE img;
private:
    double speed;
    pos p;
    int life;
};
list<plane> PlaneList;
plane hero(230, 700);
void plane::Drawplane()
{
    putimage(p.x, p.y, &img);
}
void plane::Move(int dir)
{
    if (p.x + direction[dir][0] >= -20 && p.x + direction[dir][0] <= 500)
        Setpos(p.x + direction[dir][0]*speed, p.y + direction[dir][1] * speed);
    else if (p.x + direction[dir][0] * speed < -20)
        Setpos(500, p.y + direction[dir][1] * speed);
    else
        Setpos(0, p.y + direction[dir][0] * speed);
}
void plane::Shoot(bool up)
{
    pos tp = p;
    tp.x += 15;
    bullet tmp(tp, up);
    tmp.Getimg();
    L.insert(L.begin(), tmp);
    putimage(tp.x, p.y, &tmp.img);
    FlushBatchDraw();
}
void init()
{
    initgraph(512, 768);
    loadimage(&background, _T("D:\\background.jpg"));
    loadimage(&hero.img, _T("D:\\hero1.ico"));
    loadimage(&ash, _T("D:\\ashes.ico"));
    putimage(0, 0, &background);
}
void check()
{
    pos tmp;
    if (!L.empty())
    for (list<bullet>::iterator it = L.begin(); it != L.end();)
    {
        it->Move();
        tmp = it->Getpos();
        if (tmp.y < 0 || tmp.y>700)
        {
            it = L.erase(it);
        }
        else
            it++;
    }
    for (list<plane>::iterator it = PlaneList.begin(); it != PlaneList.end();)
    {
        it->Move(2);
        tmp = it->Getpos();
        if (tmp.y < -20 || tmp.y>750)
        {
            it = PlaneList.erase(it);
        }
        else
            it++;
    }
    int d = 24;
    for (list<bullet>::iterator it = L.begin(); it != L.end();)
    {
        auto tbullet = it->Getpos();
        bool f = false;
        for (auto k = PlaneList.begin(); k != PlaneList.end();)
        {
            auto tpos = k->Getpos();
            tpos.x += 15;
            tpos.y += 15;
            if ((tbullet.x - tpos.x<d&&tbullet.x - tpos.x>-d) && (tbullet.y - tpos.y<d&&tbullet.y - tpos.y>-d))
            {
                f = true;
                k = PlaneList.erase(k);
            }
            else k++;
        }
        if (!f)
            it++;
        else
            it = L.erase(it);
    }
}
void update()
{
    putimage(0, 0, &background);
    if (rand() % 1000 == 0)
    {
        plane p1(rand()%400+20,0);
        p1.Setspeed(0.2);
        loadimage(&p1.img, _T("D:\\plane1.ico"));
        PlaneList.insert(PlaneList.begin(), p1);
    }
    hero.Drawplane();
    check();
    if (!L.empty())
        for (list<bullet>::iterator it = L.begin(); it != L.end(); it++)
        {
            auto t = it->Getpos();
            putimage(t.x, t.y, &it->img);
        }
    for (auto it = PlaneList.begin(); it != PlaneList.end(); it++)
    {
        it->Drawplane();
    }
    FlushBatchDraw();
}
int main()
{
    init();
    BeginBatchDraw();
    while (1)
    {
        update();
        if (KEY_DOWN(VK_UP))
        {
            hero.Move(3);
        }
        else if (KEY_DOWN(VK_LEFT))
        {
            hero.Move(1);
        }
        else if (KEY_DOWN(VK_RIGHT))
        {
            hero.Move(0);
        }
        else if (KEY_DOWN(VK_DOWN))
        {
            hero.Move(2);
        }
        else if (KEY_DOWN(VK_RETURN) || KEY_DOWN(VK_SPACE))
        {
            while (KEY_DOWN(VK_RETURN) || KEY_DOWN(VK_SPACE))
            { }
            if(L.size()<5)
                hero.Shoot(true);
        }
    }
    return 0;
}

5.1日

  感觉类的编写处理不好,导致有很多重复的代码。决定重构一下。

时间: 2024-10-02 14:19:36

c++ 打飞机游戏开发日志的相关文章

[游戏开发日志]Windows下Cocos2d-x 3.14环境搭建

总介绍 我们小组使用的是cocos2d-x的游戏开发引擎,因此在所有开发工作之前,我们需要对这个引擎进行环境的搭建. 搭建过程 VS2013的下载和安装 VS只是作为一个开发环境而已,简单来说就是敲代码用的,都中文的,搞起来很简单,我就不介绍了 图1: 在cocos2d-x的网站上即可下到cocos2d-x的最新版本,下载后用vs即可打开相应的工程文件 我们下载版本3.14.1,完成下载后,我们打开该压缩包 图2: 此外,我们还需要进行python的安装,是因为在编译这个引擎时,python是必

unity独立游戏开发日志2018/09/22

f::很头痛之前rm做的游戏在新电脑工程打不开了...只能另起炉灶... 还不知道新游戏叫什么名...暂且叫方块世界.(素材已经授权) 首先是规划下场景和素材文件夹的建立. unity常用的文件夹有:Scripts(储存脚本),Scenes(储存场景),Animation(储存动画)等等.最重要的是Resources(这个不可以打错),因为在unity中可以通过Load Resources中的文件夹中按文件名寻找对应的资源.来进行动态生成. 像我这个游戏中的物体含有大量的重复(很多游戏中都存在,

聚众游戏 开发日志

 2014.09.29    2014.09.28    2014.09.27    2014.09.26    2014.09.25    2014.09.24  提交android到安致市场  2014.09.23  服务器Wcf权限控制  2014.09.22  发布.net4和android两个版本  2014.09.21  部署服务器 www.winlost.com

unity独立游戏开发日志2018/09/26

最近太忙,今天吃饭的时候灵感一现...想到了随机地图生成的方法,不过可能实现的比较笨...还需要优化,大佬绕过. 注释没打,最后统一解释. using System.Collections; using System.Collections.Generic; using UnityEngine; public class StartMap : MonoBehaviour { private GameObject Bridge; private GameObject Cliff; private

基于Cocos2d-x-1.0.1的飞机大战游戏开发实例(下)

在飞机大战游戏开发中遇到的问题和解决方法: 1.在添加菜单时,我要添加一个有背景的菜单,需要在菜单pMenu中添加一个图片精灵,结果编译过了但是运行出错,如下图: 查了很多资料,调试了很长时间,整个人都要崩溃了. 最后发现引擎中CCMenu::itemForTouch函数中有遍历子节点的行为,但是循环中没有判断子节点类型是否为CCMenuItem.如图:码,这样一来,加入到pMenu中的图片精灵被当作菜单项取了出来使用,导致报错.老版本的果然又不完善的地方,整个人都不好了...果断修改引擎里的源

基于Cocos2d-x-1.0.1的飞机大战游戏开发实例(中)

接<基于Cocos2d-x-1.0.1的飞机大战游戏开发实例(上)> 三.代码分析 1.界面初始化 1 bool PlaneWarGame::init() 2 { 3 bool bRet = false; 4 do 5 { 6 CC_BREAK_IF(! CCLayer::init()); 7 8 _size = CCDirector::sharedDirector()->getWinSize(); 9 10 // 设置触摸可用 11 this->setIsTouchEnabled

cocos2dx游戏开发&mdash;&mdash;微信打飞机学习笔记(三)&mdash;&mdash;WelcomeScene的搭建

一.场景与层的关系: cocos2dx的框架可以说主要由导演,场景,层,精灵来构成: 1.其中导演,意如其名,就是操控整个游戏的一个单例,管理着整个游戏. 2.场景就像电影的一幕剧情,所以说,懂得如何划分好游戏的场景,是开始动手做游戏的第一步. 3.一个场景会有很多层,用来处理场景不同的功能. 4.而精灵则是最小的单位,比如子弹,飞机,敌机都是一个个的精灵所组成的.   二.WelcomeScene的搭建: 1.场景和层的二种搭建方法: (1)一种就是跟HelloWorld示例一样的方法,以一个

cocos2dx游戏开发——微信打飞机学习笔记(二)——游戏框架

一.游戏的基本框架: WelcomeScene    ——>    GameScene   ——>   GameOverScene ||                                       ||                                    || ∨                                      ∨                                   ∨ WelcomeLayer            

cocos2dx游戏开发——微信打飞机学习笔记(一)——开发准备

一.环境的搭建 1.Windows开发准备: (1)软件下载及安装 •下载Cocos2d-x 最新版本:http://www.cocos2d-x.org/download 或者从Cocos2d-x GitHub主页中克隆Develop分支:https://github.com/cocos2d/cocos2d-x •配置Python 2.7 环境:http://www.python.org/download/releases/ •建议IDE:Visual Studio 2013 •运行cocos2