みけCAT さんが書きました:私がNo: 15で指摘した問題がまだ修正されていないようですね。
そのようです。
今のところとりあえずNo.7最後の行の問題と、No.15で指摘して頂いた点は改善しました。(wave.cpp Line:36)
現時点での動作するソースコードを張っておきます。
wave.h
コード:
#ifndef DEF_WAVE_H
#define DEF_WAVE_H
//中心に向かっての加速度
const double G = 1;
//一つの質点が持つ情報
typedef struct
{
//座標
int x;
int y;
//加速度
double v;
}dot_t;
//一つの波が持つ情報
typedef struct
{
//質点
dot_t dot[640];
//遅延量(未実装)
int late;
//損質量(未実装)
double lost;
}wave_t;
void Wave_Init();
void Wave_Update();
void Wave_Draw();
#endif
wave.cpp
コード:
#include "DxLib.h"
#include "KeyBoard.h"
#include "wave.h"
wave_t wave[2];
wave_t *current_wave = &wave[0];
wave_t *next_wave = &wave[1];
void Wave_Init()
{
//遅延量(単位:frame)
current_wave->late = 1;
//損質量(単位:加速度/frame)
current_wave->lost = 0.2;
for (int i = 0; i < 640; i++)
{
current_wave->dot[i].x = i;
current_wave->dot[i].y = 240;
current_wave->dot[i].v = 0;
}
}
void Wave_Update()
{
//中心に向かって加速度をつける
if (current_wave->dot[0].y < 240)
{
next_wave->dot[0].v = current_wave->dot[0].v - G;
} else if (current_wave->dot[0].y > 240)
{
next_wave->dot[0].v = current_wave->dot[0].v + G;
} else
{
//何も押されていない場合、次フレームに現在のフレームの加速度を代入、よっていずれの場合も、次フレームnext_wave->dot[0].vには現在のフレームの情報を含むものが入る。
next_wave->dot[0].v = current_wave->dot[0].v;
}
//次のフレームは、Zキーが押された場合、加速度が1になる。
if (KeyBoard_Get(KEY_INPUT_Z) > 1)
{
next_wave->dot[0].v += 1;
}
else if (KeyBoard_Get(KEY_INPUT_X) > 1)
{
next_wave->dot[0].v -= 1;
}
//デバッグ用
DrawFormatString(0, 24, GetColor(255,255,255), "next:%0.0f current:%0.0f\n", next_wave->dot[0].v, current_wave->dot[0].v);
//加速度のコピー
for (int i = 638; i >= 0; i--)
{
//次のフレームは、現在のフレームの一つ左の点の加速度になる、
next_wave->dot[i + 1].v = current_wave->dot[i].v;
//次のフレームのx座標は、現在のフレームに等しい
next_wave->dot[i].x = current_wave->dot[i].x;
//次のフレームのy座標は、現在のフレームに次のフレームの加速度を反映させた位置である。(?)
next_wave->dot[i].y = current_wave->dot[i].y - next_wave->dot[i].v;
}
// 波のデータのバッファを入れ替える
{
wave_t *temp = current_wave;
current_wave = next_wave;
next_wave = temp;
}
}
void Wave_Draw()
{
//中心線の描画
DrawLine(0, 240, 640, 240, GetColor(255, 0, 0), 3);
//描画
for (int i = 0; i < 638; i++)
{
DrawLine(current_wave->dot[i].x, current_wave->dot[i].y, current_wave->dot[i+1].x, current_wave->dot[i+1].y, GetColor(255, 255, 255),1);
//DrawBox(current_wave->dot[i].x, current_wave->dot[i].y, current_wave->dot[i].x+4, current_wave->dot[i].y+4, GetColor(255, 255, 255),true);
}
}
KeyBoard.h
コード:
#ifndef DEF_KEYBOARD_H
#define DEF_KEYBOARD_H
int KeyBoard_Update();
int KeyBoard_Get(int KeyCode);
#endif DEF_KEYBOARD_H
KeyBoard.cpp
コード:
#include "DxLib.h"
#include "KeyBoard.h"
static int m_Key[256];
// キーの入力状態を更新する
int KeyBoard_Update()
{
char tmpKey[256]; // 現在のキーの入力状態を格納する
GetHitKeyStateAll(tmpKey); // 全てのキーの入力状態を得る
for (int i = 0; i<256; i++)
{
if (tmpKey[i] != 0)
{ // i番のキーコードに対応するキーが押されていたら
m_Key[i]++; // 加算
}
else { // 押されていなければ
m_Key[i] = 0; // 0にする
}
}
return 0;
}
int KeyBoard_Get(int KeyCode)
{
return m_Key[KeyCode];
}
Main.cpp
コード:
#include "DxLib.h"
#include "KeyBoard.h"
#include "wave.h"
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
ChangeWindowMode(TRUE);
DxLib_Init();
SetDrawScreen(DX_SCREEN_BACK);
Wave_Init();
while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && KeyBoard_Get(KEY_INPUT_ESCAPE) == 0)
{
KeyBoard_Update();
Wave_Update();
Wave_Draw();
}
printfDx("メインループを抜けました。何かキーを押すと終了します。");
WaitKey();
DxLib_End();
return 0;
}
x=1の時のyの値が異常であることについては「何故か」解決してしまっています。多分No.15で指摘していただいたことに関連しているか、たまたまであるかと思いますが。
このコードに問題があったとしても、この後 今日、明日と用事があって申し訳ありませんが、返信がかなり遅れるかもしれません.
:追記: 動作しなかったので必要なコードの追加