#include "DxLib.h"
#define SCREEN_WIDTH (320) //画面の横幅
#define SCREEN_HEIGHT (240) //画面の縦幅
#define STAGE_WIDTH (400)
#define STAGE_HEIGHT (320)
#define CHIP_SIZE (16) //チップのサイズ
#define MAP_WIDTH (STAGE_WIDTH/CHIP_SIZE)
#define MAP_HEIGHT (STAGE_HEIGHT/CHIP_SIZE)
#define JOYPAD_BUTTON_MAX (28)
#define PAD_INPUT_ON 1
#define PAD_INPUT_OFF 0
HANDLE Stdout;
//テスト用のマップデータ。実際の開発では、Tiled(フリーのマップエディタ)を使う予定。
//このテストプログラムがある程度の段階に達したら、本格的な開発に移ります。
//TinyXML2は便利だ
char MapData[MAP_HEIGHT][MAP_WIDTH]
{
1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
1,0,0,0,0, 0,1,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
1,0,0,0,0, 1,1,1,1,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
1,0,0,0,1, 1,1,1,1,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,1,1,1,0, 0,0,0,0,1,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
1,0,0,0,0, 0,0,1,0,1, 1,1,1,1,1, 1,1,1,1,1, 0,0,0,0,1,
1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1,
};
float PlayerX, PlayerY;
float SaveX, SaveY;
float MoveX, MoveY;
float VectX;
float DropPower, Grav;
float MaxVect;
char JumpFlag, Dir, AirFlag, NonVertJump;
int DashCnt, JumpTimer;
int Input, EdgeInput, Pad;
int FreamStartTime;
int CameraX = 0;
int CameraY = 0;
float CharX, CharY, ViewCharX, ViewCharY;
int MapHitCheck(float X, float Y, float *MoveX, float *MoveY, int Size);
int CharMove(float *X, float *Y, float MoveX, float MoveY, float *Drop, float *G, char *Jump, char *Air, char *Vert,int *JumpT,float *Vect, int Size);
int MapChipParam(float X, float Y);
int CameraCheck(float X, float Y);
bool IsPush(int PadHandle);
bool IsFree(int PadHandle);
bool IsHold(int PadHandle);
bool IsPull(int PadHandle);
//将来の開発で使う予定の関数。
//押されたか?
bool IsPush(int PadHandle) {
if (((EdgeInput&PadHandle) > PAD_INPUT_ON)) {
return true;
}
return false;
}
//押されていないか?
bool IsFree (int PadHandle) {
if ((Input&PadHandle) == PAD_INPUT_OFF) {
return true;
}
return false;
}
//離されたか?
bool IsPull(int PadHandle) {
if ((EdgeInput&PadHandle) == PAD_INPUT_OFF) {
return true;
}
return false;
}
//押されているか?
bool IsHold (int PadHandle) {
if ((Input&PadHandle) > PAD_INPUT_ON) {
return true;
}
return false;
}
//マップチップのデータ獲得
int MapChipParam(float X, float Y) {
int x, y;
x = (int)X / CHIP_SIZE;
y = (int)Y / CHIP_SIZE;
if (x >= MAP_WIDTH || y >= MAP_HEIGHT || x < 0 || y < 0) return 0;
return MapData[y][x];
}
//衝突判定
int MapHitCheck(float X, float Y, float *MoveX, float *MoveY, int Size) {
float afX, afY;
afX = X + *MoveX;
afY = Y + *MoveY;
float blx, brx, bby, bty;
blx = (float)((int)afX / Size)*Size;
brx = (float)((int)afX / Size + 1)*Size;
bty = (float)((int)afY / Size)*Size;
bby = (float)((int)afY / Size + 1)*Size;
if (MapChipParam(afX, afY) == 1) {
if (*MoveY > 0.0F) {
printf("\n下に当たりました。");
//移動量を補正する
*MoveY = bty - Y - 1.0F;
//上の壁に当たったと判定する
return 3;
}
if (*MoveY < 0.0F) {
printf("\n上に当たりました。");
//移動量を補正する
*MoveY = bby - Y + 1.0F;
//下の壁に当たったと判定する
return 4;
}
//右の当たり判定
if (*MoveX > 0.0F) {
printf("\n右に当たりました。");
//移動量を補正する
*MoveX = blx - X - 1.0F;
//右の壁に当たったと判定する
return 1;
}
//左の当たり判定
if (*MoveX < 0.0F) {
printf("\n左に当たりました。");
//移動量を補正する
*MoveX = brx - X + 1.0F;
//左の壁に当たったと判定する
return 2;
}
//ここに来たら適当な値を返す
return 4;
}
return 0;
}
//当たり判定チェック
int CharMove(float *X, float *Y, float MoveX, float MoveY, float *Drop,float *G,char *Jump,char *Air,char *Vert, int *JumpT,float *Vect,int Size){
float Dummy = 0.0F;
float hsize;
//直前フレーム
float PrevX = *X + MoveX;
float PrevY = *Y + MoveY;
//ベクトルのバックアップ
float SaveMoveX = MoveX;
float SaveMoveY = MoveY;
hsize = Size * 0.5F;
//上下の当たり判定チェック、上に衝突したら落下させ、下に衝突したら着地させる。
{
//左下
if (MapHitCheck(*X - hsize, *Y + hsize - 1.0F, &Dummy, &MoveY,(int)Size) == 3) *Drop = 0.0F,MoveY -= 1.0F,printf("\n上下::左下");
//右下
if (MapHitCheck(*X + hsize, *Y + hsize - 1.0F, &Dummy, &MoveY,(int)Size) == 3) *Drop = 0.0F,MoveY -= 1.0F,printf("\n上下::右下");
//左上
if (MapHitCheck(*X - hsize, *Y - hsize + 1.0F, &Dummy, &MoveY,(int)Size) == 4) *Drop *= -0.5F,MoveY = 0.0F,printf("\n上下::左上");
//右上
if (MapHitCheck(*X + hsize, *Y - hsize + 1.0F, &Dummy, &MoveY,(int)Size) == 4) *Drop *= -0.5F,MoveY = 0.0F,printf("\n上下::右上");
//問題ないのなら移動させる
PrevY = *Y + MoveY;
*Y = PrevY;
}
//左右の当たり判定チェック
{
//左下
if (MapHitCheck(*X - hsize + 1.0F, *Y + hsize, &MoveX, &Dummy, (int)Size))*Vect = 0.0F, MoveX += 1.0F, printf("\n左右::左下");
//右上
if (MapHitCheck(*X + hsize - 1.0F, *Y + hsize, &MoveX, &Dummy, (int)Size))*Vect = 0.0F, MoveX -= 1.0F, printf("\n左右::右下");
//左上
if (MapHitCheck(*X - hsize + 1.0F, *Y - hsize, &MoveX, &Dummy, (int)Size))*Vect = 0.0F, MoveX += 1.0F, printf("\n左右::左上");
//右上
if (MapHitCheck(*X + hsize - 1.0F, *Y - hsize, &MoveX, &Dummy, (int)Size))*Vect = 0.0F, MoveX -= 1.0F, printf("\n左右::右上");
//問題ないのなら移動させる
PrevX = *X + MoveX;
*X = PrevX;
}
//着地判定
{
if (MapChipParam(*X - hsize, *Y + hsize + 1.0F) == 0 && MapChipParam(*X + hsize, *Y + hsize + 1.0F) == 0) {
*Air = TRUE;
*G = 0.5F;
}
else {
*JumpT = 0;
*Drop = 0.0F;
*G = 0.0F;
*Air = FALSE;
*Vert = FALSE;
*Jump = FALSE;
}
}
return 0;
}
//カメラの位置計算
int CameraCheck(float X, float Y) {
//カメラのチェック
CharX = X;
CharY = Y;
//カメラの位置を計算する
CameraX = (int)CharX - SCREEN_WIDTH / 2;
CameraY = (int)CharY - SCREEN_HEIGHT / 2;
//カメラの補正
if (CameraX < 0)CameraX = 0;
if (CameraX >(STAGE_WIDTH - SCREEN_WIDTH))CameraX = (STAGE_WIDTH - SCREEN_WIDTH);
if (CameraY < 0)CameraY = 0;
if (CameraY >(STAGE_HEIGHT - SCREEN_HEIGHT))CameraY = (STAGE_HEIGHT - SCREEN_HEIGHT);
ViewCharX = CharX - CameraX;
ViewCharY = CharY - CameraY;
return 0;
}
int init(void) {
ChangeWindowMode(TRUE),SetGraphMode(320,240,32),printf("初期化しています…");
if (DxLib_Init() == -1) { return -1; }
PlayerX = 240.0F, PlayerY = 200.0F, MoveX = 0.0F, MoveY = 0.0F;
JumpFlag = FALSE, DropPower = 0.0F, Grav = 0.5F, Dir = TRUE;
Input = 0, EdgeInput = 0, FreamStartTime = GetNowCount();
DashCnt = 0,MaxVect = 0.0F, NonVertJump = FALSE;
return 0;
}
int main(void) {
FreamStartTime = GetNowCount();
while (GetNowCount() - FreamStartTime < 1000 / 60) {}
system("cls");
printf("メインループ開始\n");
printf("\nPlayerX=%d,PlayerY=%d,Grav=%8.2f,DropPower=%8.2f", (int)PlayerX, (int)PlayerY, Grav,DropPower);
printf("\nMoveX=%8.1f,MoveY=%8.1f,Jump=%d", MoveX, MoveY,JumpFlag);
printf("\nCharX=%8.1f,CharY=%8.1f,CameraX=%d,CameraY=%d,ViewX=%8.1f,ViewY=%8.1f", CharX, CharY, CameraX, CameraY, ViewCharX, ViewCharY);
printf("\n現在の向き=%d\t右は1、左は0,NonVert = %d,VectX = %8.1f,JumpTimer = %d,DashCnt = %d", Dir, NonVertJump, VectX,JumpTimer,DashCnt);
//カメラの処理を行う
CameraCheck(PlayerX, PlayerY);
//入力状態を更新
{
int i;
i = GetJoypadInputState(DX_INPUT_KEY_PAD1);
EdgeInput = i & ~Input;
Input = i;
}
//移動処理
{
int DashTime = 8;
int ContTimer = 8;
//ベクトルを初期化し、加減速処理を行う。
if (NonVertJump == FALSE) {
MoveX = 0.0F;
VectX = 0.0F;
MaxVect = 0.0F;
}
else {
MoveX = VectX;
}
MoveY = 0.0F;
char RunButton;
//0なら移動していない、1なら右へ移動中、2なら左へ移動中
char NonVertJumpFlag = 0;
{
//レバー二段ダッシュの判定を行う
if ((Input&PAD_INPUT_2) > PAD_INPUT_ON) {
RunButton = TRUE;
}
else {
RunButton = FALSE;
}
//右へ移動
if (NonVertJump == FALSE && (Input&PAD_INPUT_RIGHT) > PAD_INPUT_ON) {
if ((Input&PAD_INPUT_RIGHT) == PAD_INPUT_ON) {
if (DashCnt < DashTime && NonVertJumpFlag == 1) {
RunButton = TRUE;
}
if (NonVertJumpFlag == 2) {
RunButton = FALSE;
}
RunButton = TRUE;
}
if (RunButton == TRUE && JumpFlag == FALSE) {
MoveX = 8.0F;
}
else if (RunButton == FALSE && JumpFlag == FALSE) {
MoveX = 5.0F;
}
else {
MoveX = 3.0F;
}
Dir = TRUE;
NonVertJumpFlag = 1;
DashCnt = 0;
}
//左に移動
if (NonVertJump == FALSE && (Input&PAD_INPUT_LEFT) > PAD_INPUT_ON) {
if (RunButton == TRUE) {
MoveX = -8.0F;
}
else if (RunButton == FALSE && JumpFlag == FALSE) {
MoveX = -5.0F;
}
else {
MoveX = -3.0F;
}
Dir = FALSE;
NonVertJumpFlag = 2;
DashCnt = 0;
}
DashCnt++;
}
//ジャンプボタンが押されているフレームを格納する。
if ((Input&PAD_INPUT_1) > PAD_INPUT_ON) {
JumpTimer++;
}
else {
JumpTimer = 0;
}
//長押しで重力が弱く、離せば、重力が強く。
if (JumpTimer > 0) {
if (JumpTimer == 1 && NonVertJumpFlag == 0 && JumpFlag == FALSE) {
JumpFlag = TRUE;
DropPower = -7.0F;
}
if (JumpTimer == 1 && NonVertJumpFlag == 1 && JumpFlag == FALSE) {
JumpFlag = TRUE;
DropPower = -7.0F;
if (RunButton == TRUE) {
VectX = 8.0F;
MaxVect = 8.0F;
}
else {
VectX = 5.0F;
MaxVect = 5.0F;
}
//斜めに飛んでいることを確認
NonVertJump = TRUE;
}
if (JumpTimer == 1 && NonVertJumpFlag == 2 && JumpFlag == FALSE) {
JumpFlag = TRUE;
DropPower = -7.0F;
if (RunButton == TRUE) {
VectX = -8.0F;
MaxVect = -8.0F;
}
else {
VectX = -5.0F;
MaxVect = -5.0F;
}
NonVertJump = TRUE;
}
Grav = 0.25F;
}
else {
if (JumpFlag == TRUE) {
Grav = 0.5F;
}
}
}
//空中での移動を解禁する
if (NonVertJump == TRUE && VectX == 0 || DropPower > 0) {
VectX = 0.0F;
NonVertJump = FALSE;
}
//右へジャンプしているときに左で減速
if (NonVertJump == TRUE && VectX > 0 &&(Input&PAD_INPUT_LEFT) > PAD_INPUT_ON) {
//マリオ3以降よろしく、方向転換する。
Dir = FALSE;
VectX -= 1.0F;
DropPower += 0.1F;
MoveX = VectX;
}
//マリオ3のように加速
if (NonVertJump == TRUE && VectX > 0 && MaxVect > VectX && (Input&PAD_INPUT_RIGHT)>PAD_INPUT_ON) {
Dir = TRUE;
VectX += 1.0F;
MoveX = VectX;
}
//左へジャンプしているときに右で減速
if (NonVertJump == TRUE && VectX < 0 &&(Input&PAD_INPUT_RIGHT) > PAD_INPUT_ON) {
//マリオ3以降よろしく、方向転換する。
Dir = TRUE;
VectX += 1.0F;
DropPower += 0.1F;
MoveX = VectX;
}
if (NonVertJump == TRUE && VectX < 0 && MaxVect < VectX && (Input&PAD_INPUT_LEFT)>PAD_INPUT_ON) {
Dir = FALSE;
VectX -= 1.0F;
MoveX = VectX;
}
//落下処理
DropPower += Grav;
MoveY = DropPower;
//移動量に基づいて移動する。
CharMove(&PlayerX, &PlayerY, MoveX, MoveY, &DropPower, &Grav, &JumpFlag, &AirFlag, &NonVertJump, &JumpTimer ,&VectX, CHIP_SIZE);
//マップの描画
{
int i, j;
for (i = 0; i < MAP_HEIGHT; i++) {
for (j = 0; j < MAP_WIDTH; j++) {
if (MapData[i][j] == 1) {
DrawBox(j*CHIP_SIZE - CameraX, i*CHIP_SIZE - CameraY, j*CHIP_SIZE + CHIP_SIZE - CameraX, i*CHIP_SIZE + CHIP_SIZE - CameraY, GetColor(255, 255, 255), TRUE);
}
}
}
}
//キャラの描画
DrawBox((int)(ViewCharX)-(CHIP_SIZE / 2), (int)(ViewCharY)-(CHIP_SIZE / 2), (int)(ViewCharX + CHIP_SIZE) - (CHIP_SIZE / 2), (int)(ViewCharY + CHIP_SIZE) - (CHIP_SIZE / 2), GetColor(255, 0, 0), TRUE);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
AllocConsole(); FILE* out = 0; freopen_s(&out, "CON", "w", stdout); Stdout = GetStdHandle(STD_OUTPUT_HANDLE);
init();
while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {
main();
}
DxLib_End(); fclose(out); FreeConsole();
return 0;
}
レバー二回ダッシュが反応しない。
レバー二回ダッシュが反応しない。
ジャンプの距離調整が以外にも簡単すぎて驚きが隠せない人です。レバーを二回入れるとダッシュする機能をhttp://www48.atpages.jp/happynetwork/dash.htmlを参考にして実装しようとしているのですが、何故か、反応せずに通常の歩きのような速度になってしまいます。(具体的にはRunButtonがTRUEのときに、8.0Fになる感じです。)
Re: レバー二回ダッシュが反応しない。
へー、そうなんですね。keito940 さんが書きました: ジャンプの距離調整が以外にも簡単すぎて驚きが隠せない人です。レバーを二回入れるとダッシュする機能をhttp://www48.atpages.jp/happynetwork/dash.htmlを参考にして実装しようとしているのですが、何故か、反応せずに通常の歩きのような速度になってしまいます。(具体的にはRunButtonがTRUEのときに、8.0Fになる感じです。)
現状の報告はわかりましたが、質問は書かれていないように見えます。
ソースコードが比較的長いので、質問が無いのであればあまり読みたくありません。
何か質問はありますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: レバー二回ダッシュが反応しない。
右に二回で右へダッシュを実装しているのに、右に二回押しても、ダッシュが出ないので、どうしたらダッシュできるのかを教えて下さい。みけCAT さんが書きました: ソースコードが比較的長いので、質問が無いのであればあまり読みたくありません。
何か質問はありますか?
Re: レバー二回ダッシュが反応しない。
バグをみつけて修正し、コンパイルして実行すればいいと思います。keito940 さんが書きました:右に二回で右へダッシュを実装しているのに、右に二回押しても、ダッシュが出ないので、どうしたらダッシュできるのかを教えて下さい。
例えば、実行していないし理解も足りないと思いますが、290行目からの
という部分は、
- NonVertJumpFlagを0で初期化し、更新しないままNonVertJumpFlag == 1やNonVertJumpFlag == 2の判定をしているので、
これらは普通は(デバッガ、チートツール、宇宙線などの外部の力で値が書き変わらなければ)常に偽になります。 - そもそも、内側のif文で判定してRunButtonに値を代入しても、その後で結局RunButton = TRUE;を実行しているので、
条件文に副作用も無いし、内側のif文がある意味が無いです。
「右に二回」というのは、「右を押す→離す→十分短い間にもう一度右を押す」という操作のことですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: レバー二回ダッシュが反応しない。
そもそも、PAD_INPUT_RIGHTはDXライブラリ Ver 3.17eにおいては0x00000004と定義されており、
(Input&PAD_INPUT_RIGHT)は0か4になるでしょう。
従って、このファイルの先頭の方で1と定義されているPAD_INPUT_ONと比較すると、常に不一致になり、
この条件式は常に偽になるでしょう。
そもそも、ある特定の値との比較によって真かどうかを判定しようとするのが間違いです。
ボタンが押されているかは (Input & 判定したいボタンを表す定数)
ボタンが押されていないかは !(Input & 判定したいボタンを表す定数)
のようにするといいでしょう。
似た問題について、ポインタの話(おまけ) - C言語 - 碧色工房
の「真偽値 FALSE」の所に書かれています。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: レバー二回ダッシュが反応しない。
みけCATさんの言うとおりにしてみました。このコードはレバー二回ダッシュを実装しているように見えますが、ソニックみたいに、ダッシュが常に出た状態になってしまいます。どこに原因がありますか?
int main(void) {
FreamStartTime = GetNowCount();
while (GetNowCount() - FreamStartTime < 1000 / 60) {}
system("cls");
printf("メインループ開始\n");
printf("\nPlayerX=%d,PlayerY=%d,Grav=%8.2f,DropPower=%8.2f", (int)PlayerX, (int)PlayerY, Grav,DropPower);
printf("\nMoveX=%8.1f,MoveY=%8.1f,Jump=%d", MoveX, MoveY,JumpFlag);
printf("\nCharX=%8.1f,CharY=%8.1f,CameraX=%d,CameraY=%d,ViewX=%8.1f,ViewY=%8.1f", CharX, CharY, CameraX, CameraY, ViewCharX, ViewCharY);
printf("\n現在の向き=%d\t右は1、左は0,NonVert = %d,VectX = %8.1f,JumpTimer = %d,DashCnt = %d", Dir, NonVertJump, VectX,JumpTimer,DashCnt);
//カメラの処理を行う
CameraCheck(PlayerX, PlayerY);
//入力状態を更新
{
int i;
i = GetJoypadInputState(DX_INPUT_KEY_PAD1);
EdgeInput = i & ~Input;
Input = i;
}
//移動処理
{
int DashTime = 8;
int ContTimer = 8;
//ベクトルを初期化し、加減速処理を行う。
if (NonVertJump == FALSE) {
MoveX = 0.0F;
VectX = 0.0F;
MaxVect = 0.0F;
}
else {
MoveX = VectX;
}
MoveY = 0.0F;
char RunButton;
//0なら移動していない、1なら右へ移動中、2なら左へ移動中
char NonVertJumpFlag = 0;
{
if ((Input&PAD_INPUT_2)) {
RunButton = TRUE;
}
else {
RunButton = FALSE;
}
//右へ移動
if (NonVertJump == FALSE && (Input&PAD_INPUT_RIGHT)) {
NonVertJumpFlag = 1;
//レバー二段ダッシュの判定を行う
if ((Input&PAD_INPUT_RIGHT)) {
if (DashCnt < DashTime && dir == 1) {
RunButton = TRUE;
}
if (dir == 2) {
RunButton = FALSE;
}
dir = 1;
}
if (RunButton == TRUE && JumpFlag == FALSE) {
MoveX = 8.0F;
}
else if (RunButton == FALSE && JumpFlag == FALSE) {
MoveX = 5.0F;
}
else {
MoveX = 3.0F;
}
Dir = TRUE;
DashCnt = 0;
}
//左に移動
if (NonVertJump == FALSE && (Input&PAD_INPUT_LEFT)) {
NonVertJumpFlag = 2;
if ((Input&PAD_INPUT_LEFT)) {
if (DashCnt < DashTime && dir == 2) {
RunButton = TRUE;
}
if (dir == 1) {
RunButton = FALSE;
}
dir = 2;
}
if (RunButton == TRUE && JumpFlag == FALSE) {
MoveX = -8.0F;
}
else if (RunButton == FALSE && JumpFlag == FALSE) {
MoveX = -5.0F;
}
else {
MoveX = -3.0F;
}
Dir = FALSE;
DashCnt = 0;
}
DashCnt++;
}
//ジャンプボタンが押されているフレームを格納する。
if ((Input&PAD_INPUT_1)) {
JumpTimer++;
}
else {
JumpTimer = 0;
}
//長押しで重力が弱く、離せば、重力が強く。
if (JumpTimer > 0) {
if (JumpTimer == 1 && NonVertJumpFlag == 0 && JumpFlag == FALSE) {
JumpFlag = TRUE;
DropPower = -7.0F;
}
if (JumpTimer == 1 && NonVertJumpFlag == 1 && JumpFlag == FALSE) {
JumpFlag = TRUE;
DropPower = -7.0F;
if (RunButton == TRUE) {
VectX = 8.0F;
MaxVect = 8.0F;
}
else {
VectX = 5.0F;
MaxVect = 5.0F;
}
//斜めに飛んでいることを確認
NonVertJump = TRUE;
}
if (JumpTimer == 1 && NonVertJumpFlag == 2 && JumpFlag == FALSE) {
JumpFlag = TRUE;
DropPower = -7.0F;
if (RunButton == TRUE) {
VectX = -8.0F;
MaxVect = -8.0F;
}
else {
VectX = -5.0F;
MaxVect = -5.0F;
}
NonVertJump = TRUE;
}
Grav = 0.25F;
}
else {
if (JumpFlag == TRUE) {
Grav = 0.5F;
}
}
}
//空中での移動を解禁する
if (NonVertJump == TRUE && VectX == 0 || DropPower > 0) {
VectX = 0.0F;
NonVertJump = FALSE;
}
//右へジャンプしているときに左で減速
if (NonVertJump == TRUE && VectX > 0 &&(Input&PAD_INPUT_LEFT)) {
//マリオ3以降よろしく、方向転換する。
Dir = FALSE;
VectX -= 1.0F;
DropPower += 0.1F;
MoveX = VectX;
}
//マリオ3のように加速
if (NonVertJump == TRUE && VectX > 0 && MaxVect > VectX && (Input&PAD_INPUT_RIGHT)) {
Dir = TRUE;
VectX += 1.0F;
MoveX = VectX;
}
//左へジャンプしているときに右で減速
if (NonVertJump == TRUE && VectX < 0 &&(Input&PAD_INPUT_RIGHT)) {
//マリオ3以降よろしく、方向転換する。
Dir = TRUE;
VectX += 1.0F;
DropPower += 0.1F;
MoveX = VectX;
}
if (NonVertJump == TRUE && VectX < 0 && MaxVect < VectX && (Input&PAD_INPUT_LEFT)) {
Dir = FALSE;
VectX -= 1.0F;
MoveX = VectX;
}
//落下処理
DropPower += Grav;
MoveY = DropPower;
//移動量に基づいて移動する。
CharMove(&PlayerX, &PlayerY, MoveX, MoveY, &DropPower, &Grav, &JumpFlag, &AirFlag, &NonVertJump, &JumpTimer ,&VectX, CHIP_SIZE);
//マップの描画
{
int i, j;
for (i = 0; i < MAP_HEIGHT; i++) {
for (j = 0; j < MAP_WIDTH; j++) {
if (MapData[i][j] == 1) {
DrawBox(j*CHIP_SIZE - CameraX, i*CHIP_SIZE - CameraY, j*CHIP_SIZE + CHIP_SIZE - CameraX, i*CHIP_SIZE + CHIP_SIZE - CameraY, GetColor(255, 255, 255), TRUE);
}
}
}
}
//キャラの描画
DrawBox((int)(ViewCharX)-(CHIP_SIZE / 2), (int)(ViewCharY)-(CHIP_SIZE / 2), (int)(ViewCharX + CHIP_SIZE) - (CHIP_SIZE / 2), (int)(ViewCharY + CHIP_SIZE) - (CHIP_SIZE / 2), GetColor(255, 0, 0), TRUE);
}
Re: レバー二回ダッシュが反応しない。
取り合えずソースを2分割。g1.cpp,g2/cpp
g1.cpp
///
#include "DxLib.h"
///
#define SCREEN_WIDTH (320) //画面の横幅
#define SCREEN_HEIGHT (240) //画面の縦幅
#define STAGE_WIDTH (400)
#define STAGE_HEIGHT (320)
#define CHIP_SIZE (16) //チップのサイズ
#define MAP_WIDTH (STAGE_WIDTH/CHIP_SIZE)
#define MAP_HEIGHT (STAGE_HEIGHT/CHIP_SIZE)
#define JOYPAD_BUTTON_MAX (28)
#define PAD_INPUT_ON 1
#define PAD_INPUT_OFF 0
HANDLE Stdout;
//テスト用のマップデータ。実際の開発では、Tiled(フリーのマップエディタ)を使う予定。
//このテストプログラムがある程度の段階に達したら、本格的な開発に移ります。
//TinyXML2は便利だ
char MapData[MAP_HEIGHT][MAP_WIDTH]
{
1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
1,0,0,0,0, 0,1,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
1,0,0,0,0, 1,1,1,1,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
1,0,0,0,1, 1,1,1,1,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,1,1,1,0, 0,0,0,0,1,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
1,0,0,0,0, 0,0,1,0,1, 1,1,1,1,1, 1,1,1,1,1, 0,0,0,0,1,
1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1,
};
float PlayerX, PlayerY;
float SaveX, SaveY;
float MoveX, MoveY;
float VectX;
float DropPower, Grav;
float MaxVect;
char JumpFlag, Dir, AirFlag, NonVertJump;
int DashCnt, JumpTimer;
int Input, EdgeInput, Pad;
int FreamStartTime;
int CameraX = 0;
int CameraY = 0;
float CharX, CharY, ViewCharX, ViewCharY;
/////
int main();/////<<<===================================================== main
int MapHitCheck(float X, float Y, float *MoveX, float *MoveY, int Size);
int CharMove(float *X, float *Y, float MoveX, float MoveY, float *Drop, float *G, char *Jump, char *Air, char *Vert,int *JumpT,float *Vect, int Size);
int MapChipParam(float X, float Y);
int CameraCheck(float X, float Y);
bool IsPush(int PadHandle);
bool IsFree(int PadHandle);
bool IsHold(int PadHandle);
bool IsPull(int PadHandle);
//将来の開発で使う予定の関数。
//押されたか?
bool IsPush(int PadHandle) {
if (((EdgeInput&PadHandle) > PAD_INPUT_ON)) {
return true;
}
return false;
}
//押されていないか?
bool IsFree (int PadHandle) {
if ((Input&PadHandle) == PAD_INPUT_OFF) {
return true;
}
return false;
}
//離されたか?
bool IsPull(int PadHandle) {
if ((EdgeInput&PadHandle) == PAD_INPUT_OFF) {
return true;
}
return false;
}
//押されているか?
bool IsHold (int PadHandle) {
if ((Input&PadHandle) > PAD_INPUT_ON) {
return true;
}
return false;
}
//マップチップのデータ獲得
int MapChipParam(float X, float Y) {
int x, y;
x = (int)X / CHIP_SIZE;
y = (int)Y / CHIP_SIZE;
if (x >= MAP_WIDTH || y >= MAP_HEIGHT || x < 0 || y < 0) return 0;
return MapData[y][x];
}
//衝突判定
int MapHitCheck(float X, float Y, float *MoveX, float *MoveY, int Size) {
float afX, afY;
afX = X + *MoveX;
afY = Y + *MoveY;
float blx, brx, bby, bty;
blx = (float)((int)afX / Size)*Size;
brx = (float)((int)afX / Size + 1)*Size;
bty = (float)((int)afY / Size)*Size;
bby = (float)((int)afY / Size + 1)*Size;
if (MapChipParam(afX, afY) == 1) {
if (*MoveY > 0.0F) {
printf("\n下に当たりました。");
//移動量を補正する
*MoveY = bty - Y - 1.0F;
//上の壁に当たったと判定する
return 3;
}
if (*MoveY < 0.0F) {
printf("\n上に当たりました。");
//移動量を補正する
*MoveY = bby - Y + 1.0F;
//下の壁に当たったと判定する
return 4;
}
//右の当たり判定
if (*MoveX > 0.0F) {
printf("\n右に当たりました。");
//移動量を補正する
*MoveX = blx - X - 1.0F;
//右の壁に当たったと判定する
return 1;
}
//左の当たり判定
if (*MoveX < 0.0F) {
printf("\n左に当たりました。");
//移動量を補正する
*MoveX = brx - X + 1.0F;
//左の壁に当たったと判定する
return 2;
}
//ここに来たら適当な値を返す
return 4;
}
return 0;
}
//当たり判定チェック
int CharMove(float *X, float *Y, float MoveX, float MoveY, float *Drop,float *G,char *Jump,char *Air,char *Vert, int *JumpT,float *Vect,int Size){
float Dummy = 0.0F;
float hsize;
//直前フレーム
float PrevX = *X + MoveX;
float PrevY = *Y + MoveY;
//ベクトルのバックアップ
float SaveMoveX = MoveX;
float SaveMoveY = MoveY;
hsize = Size * 0.5F;
//上下の当たり判定チェック、上に衝突したら落下させ、下に衝突したら着地させる。
{
//左下
if (MapHitCheck(*X - hsize, *Y + hsize - 1.0F, &Dummy, &MoveY,(int)Size) == 3) *Drop = 0.0F,MoveY -= 1.0F,printf("\n上下::左下");
//右下
if (MapHitCheck(*X + hsize, *Y + hsize - 1.0F, &Dummy, &MoveY,(int)Size) == 3) *Drop = 0.0F,MoveY -= 1.0F,printf("\n上下::右下");
//左上
if (MapHitCheck(*X - hsize, *Y - hsize + 1.0F, &Dummy, &MoveY,(int)Size) == 4) *Drop *= -0.5F,MoveY = 0.0F,printf("\n上下::左上");
//右上
if (MapHitCheck(*X + hsize, *Y - hsize + 1.0F, &Dummy, &MoveY,(int)Size) == 4) *Drop *= -0.5F,MoveY = 0.0F,printf("\n上下::右上");
//問題ないのなら移動させる
PrevY = *Y + MoveY;
*Y = PrevY;
}
//左右の当たり判定チェック
{
//左下
if (MapHitCheck(*X - hsize + 1.0F, *Y + hsize, &MoveX, &Dummy, (int)Size))*Vect = 0.0F, MoveX += 1.0F, printf("\n左右::左下");
//右上
if (MapHitCheck(*X + hsize - 1.0F, *Y + hsize, &MoveX, &Dummy, (int)Size))*Vect = 0.0F, MoveX -= 1.0F, printf("\n左右::右下");
//左上
if (MapHitCheck(*X - hsize + 1.0F, *Y - hsize, &MoveX, &Dummy, (int)Size))*Vect = 0.0F, MoveX += 1.0F, printf("\n左右::左上");
//右上
if (MapHitCheck(*X + hsize - 1.0F, *Y - hsize, &MoveX, &Dummy, (int)Size))*Vect = 0.0F, MoveX -= 1.0F, printf("\n左右::右上");
//問題ないのなら移動させる
PrevX = *X + MoveX;
*X = PrevX;
}
//着地判定
{
if (MapChipParam(*X - hsize, *Y + hsize + 1.0F) == 0 && MapChipParam(*X + hsize, *Y + hsize + 1.0F) == 0) {
*Air = TRUE;
*G = 0.5F;
}
else {
*JumpT = 0;
*Drop = 0.0F;
*G = 0.0F;
*Air = FALSE;
*Vert = FALSE;
*Jump = FALSE;
}
}
return 0;
}
//カメラの位置計算
int CameraCheck(float X, float Y) {
//カメラのチェック
CharX = X;
CharY = Y;
//カメラの位置を計算する
CameraX = (int)CharX - SCREEN_WIDTH / 2;
CameraY = (int)CharY - SCREEN_HEIGHT / 2;
//カメラの補正
if (CameraX < 0)CameraX = 0;
if (CameraX >(STAGE_WIDTH - SCREEN_WIDTH))CameraX = (STAGE_WIDTH - SCREEN_WIDTH);
if (CameraY < 0)CameraY = 0;
if (CameraY >(STAGE_HEIGHT - SCREEN_HEIGHT))CameraY = (STAGE_HEIGHT - SCREEN_HEIGHT);
ViewCharX = CharX - CameraX;
ViewCharY = CharY - CameraY;
return 0;
}
int init(void) {
ChangeWindowMode(TRUE),SetGraphMode(320,240,32),printf("初期化しています…");
if (DxLib_Init() == -1) { return -1; }
PlayerX = 240.0F, PlayerY = 200.0F, MoveX = 0.0F, MoveY = 0.0F;
JumpFlag = FALSE, DropPower = 0.0F, Grav = 0.5F, Dir = TRUE;
Input = 0, EdgeInput = 0, FreamStartTime = GetNowCount();
DashCnt = 0,MaxVect = 0.0F, NonVertJump = FALSE;
return 0;
}
///// main ---テスト用---
/*
int main(void) {
FreamStartTime = GetNowCount();
while (GetNowCount() - FreamStartTime < 1000 / 60) {}
system("cls");
printf("メインループ開始\n");
printf("\nPlayerX=%d,PlayerY=%d,Grav=%8.2f,DropPower=%8.2f", (int)PlayerX, (int)PlayerY, Grav,DropPower);
printf("\nMoveX=%8.1f,MoveY=%8.1f,Jump=%d", MoveX, MoveY,JumpFlag);
printf("\nCharX=%8.1f,CharY=%8.1f,CameraX=%d,CameraY=%d,ViewX=%8.1f,ViewY=%8.1f", CharX, CharY, CameraX, CameraY, ViewCharX, ViewCharY);
printf("\n現在の向き=%d\t右は1、左は0,NonVert = %d,VectX = %8.1f,JumpTimer = %d,DashCnt = %d", Dir, NonVertJump, VectX,JumpTimer,DashCnt);
DrawString(10, 10, "DxLib: Hello World!", GetColor(255, 255, 255)); // 文字を書く
return 0;
}
*/
////////////////////////////////////////////////////////////////////////////////////////////////////
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
AllocConsole(); FILE* out = 0; freopen_s(&out, "CON", "w", stdout);
Stdout = GetStdHandle(STD_OUTPUT_HANDLE);
init();
while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {
main();
}
DxLib_End(); fclose(out); FreeConsole();
return 0;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
///
#include "DxLib.h"
///
#define SCREEN_WIDTH (320) //画面の横幅
#define SCREEN_HEIGHT (240) //画面の縦幅
#define STAGE_WIDTH (400)
#define STAGE_HEIGHT (320)
#define CHIP_SIZE (16) //チップのサイズ
#define MAP_WIDTH (STAGE_WIDTH/CHIP_SIZE)
#define MAP_HEIGHT (STAGE_HEIGHT/CHIP_SIZE)
#define JOYPAD_BUTTON_MAX (28)
#define PAD_INPUT_ON 1
#define PAD_INPUT_OFF 0
extern HANDLE Stdout;
//テスト用のマップデータ。実際の開発では、Tiled(フリーのマップエディタ)を使う予定。
//このテストプログラムがある程度の段階に達したら、本格的な開発に移ります。
//TinyXML2は便利だ
extern char MapData[MAP_HEIGHT][MAP_WIDTH];
extern float PlayerX, PlayerY;
extern float SaveX, SaveY;
extern float MoveX, MoveY;
extern float VectX;
extern float DropPower, Grav;
extern float MaxVect;
extern char JumpFlag, Dir, AirFlag, NonVertJump;
extern int DashCnt, JumpTimer;
extern int Input, EdgeInput, Pad;
extern int FreamStartTime;
extern int CameraX;
extern int CameraY;
extern float CharX, CharY, ViewCharX, ViewCharY;
/////
int main();
int MapHitCheck(float X, float Y, float *MoveX, float *MoveY, int Size);
int CharMove(float *X, float *Y, float MoveX, float MoveY, float *Drop, float *G, char *Jump, char *Air, char *Vert,int *JumpT,float *Vect, int Size);
int MapChipParam(float X, float Y);
int CameraCheck(float X, float Y);
bool IsPush(int PadHandle);
bool IsFree(int PadHandle);
bool IsHold(int PadHandle);
bool IsPull(int PadHandle);
/////
int main(void) {
FreamStartTime = GetNowCount();
while (GetNowCount() - FreamStartTime < 1000 / 60) {}
system("cls");
printf("メインループ開始\n");
printf("\nPlayerX=%d,PlayerY=%d,Grav=%8.2f,DropPower=%8.2f", (int)PlayerX, (int)PlayerY, Grav,DropPower);
printf("\nMoveX=%8.1f,MoveY=%8.1f,Jump=%d", MoveX, MoveY,JumpFlag);
printf("\nCharX=%8.1f,CharY=%8.1f,CameraX=%d,CameraY=%d,ViewX=%8.1f,ViewY=%8.1f", CharX, CharY, CameraX, CameraY, ViewCharX, ViewCharY);
printf("\n現在の向き=%d\t右は1、左は0,NonVert = %d,VectX = %8.1f,JumpTimer = %d,DashCnt = %d", Dir, NonVertJump, VectX,JumpTimer,DashCnt);
//カメラの処理を行う
CameraCheck(PlayerX, PlayerY);
//入力状態を更新
{
int i;
i = GetJoypadInputState(DX_INPUT_KEY_PAD1);
EdgeInput = i & ~Input;
Input = i;
}
//移動処理
{
int DashTime = 8;
int ContTimer = 8;
//ベクトルを初期化し、加減速処理を行う。
if (NonVertJump == FALSE) {
MoveX = 0.0F;
VectX = 0.0F;
MaxVect = 0.0F;
}
else {
MoveX = VectX;
}
MoveY = 0.0F;
char RunButton;
//0なら移動していない、1なら右へ移動中、2なら左へ移動中
char NonVertJumpFlag = 0;
{
if ((Input&PAD_INPUT_2)) {
RunButton = TRUE;
}
else {
RunButton = FALSE;
}
//右へ移動
if (NonVertJump == FALSE && (Input&PAD_INPUT_RIGHT)) {
NonVertJumpFlag = 1;
//レバー二段ダッシュの判定を行う
if ((Input&PAD_INPUT_RIGHT)) {
if (DashCnt < DashTime && Dir == 1) {
RunButton = TRUE;
}
if (Dir == 2) {
RunButton = FALSE;
}
Dir = 1;
}
if (RunButton == TRUE && JumpFlag == FALSE) {
MoveX = 8.0F;
}
else if (RunButton == FALSE && JumpFlag == FALSE) {
MoveX = 5.0F;
}
else {
MoveX = 3.0F;
}
Dir = TRUE;
DashCnt = 0;
}
//左に移動
if (NonVertJump == FALSE && (Input&PAD_INPUT_LEFT)) {
NonVertJumpFlag = 2;
if ((Input&PAD_INPUT_LEFT)) {
if (DashCnt < DashTime && Dir == 2) {
RunButton = TRUE;
}
if (Dir == 1) {
RunButton = FALSE;
}
Dir = 2;
}
if (RunButton == TRUE && JumpFlag == FALSE) {
MoveX = -8.0F;
}
else if (RunButton == FALSE && JumpFlag == FALSE) {
MoveX = -5.0F;
}
else {
MoveX = -3.0F;
}
Dir = FALSE;
DashCnt = 0;
}
DashCnt++;
}
//ジャンプボタンが押されているフレームを格納する。
if ((Input&PAD_INPUT_1)) {
JumpTimer++;
}
else {
JumpTimer = 0;
}
//長押しで重力が弱く、離せば、重力が強く。
if (JumpTimer > 0) {
if (JumpTimer == 1 && NonVertJumpFlag == 0 && JumpFlag == FALSE) {
JumpFlag = TRUE;
DropPower = -7.0F;
}
if (JumpTimer == 1 && NonVertJumpFlag == 1 && JumpFlag == FALSE) {
JumpFlag = TRUE;
DropPower = -7.0F;
if (RunButton == TRUE) {
VectX = 8.0F;
MaxVect = 8.0F;
}
else {
VectX = 5.0F;
MaxVect = 5.0F;
}
//斜めに飛んでいることを確認
NonVertJump = TRUE;
}
if (JumpTimer == 1 && NonVertJumpFlag == 2 && JumpFlag == FALSE) {
JumpFlag = TRUE;
DropPower = -7.0F;
if (RunButton == TRUE) {
VectX = -8.0F;
MaxVect = -8.0F;
}
else {
VectX = -5.0F;
MaxVect = -5.0F;
}
NonVertJump = TRUE;
}
Grav = 0.25F;
}
else {
if (JumpFlag == TRUE) {
Grav = 0.5F;
}
}
}
//空中での移動を解禁する
if (NonVertJump == TRUE && VectX == 0 || DropPower > 0) {
VectX = 0.0F;
NonVertJump = FALSE;
}
//右へジャンプしているときに左で減速
if (NonVertJump == TRUE && VectX > 0 &&(Input&PAD_INPUT_LEFT)) {
//マリオ3以降よろしく、方向転換する。
Dir = FALSE;
VectX -= 1.0F;
DropPower += 0.1F;
MoveX = VectX;
}
//マリオ3のように加速
if (NonVertJump == TRUE && VectX > 0 && MaxVect > VectX && (Input&PAD_INPUT_RIGHT)) {
Dir = TRUE;
VectX += 1.0F;
MoveX = VectX;
}
//左へジャンプしているときに右で減速
if (NonVertJump == TRUE && VectX < 0 &&(Input&PAD_INPUT_RIGHT)) {
//マリオ3以降よろしく、方向転換する。
Dir = TRUE;
VectX += 1.0F;
DropPower += 0.1F;
MoveX = VectX;
}
if (NonVertJump == TRUE && VectX < 0 && MaxVect < VectX && (Input&PAD_INPUT_LEFT)) {
Dir = FALSE;
VectX -= 1.0F;
MoveX = VectX;
}
//落下処理
DropPower += Grav;
MoveY = DropPower;
//移動量に基づいて移動する。
CharMove(&PlayerX, &PlayerY, MoveX, MoveY, &DropPower, &Grav, &JumpFlag, &AirFlag, &NonVertJump, &JumpTimer ,&VectX, CHIP_SIZE);
//マップの描画
{
int i, j;
for (i = 0; i < MAP_HEIGHT; i++) {
for (j = 0; j < MAP_WIDTH; j++) {
if (MapData[i][j] == 1) {
DrawBox(j*CHIP_SIZE - CameraX, i*CHIP_SIZE - CameraY, j*CHIP_SIZE + CHIP_SIZE - CameraX, i*CHIP_SIZE + CHIP_SIZE - CameraY, GetColor(255, 255, 255), TRUE);
}
}
}
}
//キャラの描画
DrawBox((int)(ViewCharX)-(CHIP_SIZE / 2), (int)(ViewCharY)-(CHIP_SIZE / 2), (int)(ViewCharX + CHIP_SIZE) - (CHIP_SIZE / 2), (int)(ViewCharY + CHIP_SIZE) - (CHIP_SIZE / 2), GetColor(255, 0, 0), TRUE);
}
cl /c /TP /EHsc /D "_MBCS" /MT /Id:\dxlib /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /W3 g1.cpp g2.cpp
Microsoft(R) C/C++ Optimizing Compiler Version 19.00.24215.1 for x86
Copyright (C) Microsoft Corporation. All rights reserved.
g1.cpp
g2.cpp
g2.cpp(94): error C2065: 'dir': 定義されていない識別子です。
g2.cpp(97): error C2065: 'dir': 定義されていない識別子です。
g2.cpp(100): error C2065: 'dir': 定義されていない識別子です。
g2.cpp(118): error C2065: 'dir': 定義されていない識別子です。
g2.cpp(121): error C2065: 'dir': 定義されていない識別子です。
g2.cpp(124): error C2065: 'dir': 定義されていない識別子です。
コードを生成中...
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\cl.EXE"' : リターン コード '0x2'
Stop.
g.mak
TARGETNAME=g1
C_FLAGS=/c /TP /EHsc /D "_MBCS" /MT /Id:\dxlib /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /W3
LINK_FLAGS=/SUBSYSTEM:WINDOWS /LIBPATH:"d:\DxLib_VC\プロジェクトに追加すべきファイル_VC用" "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib"
ALL:
cl $(C_FLAGS) $(TARGETNAME).cpp g2.cpp
link /out:$(TARGETNAME).exe $(LINK_FLAGS) $(TARGETNAME).obj g2.obj
$(TARGETNAME).exe
Re: レバー二回ダッシュが反応しない。
[訂正]g.mak
TARGETNAME=g1
C_FLAGS=/c /TP /EHsc /D "_MBCS" /MT /Id:\dxlib /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /W3
LINK_FLAGS=/SUBSYSTEM:WINDOWS /LIBPATH:d:\DxLib "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib"
ALL:
cl $(C_FLAGS) $(TARGETNAME).cpp g2.cpp
link /out:$(TARGETNAME).exe $(LINK_FLAGS) $(TARGETNAME).obj g2.obj
$(TARGETNAME).exe
Re: レバー二回ダッシュが反応しない。
すいません、しっかりコンパイルしたいと思います~。
ところで何か問題な点はありますか?
ところで何か問題な点はありますか?
int main(void) {
FreamStartTime = GetNowCount();
while (GetNowCount() - FreamStartTime < 1000 / 60) {}
system("cls");
printf("メインループ開始\n");
printf("\nPlayerX=%d,PlayerY=%d,Grav=%8.2f,DropPower=%8.2f", (int)PlayerX, (int)PlayerY, Grav,DropPower);
printf("\nMoveX=%8.1f,MoveY=%8.1f,Jump=%d", MoveX, MoveY,JumpFlag);
printf("\nCharX=%8.1f,CharY=%8.1f,CameraX=%d,CameraY=%d,ViewX=%8.1f,ViewY=%8.1f", CharX, CharY, CameraX, CameraY, ViewCharX, ViewCharY);
printf("\n現在の向き=%d\t右は1、左は0,NonVert = %d,VectX = %8.1f,JumpTimer = %d,DashCnt = %d", Dir, NonVertJump, VectX,JumpTimer,DashCnt);
//カメラの処理を行う
CameraCheck(PlayerX, PlayerY);
//入力状態を更新
{
int i;
i = GetJoypadInputState(DX_INPUT_KEY_PAD1);
EdgeInput = i & ~Input;
Input = i;
}
//移動処理
{
int DashTime = 8;
int ContTimer = 8;
//ベクトルを初期化し、加減速処理を行う。
if (NonVertJump == FALSE) {
MoveX = 0.0F;
VectX = 0.0F;
MaxVect = 0.0F;
}
else {
MoveX = VectX;
}
MoveY = 0.0F;
char RunButton;
//0なら移動していない、1なら右へ移動中、2なら左へ移動中
char NonVertJumpFlag = 0;
{
if ((Input&PAD_INPUT_2)) {
RunButton = TRUE;
}
else {
RunButton = FALSE;
}
//右へ移動
if (NonVertJump == FALSE && (Input&PAD_INPUT_RIGHT)) {
NonVertJumpFlag = 1;
DashCnt = 0;
//レバー二段ダッシュの判定を行う
if ((Input&PAD_INPUT_RIGHT)) {
if (DashCnt < DashTime && dir == 1) {
RunButton = TRUE;
}
if (dir == 2) {
RunButton = FALSE;
}
dir = 1;
}
if (RunButton == TRUE && JumpFlag == FALSE) {
MoveX = 8.0F;
}
else if (RunButton == FALSE && JumpFlag == FALSE) {
MoveX = 5.0F;
}
else {
MoveX = 3.0F;
}
}
//左に移動
if (NonVertJump == FALSE && (Input&PAD_INPUT_LEFT)) {
NonVertJumpFlag = 2;
DashCnt = 0;
if ((Input&PAD_INPUT_LEFT)) {
if (DashCnt < DashTime && dir == 2) {
RunButton = TRUE;
}
if (dir == 1) {
RunButton = FALSE;
}
dir = 2;
}
if (RunButton == TRUE && JumpFlag == FALSE) {
MoveX = -8.0F;
}
else if (RunButton == FALSE && JumpFlag == FALSE) {
MoveX = -5.0F;
}
else {
MoveX = -3.0F;
}
}
DashCnt++;
}
//ジャンプボタンが押されているフレームを格納する。
if ((Input&PAD_INPUT_1)) {
JumpTimer++;
}
else {
JumpTimer = 0;
}
//長押しで重力が弱く、離せば、重力が強く。
if (JumpTimer > 0) {
if (JumpTimer == 1 && NonVertJumpFlag == 0 && JumpFlag == FALSE) {
JumpFlag = TRUE;
DropPower = -7.0F;
}
if (JumpTimer == 1 && NonVertJumpFlag == 1 && JumpFlag == FALSE) {
JumpFlag = TRUE;
DropPower = -7.0F;
if (RunButton == TRUE) {
VectX = 8.0F;
MaxVect = 8.0F;
}
else {
VectX = 5.0F;
MaxVect = 5.0F;
}
//斜めに飛んでいることを確認
NonVertJump = TRUE;
}
if (JumpTimer == 1 && NonVertJumpFlag == 2 && JumpFlag == FALSE) {
JumpFlag = TRUE;
DropPower = -7.0F;
if (RunButton == TRUE) {
VectX = -8.0F;
MaxVect = -8.0F;
}
else {
VectX = -5.0F;
MaxVect = -5.0F;
}
NonVertJump = TRUE;
}
Grav = 0.25F;
}
else {
if (JumpFlag == TRUE) {
Grav = 0.5F;
}
}
}
//空中での移動を解禁する
if (NonVertJump == TRUE && VectX == 0 || DropPower > 0) {
VectX = 0.0F;
NonVertJump = FALSE;
}
//右へジャンプしているときに左で減速
if (NonVertJump == TRUE && VectX > 0 &&(Input&PAD_INPUT_LEFT)) {
//マリオ3以降よろしく、方向転換する。
Dir = FALSE;
VectX -= 1.0F;
DropPower += 0.1F;
MoveX = VectX;
}
//マリオ3のように加速
if (NonVertJump == TRUE && VectX > 0 && MaxVect > VectX && (Input&PAD_INPUT_RIGHT)) {
Dir = TRUE;
VectX += 1.0F;
MoveX = VectX;
}
//左へジャンプしているときに右で減速
if (NonVertJump == TRUE && VectX < 0 &&(Input&PAD_INPUT_RIGHT)) {
//マリオ3以降よろしく、方向転換する。
Dir = TRUE;
VectX += 1.0F;
DropPower += 0.1F;
MoveX = VectX;
}
if (NonVertJump == TRUE && VectX < 0 && MaxVect < VectX && (Input&PAD_INPUT_LEFT)) {
Dir = FALSE;
VectX -= 1.0F;
MoveX = VectX;
}
//落下処理
DropPower += Grav;
MoveY = DropPower;
//移動量に基づいて移動する。
CharMove(&PlayerX, &PlayerY, MoveX, MoveY, &DropPower, &Grav, &JumpFlag, &AirFlag, &NonVertJump, &JumpTimer ,&VectX, CHIP_SIZE);
//マップの描画
{
int i, j;
for (i = 0; i < MAP_HEIGHT; i++) {
for (j = 0; j < MAP_WIDTH; j++) {
if (MapData[i][j] == 1) {
DrawBox(j*CHIP_SIZE - CameraX, i*CHIP_SIZE - CameraY, j*CHIP_SIZE + CHIP_SIZE - CameraX, i*CHIP_SIZE + CHIP_SIZE - CameraY, GetColor(255, 255, 255), TRUE);
}
}
}
}
//キャラの描画
DrawBox((int)(ViewCharX)-(CHIP_SIZE / 2), (int)(ViewCharY)-(CHIP_SIZE / 2), (int)(ViewCharX + CHIP_SIZE) - (CHIP_SIZE / 2), (int)(ViewCharY + CHIP_SIZE) - (CHIP_SIZE / 2), GetColor(255, 0, 0), TRUE);
}
Re: レバー二回ダッシュが反応しない。
DashCntは0を代入、DashTimeは8で初期化し、その値をそのまま比較しているので、
DashCnt < DashTimeは(デバッガなどによる外部からの値の書き替えや処理系の不都合などがなければ)常に真となる、怪しい式ですね。
「左に移動」の方にも同様の怪しい式があります。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: レバー二回ダッシュが反応しない。
指摘してくれてありがとうございます。
さっきの式が常に真になるのなら、どうすればいいのですか?
レバー二回ダッシュのアルゴリズムは、今のサイトのであってますか?
さっきの式が常に真になるのなら、どうすればいいのですか?
レバー二回ダッシュのアルゴリズムは、今のサイトのであってますか?
Re: レバー二回ダッシュが反応しない。
コードの構成を、参考にしたサイトのとおりにしてみました。
中身は変わらないと思います。
僕にはなんのことやらさっぱりなので…。
中身は変わらないと思います。
//移動処理
{
int DashTime = 8;
int ContTimer = 8;
//ベクトルを初期化し、加減速処理を行う。
if (NonVertJump == FALSE) {
MoveX = 0.0F;
VectX = 0.0F;
MaxVect = 0.0F;
}
else {
MoveX = VectX;
}
MoveY = 0.0F;
char RunButton;
//0なら移動していない、1なら右へ移動中、2なら左へ移動中
char NonVertJumpFlag = 0;
{
if ((Input&PAD_INPUT_2)) {
RunButton = TRUE;
}
else {
RunButton = FALSE;
}
//右へ移動
if (NonVertJump == FALSE && (Input&PAD_INPUT_RIGHT)) {
NonVertJumpFlag = 1;
//レバー二段ダッシュの判定を行う
if ((Input&PAD_INPUT_RIGHT)) {
if (DashCnt < DashTime && dir == 1) {
RunButton = TRUE;
}
if (dir == 2) {
RunButton = FALSE;
}
dir = 1;
}
if (RunButton == TRUE && JumpFlag == FALSE) {
MoveX = 8.0F;
}
else if (RunButton == FALSE && JumpFlag == FALSE) {
MoveX = 5.0F;
}
else {
MoveX = 3.0F;
}
DashCnt = 0;
}
//左に移動
else if (NonVertJump == FALSE && (Input&PAD_INPUT_LEFT)) {
NonVertJumpFlag = 2;
if ((Input&PAD_INPUT_LEFT)) {
if (DashCnt < 8 && dir == 2) {
RunButton = TRUE;
}
if (dir == 1) {
RunButton = FALSE;
}
dir = 2;
}
if (RunButton == TRUE && JumpFlag == FALSE) {
MoveX = -8.0F;
}
else if (RunButton == FALSE && JumpFlag == FALSE) {
MoveX = -5.0F;
}
else {
MoveX = -3.0F;
}
DashCnt = 0;
}
else {
RunButton = FALSE;
}
DashCnt++;
}
サイトにそう書かれてたからこの式が正しいかと思ってました。ダッシュのサンプルを誰か書いてくれませんか?みけCAT さんが書きました: DashCnt < DashTimeは(デバッガなどによる外部からの値の書き替えや処理系の不都合などがなければ)常に真となる、怪しい式ですね。
僕にはなんのことやらさっぱりなので…。
Re: レバー二回ダッシュが反応しない。
ボタンを離せば、ダッシュのカウンターが始動するようにしてみましたが、やっぱり変わりません。
どこがおかしいのでしょうか?
どこがおかしいのでしょうか?
int main(void) {
FreamStartTime = GetNowCount();
while (GetNowCount() - FreamStartTime < 1000 / 60) {}
system("cls");
printf("メインループ開始\n");
printf("\nPlayerX=%d,PlayerY=%d,Grav=%8.2f,DropPower=%8.2f", (int)PlayerX, (int)PlayerY, Grav,DropPower);
printf("\nMoveX=%8.1f,MoveY=%8.1f,Jump=%d", MoveX, MoveY,JumpFlag);
printf("\nCharX=%8.1f,CharY=%8.1f,CameraX=%d,CameraY=%d,ViewX=%8.1f,ViewY=%8.1f", CharX, CharY, CameraX, CameraY, ViewCharX, ViewCharY);
printf("\n現在の向き=%d\t右は1、左は0,NonVert = %d,VectX = %8.1f,JumpTimer = %d,DashCnt = %d", Dir, NonVertJump, VectX,JumpTimer,DashCnt);
//カメラの処理を行う
CameraCheck(PlayerX, PlayerY);
//入力状態を更新
{
int i;
i = GetJoypadInputState(DX_INPUT_KEY_PAD1);
EdgeInput = i & ~Input;
Input = i;
}
//移動処理
{
int ContTimer = 8;
//ベクトルを初期化し、加減速処理を行う。
if (NonVertJump == FALSE) {
MoveX = 0.0F;
VectX = 0.0F;
MaxVect = 0.0F;
}
else {
MoveX = VectX;
}
MoveY = 0.0F;
char RunButton;
//0なら移動していない、1なら右へ移動中、2なら左へ移動中
char NonVertJumpFlag = 0;
{
int DashTime = 8;
if ((Input&PAD_INPUT_2)) {
RunButton = TRUE;
}
else {
RunButton = FALSE;
}
//右へ移動
if (NonVertJump == FALSE && (Input&PAD_INPUT_RIGHT)) {
NonVertJumpFlag = 1;
//レバー二段ダッシュの判定を行う
if ((Input&PAD_INPUT_RIGHT)) {
if (DashCnt < DashTime && dir == 1) {
RunButton = TRUE;
}
if (dir == 2) {
RunButton = FALSE;
}
dir = 1;
}
if (RunButton == TRUE && JumpFlag == FALSE) {
MoveX = 8.0F;
}
else if (RunButton == FALSE && JumpFlag == FALSE) {
MoveX = 5.0F;
}
else {
MoveX = 3.0F;
}
DashCnt = 0;
}
//左に移動
else if (NonVertJump == FALSE && (Input&PAD_INPUT_LEFT)) {
NonVertJumpFlag = 2;
if ((Input&PAD_INPUT_LEFT)) {
if (DashCnt < 8 && dir == 2) {
RunButton = TRUE;
}
if (dir == 1) {
RunButton = FALSE;
}
dir = 2;
}
if (RunButton == TRUE && JumpFlag == FALSE) {
MoveX = -8.0F;
}
else if (RunButton == FALSE && JumpFlag == FALSE) {
MoveX = -5.0F;
}
else {
MoveX = -3.0F;
}
DashCnt = 0;
}
else {
RunButton = FALSE;
}
if (!(Input&PAD_INPUT_LEFT) || !(Input&PAD_INPUT_RIGHT)) {
DashCnt++;
}
}
//ジャンプボタンが押されているフレームを格納する。
if ((Input&PAD_INPUT_1)) {
JumpTimer++;
}
else {
JumpTimer = 0;
}
//長押しで重力が弱く、離せば、重力が強く。
if (JumpTimer > 0) {
if (JumpTimer == 1 && NonVertJumpFlag == 0 && JumpFlag == FALSE) {
JumpFlag = TRUE;
DropPower = -7.0F;
}
if (JumpTimer == 1 && NonVertJumpFlag == 1 && JumpFlag == FALSE) {
JumpFlag = TRUE;
DropPower = -7.0F;
if (RunButton == TRUE) {
VectX = 8.0F;
MaxVect = 8.0F;
}
else {
VectX = 5.0F;
MaxVect = 5.0F;
}
//斜めに飛んでいることを確認
NonVertJump = TRUE;
}
if (JumpTimer == 1 && NonVertJumpFlag == 2 && JumpFlag == FALSE) {
JumpFlag = TRUE;
DropPower = -7.0F;
if (RunButton == TRUE) {
VectX = -8.0F;
MaxVect = -8.0F;
}
else {
VectX = -5.0F;
MaxVect = -5.0F;
}
NonVertJump = TRUE;
}
Grav = 0.25F;
}
else {
if (JumpFlag == TRUE) {
Grav = 0.5F;
}
}
}
//空中での移動を解禁する
if (NonVertJump == TRUE && VectX == 0 || DropPower > 0) {
VectX = 0.0F;
NonVertJump = FALSE;
}
//右へジャンプしているときに左で減速
if (NonVertJump == TRUE && VectX > 0 &&(Input&PAD_INPUT_LEFT)) {
//マリオ3以降よろしく、方向転換する。
Dir = FALSE;
VectX -= 1.0F;
DropPower += 0.1F;
MoveX = VectX;
}
//マリオ3のように加速
if (NonVertJump == TRUE && VectX > 0 && MaxVect > VectX && (Input&PAD_INPUT_RIGHT)) {
Dir = TRUE;
VectX += 1.0F;
MoveX = VectX;
}
//左へジャンプしているときに右で減速
if (NonVertJump == TRUE && VectX < 0 &&(Input&PAD_INPUT_RIGHT)) {
//マリオ3以降よろしく、方向転換する。
Dir = TRUE;
VectX += 1.0F;
DropPower += 0.1F;
MoveX = VectX;
}
if (NonVertJump == TRUE && VectX < 0 && MaxVect < VectX && (Input&PAD_INPUT_LEFT)) {
Dir = FALSE;
VectX -= 1.0F;
MoveX = VectX;
}
//落下処理
DropPower += Grav;
MoveY = DropPower;
//移動量に基づいて移動する。
CharMove(&PlayerX, &PlayerY, MoveX, MoveY, &DropPower, &Grav, &JumpFlag, &AirFlag, &NonVertJump, &JumpTimer ,&VectX, CHIP_SIZE);
//マップの描画
{
int i, j;
for (i = 0; i < MAP_HEIGHT; i++) {
for (j = 0; j < MAP_WIDTH; j++) {
if (MapData[i][j] == 1) {
DrawBox(j*CHIP_SIZE - CameraX, i*CHIP_SIZE - CameraY, j*CHIP_SIZE + CHIP_SIZE - CameraX, i*CHIP_SIZE + CHIP_SIZE - CameraY, GetColor(255, 255, 255), TRUE);
}
}
}
}
//キャラの描画
DrawBox((int)(ViewCharX)-(CHIP_SIZE / 2), (int)(ViewCharY)-(CHIP_SIZE / 2), (int)(ViewCharX + CHIP_SIZE) - (CHIP_SIZE / 2), (int)(ViewCharY + CHIP_SIZE) - (CHIP_SIZE / 2), GetColor(255, 0, 0), TRUE);
}
Re: レバー二回ダッシュが反応しない。
なんとなくではありますが、それらしい判定ができたので。とは言っても1フレームだけで、右にしか使えないのですが…。
後は、どうやってダッシュを維持させるかです…。
なお、コード全体の最初の、char型が宣言されている部分に部分にDirTを宣言してください。
後は、どうやってダッシュを維持させるかです…。
なお、コード全体の最初の、char型が宣言されている部分に部分にDirTを宣言してください。
//移動処理
{
int DashT;
int ContTimer = 8;
//ベクトルを初期化し、加減速処理を行う。
if (NonVertJump == FALSE) {
MoveX = 0.0F;
VectX = 0.0F;
MaxVect = 0.0F;
}
else {
MoveX = VectX;
}
MoveY = 0.0F;
char RunButton;
//0なら移動していない、1なら右へ移動中、2なら左へ移動中
char NonVertJumpFlag = 0;
//左右に押されているか確認する。
if ((Input&PAD_INPUT_LEFT) || (Input&PAD_INPUT_RIGHT)) {
DirT = TRUE;
}
else {
DirT = FALSE;
}
//ダッシュのトリガーをチェックする
if (DashCnt == 1 && DirT == TRUE) {
DashT = 0;
}
else {
DashT = 1;
}
{
int DashTime = 8;
if ((Input&PAD_INPUT_2)) {
RunButton = TRUE;
}
else {
RunButton = FALSE;
}
//右へ移動
if (NonVertJump == FALSE && (Input&PAD_INPUT_RIGHT)) {
NonVertJumpFlag = 1;
//レバー二段ダッシュの判定を行う
if ((Input&PAD_INPUT_RIGHT)) {
if (DashT == 1 && DashCnt < DashTime && dir == 1) {
RunButton = TRUE;
}
if (dir == 2) {
RunButton = FALSE;
}
dir = 1;
}
if (RunButton == TRUE && JumpFlag == FALSE) {
MoveX = 8.0F;
}
else if (RunButton == FALSE && JumpFlag == FALSE) {
MoveX = 5.0F;
}
else {
MoveX = 3.0F;
}
DashCnt = 0;
}
Re: レバー二回ダッシュが反応しない。
二段ダッシュの判定らしきものを実装することはできました。(とは言っても、右だけですけど)
ですが、どういうわけか、コンソールによると1Fだけしかダッシュせず、実質歩いている状態になってしまいます。
どうすればいいのでしょうか?何か原因があるのでしょうか。
ですが、どういうわけか、コンソールによると1Fだけしかダッシュせず、実質歩いている状態になってしまいます。
どうすればいいのでしょうか?何か原因があるのでしょうか。
#include "DxLib.h"
#define SCREEN_WIDTH (320) //画面の横幅
#define SCREEN_HEIGHT (240) //画面の縦幅
#define STAGE_WIDTH (400)
#define STAGE_HEIGHT (320)
#define CHIP_SIZE (16) //チップのサイズ
#define MAP_WIDTH (STAGE_WIDTH/CHIP_SIZE)
#define MAP_HEIGHT (STAGE_HEIGHT/CHIP_SIZE)
#define JOYPAD_BUTTON_MAX (28)
#define PAD_INPUT_ON 1
#define PAD_INPUT_OFF 0
HANDLE Stdout;
//テスト用のマップデータ。実際の開発では、Tiled(フリーのマップエディタ)を使う予定。
//このテストプログラムがある程度の段階に達したら、本格的な開発に移ります。
//TinyXML2は便利だ
char MapData[MAP_HEIGHT][MAP_WIDTH]
{
1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
1,0,0,0,0, 0,1,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
1,0,0,0,0, 1,1,1,1,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
1,0,0,0,1, 1,1,1,1,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,1,1,1,0, 0,0,0,0,1,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1,
1,0,0,0,0, 0,0,1,0,1, 1,1,1,1,1, 1,1,1,1,1, 0,0,0,0,1,
1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1,
};
float PlayerX, PlayerY;
float SaveX, SaveY;
float MoveX, MoveY;
float VectX;
float DropPower, Grav;
float MaxVect;
char JumpFlag, Dir, AirFlag, NonVertJump, dir, DirT, DashB;
int DashCnt, JumpTimer;
int Input, EdgeInput, Pad;
int FreamStartTime;
int CameraX = 0;
int CameraY = 0;
float CharX, CharY, ViewCharX, ViewCharY;
int MapHitCheck(float X, float Y, float *MoveX, float *MoveY, int Size);
int CharMove(float *X, float *Y, float MoveX, float MoveY, float *Drop, float *G, char *Jump, char *Air, char *Vert,int *JumpT,float *Vect, int Size);
int MapChipParam(float X, float Y);
int CameraCheck(float X, float Y);
bool IsPush(int PadHandle);
bool IsFree(int PadHandle);
bool IsHold(int PadHandle);
bool IsPull(int PadHandle);
//将来の開発で使う予定の関数。
//押されたか?
bool IsPush(int PadHandle) {
if (((EdgeInput&PadHandle) > PAD_INPUT_ON)) {
return true;
}
return false;
}
//押されていないか?
bool IsFree (int PadHandle) {
if ((Input&PadHandle) == PAD_INPUT_OFF) {
return true;
}
return false;
}
//離されたか?
bool IsPull(int PadHandle) {
if ((EdgeInput&PadHandle) == PAD_INPUT_OFF) {
return true;
}
return false;
}
//押されているか?
bool IsHold (int PadHandle) {
if ((Input&PadHandle) > PAD_INPUT_ON) {
return true;
}
return false;
}
//マップチップのデータ獲得
int MapChipParam(float X, float Y) {
int x, y;
x = (int)X / CHIP_SIZE;
y = (int)Y / CHIP_SIZE;
if (x >= MAP_WIDTH || y >= MAP_HEIGHT || x < 0 || y < 0) return 0;
return MapData[y][x];
}
//衝突判定
int MapHitCheck(float X, float Y, float *MoveX, float *MoveY, int Size) {
float afX, afY;
afX = X + *MoveX;
afY = Y + *MoveY;
float blx, brx, bby, bty;
blx = (float)((int)afX / Size)*Size;
brx = (float)((int)afX / Size + 1)*Size;
bty = (float)((int)afY / Size)*Size;
bby = (float)((int)afY / Size + 1)*Size;
if (MapChipParam(afX, afY) == 1) {
if (*MoveY > 0.0F) {
printf("\n下に当たりました。");
//移動量を補正する
*MoveY = bty - Y - 1.0F;
//上の壁に当たったと判定する
return 3;
}
if (*MoveY < 0.0F) {
printf("\n上に当たりました。");
//移動量を補正する
*MoveY = bby - Y + 1.0F;
//下の壁に当たったと判定する
return 4;
}
//右の当たり判定
if (*MoveX > 0.0F) {
printf("\n右に当たりました。");
//移動量を補正する
*MoveX = blx - X - 1.0F;
//右の壁に当たったと判定する
return 1;
}
//左の当たり判定
if (*MoveX < 0.0F) {
printf("\n左に当たりました。");
//移動量を補正する
*MoveX = brx - X + 1.0F;
//左の壁に当たったと判定する
return 2;
}
//ここに来たら適当な値を返す
return 4;
}
return 0;
}
//当たり判定チェック
int CharMove(float *X, float *Y, float MoveX, float MoveY, float *Drop,float *G,char *Jump,char *Air,char *Vert, int *JumpT,float *Vect,int Size){
float Dummy = 0.0F;
float hsize;
//直前フレーム
float PrevX = *X + MoveX;
float PrevY = *Y + MoveY;
//ベクトルのバックアップ
float SaveMoveX = MoveX;
float SaveMoveY = MoveY;
hsize = Size * 0.5F;
//上下の当たり判定チェック、上に衝突したら落下させ、下に衝突したら着地させる。
{
//左下
if (MapHitCheck(*X - hsize, *Y + hsize - 1.0F, &Dummy, &MoveY,(int)Size) == 3) *Drop = 0.0F,MoveY -= 1.0F,printf("\n上下::左下");
//右下
if (MapHitCheck(*X + hsize, *Y + hsize - 1.0F, &Dummy, &MoveY,(int)Size) == 3) *Drop = 0.0F,MoveY -= 1.0F,printf("\n上下::右下");
//左上
if (MapHitCheck(*X - hsize, *Y - hsize + 1.0F, &Dummy, &MoveY,(int)Size) == 4) *Drop *= -0.5F,MoveY = 0.0F,printf("\n上下::左上");
//右上
if (MapHitCheck(*X + hsize, *Y - hsize + 1.0F, &Dummy, &MoveY,(int)Size) == 4) *Drop *= -0.5F,MoveY = 0.0F,printf("\n上下::右上");
//問題ないのなら移動させる
PrevY = *Y + MoveY;
*Y = PrevY;
}
//左右の当たり判定チェック
{
//左下
if (MapHitCheck(*X - hsize + 1.0F, *Y + hsize, &MoveX, &Dummy, (int)Size))*Vect = 0.0F, MoveX += 1.0F, printf("\n左右::左下");
//右上
if (MapHitCheck(*X + hsize - 1.0F, *Y + hsize, &MoveX, &Dummy, (int)Size))*Vect = 0.0F, MoveX -= 1.0F, printf("\n左右::右下");
//左上
if (MapHitCheck(*X - hsize + 1.0F, *Y - hsize, &MoveX, &Dummy, (int)Size))*Vect = 0.0F, MoveX += 1.0F, printf("\n左右::左上");
//右上
if (MapHitCheck(*X + hsize - 1.0F, *Y - hsize, &MoveX, &Dummy, (int)Size))*Vect = 0.0F, MoveX -= 1.0F, printf("\n左右::右上");
//問題ないのなら移動させる
PrevX = *X + MoveX;
*X = PrevX;
}
//着地判定
{
if (MapChipParam(*X - hsize, *Y + hsize + 1.0F) == 0 && MapChipParam(*X + hsize, *Y + hsize + 1.0F) == 0) {
*Air = TRUE;
*G = 0.5F;
}
else {
*JumpT = 0;
*Drop = 0.0F;
*G = 0.0F;
*Air = FALSE;
*Vert = FALSE;
*Jump = FALSE;
}
}
return 0;
}
//カメラの位置計算
int CameraCheck(float X, float Y) {
//カメラのチェック
CharX = X;
CharY = Y;
//カメラの位置を計算する
CameraX = (int)CharX - SCREEN_WIDTH / 2;
CameraY = (int)CharY - SCREEN_HEIGHT / 2;
//カメラの補正
if (CameraX < 0)CameraX = 0;
if (CameraX >(STAGE_WIDTH - SCREEN_WIDTH))CameraX = (STAGE_WIDTH - SCREEN_WIDTH);
if (CameraY < 0)CameraY = 0;
if (CameraY >(STAGE_HEIGHT - SCREEN_HEIGHT))CameraY = (STAGE_HEIGHT - SCREEN_HEIGHT);
ViewCharX = CharX - CameraX;
ViewCharY = CharY - CameraY;
return 0;
}
int init(void) {
ChangeWindowMode(TRUE),SetGraphMode(320,240,32),printf("初期化しています…");
if (DxLib_Init() == -1) { return -1; }
PlayerX = 240.0F, PlayerY = 200.0F, MoveX = 0.0F, MoveY = 0.0F;
JumpFlag = FALSE, DropPower = 0.0F, Grav = 0.5F, Dir = TRUE;
Input = 0, EdgeInput = 0, FreamStartTime = GetNowCount();
DashCnt = 0,MaxVect = 0.0F, NonVertJump = FALSE, dir = 0,DirT = FALSE;
DashB = FALSE;
return 0;
}
int main(void) {
FreamStartTime = GetNowCount();
while (GetNowCount() - FreamStartTime < 1000 / 60) {}
system("cls");
printf("メインループ開始\n");
printf("\nPlayerX=%d,PlayerY=%d,Grav=%8.2f,DropPower=%8.2f", (int)PlayerX, (int)PlayerY, Grav,DropPower);
printf("\nMoveX=%8.1f,MoveY=%8.1f,Jump=%d", MoveX, MoveY,JumpFlag);
printf("\nCharX=%8.1f,CharY=%8.1f,CameraX=%d,CameraY=%d,ViewX=%8.1f,ViewY=%8.1f", CharX, CharY, CameraX, CameraY, ViewCharX, ViewCharY);
printf("\n現在の向き=%d\t右は1、左は0,NonVert = %d,VectX = %8.1f,JumpTimer = %d,DashCnt = %d", Dir, NonVertJump, VectX,JumpTimer,DashCnt);
printf("\nDashT=%d,DashB=%d", DirT, DashB);
//カメラの処理を行う
CameraCheck(PlayerX, PlayerY);
//入力状態を更新
{
int i;
i = GetJoypadInputState(DX_INPUT_KEY_PAD1);
EdgeInput = i & ~Input;
Input = i;
}
//移動処理
{
int DashT;
int ContTimer = 8;
//ベクトルを初期化し、加減速処理を行う。
if (NonVertJump == FALSE) {
MoveX = 0.0F;
VectX = 0.0F;
MaxVect = 0.0F;
}
else {
MoveX = VectX;
}
MoveY = 0.0F;
char RunButton;
//0なら移動していない、1なら右へ移動中、2なら左へ移動中
char NonVertJumpFlag = 0;
//左右に押されているか確認する。
if ((Input&PAD_INPUT_LEFT) || (Input&PAD_INPUT_RIGHT)) {
DirT = TRUE;
}
else {
DirT = FALSE;
}
//ダッシュのトリガーをチェックする
if (DashCnt == 1 && DirT == TRUE) {
DashT = 0;
}
else {
DashT = 1;
}
{
int DashTime = 8;
if ((Input&PAD_INPUT_2)) {
RunButton = TRUE;
}
else {
RunButton = FALSE;
}
//右へ移動
if (NonVertJump == FALSE && (Input&PAD_INPUT_RIGHT)) {
NonVertJumpFlag = 1;
//レバー二段ダッシュの判定を行う
if ((Input&PAD_INPUT_RIGHT)) {
if ((DashT == 1 && DashCnt < DashTime) && dir == 1) {
DashB = TRUE;
if (DashB == TRUE) {
RunButton = TRUE;
}
}
if (dir == 2) {
DashB = FALSE;
RunButton = FALSE;
}
dir = 1;
}
if (RunButton == TRUE && JumpFlag == FALSE) {
MoveX = 8.0F;
}
else if (RunButton == FALSE && JumpFlag == FALSE) {
MoveX = 5.0F;
}
else {
MoveX = 3.0F;
}
DashCnt = 0;
}
//左に移動
else if (NonVertJump == FALSE && (Input&PAD_INPUT_LEFT)) {
NonVertJumpFlag = 2;
if ((Input&PAD_INPUT_LEFT)) {
if (DashCnt < DashTime && dir == 2) {
RunButton = TRUE;
}
if (dir == 1) {
RunButton = FALSE;
}
dir = 2;
}
if (RunButton == TRUE && JumpFlag == FALSE) {
MoveX = -8.0F;
}
else if (RunButton == FALSE && JumpFlag == FALSE) {
MoveX = -5.0F;
}
else {
MoveX = -3.0F;
}
DashCnt = 0;
}
else {
DashB = FALSE;
RunButton = FALSE;
}
DashCnt++;
}
//ジャンプボタンが押されているフレームを格納する。
if ((Input&PAD_INPUT_1)) {
JumpTimer++;
}
else {
JumpTimer = 0;
}
//長押しで重力が弱く、離せば、重力が強く。
if (JumpTimer > 0) {
if (JumpTimer == 1 && NonVertJumpFlag == 0 && JumpFlag == FALSE) {
JumpFlag = TRUE;
DropPower = -7.0F;
}
if (JumpTimer == 1 && NonVertJumpFlag == 1 && JumpFlag == FALSE) {
JumpFlag = TRUE;
DropPower = -7.0F;
if (RunButton == TRUE) {
VectX = 8.0F;
MaxVect = 8.0F;
}
else {
VectX = 5.0F;
MaxVect = 5.0F;
}
//斜めに飛んでいることを確認
NonVertJump = TRUE;
}
if (JumpTimer == 1 && NonVertJumpFlag == 2 && JumpFlag == FALSE) {
JumpFlag = TRUE;
DropPower = -7.0F;
if (RunButton == TRUE) {
VectX = -8.0F;
MaxVect = -8.0F;
}
else {
VectX = -5.0F;
MaxVect = -5.0F;
}
NonVertJump = TRUE;
}
Grav = 0.25F;
}
else {
if (JumpFlag == TRUE) {
Grav = 0.5F;
}
}
}
//空中での移動を解禁する
if (NonVertJump == TRUE && VectX == 0 || DropPower > 0) {
VectX = 0.0F;
NonVertJump = FALSE;
}
//右へジャンプしているときに左で減速
if (NonVertJump == TRUE && VectX > 0 &&(Input&PAD_INPUT_LEFT)) {
//マリオ3以降よろしく、方向転換する。
Dir = FALSE;
VectX -= 1.0F;
DropPower += 0.1F;
MoveX = VectX;
}
//マリオ3のように加速
if (NonVertJump == TRUE && VectX > 0 && MaxVect > VectX && (Input&PAD_INPUT_RIGHT)) {
Dir = TRUE;
VectX += 1.0F;
MoveX = VectX;
}
//左へジャンプしているときに右で減速
if (NonVertJump == TRUE && VectX < 0 &&(Input&PAD_INPUT_RIGHT)) {
//マリオ3以降よろしく、方向転換する。
Dir = TRUE;
VectX += 1.0F;
DropPower += 0.1F;
MoveX = VectX;
}
if (NonVertJump == TRUE && VectX < 0 && MaxVect < VectX && (Input&PAD_INPUT_LEFT)) {
Dir = FALSE;
VectX -= 1.0F;
MoveX = VectX;
}
//落下処理
DropPower += Grav;
MoveY = DropPower;
//移動量に基づいて移動する。
CharMove(&PlayerX, &PlayerY, MoveX, MoveY, &DropPower, &Grav, &JumpFlag, &AirFlag, &NonVertJump, &JumpTimer ,&VectX, CHIP_SIZE);
//マップの描画
{
int i, j;
for (i = 0; i < MAP_HEIGHT; i++) {
for (j = 0; j < MAP_WIDTH; j++) {
if (MapData[i][j] == 1) {
DrawBox(j*CHIP_SIZE - CameraX, i*CHIP_SIZE - CameraY, j*CHIP_SIZE + CHIP_SIZE - CameraX, i*CHIP_SIZE + CHIP_SIZE - CameraY, GetColor(255, 255, 255), TRUE);
}
}
}
}
//キャラの描画
DrawBox((int)(ViewCharX)-(CHIP_SIZE / 2), (int)(ViewCharY)-(CHIP_SIZE / 2), (int)(ViewCharX + CHIP_SIZE) - (CHIP_SIZE / 2), (int)(ViewCharY + CHIP_SIZE) - (CHIP_SIZE / 2), GetColor(255, 0, 0), TRUE);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
AllocConsole(); FILE* out = 0; freopen_s(&out, "CON", "w", stdout); Stdout = GetStdHandle(STD_OUTPUT_HANDLE);
init();
while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {
main();
}
DxLib_End(); fclose(out); FreeConsole();
return 0;
}
Re: レバー二回ダッシュが反応しない。
移動処理を以下のようなコードにしたら、ちゃんとしたものが出るようになりました。
{
int DashTime = 8;
if ((Input&PAD_INPUT_2)) {
RunButton = TRUE;
}
else {
RunButton = FALSE;
}
//右へ移動
if (NonVertJump == FALSE && (Input&PAD_INPUT_RIGHT)) {
NonVertJumpFlag = 1;
Dir = TRUE;
//レバー二段ダッシュの判定を行う
if ((Input&PAD_INPUT_RIGHT)) {
if ((DashT == TRUE && DashCnt < DashTime) && dir == 1) {
DashB = TRUE;
}
if (DashB == TRUE) {
RunButton = TRUE;
}
if (dir == 2) {
DashB = FALSE;
RunButton = FALSE;
}
dir = 1;
}
if (RunButton == TRUE && JumpFlag == FALSE) {
MoveX = 8.0F;
}
else if (RunButton == FALSE && JumpFlag == FALSE) {
MoveX = 5.0F;
}
else {
MoveX = 3.0F;
}
DashCnt = 0;
}
//左に移動
else if (NonVertJump == FALSE && (Input&PAD_INPUT_LEFT)) {
NonVertJumpFlag = 2;
Dir = FALSE;
if ((Input&PAD_INPUT_LEFT)) {
if ((DashT == TRUE && DashCnt < DashTime) && dir == 2) {
DashB = TRUE;
}
if (DashB == TRUE) {
RunButton = TRUE;
}
if (dir == 1) {
RunButton = FALSE;
}
dir = 2;
}
if (RunButton == TRUE && JumpFlag == FALSE) {
MoveX = -8.0F;
}
else if (RunButton == FALSE && JumpFlag == FALSE) {
MoveX = -5.0F;
}
else {
MoveX = -3.0F;
}
DashCnt = 0;
}
else {
DashB = FALSE;
RunButton = FALSE;
}
DashCnt++;
}