ゆとりーなの日記

日記的な事を書いて行くと思はれる

まさかの続行倍プッシュ

http://d.hatena.ne.jp/nao_19/20110530/1306740860を読んでてもうちょっとC++らしく書けるんじゃないかなぁとか思ったので。

//Keyboard.h
#pragma once

class Keyboard {
 public:
  keybord();
  void Update();
  int Get(int keyCode) const; // constメンバ関数に出来そう

 private:
  static const int KEYFRAMES = 256; // キーフレームはkeybord内でしか使ってないっぽいのでprivate定数に
  int m_Key[KEYFRAMES];
};
//Keyboard.cpp
#include <DxLib.h>
#include "Keyboard.h"


Keyboard::Keyboard() {}

void Keyboard::Update() {
  char tmpKey[KEYFRAMES];
  GetHitKeyStateAll(tmpKey);
  for (int i = 0; i < KEYFRAMES; ++i) {
    if (tmpKey[i]) {
      ++m_Key[i];
    } else {
      m_Key[i] = 0;
    }
  }
}

int Keyboard::Get(int KeyCode) const {
  return m_Key[KeyCode];
}
//Player.h
#pragma once
// 前方宣言で耐えそう
class keybord;

class Player {
 public:
  Player();
  ~Player();
  void Calc(const Keyboard &key); // C++ならconst参照渡しや!
  void Graph();
  
 private:
  int m_Handle;
  int m_y;
  int m_x;
};
//Player.cpp
#include <DxLib.h>
#include "Player.h"
#include "Keyboard.h"

// Initialize()とかはコンストラクタ内で完結するのが流行りっぽい
Player::Player() : m_handle(LoadGraph("../画像/キャラクタ01.png")), m_x(0), m_y(0) {}

// Finalize()とかはデストラクタの仕事っぽい
Player::~Player(void) {
  DeleteGraph(m_Handle);
}

void Player::Graph() {
  DrawGraph(m_x, m_y, m_Handle, TRUE);
}

void Player::Calc(const Keyboard &key) {
  if (key.Get(KEY_INPUT_UP) > 0) {
    --m_y;
  }
  if (key.Get(KEY_INPUT_DOWN) > 0) { 
    ++m_y;
  }
}
//main.cpp
#include <DxLib.h>
#include "Player.h"
#include "Keyboard.h"

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
  ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK);

  // 別にnewでなくてもよさそう
  Player player;

  // 同じく
  keyboard keyboard;

  // Playerクラスの初期化はコンストラクタで終わってる

  while(!ScreenFlip() && !ProcessMessage() && !ClearDrawScreen()) {
    keyboard.Update();

    player.Calc(keyboard);
    player.Graph();

    if(keyboard.Get(KEY_INPUT_ESCAPE) > 0) {
      break;
    }
  }

  // 後始末はデストラクタが勝手にやる
	
  DxLib_End();

  return 0;
}