#include "DxLib.h"
#include "Player.h"
#include "Keyboard.h"
#include "Field.h"
// このファイル内でしか使えないグローバル変数
static int m_Image[16]; //画像ハンドル
static int m_y; //y座標
static int m_x;
static int W,SPD,W2;
static int muki_flag,walk_flag;
// 初期化をする
void Player_Initialize(){
LoadDivGraph("画像/キャラクタ10.png", 16, 4, 4, 32, 32, m_Image);
m_y = 320;
m_x = 160;
SPD=1;
W=FIELD_MAX_X;//600
W2=FIELD_MAX_Y;//448
muki_flag=3;
walk_flag=0;
}
// 動きを計算する
void Player_Calc(){
if(m_x%1==0 && m_y%1==0){
walk_flag=1;
if(Keyboard_Get(KEY_INPUT_UP)>0)
muki_flag=0;
else if(Keyboard_Get(KEY_INPUT_LEFT)>0)
muki_flag=1;
else if(Keyboard_Get(KEY_INPUT_DOWN)>0)
muki_flag=2;
else if(Keyboard_Get(KEY_INPUT_RIGHT)>0)
muki_flag=3;
else
walk_flag=0;
if(walk_flag==1){
if(muki_flag==0)
m_y--;
else if(muki_flag==1)
m_x--;
else if(muki_flag==2)
m_y++;
else if(muki_flag==3)
m_x++;
if(m_x>W)
m_x--;
else if(m_x<0)
m_x++;
else if(m_y>W2)
m_y--;
else if(m_y<16)
m_y++;
}
}
}
// 描画する
void Player_Graph(){
if(muki_flag==0)
DrawGraph(m_x, m_y, m_Image[0], TRUE);
else if(muki_flag==1)
DrawGraph(m_x, m_y, m_Image[4], TRUE);
else if(muki_flag==2)
DrawGraph(m_x, m_y, m_Image[8], TRUE);
else if(muki_flag==3)
DrawGraph(m_x, m_y, m_Image[12], TRUE);
}
// 終了処理をする
void Player_Finalize(){
DeleteGraph(m_Image[16]);
}
キャラを歩かせたいです。
-
時雨
キャラを歩かせたいです。
プログラミングの館を見ながら作っています。キャラの移動はできたんですが歩かせるのがうまくいきません何かヒントでもお願いします。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: キャラを歩かせたいです。
どの様な問題があるのでしょうか?曖昧な「うまくいきません」では無く具体的にお願いします。
現状だと同じアニメコマ常に表示しているようです。
あとインデントは正確に行いましょう。バグの元になります。
現状だと同じアニメコマ常に表示しているようです。
あとインデントは正確に行いましょう。バグの元になります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: キャラを歩かせたいです。
プログラミングの館の絵だとアニメのコマは0~3の4コマの繰り返しです。
m_Image[0]など固定で与えていますが、移動の時間経過に合わせて m_Image[0]、 m_Image[1]、 m_Image[2]、 m_Image[3]と切り替える必要があります。
m_Image[4]だと m_Image[4~7]ですね。
さて、どうすれば良いと思いますか?
アイデア
(1)座標でアニメコマを決める。
(2)Player_Calc()が呼び出された回数を数える。
m_Image[0]など固定で与えていますが、移動の時間経過に合わせて m_Image[0]、 m_Image[1]、 m_Image[2]、 m_Image[3]と切り替える必要があります。
m_Image[4]だと m_Image[4~7]ですね。
さて、どうすれば良いと思いますか?
アイデア
(1)座標でアニメコマを決める。
(2)Player_Calc()が呼び出された回数を数える。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
時雨
Re: キャラを歩かせたいです。
プログラムの館のものを利用しましたが歩かせることできました。
#include "DxLib.h"
#include "Player.h"
#include "Keyboard.h"
#include "Field.h"
// このファイル内でしか使えないグローバル変数
static int m_Image[16]; //画像ハンドル
static int m_y; //y座標
static int m_x;
static int W,SPD,W2;
static int muki_flag,walk_flag;
// 初期化をする
void Player_Initialize(){
LoadDivGraph("画像/キャラクタ10.png", 16, 4, 4, 32, 32, m_Image);
m_y = 320;
m_x = 160;
SPD=1;
W=FIELD_MAX_X;//600
W2=FIELD_MAX_Y;//448
muki_flag=3;
walk_flag=0;
}
// 動きを計算する
void Player_Calc(){
if(m_x%1==0 && m_y%1==0){
walk_flag=1;
if(Keyboard_Get(KEY_INPUT_UP)>0)
muki_flag=0;
else if(Keyboard_Get(KEY_INPUT_LEFT)>0)
muki_flag=1;
else if(Keyboard_Get(KEY_INPUT_DOWN)>0)
muki_flag=2;
else if(Keyboard_Get(KEY_INPUT_RIGHT)>0)
muki_flag=3;
else
walk_flag=0;
if(walk_flag==1){
if(muki_flag==0)
m_y--;
else if(muki_flag==1)
m_x--;
else if(muki_flag==2)
m_y++;
else if(muki_flag==3)
m_x++;
if(m_x>W)
m_x--;
else if(m_x<0)
m_x++;
else if(m_y>W2)
m_y--;
else if(m_y<16)
m_y++;
}
}
}
// 描画する
void Player_Graph(){
m_Image[12]=m_Image[(m_x%32)/8+12];
m_Image[8]=m_Image[(m_y%32)/8+8];
m_Image[0]=m_Image[(m_y%32)/8+0];
m_Image[4]=m_Image[(m_x%32)/8+4];
if(muki_flag==0)
DrawGraph(m_x, m_y, m_Image[0], TRUE);
else if(muki_flag==1)
DrawGraph(m_x, m_y, m_Image[4], TRUE);
else if(muki_flag==2)
DrawGraph(m_x, m_y, m_Image[8], TRUE);
else if(muki_flag==3)
DrawGraph(m_x, m_y, m_Image[12], TRUE);
}
// 終了処理をする
void Player_Finalize(){
DeleteGraph(m_Image[16]);
}- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: キャラを歩かせたいです。
解決チェックを外しておきますが、このコードはバグっています。
0,1,2,3,3,1,2,3,3,1,2,3・・・
とコマが再生されるはずです。ちょっとガクツキませんか?
【補足】
0,1,2,3,3,1,2,3,3,1,2,3・・・
とコマが再生されるはずです。ちょっとガクツキませんか?
【補足】
も忘れないで下さい。あとインデントは正確に行いましょう。バグの元になります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
peot
Re: キャラを歩かせたいです。
もう解決しているのかもしれませんが、
コードを見て気になった箇所を2つだけ指摘させてください。
ひとつめ、28行目のIF文は何を判定しようとしたのでしょうか?
整数を1で割った余りが0以外になる事はないので、この判定は必要ないですよね。
ふたつめ、終了処理(80行目)で としていますが、これでは配列の16番目の画像だけを削除している事になるので、
終了処理としては不完全になっています。
FOR文などを使って全ての配列を削除するようにしましょう。
以下で私なり改変してみました。
コードを見て気になった箇所を2つだけ指摘させてください。
ひとつめ、28行目のIF文は何を判定しようとしたのでしょうか?
整数を1で割った余りが0以外になる事はないので、この判定は必要ないですよね。
ふたつめ、終了処理(80行目)で としていますが、これでは配列の16番目の画像だけを削除している事になるので、
終了処理としては不完全になっています。
FOR文などを使って全ての配列を削除するようにしましょう。
以下で私なり改変してみました。
#include "DxLib.h"
#include "Player.h"
#include "Keyboard.h"
#include "Field.h"
//定数
#define IMAGE_MAX 16 //画像の分割最大数
#define TIMING 10 //アニメの速さ
#define PATTERN 4 //アニメの枚数
#define SPEED 1 //プレイヤーの移動速度
// このファイル内でしか使えないグローバル変数
static int m_Image[IMAGE_MAX]; //画像ハンドル
static int m_x; //x座標
static int m_y; //y座標
static int SPD; //移動量
static int muki_flag; //向き
static int walk_flag; //歩き
// 初期化をする
void Player_Initialize()
{
LoadDivGraph("画像/キャラクタ10.png", IMAGE_MAX, 4, 4, 32, 32, m_Image);
m_y = 320;
m_x = 160;
SPD = SPEED;
muki_flag = 8;
walk_flag = 0;
}
// 動きを計算する
void Player_Calc()
{
//キーボードによる移動処理
walk_flag = 0;
if( Keyboard_Get(KEY_INPUT_UP) > 0 ){
walk_flag = 1;
muki_flag = 0;
m_y -= SPD;
}
if( Keyboard_Get(KEY_INPUT_DOWN) > 0 ){
walk_flag = 1;
muki_flag = 8;
m_y += SPD;
}
if( Keyboard_Get(KEY_INPUT_LEFT) > 0 ){
walk_flag = 1;
muki_flag = 4;
m_x -= SPD;
}
if( Keyboard_Get(KEY_INPUT_RIGHT) > 0 ){
walk_flag = 1;
muki_flag = 12;
m_x += SPD;
}
//画面内移動補正
if(m_x > FIELD_MAX_X ) m_x = FIELD_MAX_X;//600
if(m_x < 0 ) m_x = 0;
if(m_y > FIELD_MAX_Y ) m_y = FIELD_MAX_Y;//448
if(m_y < 16 ) m_y = 16;
}
// 描画する
void Player_Graph()
{
static int timer = 0;//アニメの速さ用
static int count = 0;//アニメのコマ送り用
//歩きアニメ処理
if(walk_flag == 1 ){
if(( timer%TIMING ) == 0 ) count = ( count+1 )%PATTERN ;
}else{
count = 0;//止まっている時は1枚目を表示する
}
timer++;
//歩きアニメ表示
int motion = muki_flag + count;
DrawGraph(m_x, m_y, m_Image[motion], TRUE);
}
// 終了処理をする
void Player_Finalize()
{
for(int i = 0; i < IMAGE_MAX; i++ ){
DeleteGraph( m_Image[i] );
}
}