今Visual Studioでマリオみたいな横スクロールのアクションゲームを作っているんですが・・・
自キャラは自由に動かすことができ、敵にはベクトルと地面の当たり判定ができたのですが
敵の動かし方がわかりません。
LoadDivGraphwoを使って動かすにはどうすればいいのでしょうか?
敵の動かし方
Re: 敵の動かし方
LoadDivGraphはあくまで画像をロードする関数です。
プレイヤーキャラの移動を理解できていればさほど難しい問題ではないような気がするのですが……。
方法の一つとしては、敵キャラに周囲のマップ情報とプレイヤーキャラの座標などを与え、
それを使って処理を行う、といった感じでしょうか。
例えばプレイヤーが遠くに入れば近づく、
逆に近くにいれば、一歩下がって攻撃を行う、
目の前に段差があれば乗り越える、
などのように。
プレイヤーキャラの移動を理解できていればさほど難しい問題ではないような気がするのですが……。
方法の一つとしては、敵キャラに周囲のマップ情報とプレイヤーキャラの座標などを与え、
それを使って処理を行う、といった感じでしょうか。
例えばプレイヤーが遠くに入れば近づく、
逆に近くにいれば、一歩下がって攻撃を行う、
目の前に段差があれば乗り越える、
などのように。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 敵の動かし方
自キャラが動かせるのなら、それと同じなのですが何処がわからないのでしょうか?
出来ればソースコードを提示してもらったほうが良いと思います。
出来ればソースコードを提示してもらったほうが良いと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 敵の動かし方
#include "myhelper.h"
#include "mymain.h"
Point2D g_enemypos = {100, 50};
Point2D g_jikipos = {40,400};
Vector g_jikivector = {0,0};
Vector g_enemyvector = {0,0};
//エリス
BOOL g_direction = DIRECTION_RIGHT;
BOOL g_nowjumping = FALSE;
//スライム
BOOL g_direction1 = DIRECTION_RIGHT;
BOOL g_nowjumpn1 = FALSE;
int g_enemyimage[3];
int g_jikiimage[11];
void MyMain(){
//動き
Vector curvec1 = {0,0};
int key = GetJoypadInputState( DX_INPUT_KEY_PAD1 );
if (key & PAD_INPUT_LEFT){
curvec1 = AddVector( curvec1, LEFTMOVEC );
g_direction = DIRECTION_LEFT;
}
if (key & PAD_INPUT_RIGHT){
curvec1 = AddVector( curvec1, RIGHTMOVEC );
g_direction = DIRECTION_RIGHT;
}
//地面との当たり判定
//エリス
BOOL ontheground = FALSE;
if (g_jikipos.y > 399){
ontheground = TRUE;
g_nowjumping = FALSE;
g_jikivector.x = 0;
g_jikivector.y = 0;
}
//スライム
BOOL ontheground1 = FALSE;
if (g_enemypos.y > 399){
ontheground1 = TRUE;
g_enemyvector.x = 0;
g_enemyvector.y = 0;
}
//ジャンプ
if (key & PAD_INPUT_A){
curvec1 = AddVector( curvec1, JUMPMOVEC );
g_nowjumping = TRUE;
}
if(ontheground == TRUE){
g_jikivector = AddVector( g_jikivector, curvec1);
}else{
g_jikivector = AddVectorInFrameTime(g_jikivector,GRAVITY);
if(g_jikivector.y > 400) g_jikivector.y = 400;
}
g_jikipos = AddVectorInFrameTime( g_jikipos,g_jikivector);
if ((ontheground == TRUE) && (g_nowjumping == FALSE)){
if(fabs(curvec1.x) > ZEROVALUE){
//走る
DrawAnimation( g_jikipos.x,g_jikipos.y, 1, 0, g_direction,
&g_jikiimage[2],6, 12 );
}else{
//停止状態
DrawAnimation( g_jikipos.x,g_jikipos.y, 1, 0, g_direction,
&g_jikiimage[0],1, 12 );
}
}else{
//ジャンプ状態
if ( fabs(g_jikivector.x) < ZEROVALUE ){
DrawAnimation( g_jikipos.x,g_jikipos.y, 1, 0, g_direction,
&g_jikiimage[8],1, 12 );
}else{
DrawAnimation( g_jikipos.x,g_jikipos.y, 1, 0, g_direction,
&g_jikiimage[9],1, 12 );
}
}
//スライム
if(ontheground1 == TRUE){
g_enemyvector = AddVector( g_enemyvector, curvec1);
}else{
g_enemyvector = AddVectorInFrameTime(g_enemyvector,GRAVITY);
if(g_enemyvector.y > 400) g_enemyvector.y = 400;
g_enemypos = AddVectorInFrameTime( g_enemypos,g_enemyvector);
}
//スライム
DrawAnimation( g_enemypos.x,g_enemypos.y,1,0,FALSE,
&g_enemyimage[1],2,5);
}
int LoadFiles(){
if (LoadDivGraph("media\\suraimu.bmp",3,3,1,32,32,g_enemyimage) == -1) return -1;
if(LoadDivGraph("media\\eris.bmp",11,11,1,32,32,g_jikiimage) == -1) return -1;
}
返信ありがとうございます。
問題のところだけソースコードのせました。
わかりづらくってすいません・・・
自キャラの場合は(key & PAD_INPUT_LEFT)のようにすれば自分で動かせるのはわかるんですが
敵キャラの場合どうすればいいのかがよくわかりません。
#include "mymain.h"
Point2D g_enemypos = {100, 50};
Point2D g_jikipos = {40,400};
Vector g_jikivector = {0,0};
Vector g_enemyvector = {0,0};
//エリス
BOOL g_direction = DIRECTION_RIGHT;
BOOL g_nowjumping = FALSE;
//スライム
BOOL g_direction1 = DIRECTION_RIGHT;
BOOL g_nowjumpn1 = FALSE;
int g_enemyimage[3];
int g_jikiimage[11];
void MyMain(){
//動き
Vector curvec1 = {0,0};
int key = GetJoypadInputState( DX_INPUT_KEY_PAD1 );
if (key & PAD_INPUT_LEFT){
curvec1 = AddVector( curvec1, LEFTMOVEC );
g_direction = DIRECTION_LEFT;
}
if (key & PAD_INPUT_RIGHT){
curvec1 = AddVector( curvec1, RIGHTMOVEC );
g_direction = DIRECTION_RIGHT;
}
//地面との当たり判定
//エリス
BOOL ontheground = FALSE;
if (g_jikipos.y > 399){
ontheground = TRUE;
g_nowjumping = FALSE;
g_jikivector.x = 0;
g_jikivector.y = 0;
}
//スライム
BOOL ontheground1 = FALSE;
if (g_enemypos.y > 399){
ontheground1 = TRUE;
g_enemyvector.x = 0;
g_enemyvector.y = 0;
}
//ジャンプ
if (key & PAD_INPUT_A){
curvec1 = AddVector( curvec1, JUMPMOVEC );
g_nowjumping = TRUE;
}
if(ontheground == TRUE){
g_jikivector = AddVector( g_jikivector, curvec1);
}else{
g_jikivector = AddVectorInFrameTime(g_jikivector,GRAVITY);
if(g_jikivector.y > 400) g_jikivector.y = 400;
}
g_jikipos = AddVectorInFrameTime( g_jikipos,g_jikivector);
if ((ontheground == TRUE) && (g_nowjumping == FALSE)){
if(fabs(curvec1.x) > ZEROVALUE){
//走る
DrawAnimation( g_jikipos.x,g_jikipos.y, 1, 0, g_direction,
&g_jikiimage[2],6, 12 );
}else{
//停止状態
DrawAnimation( g_jikipos.x,g_jikipos.y, 1, 0, g_direction,
&g_jikiimage[0],1, 12 );
}
}else{
//ジャンプ状態
if ( fabs(g_jikivector.x) < ZEROVALUE ){
DrawAnimation( g_jikipos.x,g_jikipos.y, 1, 0, g_direction,
&g_jikiimage[8],1, 12 );
}else{
DrawAnimation( g_jikipos.x,g_jikipos.y, 1, 0, g_direction,
&g_jikiimage[9],1, 12 );
}
}
//スライム
if(ontheground1 == TRUE){
g_enemyvector = AddVector( g_enemyvector, curvec1);
}else{
g_enemyvector = AddVectorInFrameTime(g_enemyvector,GRAVITY);
if(g_enemyvector.y > 400) g_enemyvector.y = 400;
g_enemypos = AddVectorInFrameTime( g_enemypos,g_enemyvector);
}
//スライム
DrawAnimation( g_enemypos.x,g_enemypos.y,1,0,FALSE,
&g_enemyimage[1],2,5);
}
int LoadFiles(){
if (LoadDivGraph("media\\suraimu.bmp",3,3,1,32,32,g_enemyimage) == -1) return -1;
if(LoadDivGraph("media\\eris.bmp",11,11,1,32,32,g_jikiimage) == -1) return -1;
}
返信ありがとうございます。
問題のところだけソースコードのせました。
わかりづらくってすいません・・・
自キャラの場合は(key & PAD_INPUT_LEFT)のようにすれば自分で動かせるのはわかるんですが
敵キャラの場合どうすればいいのかがよくわかりません。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 敵の動かし方
フォーラムルールを一度読んでいただきたいのですが、フォーラムルールに説明されているcodeタグを使うと綺麗にソースコードを掲載できます。
http://dixq.net/board/board.html
http://dixq.net/board/board.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 敵の動かし方
#include "myhelper.h"
#include "mymain.h"
Point2D g_enemypos = {100, 50};
Point2D g_jikipos = {40,400};
Vector g_jikivector = {0,0};
Vector g_enemyvector = {0,0};
//エリス
BOOL g_direction = DIRECTION_RIGHT;
BOOL g_nowjumping = FALSE;
//スライム
BOOL g_direction1 = DIRECTION_RIGHT;
BOOL g_nowjumpn1 = FALSE;
int g_enemyimage[3];
int g_jikiimage[11];
void MyMain(){
//動き
Vector curvec1 = {0,0};
int key = GetJoypadInputState( DX_INPUT_KEY_PAD1 );
if (key & PAD_INPUT_LEFT){
curvec1 = AddVector( curvec1, LEFTMOVEC );
g_direction = DIRECTION_LEFT;
}
if (key & PAD_INPUT_RIGHT){
curvec1 = AddVector( curvec1, RIGHTMOVEC );
g_direction = DIRECTION_RIGHT;
}
//地面との当たり判定
//エリス
BOOL ontheground = FALSE;
if (g_jikipos.y > 399){
ontheground = TRUE;
g_nowjumping = FALSE;
g_jikivector.x = 0;
g_jikivector.y = 0;
}
//スライム
BOOL ontheground1 = FALSE;
if (g_enemypos.y > 399){
ontheground1 = TRUE;
g_enemyvector.x = 0;
g_enemyvector.y = 0;
}
//ジャンプ
if (key & PAD_INPUT_A){
curvec1 = AddVector( curvec1, JUMPMOVEC );
g_nowjumping = TRUE;
}
if(ontheground == TRUE){
g_jikivector = AddVector( g_jikivector, curvec1);
}else{
g_jikivector = AddVectorInFrameTime(g_jikivector,GRAVITY);
if(g_jikivector.y > 400) g_jikivector.y = 400;
}
g_jikipos = AddVectorInFrameTime( g_jikipos,g_jikivector);
if ((ontheground == TRUE) && (g_nowjumping == FALSE)){
if(fabs(curvec1.x) > ZEROVALUE){
//走る
DrawAnimation( g_jikipos.x,g_jikipos.y, 1, 0, g_direction,
&g_jikiimage[2],6, 12 );
}else{
//停止状態
DrawAnimation( g_jikipos.x,g_jikipos.y, 1, 0, g_direction,
&g_jikiimage[0],1, 12 );
}
}else{
//ジャンプ状態
if ( fabs(g_jikivector.x) < ZEROVALUE ){
DrawAnimation( g_jikipos.x,g_jikipos.y, 1, 0, g_direction,
&g_jikiimage[8],1, 12 );
}else{
DrawAnimation( g_jikipos.x,g_jikipos.y, 1, 0, g_direction,
&g_jikiimage[9],1, 12 );
}
}
//スライム
if(ontheground1 == TRUE){
g_enemyvector = AddVector( g_enemyvector, curvec1);
}else{
g_enemyvector = AddVectorInFrameTime(g_enemyvector,GRAVITY);
if(g_enemyvector.y > 400) g_enemyvector.y = 400;
g_enemypos = AddVectorInFrameTime( g_enemypos,g_enemyvector);
}
//スライム
DrawAnimation( g_enemypos.x,g_enemypos.y,1,0,FALSE,
&g_enemyimage[1],2,5);
}
int LoadFiles(){
if (LoadDivGraph("media\\suraimu.bmp",3,3,1,32,32,g_enemyimage) == -1) return -1;
if(LoadDivGraph("media\\eris.bmp",11,11,1,32,32,g_jikiimage) == -1) return -1;
}
これで大丈夫でしょうか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 敵の動かし方
codeタグはOKです。
インデントがちゃんと出来ていませんので、次のコードはちゃんと直してくださいね。
で、LoadDivGraph()で画像ロードはちゃんとできていると思いますが、DrawAnimation()と言う謎の関数があります。これはご自身で作られた関数でしょうか?
引数の機能を説明してもらうか、DrawAnimation()関数自体を見せて下さい。
あとスライムもジャンプするみたいですが、ジャンプの地面処理は主人公と共通の関数にしたほうが良いと思いますね。
インデントがちゃんと出来ていませんので、次のコードはちゃんと直してくださいね。
で、LoadDivGraph()で画像ロードはちゃんとできていると思いますが、DrawAnimation()と言う謎の関数があります。これはご自身で作られた関数でしょうか?
引数の機能を説明してもらうか、DrawAnimation()関数自体を見せて下さい。
あとスライムもジャンプするみたいですが、ジャンプの地面処理は主人公と共通の関数にしたほうが良いと思いますね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。