第4回:敵をつくる

 プレイヤーの基本プログラムがひととおりできましたので、敵キャラクラスの作成に移りましょう。

 敵キャラといっても、すべての敵が同じ動き・パターンでは、スペースインベーダーになってしまいます。ザコからボスまで様々なパターンを提供するためにも、CCharactorを基底とする敵キャラ共通クラス「CEnemyBase」を用意することにしましょう。今は全くと言っていいほど空の状態ですが、後々いろいろとクラスに修正を加えていきます。
#pragma once

#include "Charactor.h"

#define ENEMY_PRIORITY 60000

class CEnemyBase : public CCharactor
{
protected:
    virtual void Init();
};
#include "EnemyBase.h"

void CEnemyBase::Init()
{
}
 手始めに簡単なザコ敵を作ってみることにしましょう。今回つくるザコ敵は、アニメーションしながら左から右(あるいはその逆)に加速度を増しながら移動していくというシンプルなものにしています。なお、サンプルとして利用するザコ的に使用するテクスチャは、別の敵のデータとも共有しています。
#pragma once

#include "EnemyBase.h"

class CEnemy1 : public CEnemyBase
{
public:
    CEnemy1(float sx);
private:
    int frame, animframe;
    bool left;
    float accel_x;
protected:
    virtual void Init();
    virtual void Exec();
};
#include "Enemy.h"

CEnemy1::CEnemy1(float sx)
{
    this->x = sx;
}

void CEnemy1::Init()
{
    CEnemyBase::Init();

    sprite.SetTexture((CTexture*)FindItemBox("zakotex"));
    sprite.SetSpriteSize(32, 32);

    frame = 0;
    animframe = 0;

    y = -16.0f;
    accel_x = 0.0f;
    left = (x < 320.0f);
}

void CEnemy1::Exec()
{
    y += 3.0f;

    x += accel_x;
    if(left == true){
        accel_x += 0.05f;
    }else{
        accel_x -= 0.05f;
    }

    if(y > 640.0f + 16.0f || x < -16.0f || x > 640.0f + 16.0f)
    {
        // 画面外に出たら消去
        RemoveObject(this);
        return;
    }

    frame++;
    if(frame >= 10){
        animframe++;
        if(animframe > 5) animframe = 0;

        frame = 0;
        sprite.SetFrame(animframe);
    }

    sprite.Draw(x, y);
}
 試しにwinmain.cppのコードをこのように修正してみましょう。以下のムービーのように敵が移動します。
    game.AppendObject(new CTaskHead(), 0, true);
    game.AppendObject(new CTaskTail(), INT_MAX, true);

    CTexture *etex = new CTexture(_T("data\\zako.png"));
    game.AppendItemBox("zakotex", etex);
    game.AppendObject(etex, 1000, true);

    game.AppendObject(new CEnemy1(50.0f), ENEMY_PRIORITY, true);

    ShowWindow(mainWnd, nCmdShow);