《咸鱼的救赎》代码总结

剧情一帧

看完了了童晶老师的《做游戏,学编程》网课,自己尝试着用C做了一个小游戏,主要实现了三个功能:galgame幻灯片剧情切换,打飞机小游戏,找不同游戏。利用了easyX的交互和图形界面功能。下面对代码实现进行总结,以免遗忘。
github:(https://github.com/iMaxmoe/game_saultyFish)

幻灯片切换

由于对easyX的函数并不熟悉,这里使用的是笨办法,通过加载新图片来实现剧情切换。这种方法适用于于小体量的galgame,但一旦文本量大了,就会造成不小的负担。更优解还是加载一张背景图片,变更文本框。

  • 加载IMAGE对象,使用loadimage(&pic,"path")函数。为了防止图片切换过快,自定义了load()函数,由putimage()Sleep()两部分组成。
  • 幻灯片切换主要依靠while()switch()语句,定义了clickjump两个变量,来控制切换图片和跳出循环。此处才深刻体会到了while()for()的本质区别。
  • easyX的鼠标交互函数
MOUSEMSG m;
while (MouseHit())
{
    m = GetMouseMsg();
    if (m.uMsg == WM_LBUTTONDOWN)
    click++;
}

打飞机游戏

设置了3种攻击对象,引入了时间函数,是三个主要功能中最复杂的部分。

对象绘制
  • 由于画面需要不断更新,为免卡顿,使用了BeginBatchDraw()FlushBatchDraw()以及EndBatchDraw()三个函数。
  • “退而求其次大法”:由于蠢,给炮弹只设置了长度为3的数组,因此在连续射击时出现了炮弹消失的Bug。这里炮弹并不是真正的消失,而是被重新定位到画面外的位置。这也是游戏处理图形对象的常用技巧。
  • easyX的putimage()函数非常好用,只需要定义两个关于x和y坐标的变量,就可以通过该函数实现图形位置切换。此处依旧是while()函数,在每个循环都需要更新画面,帧切换实现动画效果。
炮弹逻辑

主要是速度调节(依赖循环)和重新定位两个功能。

for (int j = 0; j < 3; j++)
    {
        if (speedBbl == 2)
        {
            bblY[j] -= 3;
            speedBbl = 0;
        }
        if (bblY[j] <= 0) //bubble is out of the canvas
        {
            bblY[j] = -3000;//redirect and wait for the new launch
        }
        speedBbl++;
    }
击中怪物

由于怪物数量多,也需要设置数组,此处用for()循环,同时涉及定位容错问题。我采用的方法:用photoshop处理怪物遮罩图,并且记录图片大小。

for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            if ((bblX[j] < mons1X[i] + 35) && (bblX[j] > mons1X[i] - 35) && (bblY[j] < mons1Y[i] + 35) && (bblY[j] > mons1Y[i] - 35))
            {
                mons1X[i] = (rand() % 750) + 20;
                mons1Y[i] = -200;
                score++;
                for (int j = 0; j<3; j++)
                    bblY[j] = -3000;
                //set the music
                mciSendString("close jpmusic", NULL, 0, NULL);
                mciSendString("open .\\gameImage\\mons1.mp3 alias jpmusic", NULL, 0, NULL);
                mciSendString("play jpmusic", NULL, 0, NULL);

            }
        }

同样,需要定义怪物坐标变量,并且在循环中更新怪物位置以实现降落效果。
怪物重生成则运用了随机数。

鼠标交互

easyX()鼠标定位函数以及click感知函数。

MOUSEMSG m;
    while (MouseHit())
    {
        m = GetMouseMsg();
        if (m.uMsg == WM_MOUSEMOVE)
        {
            fishX = m.x;
        }

        //for bubble 1
        if ((m.uMsg == WM_LBUTTONDOWN) && (bblY[0] == -3000))
        {
            bblX[0] = fishX + 25;
            bblY[0] = fishY - 50;
        }

        //for bubble after one
        for (int j = 1; j < 3; j++)
        {
            if ((m.uMsg == WM_LBUTTONDOWN)&&(bblY[j-1]!=-3000))
            {
                bblX[j] = fishX + 25;
                bblY[j] = fishY - 50;
            }
        }
    }
}
通关判定

while()框架下嵌入两个if()判断

void level1()
{
    startup1();
    while (1)
    {       /*end of shooting*/
        if (anger <= 0)
        {
            EndBatchDraw();
            break;
        }

        if (left <= 0)
            gameover1();
        show1();
        updateWithoutInput1();
        updateWithInput1();
    }
}

找不同游戏

主要利用的是鼠标交互功能。笨办法:photoshop标尺定位不同点的像素位置。图片处理时间远超代码时间XD。逻辑很简单。

void forPic1()
{
    //pic1
    while ((pic1[0] == 0) || (pic1[1] == 0) || (pic1[2] == 0) || (pic1[3] == 0) || (pic1[4] == 0))
    {
        MOUSEMSG m1;
        FlushMouseMsgBuffer();
        m1 = GetMouseMsg();
        setlinecolor(COLORREF RGB(256, 256, 256));
        setlinestyle(PS_SOLID | PS_JOIN_BEVEL, 3);
        if (m1.uMsg == WM_LBUTTONDOWN)
        {
            m1 = GetMouseMsg();
            if ((m1.x < 636) && (m1.x > 592) && (m1.y < 225) && (m1.y > 200))
            {
                pic1[0] = 1;
                circle(614, 212.5, 15);
                right();
            }

            if ((m1.x < 473) && (m1.x > 447) && (m1.y < 131) && (m1.y > 114))
            {
                pic1[1] = 1;
                circle(460, 122.5, 15);
                right();
            }

            if ((m1.x < 748) && (m1.x > 676) && (m1.y < 174) && (m1.y > 94))
            {
                pic1[2] = 1;
                circle(712, 134, 30);
                right();
            }

            if ((m1.x < 514) && (m1.x > 414) && (m1.y < 497) && (m1.y > 419))
            {
                pic1[3] = 1;
                circle(464, 458, 40);
                right();
            }

            if ((m1.x < 620) && (m1.x > 580) && (m1.y < 190) && (m1.y > 164))
            {
                pic1[4] = 1;
                circle(600, 177, 20);
                right();
            }
        }
    }
    Sleep(500);
}

杂七杂八

  • 音乐设置包含背景音乐和音效两部分,注意切换音乐时需要关闭前一个。
mciSendString("close bkmusic", NULL, 0, NULL);
mciSendString("open .\\gameImage\\bgm1.mp3 alias bkmusic", NULL, 0, NULL);
mciSendString("play bkmusic", NULL, 0, NULL);
mciSendString("close jpmusic", NULL, 0, NULL);
mciSendString("open .\\gameImage\\mons3.mp3 alias jpmusic", NULL, 0, NULL);
mciSendString("play jpmusic", NULL, 0, NULL);
  • 使用了童晶老师教的游戏模块化框架:
int main()
{
startup();
while(1)
{
  show();
  updateWithoutInput();
  updateWithInput();
}
}
  • 使用了头文件的方法来分类编写不同关卡。
  • 自己绘制和处理立绘和素材,photoshop技术++。

总结

第一次独立完成的千行项目,有太多可以优化的地方,不过还是蛮有意思的。接下来想深入学java,开发一个安卓游戏~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容