敵の動かし方

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
風流

敵の動かし方

#1

投稿記事 by 風流 » 11年前

今Visual Studioでマリオみたいな横スクロールのアクションゲームを作っているんですが・・・
自キャラは自由に動かすことができ、敵にはベクトルと地面の当たり判定ができたのですが
敵の動かし方がわかりません。
LoadDivGraphwoを使って動かすにはどうすればいいのでしょうか?

nil
記事: 428
登録日時: 12年前

Re: 敵の動かし方

#2

投稿記事 by nil » 11年前

LoadDivGraphはあくまで画像をロードする関数です。
プレイヤーキャラの移動を理解できていればさほど難しい問題ではないような気がするのですが……。

方法の一つとしては、敵キャラに周囲のマップ情報とプレイヤーキャラの座標などを与え、
それを使って処理を行う、といった感じでしょうか。
例えばプレイヤーが遠くに入れば近づく、
逆に近くにいれば、一歩下がって攻撃を行う、
目の前に段差があれば乗り越える、
などのように。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 敵の動かし方

#3

投稿記事 by softya(ソフト屋) » 11年前

自キャラが動かせるのなら、それと同じなのですが何処がわからないのでしょうか?
出来ればソースコードを提示してもらったほうが良いと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

風流

Re: 敵の動かし方

#4

投稿記事 by 風流 » 11年前

#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)のようにすれば自分で動かせるのはわかるんですが
敵キャラの場合どうすればいいのかがよくわかりません。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 敵の動かし方

#5

投稿記事 by softya(ソフト屋) » 11年前

フォーラムルールを一度読んでいただきたいのですが、フォーラムルールに説明されているcodeタグを使うと綺麗にソースコードを掲載できます。
http://dixq.net/board/board.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

風流

Re: 敵の動かし方

#6

投稿記事 by 風流 » 11年前

コード:

#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: 敵の動かし方

#7

投稿記事 by softya(ソフト屋) » 11年前

codeタグはOKです。
インデントがちゃんと出来ていませんので、次のコードはちゃんと直してくださいね。

で、LoadDivGraph()で画像ロードはちゃんとできていると思いますが、DrawAnimation()と言う謎の関数があります。これはご自身で作られた関数でしょうか?
引数の機能を説明してもらうか、DrawAnimation()関数自体を見せて下さい。
あとスライムもジャンプするみたいですが、ジャンプの地面処理は主人公と共通の関数にしたほうが良いと思いますね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

“C言語何でも質問掲示板” へ戻る