#include "dxlib.h"
#define SCREEN_WIDTH (320)
#define SCREEN_HEIGHT (240)
#define CHIP_SIZE (16)
#define MAP_WIDTH (SCREEN_WIDTH/CHIP_SIZE)
#define MAP_HEIGHT (SCREEN_HEIGHT/CHIP_SIZE)
float PlayerX = 24.0F, PlayerY = 216.0F, DropPower = 0.0F,Gravity;
char dir, JumpFlag, DashFlag,AirFlag;
int GetChipParam(float X, float Y);
int MoveChecker(float *X, float *Y, float *DropPower, float MoveX, float MoveY, float Size,char *JumpFlag);
int MapHitCheck(float X,float Y,float *MoveX,float *MoveY);
int PlayerHandle, MapChipHandle[2], JumpCount, DashTrigger, Time, Input,EdgeInput;
int Key[256];
int gpUpdateKey() {
char tmpKey[256];
GetHitKeyStateAll(tmpKey);
for (int i = 0; i < 256; i++){
if (tmpKey[i] != 0) {
Key[i]++;
}
else {
Key[i] = 0;
}
}
return 0;
}
char MapData[MAP_HEIGHT][MAP_WIDTH] =
{
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,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,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1,
};
//マップチップ確認
int GetChipParam(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) {
float afX, afY;
afX = X + *MoveX;
afY = Y + *MoveY;
if (GetChipParam(X, Y) == 1) {
float blx, bty, brx, bby;
//壁衝突確認
blx = (float)((int)afX / CHIP_SIZE)*CHIP_SIZE;//左辺の当たり判定
brx = (float)((int)afX / CHIP_SIZE + 1)*CHIP_SIZE;//右辺の当たり判定
bty = (float)((int)afY / CHIP_SIZE)*CHIP_SIZE;//上辺の当たり判定
bby = (float)((int)afY / CHIP_SIZE + 1)*CHIP_SIZE;//下辺の当たり判定
//上辺に当たったら3を返す
if (*MoveY > 0.0F) {
*MoveY = bty - Y - 1.0F;
return 3;
}
//下辺に当たっていたら4を返す
if (*MoveY < 0.0F) {
*MoveY = bby - Y - 1.0F;
return 4;
}
if (*MoveX > 0.0F) {
*MoveX = blx - X - 1.0F;
return 1;
}
if (*MoveX < 0.0F) {
*MoveX = brx - X + 1.0F;
return 2;
}
return 4;
}
return 0;
}
//当たり判定チェック
int MoveChecker(float *X, float *Y, float *DropPower, float MoveX, float MoveY,float Size, char *JumpFlag) {
float Dummy = 0.0F;
float hsize;
hsize = Size*0.5F;
//上下移動成分をチェック
{
//左下
if (MapHitCheck(*X - hsize, *Y + hsize, &Dummy, &MoveY) == 3) *DropPower = 0.0F;
//右下
if (MapHitCheck(*X + hsize, *Y + hsize, &Dummy, &MoveY) == 3) *DropPower = 0.0F;
//左上
if (MapHitCheck(*X - hsize, *Y - hsize, &Dummy, &MoveY) == 4) *DropPower = -1.0F;
//右上
if (MapHitCheck(*X - hsize, *Y - hsize, &Dummy, &MoveY) == 4) *DropPower = -1.0F;
//問題がないのなら移動成分を加算する
*Y += MoveY;
}
//左右移動成分、以下同順
{
MapHitCheck(*X - hsize, *Y + hsize, &MoveX, &Dummy);
MapHitCheck(*X + hsize, *Y + hsize, &MoveX, &Dummy);
MapHitCheck(*X - hsize, *Y - hsize, &MoveX, &Dummy);
MapHitCheck(*X + hsize, *Y - hsize, &MoveX, &Dummy);
*X += MoveX;
}
{
//空中にいるなら、何もしない
if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F) && (*X + Size*0.5, *Y + Size*0.5F)) {
}
//もし足場に着地したらジャンプ回数をリセットする
else {
JumpCount = 0;
Gravity = 0;
*JumpFlag = FALSE;
}
return 0;
}
}
int main(void) {
SetDrawScreen(DX_SCREEN_BACK);
Input = 0;
Time = GetNowCount();//カウント値を更新する
PlayerHandle = LoadGraph("テスト用.png");
LoadDivGraph("マップチップ.bmp", 2, 2, 1, 16, 16, MapChipHandle);
dir = TRUE;
DashFlag = FALSE;
while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && gpUpdateKey() == 0) {
//カウント値を更新する
Time = GetNowCount();
//入力状態を更新する
{
int i;
i = GetJoypadInputState(DX_INPUT_KEY_PAD1);
//チョン押しを確認する
EdgeInput = i & ~Input;
Input = i;
}
//ダッシュトリガー確認
if ((Input&PAD_INPUT_1) == 0) {
DashFlag = FALSE;
}
if (JumpCount >= 2) {
JumpFlag = TRUE;
}
//移動処理
{
float MoveX, MoveY;
MoveX = 0.0F;
MoveY = 0.0F;
//左に移動
if ((Input&PAD_INPUT_LEFT) != 0) {
dir = FALSE;
MoveX -= 5.0F;
}
//右に移動
if ((Input&PAD_INPUT_RIGHT) != 0) {
dir = TRUE;
MoveX += 5.0F;
}
//左ラン
if ((Input&PAD_INPUT_LEFT) != 0 && (Input&PAD_INPUT_1) != 0 && JumpFlag == FALSE) {
dir = FALSE;
DashFlag = TRUE;
MoveX -= 5.25F;
}
//右ラン
if ((Input&PAD_INPUT_RIGHT) != 0 && (Input&PAD_INPUT_1) != 0 && JumpFlag == FALSE) {
dir = TRUE;
DashFlag = TRUE;
MoveX += 5.25F;
}
//ダッシュボタン
if ((EdgeInput&PAD_INPUT_3) != 0) {
}
//ジャンプ処理
if ((EdgeInput&PAD_INPUT_2) != 0 && JumpFlag == FALSE) {
//ジャンプできる状態にする
DropPower = 0;
//ジャンプ回数を増やす
JumpCount += 1;
//ジャンプする
DropPower = -9.5F;
//ジャンプするときの重力を決める
Gravity = 0.5F;
}
if ((EdgeInput&PAD_INPUT_2) != 0 && DashFlag == TRUE && JumpFlag == FALSE) {
DashFlag = TRUE;
DropPower = 0;
JumpCount += 1;
DropPower = -12.0F;
Gravity = 0.5F;
}
//落下処理
DropPower += Gravity;
//落下速度を移動量に追加する
MoveY = DropPower;
//当たり判定に基づく移動を行う
MoveChecker(&PlayerX, &PlayerY, &DropPower, MoveX, MoveY, CHIP_SIZE,&JumpFlag);
}
//マップの描画
{
int i, j;
for (i = 0; i < MAP_HEIGHT; i++) {
for (j = 0; j < MAP_WIDTH; j++) {
if (MapData[i][j] == 1) {
DrawGraph(j * CHIP_SIZE, i*CHIP_SIZE, MapChipHandle[1],TRUE);
}
}
}
}
//キャラの描画
{
if (dir == TRUE)
DrawRotaGraph((int)PlayerX, (int)PlayerY, 1.0, 0.0, PlayerHandle, TRUE, FALSE);
else
DrawRotaGraph((int)PlayerX, (int)PlayerY, 1.0, 0, PlayerHandle, TRUE, TRUE);
}
}
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){
ChangeWindowMode(TRUE), SetGraphMode(320, 240, 32);
//初期化
if (DxLib_Init() == -1) {
return -1;
}
//メインプログラム
main();
//DXライブラリを終了する
DxLib_End();
return 0;
}
移動とジャンプが上手く行きません。
移動とジャンプが上手く行きません。
DXライブラリの公式サイトにあるサンプルコードを参考にして、アクションゲームを作っていて、当たり判定のプログラムを完成させたはいいのですが、何かの不具合でジャンプするとどこまでも飛んでいってしまう上に、左右に移動しようとしても全く反応しません。(正確には1マス動いて止まります。)コードは以下のとおりです。
- 添付ファイル
-
- テスト用の素材.zip
- ファイルがないよと言われましたので…
- (528 バイト) ダウンロード数: 148 回
最後に編集したユーザー keito940 on 2017年1月18日(水) 15:59 [ 編集 1 回目 ]
Re: 移動とジャンプが上手く行きません。
自分で適当な画像を作ればいいのではないでしょうか?sadora3 さんが書きました:画像がないので、こちらで実行しても真っ暗な画面が描画されるだけでした。
DrawBoxやDrawCircle関数を使い、頑張って画像なしでも実行出来るようにするか、画像も一緒に添付してくれると助かります。
例えばこんなの(添付)とか。
- 添付ファイル
-
- gazou.zip
- テスト用画像
- (608 バイト) ダウンロード数: 145 回
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 移動とジャンプが上手く行きません。
コンパイルしてみたところ、126行目
で、&&の右側のコンマ演算子の左辺「*X + Size*0.5」の計算結果が使われていない、という警告が出ました。
意図した処理になっているかを確認してください。
意図した処理になっているかを確認してください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 移動とジャンプが上手く行きません。
それを試しては見たのですが、着地するとキャラが震えて、移動しようとしても、ブルブル震えている上に見えない壁に阻まれているかのような動きをしてしまいます。sadora3 さんが書きました:画像がないので、こちらで実行しても真っ暗な画面が描画されるだけでした。
DrawBoxやDrawCircle関数を使い、頑張って画像なしでも実行出来るようにするか、画像も一緒に添付してくれると助かります。
以下は憶測で回答します。
212~215行目辺りが怪しそうです。 このように直したら、ジャンプは正常になりませんでしょうか?
追記:
あ、違いました。失礼しました。
131行目をコメントアウトすればジャンプ出来るようになると思います。
ああ、言われてみれば、と思って
int MoveChecker(float *X, float *Y, float *DropPower, float MoveX, float MoveY, float Size,char *JumpFlag,char *AirFlag);
int MapHitCheck(float X,float Y,float *MoveX,float *MoveY);
int PlayerHandle, MapChipHandle[2], JumpCount, DashTrigger, Time, Input,EdgeInput;
int Key[256];
int gpUpdateKey() {
char tmpKey[256];
GetHitKeyStateAll(tmpKey);
for (int i = 0; i < 256; i++){
if (tmpKey[i] != 0) {
Key[i]++;
}
else {
Key[i] = 0;
}
}
return 0;
}
char MapData[MAP_HEIGHT][MAP_WIDTH] =
{
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,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,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1,
};
//マップチップ確認
int GetChipParam(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) {
float afX, afY;
afX = X + *MoveX;
afY = Y + *MoveY;
if (GetChipParam(X, Y) == 1) {
float blx, bty, brx, bby;
//壁衝突確認
blx = (float)((int)afX / CHIP_SIZE)*CHIP_SIZE;//左辺の当たり判定
brx = (float)((int)afX / CHIP_SIZE + 1)*CHIP_SIZE;//右辺の当たり判定
bty = (float)((int)afY / CHIP_SIZE)*CHIP_SIZE;//上辺の当たり判定
bby = (float)((int)afY / CHIP_SIZE + 1)*CHIP_SIZE;//下辺の当たり判定
//上辺に当たったら3を返す
if (*MoveY > 0.0F) {
*MoveY = bty - Y - 1.0F;
return 3;
}
//下辺に当たっていたら4を返す
if (*MoveY < 0.0F) {
*MoveY = bby - Y - 1.0F;
return 4;
}
if (*MoveX > 0.0F) {
*MoveX = blx - X - 1.0F;
return 1;
}
if (*MoveX < 0.0F) {
*MoveX = brx - X + 1.0F;
return 2;
}
return 4;
}
return 0;
}
//当たり判定チェック
int MoveChecker(float *X, float *Y, float *DropPower, float MoveX, float MoveY,float Size, char *JumpFlag,char *AirFlag) {
float Dummy = 0.0F;
float hsize;
hsize = Size*0.5F;
//上下移動成分をチェック
{
//左下
if (MapHitCheck(*X - hsize, *Y + hsize, &Dummy, &MoveY) == 3) *DropPower = 0.0F;
//右下
if (MapHitCheck(*X + hsize, *Y + hsize, &Dummy, &MoveY) == 3) *DropPower = 0.0F;
//左上
if (MapHitCheck(*X - hsize, *Y - hsize, &Dummy, &MoveY) == 4) *DropPower = -1.0F;
//右上
if (MapHitCheck(*X - hsize, *Y - hsize, &Dummy, &MoveY) == 4) *DropPower = -1.0F;
//問題がないのなら移動成分を加算する
*Y += MoveY;
}
//左右移動成分、以下同順
{
MapHitCheck(*X - hsize, *Y + hsize, &MoveX, &Dummy);
MapHitCheck(*X + hsize, *Y + hsize, &MoveX, &Dummy);
MapHitCheck(*X - hsize, *Y - hsize, &MoveX, &Dummy);
MapHitCheck(*X + hsize, *Y - hsize, &MoveX, &Dummy);
*X += MoveX;
}
{
//空中にいるなら、何もしない
if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F) && (*X + Size*0.5F, *Y + Size*0.5F)) {
*AirFlag = TRUE;
}
//もし足場に着地したらジャンプ回数をリセットする
else {
JumpCount = 0;
*JumpFlag = FALSE;
}
return 0;
}
}
int main(void) {
SetDrawScreen(DX_SCREEN_BACK);
Input = 0;
Time = GetNowCount();//カウント値を更新する
PlayerHandle = LoadGraph("テスト用.png");
LoadDivGraph("マップチップ.bmp", 2, 2, 1, 16, 16, MapChipHandle);
dir = TRUE;
DashFlag = FALSE;
while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && gpUpdateKey() == 0) {
//カウント値を更新する
Time = GetNowCount();
//入力状態を更新する
{
int i;
i = GetJoypadInputState(DX_INPUT_KEY_PAD1);
//チョン押しを確認する
EdgeInput = i & ~Input;
Input = i;
}
//ダッシュトリガー確認
if ((Input&PAD_INPUT_1) == 0) {
DashFlag = FALSE;
}
if (JumpCount >= 2) {
JumpFlag = TRUE;
}
//移動処理
{
float MoveX, MoveY;
MoveX = 0.0F;
MoveY = 0.0F;
//左に移動
if ((Input&PAD_INPUT_LEFT) != 0) {
dir = FALSE;
MoveX -= 5.0F;
}
//右に移動
if ((Input&PAD_INPUT_RIGHT) != 0) {
dir = TRUE;
MoveX += 5.0F;
}
//左ラン
if ((Input&PAD_INPUT_LEFT) != 0 && (Input&PAD_INPUT_1) != 0 && JumpFlag == FALSE) {
dir = FALSE;
DashFlag = TRUE;
MoveX -= 5.25F;
}
//右ラン
if ((Input&PAD_INPUT_RIGHT) != 0 && (Input&PAD_INPUT_1) != 0 && JumpFlag == FALSE) {
dir = TRUE;
DashFlag = TRUE;
MoveX += 5.25F;
}
//ダッシュボタン
if ((EdgeInput&PAD_INPUT_3) != 0) {
}
//ジャンプ処理
if ((EdgeInput&PAD_INPUT_2) != 0 && JumpFlag == FALSE) {
//ジャンプできる状態にする
DropPower = 0;
//ジャンプ回数を増やす
JumpCount += 1;
//ジャンプする
DropPower -= 9.5F;
//ジャンプするときの重力を決める
Gravity = 0.5F;
}
if ((EdgeInput&PAD_INPUT_2) != 0 && DashFlag == TRUE && JumpFlag == FALSE) {
DashFlag = TRUE;
DropPower = 0;
JumpCount += 1;
DropPower -= 12.0F;
Gravity = 0.5F;
}
//落下処理
DropPower += Gravity;
//落下速度を移動量に追加する
MoveY = DropPower;
//当たり判定に基づく移動を行う
MoveChecker(&PlayerX, &PlayerY, &DropPower, MoveX, MoveY, CHIP_SIZE,&JumpFlag,&AirFlag);
}
//マップの描画
{
int i, j;
for (i = 0; i < MAP_HEIGHT; i++) {
for (j = 0; j < MAP_WIDTH; j++) {
if (MapData[i][j] == 1) {
DrawGraph(j * CHIP_SIZE, i*CHIP_SIZE, MapChipHandle[1],TRUE);
}
}
}
}
//キャラの描画
{
if (dir == TRUE)
DrawRotaGraph((int)PlayerX, (int)PlayerY, 1.0, 0.0, PlayerHandle, TRUE, FALSE);
else
DrawRotaGraph((int)PlayerX, (int)PlayerY, 1.0, 0, PlayerHandle, TRUE, TRUE);
}
}
}
質問したときに言い忘れてたのですが、ランボタンが一度ジャンプしないと使えない上に、カクカクした動きになってしまいます。
Re: 移動とジャンプが上手く行きません。
>>みけCATさん
画像の件ですが、確かにこちらでも用意できましたから、そうすればよかったですね。
ご指摘ありがとうございます。今度そうします。
>>keito940さん
ああ、私の回答で混乱させてしまい申し訳ありません。
私が指摘した部分は触ってはいけませんでした。
ですので、NO1のソースコード(最初に提示して頂いた方です)の方に戻してください。
みけCATさんが指摘してくれたように、126行目の、
if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F) && (*X + Size*0.5, *Y + Size*0.5F)) {
こいつがいけなかったようです。
以下のように修正すると、動くようになると思います。
・8行目のPlayerYの初期化子を、「216.0F」ではなく、「214.0F」にする。
・126行目の、
if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F) && (*X + Size*0.5, *Y + Size*0.5F)) {
これを、
if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F + 1.0f) == 0 && GetChipParam(*X + Size*0.5F, *Y + Size*0.5F + 1.0f) == 0) {
こうする。
これでkeito940さんが求めていた動作になりませんでしょうか?
画像の件ですが、確かにこちらでも用意できましたから、そうすればよかったですね。
ご指摘ありがとうございます。今度そうします。
>>keito940さん
ああ、私の回答で混乱させてしまい申し訳ありません。
私が指摘した部分は触ってはいけませんでした。
ですので、NO1のソースコード(最初に提示して頂いた方です)の方に戻してください。
みけCATさんが指摘してくれたように、126行目の、
if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F) && (*X + Size*0.5, *Y + Size*0.5F)) {
こいつがいけなかったようです。
以下のように修正すると、動くようになると思います。
・8行目のPlayerYの初期化子を、「216.0F」ではなく、「214.0F」にする。
・126行目の、
if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F) && (*X + Size*0.5, *Y + Size*0.5F)) {
これを、
if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F + 1.0f) == 0 && GetChipParam(*X + Size*0.5F, *Y + Size*0.5F + 1.0f) == 0) {
こうする。
これでkeito940さんが求めていた動作になりませんでしょうか?
Re: 移動とジャンプが上手く行きません。
そのコードを試してみて、移動自体はできたのですが、ジャンプして着地するとまた見えない壁に阻まれてしまいます。sadora3 さんが書きました:>>みけCATさん
以下のように修正すると、動くようになると思います。
・8行目のPlayerYの初期化子を、「216.0F」ではなく、「214.0F」にする。
・126行目の、
if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F) && (*X + Size*0.5, *Y + Size*0.5F)) {
これを、
if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F + 1.0f) == 0 && GetChipParam(*X + Size*0.5F, *Y + Size*0.5F + 1.0f) == 0) {
こうする。
これでkeito940さんが求めていた動作になりませんでしょうか?
しかも、最大二段のつもりなのに、何段もジャンプできてしまいます。
Re: 移動とジャンプが上手く行きません。
>>keito940さん
あれ、おかしいですね。こちらではジャンプ後も正常に移動出来ましたし、ジャンプの回数は最大で2回までしか出来ませんでしたよ。
NO.1のソースコード(最初に提示したコード)の方に戻してから、8行目と126行目を修正しましたか?そうすれば大丈夫なはずなのですが。
もし、そうしたのであれば、またソースコードを見せて頂きたいです。
あれ、おかしいですね。こちらではジャンプ後も正常に移動出来ましたし、ジャンプの回数は最大で2回までしか出来ませんでしたよ。
NO.1のソースコード(最初に提示したコード)の方に戻してから、8行目と126行目を修正しましたか?そうすれば大丈夫なはずなのですが。
もし、そうしたのであれば、またソースコードを見せて頂きたいです。
Re: 移動とジャンプが上手く行きません。
実は、最初のコードに戻していなかったことに気づいて、戻してみて今言われたことをやってみましたが、やはりジャンプがどこまでも飛んでいってしまいます。sadora3 さんが書きました:>>keito940さん
あれ、おかしいですね。こちらではジャンプ後も正常に移動出来ましたし、ジャンプの回数は最大で2回までしか出来ませんでしたよ。
NO.1のソースコード(最初に提示したコード)の方に戻してから、8行目と126行目を修正しましたか?そうすれば大丈夫なはずなのですが。
もし、そうしたのであれば、またソースコードを見せて頂きたいです。
コードを貼り付けますので、どこが悪いのか教えてくれませんか?
#include "dxlib.h"
#define SCREEN_WIDTH (320)
#define SCREEN_HEIGHT (240)
#define CHIP_SIZE (16)
#define MAP_WIDTH (SCREEN_WIDTH/CHIP_SIZE)
#define MAP_HEIGHT (SCREEN_HEIGHT/CHIP_SIZE)
float PlayerX = 24.0F, PlayerY = 214.0F, DropPower = 0.0F,Gravity;
char dir, JumpFlag, DashFlag,AirFlag;
int GetChipParam(float X, float Y);
int MoveChecker(float *X, float *Y, float *DropPower, float MoveX, float MoveY, float Size,char *JumpFlag);
int MapHitCheck(float X,float Y,float *MoveX,float *MoveY);
int PlayerHandle, MapChipHandle[2], JumpCount, DashTrigger, Time, Input,EdgeInput;
int Key[256];
int gpUpdateKey() {
char tmpKey[256];
GetHitKeyStateAll(tmpKey);
for (int i = 0; i < 256; i++){
if (tmpKey[i] != 0) {
Key[i]++;
}
else {
Key[i] = 0;
}
}
return 0;
}
char MapData[MAP_HEIGHT][MAP_WIDTH] =
{
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,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,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1,
};
//マップチップ確認
int GetChipParam(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) {
float afX, afY;
afX = X + *MoveX;
afY = Y + *MoveY;
if (GetChipParam(X, Y) == 1) {
float blx, bty, brx, bby;
//壁衝突確認
blx = (float)((int)afX / CHIP_SIZE)*CHIP_SIZE;//左辺の当たり判定
brx = (float)((int)afX / CHIP_SIZE + 1)*CHIP_SIZE;//右辺の当たり判定
bty = (float)((int)afY / CHIP_SIZE)*CHIP_SIZE;//上辺の当たり判定
bby = (float)((int)afY / CHIP_SIZE + 1)*CHIP_SIZE;//下辺の当たり判定
//上辺に当たったら3を返す
if (*MoveY > 0.0F) {
*MoveY = bty - Y - 1.0F;
return 3;
}
//下辺に当たっていたら4を返す
if (*MoveY < 0.0F) {
*MoveY = bby - Y + 1.0F;
return 4;
}
if (*MoveX > 0.0F) {
*MoveX = blx - X - 1.0F;
return 1;
}
if (*MoveX < 0.0F) {
*MoveX = brx - X + 1.0F;
return 2;
}
return 4;
}
return 0;
}
//当たり判定チェック
int MoveChecker(float *X, float *Y, float *DropPower, float MoveX, float MoveY,float Size, char *JumpFlag) {
float Dummy = 0.0F;
float hsize;
hsize = Size*0.5F;
//上下移動成分をチェック
{
//左下
if (MapHitCheck(*X - hsize, *Y + hsize, &Dummy, &MoveY) == 3) *DropPower = 0.0F;
//右下
if (MapHitCheck(*X + hsize, *Y + hsize, &Dummy, &MoveY) == 3) *DropPower = 0.0F;
//左上
if (MapHitCheck(*X - hsize, *Y - hsize, &Dummy, &MoveY) == 4) *DropPower = -1.0F;
//右上
if (MapHitCheck(*X + hsize, *Y - hsize, &Dummy, &MoveY) == 4) *DropPower = -1.0F;
//問題がないのなら移動成分を加算する
*Y += MoveY;
}
//左右移動成分、以下同順
{
MapHitCheck(*X - hsize, *Y + hsize, &MoveX, &Dummy);
MapHitCheck(*X + hsize, *Y + hsize, &MoveX, &Dummy);
MapHitCheck(*X - hsize, *Y - hsize, &MoveX, &Dummy);
MapHitCheck(*X + hsize, *Y - hsize, &MoveX, &Dummy);
*X += MoveX;
}
{
//空中にいるなら、何もしない
if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F+1.0F)==0 && (*X + Size*0.5F, *Y + Size*0.5F+1.0F)==0) {
}
//もし足場に着地したらジャンプ回数をリセットする
else {
JumpCount = 0;
Gravity = 0;
*JumpFlag = FALSE;
}
return 0;
}
}
int main(void) {
SetDrawScreen(DX_SCREEN_BACK);
Input = 0;
Time = GetNowCount();//カウント値を更新する
PlayerHandle = LoadGraph("テスト用.png");
LoadDivGraph("マップチップ.bmp", 2, 2, 1, 16, 16, MapChipHandle);
dir = TRUE;
DashFlag = FALSE;
while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && gpUpdateKey() == 0) {
//カウント値を更新する
Time = GetNowCount();
//入力状態を更新する
{
int i;
i = GetJoypadInputState(DX_INPUT_KEY_PAD1);
//チョン押しを確認する
EdgeInput = i & ~Input;
Input = i;
}
//ダッシュトリガー確認
if ((Input&PAD_INPUT_1) == 0) {
DashFlag = FALSE;
}
if (JumpCount >= 2) {
JumpFlag = TRUE;
}
//移動処理
{
float MoveX, MoveY;
MoveX = 0.0F;
MoveY = 0.0F;
//左に移動
if ((Input&PAD_INPUT_LEFT) != 0) {
dir = FALSE;
MoveX -= 5.0F;
}
//右に移動
if ((Input&PAD_INPUT_RIGHT) != 0) {
dir = TRUE;
MoveX += 5.0F;
}
//左ラン
if ((Input&PAD_INPUT_LEFT) != 0 && (Input&PAD_INPUT_1) != 0 && JumpFlag == FALSE) {
dir = FALSE;
DashFlag = TRUE;
MoveX -= 5.25F;
}
//右ラン
if ((Input&PAD_INPUT_RIGHT) != 0 && (Input&PAD_INPUT_1) != 0 && JumpFlag == FALSE) {
dir = TRUE;
DashFlag = TRUE;
MoveX += 5.25F;
}
//ダッシュボタン
if ((EdgeInput&PAD_INPUT_3) != 0) {
}
//ジャンプ処理
if ((EdgeInput&PAD_INPUT_2) != 0 && JumpFlag == FALSE) {
//ジャンプできる状態にする
DropPower = 0;
//ジャンプ回数を増やす
JumpCount += 1;
//ジャンプする
DropPower = -9.5F;
//ジャンプするときの重力を決める
Gravity = 0.5F;
}
if ((EdgeInput&PAD_INPUT_2) != 0 && DashFlag == TRUE && JumpFlag == FALSE) {
DashFlag = TRUE;
DropPower = 0;
JumpCount += 1;
DropPower = -12.0F;
Gravity = 0.5F;
}
//落下処理
DropPower += Gravity;
//落下速度を移動量に追加する
MoveY = DropPower;
//当たり判定に基づく移動を行う
MoveChecker(&PlayerX, &PlayerY, &DropPower, MoveX, MoveY, CHIP_SIZE,&JumpFlag);
}
//マップの描画
{
int i, j;
for (i = 0; i < MAP_HEIGHT; i++) {
for (j = 0; j < MAP_WIDTH; j++) {
if (MapData[i][j] == 1) {
DrawGraph(j * CHIP_SIZE, i*CHIP_SIZE, MapChipHandle[1],TRUE);
}
}
}
}
//キャラの描画
{
if (dir == TRUE)
DrawRotaGraph((int)PlayerX, (int)PlayerY, 1.0, 0.0, PlayerHandle, TRUE, FALSE);
else
DrawRotaGraph((int)PlayerX, (int)PlayerY, 1.0, 0, PlayerHandle, TRUE, TRUE);
}
}
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){
ChangeWindowMode(TRUE), SetGraphMode(320, 240, 32);
//初期化
if (DxLib_Init() == -1) {
return -1;
}
//メインプログラム
main();
//DXライブラリを終了する
DxLib_End();
return 0;
}
Re: 移動とジャンプが上手く行きません。
まだコンマ演算子の左辺、*X + Size*0.5Fを投げ捨てるコードのままですね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 移動とジャンプが上手く行きません。
なるほど、当たり判定チェックにおかしい部分があるわけですね。みけCAT さんが書きました: まだコンマ演算子の左辺、*X + Size*0.5Fを投げ捨てるコードのままですね。
なお、コンマ演算子については自分で調べてみたので、なんとなくわかったんですが、具体的にどういうことか、コード付きで教えてください。
追記:ちなみに先程の書き込みは削除しました。質問の仕方が悪かったですね…。
Re: 移動とジャンプが上手く行きません。
if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F+1.0F)==0 && (*X + Size*0.5F, *Y + Size*0.5F+1.0F)==0){
}
本当にやりたいことを書いた状態にするには
>・126行目の、
>if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F) && (*X + Size*0.5, *Y + Size*0.5F)) {
>これを、
>if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F + 1.0f) == 0 && GetChipParam(*X + Size*0.5F, *Y + Size*0.5F + 1.0f) == 0) {
>こうする。
なのでは? という指摘がなされている状態… ということだと思います.
Re: 移動とジャンプが上手く行きません。
コードを調べてみたのですけど、ジャンプするとどこまでも飛んで行くというバグの原因はそういうことではないようですよ。usao さんが書きました:これの && の右側部分が,不幸にも(?)カンマ演算子がどうのという形として解釈されてコンパイルが通ってしまっているけども,if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F+1.0F)==0 && (*X + Size*0.5F, *Y + Size*0.5F+1.0F)==0){ }
本当にやりたいことを書いた状態にするには
>・126行目の、
>if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F) && (*X + Size*0.5, *Y + Size*0.5F)) {
>これを、
>if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F + 1.0f) == 0 && GetChipParam(*X + Size*0.5F, *Y + Size*0.5F + 1.0f) == 0) {
>こうする。
なのでは? という指摘がなされている状態… ということだと思います.
Re: 移動とジャンプが上手く行きません。
NO.9のソースコードを見ましたが、NO.1のソースコードに戻っていないように思われます。
http://difff.jp/
こちらのサイトでNO.9のコードと、NO.1のコードを比較しましたが、8行目と、126行目以外の行が書き換わっていました。具体的には、
82行目の
*MoveY = bby - Y - 1.0F;
が、
*MoveY = bby - Y + 1.0F;
に書き換わっていたり、110行目の
if (MapHitCheck(*X - hsize, *Y - hsize, &Dummy, &MoveY) == 4) *DropPower = -1.0F;
が、
if (MapHitCheck(*X + hsize, *Y - hsize, &Dummy, &MoveY) == 4) *DropPower = -1.0F;
に書き換わっていたりしています。
本当に、NO.1のソースコード(最初に提示して頂いた方です)の方に戻してから
・8行目のPlayerYの初期化子を、「216.0F」ではなく、「214.0F」にする。
・126行目の、
if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F) && (*X + Size*0.5, *Y + Size*0.5F)) {
これを、
if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F + 1.0f) == 0 && GetChipParam(*X + Size*0.5F, *Y + Size*0.5F + 1.0f) == 0) {
こうしたのでしょうか?
これ以外の行の書き換えをしないで、一度実行してみてください。
それでもエラーや、不具合・自分が思った処理と違ったら、その内容を詳しく記述し、自分はどういう処理がしたいのかを書いて、ソースコードを見せてください。
[追記]
あと、みけCATさんがおっしゃっていた
「まだコンマ演算子の左辺、*X + Size*0.5Fを投げ捨てるコードのままですね。」
というのは、
if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F+1.0F)==0 && (*X + Size*0.5F, *Y + Size*0.5F+1.0F)==0) {
こちらと下記のコードをよく見比べてみてください。
if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F + 1.0f) == 0 && GetChipParam(*X + Size*0.5F, *Y + Size*0.5F + 1.0f) == 0) {
論理演算子(&&)の右側に、GetChipParamをつけ忘れていますよ、という意味だと思います。
http://difff.jp/
こちらのサイトでNO.9のコードと、NO.1のコードを比較しましたが、8行目と、126行目以外の行が書き換わっていました。具体的には、
82行目の
*MoveY = bby - Y - 1.0F;
が、
*MoveY = bby - Y + 1.0F;
に書き換わっていたり、110行目の
if (MapHitCheck(*X - hsize, *Y - hsize, &Dummy, &MoveY) == 4) *DropPower = -1.0F;
が、
if (MapHitCheck(*X + hsize, *Y - hsize, &Dummy, &MoveY) == 4) *DropPower = -1.0F;
に書き換わっていたりしています。
本当に、NO.1のソースコード(最初に提示して頂いた方です)の方に戻してから
・8行目のPlayerYの初期化子を、「216.0F」ではなく、「214.0F」にする。
・126行目の、
if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F) && (*X + Size*0.5, *Y + Size*0.5F)) {
これを、
if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F + 1.0f) == 0 && GetChipParam(*X + Size*0.5F, *Y + Size*0.5F + 1.0f) == 0) {
こうしたのでしょうか?
これ以外の行の書き換えをしないで、一度実行してみてください。
それでもエラーや、不具合・自分が思った処理と違ったら、その内容を詳しく記述し、自分はどういう処理がしたいのかを書いて、ソースコードを見せてください。
[追記]
あと、みけCATさんがおっしゃっていた
「まだコンマ演算子の左辺、*X + Size*0.5Fを投げ捨てるコードのままですね。」
というのは、
if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F+1.0F)==0 && (*X + Size*0.5F, *Y + Size*0.5F+1.0F)==0) {
こちらと下記のコードをよく見比べてみてください。
if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F + 1.0f) == 0 && GetChipParam(*X + Size*0.5F, *Y + Size*0.5F + 1.0f) == 0) {
論理演算子(&&)の右側に、GetChipParamをつけ忘れていますよ、という意味だと思います。
Re: 移動とジャンプが上手く行きません。
そこは自分から気づいて直しました。sadora3 さんが書きました:NO.9のソースコードを見ましたが、NO.1のソースコードに戻っていないように思われます。
http://difff.jp/
こちらのサイトでNO.9のコードと、NO.1のコードを比較しましたが、8行目と、126行目以外の行が書き換わっていました。具体的には、
82行目の
*MoveY = bby - Y - 1.0F;
が、
*MoveY = bby - Y + 1.0F;
に書き換わっていたり、110行目の
if (MapHitCheck(*X - hsize, *Y - hsize, &Dummy, &MoveY) == 4) *DropPower = -1.0F;
が、
if (MapHitCheck(*X + hsize, *Y - hsize, &Dummy, &MoveY) == 4) *DropPower = -1.0F;
に書き換わっていたりしています。
了解です!!!sadora3 さんが書きました:本当に、NO.1のソースコード(最初に提示して頂いた方です)の方に戻してから
・8行目のPlayerYの初期化子を、「216.0F」ではなく、「214.0F」にする。
・126行目の、
if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F) && (*X + Size*0.5, *Y + Size*0.5F)) {
これを、
if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F + 1.0f) == 0 && GetChipParam(*X + Size*0.5F, *Y + Size*0.5F + 1.0f) == 0) {
こうしたのでしょうか?
これ以外の行の書き換えをしないで、一度実行してみてください。
それでもエラーや、不具合・自分が思った処理と違ったら、その内容を詳しく記述し、自分はどういう処理がしたいのかを書いて、ソースコードを見せてください。
[追記]
あと、みけCATさんがおっしゃっていた
「まだコンマ演算子の左辺、*X + Size*0.5Fを投げ捨てるコードのままですね。」
というのは、
if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F+1.0F)==0 && (*X + Size*0.5F, *Y + Size*0.5F+1.0F)==0) {
こちらと下記のコードをよく見比べてみてください。
if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F + 1.0f) == 0 && GetChipParam(*X + Size*0.5F, *Y + Size*0.5F + 1.0f) == 0) {
論理演算子(&&)の右側に、GetChipParamをつけ忘れていますよ、という意味だと思います。
Re: 移動とジャンプが上手く行きません。
一応、これで解決なのですが、どうしても、キャラが2ドット浮いてしまいます。地面にしっかり着地していないとアクションゲームにはなりません。その上二段ジャンプも設計しているので、必然的に何か動き回りすぎると地面に埋まってしまいます。また、壁にぶつかるとそこにも埋まってしまいます。どうすればいいのでしょうか?
#include "dxlib.h"
#define SCREEN_WIDTH (320)
#define SCREEN_HEIGHT (240)
#define CHIP_SIZE (16)
#define MAP_WIDTH (SCREEN_WIDTH/CHIP_SIZE)
#define MAP_HEIGHT (SCREEN_HEIGHT/CHIP_SIZE)
float PlayerX = 24.0F, PlayerY = 214.0F, DropPower = 0.0F,Gravity;
char dir, JumpFlag, DashFlag, AirFlag, DashTrigger;
int GetChipParam(float X, float Y);
int MoveChecker(float *X, float *Y, float *DropPower, float MoveX, float MoveY, float Size, char *JumpFlag,char *AirFlag);
int MapHitCheck(float X,float Y,float *MoveX,float *MoveY);
int PlayerHandle, MapChipHandle[2], JumpCount, Time, Input,EdgeInput;
int Key[256];
int gpUpdateKey() {
char tmpKey[256];
GetHitKeyStateAll(tmpKey);
for (int i = 0; i < 256; i++){
if (tmpKey[i] != 0) {
Key[i]++;
}
else {
Key[i] = 0;
}
}
return 0;
}
char MapData[MAP_HEIGHT][MAP_WIDTH] =
{
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1,
};
//マップチップ確認
int GetChipParam(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) {
float afX, afY;
afX = X + *MoveX;
afY = Y + *MoveY;
if (GetChipParam(X, Y) == 1) {
float blx, bty, brx, bby;
//壁衝突確認
blx = (float)((int)afX / CHIP_SIZE)*CHIP_SIZE;//左辺の当たり判定
brx = (float)((int)afX / CHIP_SIZE + 1)*CHIP_SIZE;//右辺の当たり判定
bty = (float)((int)afY / CHIP_SIZE)*CHIP_SIZE;//上辺の当たり判定
bby = (float)((int)afY / CHIP_SIZE + 1)*CHIP_SIZE;//下辺の当たり判定
//上辺に当たったら3を返す
if (*MoveY > 0.0F) {
*MoveX = 0.0F;
*MoveY = bty - Y - 1.0F;
return 3;
}
//下辺に当たっていたら4を返す
if (*MoveY < 0.0F) {
*MoveX = 0.0F;
*MoveY = bby - Y + 1.0F;
return 4;
}
if (*MoveX > 0.0F) {
*MoveY = 0.0F;
*MoveX = blx - X - 1.0F;
return 1;
}
if (*MoveX < 0.0F) {
*MoveY = 0.0F;
*MoveX = brx - X + 1.0F;
return 2;
}
return 4;
}
return 0;
}
//当たり判定チェック
int MoveChecker(float *X, float *Y, float *DropPower, float MoveX, float MoveY,float Size, char *JumpFlag,char *AirFlag) {
float Dummy = 0.0F;
float hsize;
hsize = Size*0.5F;
//上下移動成分をチェック
{
//左下
if (MapHitCheck(*X - hsize, *Y + hsize, &Dummy, &MoveY) == 3) *DropPower = 0.0F;
//右下
if (MapHitCheck(*X + hsize, *Y + hsize, &Dummy, &MoveY) == 3) *DropPower = 0.0F;
//左上
if (MapHitCheck(*X - hsize, *Y - hsize, &Dummy, &MoveY) == 4) *DropPower = -1.0F;
//右上
if (MapHitCheck(*X + hsize, *Y - hsize, &Dummy, &MoveY) == 4) *DropPower = -1.0F;
//問題がないのなら移動成分を加算する
*Y += MoveY;
}
//左右移動成分、以下同順
{
MapHitCheck(*X - hsize, *Y + hsize, &MoveX, &Dummy);
MapHitCheck(*X + hsize, *Y + hsize, &MoveX, &Dummy);
MapHitCheck(*X - hsize, *Y - hsize, &MoveX, &Dummy);
MapHitCheck(*X + hsize, *Y - hsize, &MoveX, &Dummy);
*X += MoveX;
}
{
//空中にいるなら、空中にいるとみなす
if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F+1.0F)==0 && GetChipParam(*X + Size*0.5F, *Y + Size*0.5F+1.0F)==0){
*AirFlag = TRUE;
}
//もし足場に着地したらジャンプ回数や移動指数をリセットする
else {
*AirFlag = FALSE;
JumpCount = 0;
Gravity = 0;
*JumpFlag = FALSE;
}
return 0;
}
}
int main(void) {
SetDrawScreen(DX_SCREEN_BACK);
Input = 0;
Time = GetNowCount();//カウント値を更新する
PlayerHandle = LoadGraph("テスト用.png");
LoadDivGraph("マップチップ.bmp", 2, 2, 1, 16, 16, MapChipHandle);
dir = TRUE;
DashFlag = FALSE;
while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && gpUpdateKey() == 0) {
//カウント値を更新する
Time = GetNowCount();
//フレームを管理する
while (GetNowCount() - Time < 1000 / 60) { Sleep(1); }
//入力状態を更新する
{
int i;
i = GetJoypadInputState(DX_INPUT_KEY_PAD1);
//チョン押しを確認する
EdgeInput = i & ~Input;
Input = i;
}
//ダッシュトリガー確認
if ((Input&PAD_INPUT_1) == 0) {
DashFlag = FALSE;
}
if (JumpCount >= 2) {
JumpFlag = TRUE;
}
//移動処理
{
float MoveX, MoveY;
MoveX = 0.0F;
MoveY = 0.0F;
//左に移動
if ((Input&PAD_INPUT_LEFT) != 0) {
dir = FALSE;
MoveX -= 5.0F;
}
//右に移動
if ((Input&PAD_INPUT_RIGHT) != 0) {
dir = TRUE;
MoveX += 5.0F;
}
//左ラン
if ((Input&PAD_INPUT_LEFT) != 0 && (Input&PAD_INPUT_1) != 0 && JumpFlag == FALSE) {
dir = FALSE;
DashFlag = TRUE;
MoveX -= 5.25F;
}
//右ラン
if ((Input&PAD_INPUT_RIGHT) != 0 && (Input&PAD_INPUT_1) != 0 && JumpFlag == FALSE) {
dir = TRUE;
DashFlag = TRUE;
MoveX += 5.25F;
}
//ダッシュボタン
if ((EdgeInput&PAD_INPUT_3) != 0) {
int DashTimer = GetNowCount();
}
//ジャンプ処理
if ((EdgeInput&PAD_INPUT_2) != 0 && JumpFlag == FALSE) {
//ジャンプできる状態にする
DropPower = 0;
//ジャンプ回数を増やす
JumpCount += 1;
//ジャンプする
DropPower -= 9.5F;
//ジャンプするときの重力を決める
Gravity = 0.5F;
}
if ((EdgeInput&PAD_INPUT_2) != 0 && DashFlag == TRUE && JumpFlag == FALSE) {
DashFlag = TRUE;
DropPower = 0;
JumpCount += 1;
DropPower -= 12.0F;
Gravity = 0.5F;
}
//落下処理
DropPower += Gravity;
//落下速度を移動量に追加する
MoveY = DropPower;
//当たり判定に基づく移動を行う
MoveChecker(&PlayerX, &PlayerY, &DropPower, MoveX, MoveY, CHIP_SIZE, &JumpFlag, &AirFlag);
}
//マップの描画
{
int i, j;
for (i = 0; i < MAP_HEIGHT; i++) {
for (j = 0; j < MAP_WIDTH; j++) {
if (MapData[i][j] == 1) {
DrawGraph(j * CHIP_SIZE, i*CHIP_SIZE, MapChipHandle[1],TRUE);
}
}
}
}
//キャラの描画
{
if (dir == TRUE)
DrawRotaGraph((int)PlayerX, (int)PlayerY, 1.0, 0.0, PlayerHandle, TRUE, FALSE);
else
DrawRotaGraph((int)PlayerX, (int)PlayerY, 1.0, 0, PlayerHandle, TRUE, TRUE);
}
}
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){
ChangeWindowMode(TRUE), SetGraphMode(320, 240, 32);
//初期化
if (DxLib_Init() == -1) {
return -1;
}
//メインプログラム
main();
//DXライブラリを終了する
DxLib_End();
return 0;
}
Re: 移動とジャンプが上手く行きません。
□ printfデバッグをして手掛かりをつかみましょう。怪しい変数を表示してみましょう。
□ 大きいサイズの関数はデバッグしにくいです。小さくしましょう。
□ コメントは沢山書いた方があとで見た時役立ちます。ひと月後の自分は他人です。
(コードは直したものではないかも。要チェックです。)
□ 大きいサイズの関数はデバッグしにくいです。小さくしましょう。
□ コメントは沢山書いた方があとで見た時役立ちます。ひと月後の自分は他人です。
(コードは直したものではないかも。要チェックです。)
#include "dxlib.h" //ヘッダー部分
#define SCREEN_WIDTH (320) //幅
#define SCREEN_HEIGHT (240)//高さ
#define CHIP_SIZE (16) //CHIPサイズ
#define MAP_WIDTH (SCREEN_WIDTH/CHIP_SIZE) //MAP幅
#define MAP_HEIGHT (SCREEN_HEIGHT/CHIP_SIZE)//MAP高さ
//////プレイヤーX,Y: DropPower: 重力
float PlayerX = 24.0F, PlayerY = 214.0F, DropPower = 0.0F,Gravity;
char dir, JumpFlag, DashFlag,AirFlag; //方向,JumpFlag,DashFlag,AirFlag
int GetChipParam(float X, float Y);//////////////////////////////////////////////////////////////////////////
int MoveChecker(float *X, float *Y, float *DropPower, float MoveX, float MoveY, float Size,char *JumpFlag);//
int MapHitCheck(float X,float Y,float *MoveX,float *MoveY);//////////////////////////////////////////////////
int PlayerHandle, MapChipHandle[2], JumpCount, DashTrigger, Time, Input,EdgeInput;
int Key[256];
int gpUpdateKey() { ///----------------------------------------------------------------gpUpdateKey--
char tmpKey[256];
GetHitKeyStateAll(tmpKey);
for (int i = 0; i < 256; i++){
if (tmpKey[i] != 0) {
Key[i]++;
}
else {
Key[i] = 0;
}
}
return 0;
}//----------------------------------------------------------------------------------------------------
char MapData[MAP_HEIGHT][MAP_WIDTH] = ///---------MapData[][]
{
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,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,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1,
};
//マップチップ確認---------------------------------------------------GetChipParam--
int GetChipParam(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];
}
//マップの当たり判定--------------------------------------------------MapHitCheck--
int MapHitCheck(float X, float Y, float *MoveX, float *MoveY) {
float afX, afY;
afX = X + *MoveX;
afY = Y + *MoveY;
if (GetChipParam(X, Y) == 1) {
float blx, bty, brx, bby;
//壁衝突確認
blx = (float)((int)afX / CHIP_SIZE)*CHIP_SIZE;//左辺の当たり判定
brx = (float)((int)afX / CHIP_SIZE + 1)*CHIP_SIZE;//右辺の当たり判定
bty = (float)((int)afY / CHIP_SIZE)*CHIP_SIZE;//上辺の当たり判定
bby = (float)((int)afY / CHIP_SIZE + 1)*CHIP_SIZE;//下辺の当たり判定
//上辺に当たったら3を返す
if (*MoveY > 0.0F) {
*MoveY = bty - Y - 1.0F;
return 3;
}
//下辺に当たっていたら4を返す
if (*MoveY < 0.0F) {
*MoveY = bby - Y + 1.0F;
return 4;
}
if (*MoveX > 0.0F) {
*MoveX = blx - X - 1.0F;
return 1;
}
if (*MoveX < 0.0F) {
*MoveX = brx - X + 1.0F;
return 2;
}
return 4;
}
return 0;
}
//当たり判定チェック----------------------------------------------------------------------------MoveChecker
int MoveChecker(float *X, float *Y, float *DropPower, float MoveX, float MoveY,float Size, char *JumpFlag) {
float Dummy = 0.0F;
float hsize;
hsize = Size*0.5F;
//上下移動成分をチェック
{
//左下
if (MapHitCheck(*X - hsize, *Y + hsize, &Dummy, &MoveY) == 3) *DropPower = 0.0F;
//右下
if (MapHitCheck(*X + hsize, *Y + hsize, &Dummy, &MoveY) == 3) *DropPower = 0.0F;
//左上
if (MapHitCheck(*X - hsize, *Y - hsize, &Dummy, &MoveY) == 4) *DropPower = -1.0F;
//右上
if (MapHitCheck(*X + hsize, *Y - hsize, &Dummy, &MoveY) == 4) *DropPower = -1.0F;
//問題がないのなら移動成分を加算する
*Y += MoveY;
}
//左右移動成分、以下同順
{
MapHitCheck(*X - hsize, *Y + hsize, &MoveX, &Dummy);
MapHitCheck(*X + hsize, *Y + hsize, &MoveX, &Dummy);
MapHitCheck(*X - hsize, *Y - hsize, &MoveX, &Dummy);
MapHitCheck(*X + hsize, *Y - hsize, &MoveX, &Dummy);
*X += MoveX;
}
{
//空中にいるなら、何もしない
if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F+1.0F)==0 && (*X + Size*0.5F, *Y + Size*0.5F+1.0F)==0) {
}
//もし足場に着地したらジャンプ回数をリセットする
else {
JumpCount = 0;
Gravity = 0;
*JumpFlag = FALSE;
}
return 0;
}
}
int draw_map() { ///-------------------------------------------------draw_map--
int i, j;
for (i = 0; i < MAP_HEIGHT; i++) {
for (j = 0; j < MAP_WIDTH; j++) {
if (MapData[i][j] == 1) {
DrawGraph(j * CHIP_SIZE, i*CHIP_SIZE, MapChipHandle[1],TRUE);
}
}
} return 0;
}
int draw_char() { printf("\n\n.PlayerX=%d\t .PlayerY=%d\t .dir=%d\t",(int)PlayerX,(int)PlayerY,dir);///--draw_char--
if (dir == TRUE){ DrawRotaGraph((int)PlayerX, (int)PlayerY, 1.0, 0.0, PlayerHandle, TRUE, FALSE);
}else{ DrawRotaGraph((int)PlayerX, (int)PlayerY, 1.0, 0, PlayerHandle, TRUE, TRUE);} return 0;
}
int main(void) { printf("②main()--->\t");///-----------------------------main--
//SetDrawScreen(DX_SCREEN_BACK);
//Input = 0;
//Time = GetNowCount();//カウント値を更新する
//PlayerHandle = LoadGraph("テスト用.png");
//LoadDivGraph("マップチップ.bmp", 2, 2, 1, 16, 16, MapChipHandle);
//dir = TRUE;
//DashFlag = FALSE;
while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && gpUpdateKey() == 0) {
draw_map(); draw_char();//マップの描画 //キャラの描画
//カウント値を更新する
Time = GetNowCount();system("cls");printf("③Time=%d\t",Time);
//入力状態を更新する
{
int i;
i = GetJoypadInputState(DX_INPUT_KEY_PAD1);
//チョン押しを確認する
EdgeInput = i & ~Input;
Input = i;printf("④i=%d\n\n",i);
}
//ダッシュトリガー確認
if ((Input&PAD_INPUT_1) == 0) {
DashFlag = FALSE;
}printf("⑤DashFlag=%d\t",DashFlag);
if (JumpCount >= 2) {
JumpFlag = TRUE;
}printf("6:JumpFlag=%d\t",JumpFlag);
//移動処理
{
float MoveX, MoveY;
MoveX = 0.0F;
MoveY = 0.0F;
//左に移動
if ((Input&PAD_INPUT_LEFT) != 0) {
dir = FALSE;
MoveX -= 5.0F;
}
//右に移動
if ((Input&PAD_INPUT_RIGHT) != 0) {
dir = TRUE;
MoveX += 5.0F;
}
//左ラン
if ((Input&PAD_INPUT_LEFT) != 0 && (Input&PAD_INPUT_1) != 0 && JumpFlag == FALSE) {
dir = FALSE;
DashFlag = TRUE;
MoveX -= 5.25F;
}
//右ラン
if ((Input&PAD_INPUT_RIGHT) != 0 && (Input&PAD_INPUT_1) != 0 && JumpFlag == FALSE) {
dir = TRUE;
DashFlag = TRUE;
MoveX += 5.25F;
}
//ダッシュボタン
if ((EdgeInput&PAD_INPUT_3) != 0) {
}
//ジャンプ処理
if ((EdgeInput&PAD_INPUT_2) != 0 && JumpFlag == FALSE) {
//ジャンプできる状態にする
DropPower = 0;
//ジャンプ回数を増やす
JumpCount += 1;
//ジャンプする
DropPower = -9.5F;
//ジャンプするときの重力を決める
Gravity = 0.5F;
}
if ((EdgeInput&PAD_INPUT_2) != 0 && DashFlag == TRUE && JumpFlag == FALSE) {
DashFlag = TRUE;
DropPower = 0;
JumpCount += 1;
DropPower = -12.0F;
Gravity = 0.5F;
}
//落下処理
DropPower += Gravity;
//落下速度を移動量に追加する
MoveY = DropPower;
//当たり判定に基づく移動を行う
MoveChecker(&PlayerX, &PlayerY, &DropPower, MoveX, MoveY, CHIP_SIZE,&JumpFlag);
}
draw_char();//キャラの描画
//{
// int i, j;
// for (i = 0; i < MAP_HEIGHT; i++) {
// for (j = 0; j < MAP_WIDTH; j++) {
// if (MapData[i][j] == 1) {
// DrawGraph(j * CHIP_SIZE, i*CHIP_SIZE, MapChipHandle[1],TRUE);
// }
// }
// }
//}
//{
// if (dir == TRUE)
// DrawRotaGraph((int)PlayerX, (int)PlayerY, 1.0, 0.0, PlayerHandle, TRUE, FALSE);
// else
// DrawRotaGraph((int)PlayerX, (int)PlayerY, 1.0, 0, PlayerHandle, TRUE, TRUE);
//}
}
}
///------------------------------------------------------------------init--
int init(void) {
ChangeWindowMode(TRUE), SetGraphMode(320, 240, 32);printf("①init()--->\t");
if (DxLib_Init() == -1) { exit(-1); } //初期化
SetDrawScreen(DX_SCREEN_BACK); //
Input = 0; Time = GetNowCount(); //カウント値を更新する
PlayerHandle = LoadGraph("テスト用.png");
LoadDivGraph("マップチップ.bmp", 2, 2, 1, 16, 16, MapChipHandle);
dir = TRUE; DashFlag = FALSE; return 0;
}///---------------------------------------------------------------------------------------------WinMain--
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){
//ChangeWindowMode(TRUE), SetGraphMode(320, 240, 32);
//初期化
//if (DxLib_Init() == -1) {
// return -1;
//}
//メインプログラム
AllocConsole();FILE* out=0;freopen_s( &out, "CON", "w", stdout );///コンソール-[Debug Print]
init(); //初期化処理
main();//メイン
fclose(out);FreeConsole();///Close-コンソール解放-[Debug Print]
//DXライブラリを終了する
DxLib_End(); return 0;
}///------------------------exit--
Re: 移動とジャンプが上手く行きません。
今VistaのWindowsが起動しなくなり”システムの回復”をしたのでいろいろ設定を変えました。
VistaのVC++2008コマンドライン・コンパイラーのテストをしています。(Vistaから投稿)
コマンドライン・コンパイラー
コード
あれXキーを押すと飛び上がったままだ。コードがあってるか見てください。(よく見てません)
VistaのVC++2008コマンドライン・コンパイラーのテストをしています。(Vistaから投稿)
コマンドライン・コンパイラー
D:\h\25\g1>g
D:\h\25\g1>nmake -f g.mak
Microsoft(R) Program Maintenance Utility Version 9.00.30729.01
Copyright (C) Microsoft Corporation. All rights reserved.
cl /c /TP /EHsc /D "_MBCS" /MT /I"d:\dxlib" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /W3 g1.cpp
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
g1.cpp
link /out:g1.exe /SUBSYSTEM:WINDOWS /LIBPATH:"d:\dxlib" "kernel32.lib" "user32.lib" "gdi32.l
ib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib"
"odbc32.lib" "odbccp32.lib" g1.obj
Microsoft (R) Incremental Linker Version 9.00.30729.01
Copyright (C) Microsoft Corporation. All rights reserved.
g1.exe
#include "dxlib.h" //ヘッダー部分
#define SCREEN_WIDTH (320) //幅
#define SCREEN_HEIGHT (240)//高さ
#define CHIP_SIZE (16) //CHIPサイズ
#define MAP_WIDTH (SCREEN_WIDTH/CHIP_SIZE) //MAP幅
#define MAP_HEIGHT (SCREEN_HEIGHT/CHIP_SIZE)//MAP高さ
//////プレイヤーX,Y: DropPower: 重力
float PlayerX = 24.0F, PlayerY = 214.0F, DropPower = 0.0F,Gravity;
char dir, JumpFlag, DashFlag,AirFlag; //方向,JumpFlag,DashFlag,AirFlag
int GetChipParam(float X, float Y);//////////////////////////////////////////////////////////////////////////
int MoveChecker(float *X, float *Y, float *DropPower, float MoveX, float MoveY, float Size,char *JumpFlag);//
int MapHitCheck(float X,float Y,float *MoveX,float *MoveY);//////////////////////////////////////////////////
int PlayerHandle, MapChipHandle[2], JumpCount, DashTrigger, Time, Input,EdgeInput;
int Key[256];
int gpUpdateKey() { ///----------------------------------------------------------------gpUpdateKey--
char tmpKey[256];
GetHitKeyStateAll(tmpKey);
for (int i = 0; i < 256; i++){
if (tmpKey[i] != 0) {
Key[i]++;
}
else {
Key[i] = 0;
}
}
return 0;
}//----------------------------------------------------------------------------------------------------
char MapData[MAP_HEIGHT][MAP_WIDTH] = ///---------MapData[][]
{
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,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,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1,
};
//マップチップ確認---------------------------------------------------GetChipParam--
int GetChipParam(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];
}
//マップの当たり判定--------------------------------------------------MapHitCheck--
int MapHitCheck(float X, float Y, float *MoveX, float *MoveY) {
float afX, afY;
afX = X + *MoveX;
afY = Y + *MoveY;
if (GetChipParam(X, Y) == 1) {
float blx, bty, brx, bby;
//壁衝突確認
blx = (float)((int)afX / CHIP_SIZE)*CHIP_SIZE;//左辺の当たり判定
brx = (float)((int)afX / CHIP_SIZE + 1)*CHIP_SIZE;//右辺の当たり判定
bty = (float)((int)afY / CHIP_SIZE)*CHIP_SIZE;//上辺の当たり判定
bby = (float)((int)afY / CHIP_SIZE + 1)*CHIP_SIZE;//下辺の当たり判定
//上辺に当たったら3を返す
if (*MoveY > 0.0F) {
*MoveY = bty - Y - 1.0F;
return 3;
}
//下辺に当たっていたら4を返す
if (*MoveY < 0.0F) {
*MoveY = bby - Y + 1.0F;
return 4;
}
if (*MoveX > 0.0F) {
*MoveX = blx - X - 1.0F;
return 1;
}
if (*MoveX < 0.0F) {
*MoveX = brx - X + 1.0F;
return 2;
}
return 4;
}
return 0;
}
//当たり判定チェック----------------------------------------------------------------------------MoveChecker
int MoveChecker(float *X, float *Y, float *DropPower, float MoveX, float MoveY,float Size, char *JumpFlag) {
float Dummy = 0.0F;
float hsize;
hsize = Size*0.5F;
//上下移動成分をチェック
{
//左下
if (MapHitCheck(*X - hsize, *Y + hsize, &Dummy, &MoveY) == 3) *DropPower = 0.0F;
//右下
if (MapHitCheck(*X + hsize, *Y + hsize, &Dummy, &MoveY) == 3) *DropPower = 0.0F;
//左上
if (MapHitCheck(*X - hsize, *Y - hsize, &Dummy, &MoveY) == 4) *DropPower = -1.0F;
//右上
if (MapHitCheck(*X + hsize, *Y - hsize, &Dummy, &MoveY) == 4) *DropPower = -1.0F;
//問題がないのなら移動成分を加算する
*Y += MoveY;
}
//左右移動成分、以下同順
{
MapHitCheck(*X - hsize, *Y + hsize, &MoveX, &Dummy);
MapHitCheck(*X + hsize, *Y + hsize, &MoveX, &Dummy);
MapHitCheck(*X - hsize, *Y - hsize, &MoveX, &Dummy);
MapHitCheck(*X + hsize, *Y - hsize, &MoveX, &Dummy);
*X += MoveX;
}
{
//空中にいるなら、何もしない
if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F+1.0F)==0 && (*X + Size*0.5F, *Y + Size*0.5F+1.0F)==0) {
}
//もし足場に着地したらジャンプ回数をリセットする
else {
JumpCount = 0;
Gravity = 0;
*JumpFlag = FALSE;
}
return 0;
}
}
int draw_map() { ///-------------------------------------------------draw_map--
int i, j;
for (i = 0; i < MAP_HEIGHT; i++) {
for (j = 0; j < MAP_WIDTH; j++) {
if (MapData[i][j] == 1) {
DrawGraph(j * CHIP_SIZE, i*CHIP_SIZE, MapChipHandle[1],TRUE);
}
}
} return 0;
}
int draw_char() { ///------------------------------------------------draw_char--
if (dir == TRUE){ DrawRotaGraph((int)PlayerX, (int)PlayerY, 1.0, 0.0, PlayerHandle, TRUE, FALSE);
}else{ DrawRotaGraph((int)PlayerX, (int)PlayerY, 1.0, 0, PlayerHandle, TRUE, TRUE);} return 0;
}
int main(void) { printf("②main()--->\t");///-----------------------------main--
while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && gpUpdateKey() == 0) {
draw_map(); //マップの描画
//カウント値を更新する
Time = GetNowCount();system("cls");printf("③Time=%d\t",Time);
//入力状態を更新する
{
int i;
i = GetJoypadInputState(DX_INPUT_KEY_PAD1);
//チョン押しを確認する
EdgeInput = i & ~Input;
Input = i;printf("④i=%d\n\n",i);
}
//ダッシュトリガー確認
if ((Input&PAD_INPUT_1) == 0) {
DashFlag = FALSE;
}printf("⑤DashFlag=%d\t",DashFlag);
if (JumpCount >= 2) {
JumpFlag = TRUE;
}printf("6:JumpFlag=%d\t",JumpFlag);
//移動処理
{
float MoveX, MoveY;
MoveX = 0.0F;
MoveY = 0.0F;
//左に移動
if ((Input&PAD_INPUT_LEFT) != 0) {
dir = FALSE;
MoveX -= 5.0F;
}
//右に移動
if ((Input&PAD_INPUT_RIGHT) != 0) {
dir = TRUE;
MoveX += 5.0F;
}
//左ラン
if ((Input&PAD_INPUT_LEFT) != 0 && (Input&PAD_INPUT_1) != 0 && JumpFlag == FALSE) {
dir = FALSE;
DashFlag = TRUE;
MoveX -= 5.25F;
}
//右ラン
if ((Input&PAD_INPUT_RIGHT) != 0 && (Input&PAD_INPUT_1) != 0 && JumpFlag == FALSE) {
dir = TRUE;
DashFlag = TRUE;
MoveX += 5.25F;
}
//ダッシュボタン
if ((EdgeInput&PAD_INPUT_3) != 0) {
}
//ジャンプ処理
if ((EdgeInput&PAD_INPUT_2) != 0 && JumpFlag == FALSE) {
//ジャンプできる状態にする
DropPower = 0;
//ジャンプ回数を増やす
JumpCount += 1;
//ジャンプする
DropPower = -9.5F;
//ジャンプするときの重力を決める
Gravity = 0.5F;
}
if ((EdgeInput&PAD_INPUT_2) != 0 && DashFlag == TRUE && JumpFlag == FALSE) {
DashFlag = TRUE;
DropPower = 0;
JumpCount += 1;
DropPower = -12.0F;
Gravity = 0.5F;
}
//落下処理
DropPower += Gravity;
//落下速度を移動量に追加する
MoveY = DropPower;
//当たり判定に基づく移動を行う
MoveChecker(&PlayerX, &PlayerY, &DropPower, MoveX, MoveY, CHIP_SIZE,&JumpFlag);
}
draw_char();
}
}
///------------------------------------------------------------------init--
int init(void) {
ChangeWindowMode(TRUE), SetGraphMode(320, 240, 32);printf("①init()--->\t");
if (DxLib_Init() == -1) { return -1; }//初期化
SetDrawScreen(DX_SCREEN_BACK); //
Input = 0; Time = GetNowCount(); //カウント値を更新する
PlayerHandle = LoadGraph("テスト用.png");
LoadDivGraph("マップチップ.bmp", 2, 2, 1, 16, 16, MapChipHandle);
dir = TRUE; DashFlag = FALSE; return 0;
}///---------------------------------------------------------------------------------------------WinMain--
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){
AllocConsole();FILE* out=0;freopen_s( &out, "CON", "w", stdout );///コンソール-[Debug Print]
init(); //初期化処理
main();//メイン
fclose(out);FreeConsole();///Close-コンソール解放-[Debug Print]
//DXライブラリを終了する
DxLib_End(); return 0;
}///------------------------exit--