移動するユニットに弾を撃たせる

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

移動するユニットに弾を撃たせる

#1

投稿記事 by syuger » 11年前

Pshot.cpp

コード:

#include "DxLib.h"
#include "Pshot.h"
#include "struct.h"
#include "map.h"
#include <math.h>

#define SHOT_MAX 200

int MGGraph;//弾の画像
int cooltime;


void Pshot_Syoki(){
	int i;
	MGGraph=LoadGraph("img/MG.png");//初期化
}


void Pshot_Select(int Px,int Py,int Pi){
        int i;
	cooltime++;
	for(i=0;i<SHOT_MAX;i++){
		data[i].knd=1;
		switch(data[i].knd){//のちのち武器を追加するので種類で分岐
			case 1:
				if(cooltime>120){
					if(data[i].flag==0){
						data[i].x=Px;//プレイヤーの座標にあわせる
						data[i].flag=1;//フラグ
						data[i].who=Pi;//誰がの弾か(未使用)
						data[i].speed=1;//弾速
						cooltime=0;//クールダウン
						break;
					}
				}
		}
		if(data[i].flag==1){                    
			data[i].x=map_EntityMove(dataP[i].x);   //マップのスクロール+速さ
		}
	}		
}

void Pshot_calc(int Pi){//計算
	int i;
	for(i=0;i<SHOT_MAX;i++){
		if(data[i].flag==1){                    
			data[i].x=dataP[Pi].x+data[i].speed;   //マップのスクロール+速さ
			DrawGraph(data[i].x,data[i].y,MGGraph,TRUE);
		}
	}
}

void Pshot_Draw(){//描写(削除予定)
	int i;
//	for(i=0;i<SHOT_MAX;i++){
//		if(data[i].flag==1){
//			DrawGraph(data[i].x,data[i].y,MGGraph,TRUE);
//		}
//	}
}

Unit.cpp

コード:

#include "DxLib.h"
#include "Punit.h"
#include "Eunit.h"
#include "struct.h"
#include "Pshot.h"
#include "Eshot.h"
#include "map.h"
#include <math.h>

#define UNIT_MAX 200
#define SHOT_MAX 200
#define PI 3.141592654

//画像ハンドル略

void EUnit_Hit(){//当たり判定(未実装)
	int i,j;
	for(i=0;i>UNIT_MAX;i++){
		for(j=0;j>SHOT_MAX;j++){
			if(i>4){
				dataE[j].flag=0;
				
			}
		}
	}
}

void PUnit_Select(){//あいているユニット選択
        int i;
	Pcooltime++;
	for(i=0;i<UNIT_MAX;i++){
		if(Pcooltime>=120){
			if(CheckHitKey(KEY_INPUT_1)==1){
					if(dataP[i].flag==0){
						dataP[i].flag=1;   //以下初期値
						dataP[i].type=1;
						dataP[i].x=mapX;
						dataP[i].speed=0.5;
						dataP[i].y=200;
						dataP[i].range=100;//ここまで初期値代入
						Pcooltime=0;
					}
			}
		}
		if(dataP[i].x>mapX+1795 || dataP[i].x<mapX-3){//マップから出たら消去
				dataP[i].flag=0;
		}
	}      
}

void EUnit_Select(){ //上と同じ
	int i;
	Ecooltime++;
	for(i=0;i<UNIT_MAX;i++){
		if(Ecooltime>=120){
			if(dataE[i].flag==0){//出現
				dataE[i].flag=1;    //以下初期値
				dataE[i].type=1;
				dataE[i].x=mapX+1795;
				dataE[i].speed=0.5;
				dataE[i].y=200;
				dataE[i].range=200;//ここまで初期値代入
				Ecooltime=0;
			}
		}
		if(dataE[i].x>mapX+1800 || dataE[i].x<mapX-9){//消去判定
			dataE[i].flag=0;
		}
	}
}

int PUnit_Draw(int x,int y,int type){//種類ごとに描写
	switch(type){                                           //種類
		case 1:
				DrawGraph(x,y,PikadaGraph,TRUE);
			break;
		case 2:
				DrawGraph(x,y,PyotGraph,TRUE);
			break;
		case 3:
				DrawGraph(x,y,PgyosenGraph,TRUE);
			break;
		case 4:
				DrawGraph(x,y,PkyakusenGraph,TRUE);
			break;
	}
}

int EUnit_Draw(double x,double y,int type){//上と同じ
	switch(type){                                           //種類
		case 1:
				DrawGraph(x,y,EikadaGraph,TRUE);
			break;
		case 2:
				DrawGraph(x,y,EyotGraph,TRUE);
			break;
		case 3:
				DrawGraph(x,y,EgyosenGraph,TRUE);
			break;
		case 4:
				DrawGraph(x,y,EkyakusenGraph,TRUE);
			break;
	}
}

int PUnit_Range(int x,int y,int range){ //索敵範囲
	int i;
	int xl,yl,r;
	for(i=0;i<UNIT_MAX;i++){
		xl = dataE[i].x - x ;      //索敵範囲計算
		yl = dataE[i].y - y ;
		r = xl * xl + yl * yl ;
		if( r < range * range ){
				Pshot_Select(data[i].x,data[i].y,i); //弾発射
				Pshot_calc(i);                       //弾計算
				Pshot_Draw();                        //描写(削除予定)
				return 1;
		}
	}
	return 0;
}

int EUnit_Range(int x,int y,int range){//上と同じ
	int i;
	int xl,yl,r;
	for(i=0;i<UNIT_MAX;i++){
		xl = x - dataP[i].x ;
		yl = y - dataP[i].y ;
		r = xl * xl + yl * yl ;
		if( r < range * range ){
				Eshot_calc(dataE[i].x);
				Eshot_Draw();
				return 1;
		}
	}
	return 0;
}
void PUnit_calc(){ //計算
	int i;
	for(i=0;i<UNIT_MAX;i++){
		if(dataP[i].flag==1){
			if(dataP[i].rangeFlag==0){                     
				dataP[i].x=map_EntityMove(dataP[i].x)+dataP[i].speed;   //マップのスクロールにあわせる+速さ
				
			}else if(dataP[i].rangeFlag==1){
				dataP[i].x=map_EntityMove(dataP[i].x);                 //マップのスクロールに合わせる
			}
			dataP[i].rangeFlag=0;                                               //索敵初期化
			dataP[i].rangeFlag=PUnit_Range(dataP[i].x,dataP[i].y,dataP[i].range);//索敵範囲判定
			PUnit_Draw(dataP[i].x,dataP[i].y,dataP[i].type); //描写関数へ
		}
	}
}

void EUnit_calc(){ //上と同じ
	int i;
	for(i=0;i<UNIT_MAX;i++){
		if(dataE[i].flag==1){
			if(dataE[i].rangeFlag==0){
				dataE[i].lx=dataE[i].speed*-1;
				dataE[i].x=map_EntityMove(dataE[i].x)+dataE[i].lx;   //マップの右端-速さ
			}else if(dataE[i].rangeFlag==1){
				dataE[i].x=map_EntityMove(dataE[i].x);
			}
			dataE[i].rangeFlag=0;
			dataE[i].rangeFlag=EUnit_Range(dataE[i].x,dataE[i].y,dataE[i].range);//索敵範囲判定
			EUnit_Draw(dataE[i].x,dataE[i].y,dataE[i].type);
		}                                 
	}
}
スクロールするマップ上のユニットに弾を撃たせたいんですけど、
なかなかうまくいきません。
上のソースでは、プレイヤーのユニットからの位置で弾の座標を計算しています。
実行してみると弾の座標がおかしくなってるみたいなんです。

何か間違っている点があるのは確実なんですが、
いくら眺めてみても自分はわかりませんでした。

何箇所か未実装だったり未完成だったりしてます すいません、よろしくお願いします。

syuger

Re: 移動するユニットに弾を撃たせる

#2

投稿記事 by syuger » 11年前

すいません、わかりにくかったです。
重要な部分だけ抜き出して書きます。

コード:

void Pshot_calc(int Pi){//計算
    int i;
    for(i=0;i<SHOT_MAX;i++){
        if(data[i].flag==1){                    
            data[i].x=dataP[Pi].x+data[i].speed;   //マップのスクロール+速さ
            DrawGraph(data[i].x,data[i].y,MGGraph,TRUE);
        }
    }
}
この式でプレイヤーからの距離を求めて、
マップ上でプレイヤーに弾を撃たせることができるでしょうか?

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

Re: 移動するユニットに弾を撃たせる

#3

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

スクロールは描画だけに留めて、その他の部分はスクロールを計算に入れないほうが処理が単純になるのですが、そういう方向性はダメなのでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

syuger

Re: 移動するユニットに弾を撃たせる

#4

投稿記事 by syuger » 11年前

softya(ソフト屋) さんが書きました:スクロールは描画だけに留めて、その他の部分はスクロールを計算に入れないほうが処理が単純になるのですが、そういう方向性はダメなのでしょうか?
すいませんdxlibはじめたばかりであまりわからないんですけど
プログラムが組めるようになるならいろんな方法を知っておきたいです。

えーと、描画のための座標と実際のプログラム上の座標を別々に計算するという認識でいいでしょうか?
間違ってる気しかしませんが・・・。

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

Re: 移動するユニットに弾を撃たせる

#5

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

そうです。描画の座標は毎回描画時に計算して、各キャラの座標は別に管理して移動しない限り同じ座標から動きません。
スクロールはカメラワークと考えてもらえば良いかと思います。
前にも例えで書いたのですが、横長い舞台があってビデオ・カメラで映しているすれば、モニタに映るのはカメラで切り取られた部分だけです。
舞台の端からの相対座標と舞台の一部をカメラで切り取ったモニタに見えている相対座標は違いますよね。
イメージできそうですか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

syuger

Re: 移動するユニットに弾を撃たせる

#6

投稿記事 by syuger » 11年前

softya(ソフト屋) さんが書きました:そうです。描画の座標は毎回描画時に計算して、各キャラの座標は別に管理して移動しない限り同じ座標から動きません。
スクロールはカメラワークと考えてもらえば良いかと思います。
前にも例えで書いたのですが、横長い舞台があってビデオ・カメラで映しているすれば、モニタに映るのはカメラで切り取られた部分だけです。
舞台の端からの相対座標と舞台の一部をカメラで切り取ったモニタに見えている相対座標は違いますよね。
イメージできそうですか?
イメージは結構いい感じにできました。
しかしそれをプログラムにできません。
頭の中のイメージを添付します。
画像

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

Re: 移動するユニットに弾を撃たせる

#7

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

両方共一定速度で移動しているのなら画面座標だけで管理して、スクロール速度も移動速度に混ぜてしまえば簡単になりますよ。
こっちの方が楽かもしれません。ゲームの構造により楽な方法は変わります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

syuger
記事: 11
登録日時: 11年前

Re: 移動するユニットに弾を撃たせる

#8

投稿記事 by syuger » 11年前

softya(ソフト屋) さんが書きました:両方共一定速度で移動しているのなら画面座標だけで管理して、スクロール速度も移動速度に混ぜてしまえば簡単になりますよ。
こっちの方が楽かもしれません。ゲームの構造により楽な方法は変わります。
ゲームの構造ですか・・・
速度は、船によって変わります。(潜水艦・爆撃機などもあります)
そして、MAP上に表示する物体の種類は、
敵(10以上の種類)
プレイヤー(10以上の種類)
敵の弾
プレイヤーの弾
敵陣地
プレイヤー陣地です。

なので共通一定速度ではありません
武器によって弾速も変わりますし・・・

syuger
記事: 11
登録日時: 11年前

Re: 移動するユニットに弾を撃たせる

#9

投稿記事 by syuger » 11年前

連投失礼します
画像内容で間違いがありました
黒文字のXはプレイヤーの値でPX
赤文字のXは敵の値でEXです
失礼しました。

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

Re: 移動するユニットに弾を撃たせる

#10

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

画面が左右に移動するなら、画面の基準点(左上など)の座標が左右に移動すると考えます。
画面に対する相対位置は、敵やプレーヤーの座標から画面の基準点の座標を引けば求められます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

syuger
記事: 11
登録日時: 11年前

Re: 移動するユニットに弾を撃たせる

#11

投稿記事 by syuger » 11年前

これは、考えであってプログラムではありません。

コード:

#include "DxLib.h"

int mapX;mapの左端の座標
int Px;//プレイヤー座標
int Ex;//敵
int Pspeed;//プレイヤー速さ
int Espeed;//敵
int PtamaX,PtamaY;//弾座標
int gamenX,gamenY;//弾座
int idouryou;//画面の移動量(MAPXから)

void Pmove(){
	Px=mapX+Pspeed;//スピードを足していく
}
void Emove(){
	Ex=mapX+1800-Espeed;//MAPの幅1800から引いていく
}

void PDraw(){
	DrawGraph(Px,210,PyotGraph,TRUE);
}
void EDraw(){
	DrawGraph(Ex,210,EyotGraph,TRUE);
}

void gamen(){
	gamenX=mapX+idouryou;
}

void FrameWork(){
	if(CheckHitKey(KEY_INPUT_RIGHT)==1 && idouryou>0){
		idouryou-=1;                  //マップを右に動かす
	}else if(CheckHitKey(KEY_INPUT_LEFT)==1 && idouryou<1800){
		idouryou+=1;		//マップを左に動かす
	}
}
上に書いたとおりこれは動きませんが
考え方はこんな感じであってますか?

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

Re: 移動するユニットに弾を撃たせる

#12

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

描画座標系は保持する必要がないのでDrawだけでローカル変数として計算して、そのまま捨ててください。
この考えで統一すればmapXは、Draw以外に出てこないはずです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

syuger
記事: 11
登録日時: 11年前

Re: 移動するユニットに弾を撃たせる

#13

投稿記事 by syuger » 11年前

コード:

#include "DxLib.h"

int mapX;mapの左端の座標
int Px;//プレイヤー座標
int Ex;//敵
int Pspeed;//プレイヤー速さ
int Espeed;//敵
int PtamaX,PtamaY;//弾座標
int gamenX,gamenY;//弾座
int idouryou;//画面の移動量(MAPXから)

void Pmove(){
	Pspeed++;
}
void Emove(){
	Espeed++;
}

void PDraw(){
	DrawGraph(mapX+idouryou+Pspeed,210,PyotGraph,TRUE);
}
void EDraw(){
	DrawGraph(mapX+idouryou+Espeed,210,EyotGraph,TRUE);
}

void FrameWork(){
	if(CheckHitKey(KEY_INPUT_RIGHT)==1 && idouryou>0){
		idouryou-=1;                  //マップを右に動かす
	}else if(CheckHitKey(KEY_INPUT_LEFT)==1 && idouryou<1800){
		idouryou+=1;		//マップを左に動かす
	}
}

こうゆうことでしょうか?
このようなことを考えるのは好きなんですが、
まだ勉強不足なようで苦手なんです。

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

Re: 移動するユニットに弾を撃たせる

#14

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

moveで実際に移動するので、Drawでspeedは出てこないと思います。
mapXのidouryouも事前計算だと思います。MapMoveも必要ってことです。
Drawは描画に関わる最低限の事に絞ってください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

syuger
記事: 11
登録日時: 11年前

Re: 移動するユニットに弾を撃たせる

#15

投稿記事 by syuger » 11年前

すいません
12じでネット使えなくなるので
スマホからの返事になります
長いコードはかけませんがそこのところよろしくおねがいします

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

Re: 移動するユニットに弾を撃たせる

#16

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

こちらも寝るので返事できません。申し訳ないですが。
また、私は明日ということで。他の人が答えてくれるかもしれませんよ。

最後に一言。moveやdrawの機能をちゃんと限定してやれば見通しの良い分かりやすいプログラムになります。
何でもやる関数からは縁を切りましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

syuger
記事: 11
登録日時: 11年前

Re: 移動するユニットに弾を撃たせる

#17

投稿記事 by syuger » 11年前

ご指摘ありがとうございます
自分も寝ます。
ありがとうございました。

kino

Re: 移動するユニットに弾を撃たせる

#18

投稿記事 by kino » 11年前

はじめまして

no6のイメージはすごくよくできていると思います

そのイメージを基本で考えていくと
マップ座標は0固定
描画関係はカメラ座標で管理して
mapXをcameraXを変えたほうがわかりやすいです

int cameraX;//画面の左端の座標
int camera_idouryou;//画面の移動量

kino

Re: 移動するユニットに弾を撃たせる

#19

投稿記事 by kino » 11年前

>mapXをcameraXを変えたほうがわかりやすいです
cameraXに ですね^^;

syuger
記事: 11
登録日時: 11年前

Re: 移動するユニットに弾を撃たせる

#20

投稿記事 by syuger » 11年前

コード:

#include "DxLib.h"

int Pspeed;//プレイヤー速さ
int Espeed;//敵
int PtamaX,PtamaY;//弾座標
int gamenX,gamenY;//弾座
int PX,EX;//プレイヤーX,敵X(Yは固定)
int cameraX;//画面の座標
int cam_idouryou;//画面の移動量(MAPXから)


void camera_calc(){
	cameraX=mapX+cam_idouryou;
}

void Psyoki(){
	PX=0;
}

void Esyoki(){
	EX=1800;
} 

void cam_Move(){
	if(CheckHitKey(KEY_INPUT_RIGHT)==1 && idouryou>0){
		cam_idouryou-=1;                  //画面を左に動かす
	}else if(CheckHitKey(KEY_INPUT_LEFT)==1 && idouryou<1800){
		cam_idouryou+=1;		//画面を右に動かす
	}
}

void Map_Draw(){
	DrawGraph(0,0,"mapGraph",FALSE);
}

void Pcalc(){//計算
	PX=PX+Pspeed;
}

void Ecalc(){
	EX=EX+Espeed;
}
	

void PDraw(){
	DrawGraph(PX,210,PyotGraph,TRUE);
}

void EDraw(){
	DrawGraph(EX,210,EyotGraph,TRUE);
}


cameraXをどのように計算するのかがわかりません。

kino

Re: 移動するユニットに弾を撃たせる

#21

投稿記事 by kino » 11年前

>cameraXをどのように計算するのかがわかりません。

cameraXの結果は変わりませんが

cam_Move()の最初に
cam_idouryou=0;を追加して

13行 cameraX+=cam_idouryou; //カメラ座標計算
26行 cam_idouryou=-1;  //画面を左に動かす移動量
28行 cam_idouryou=1; //画面を右に動かす移動量

こういう風に書くとわかりやすいと思います

あとは
PDraw()とEDraw()にcameraXを追加すればできますよー

これでわからなければ聞いてくださいー^^

syuger
記事: 11
登録日時: 11年前

Re: 移動するユニットに弾を撃たせる

#22

投稿記事 by syuger » 11年前

コード:

#include "DxLib.h"
 
int Pspeed;//プレイヤー速さ
int Espeed;//敵
int PtamaX,PtamaY;//弾座標
int gamenX,gamenY;//弾座
int PX,EX;//プレイヤーX,敵X(Yは固定)
int cameraX;//画面の座標
int cam_idouryou;//画面の移動量(MAPXから)
 
 
void camera_calc(){
    cameraX=+cam_idouryou;
}
 
void Psyoki(){
    PX=0;
}
 
void Esyoki(){
    EX=1800;
} 
 
void cam_Move(){
	cam_idouryou=0;
    	if(CheckHitKey(KEY_INPUT_RIGHT)==1 && idouryou>0){
    	    cam_idouryou=-1;                  //画面を左に動かす
    	}else if(CheckHitKey(KEY_INPUT_LEFT)==1 && idouryou<1800){
    	    cam_idouryou=1;        //画面を右に動かす
    	}
}   	
 
void Map_Draw(){
    DrawGraph(0,0,"mapGraph",FALSE);
}
 
void Pcalc(){//計算
    PX=PX+Pspeed;
}
 
void Ecalc(){
    EX=EX+Espeed;
}
    
 
void PDraw(){
    DrawGraph(cameraX+PX,210,PyotGraph,TRUE);
}
 
void EDraw(){
    DrawGraph(cameraX+EX,210,EyotGraph,TRUE);
}
いわれたとおりに書きました。
これで間違ってたら恥ずかしい・・・
一応聞いておきますが。
このファイルの関数を呼んで引数をもらえば使えるようになりますよね。

kino

Re: 移動するユニットに弾を撃たせる

#23

投稿記事 by kino » 11年前

syugerさん素早い対応ありがとうございます

私の書いた通りに修正していただいたのは非常にうれしいのですが
じっくり考えながらやっていくのも必要かと思いますよーー

そして、今回修正した部分を理解していただいたものとして話を進めていきますが

PDraw() EDraw() は
camereXの追加部分はあっているのですが
それだとうまく表示できないかなと思います
すぐ答えを書いてしまうと 
syugerさんがじっくり考える時間がなくなってしまうので
ちょっと考えてみてくださいねーー

それと書き忘れましたが
&& idouryou>0  と && idouryou<1800 は必要ないですーー

syuger
記事: 11
登録日時: 11年前

Re: 移動するユニットに弾を撃たせる

#24

投稿記事 by syuger » 11年前

>そして、今回修正した部分を理解していただいたものとして話を進めていきますが

修正理解しました
cam_idouryou=0;//無限に移動してしまうから


>syugerさんがじっくり考える時間がなくなってしまうので
>ちょっと考えてみてくださいねーー

はい、じっくり考えて学習します!

syuger
記事: 11
登録日時: 11年前

Re: 移動するユニットに弾を撃たせる

#25

投稿記事 by syuger » 11年前

できました!!
プログラム的にはこれで動いています!!
しかしこれは理想的なプログラムですか?

map.cpp

コード:

#include "DxLib.h"
#include "map.h"
 
int Pspeed;//プレイヤー速さ
int Espeed;//敵
int PtamaX,PtamaY;//弾座標
int gamenX,gamenY;//弾座
int PX,EX;//プレイヤーX,敵X(Yは固定)
int cameraX;//画面の座標
int cam_idouryou;//画面の移動量(MAPXから)
int mapGraph;
int mapX;
 
 
void camera_calc(){
    cameraX=cameraX+cam_idouryou;
}

void map_calc(){
	mapX=mapX+cam_idouryou;
}

void Map_Syoki(){
	mapGraph=LoadGraph("img/stage.png");
}
 
void Psyoki(){
    PX=0;
}
 
void Esyoki(){
    EX=1800;
} 
 
void cam_Move(){
	cam_idouryou=0;
    	if(CheckHitKey(KEY_INPUT_RIGHT)==1){
    	    cam_idouryou=-5;                  //画面を左に動かす
    	}else if(CheckHitKey(KEY_INPUT_LEFT)==1){
    	    cam_idouryou=5;        //画面を右に動かす
    	}
}   	
 
void Map_Draw(){
    DrawGraph(mapX,0,mapGraph,FALSE);
}
 
    
 
void PDraw(int x,int Graph){
	DrawString(0,0,"asda",123);
    DrawGraph(x+cameraX,210,Graph,TRUE);
}
 
void EDraw(int x,int Graph){
	DrawString(0,0,"sdfji",123);
    DrawGraph(x+cameraX,210,Graph,TRUE);
}

int Stop(int x){
	x=x+cameraX;
	return (x);
}
Unit.cpp

コード:

int PUnit_Draw(int x,int y,int type){//種類ごとに描写
	switch(type){                                           //種類
		case 1:
				PDraw(x,PikadaGraph);///////////////変更点
			break;
		case 2:
				DrawGraph(x,y,PyotGraph,TRUE);
			break;
		case 3:
				DrawGraph(x,y,PgyosenGraph,TRUE);
			break;
		case 4:
				DrawGraph(x,y,PkyakusenGraph,TRUE);
			break;
	}
}


void PUnit_calc(){ //計算
	int i;
	for(i=0;i<UNIT_MAX;i++){
		if(dataP[i].flag==1){
			if(dataP[i].rangeFlag==0){                     
				dataP[i].x=dataP[i].x+dataP[i].speed;
			}else if(dataP[i].rangeFlag==1){
				Stop(dataP[i].x);                /////////変更点
			}
			dataP[i].rangeFlag=0;                                               //索敵初期化
			dataP[i].rangeFlag=PUnit_Range(dataP[i].x,dataP[i].y,dataP[i].range);//索敵範囲判定
			PUnit_Draw(dataP[i].x,210,1);
		}
	}
}
このように関数を呼び出すようにプログラムを変更しました。

kino

Re: 移動するユニットに弾を撃たせる

#26

投稿記事 by kino » 11年前

>>できました!!
>>プログラム的にはこれで動いています!!

動作しましたか、おめでとうございます^^

>>しかしこれは理想的なプログラムですか?

こういう風に書かれてしまうと戸惑ってしまいます^^;
私としてはsyugerさんがプログラムの動作を
すべて理解していただけることが理想なので
わたしが理想を判断するんじゃないんですーー

先ほどのPDrawについても
cameraX+PX が PX-cameraX だと私は思いましたが
これが正解というわけではありません
いろいろな考え方があり他の方法もあるかもしれません

syugerさんが「動いています」ではなく
プログラムがどういう風に動いているか理解できることが重要なのだと思います

syuger
記事: 11
登録日時: 11年前

Re: 移動するユニットに弾を撃たせる

#27

投稿記事 by syuger » 11年前

>私としてはsyugerさんがプログラムの動作を
>すべて理解していただけることが理想なので
>わたしが理想を判断するんじゃないんですーー

>プログラムがどういう風に動いているか理解できることが重要なのだと思います


確かにそうですねこのプログラムに関しては、しっかり理解できたので
理想道理になったということですね。
これにて解決とさせていただきます。
みなさんありがとうございました。

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

Re: 移動するユニットに弾を撃たせる

#28

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

お疲れ様でした。
cameraX+PXは確かに齟齬によるバグを生みそうですね。
※ 右方向がプラスと言う画面におけるお約束と相対座標は引いて求めるというお約束に反しているからですが。
いえ、間違っているわけじゃないんですよ。
動いているならOKなんですが、こう言う危険があるよという事だけ言っておきたかっただけです。
あと他の人がソースコード見るときに混乱する恐れはあります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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