プログラムの短縮方法

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
baby2478nishi
記事: 52
登録日時: 8年前
住所: 兵庫県姫路市

プログラムの短縮方法

#1

投稿記事 by baby2478nishi » 8年前

こんにちは。

DxLibを使って
プログラムをくんでいるのですが、2562行と膨大です。

なので、どうすれば短くできますか?

コード:

#include "DxLib.h"


(中略)
	x=0;
	y=397;
	x2=0;
	y2=397;
	j2=0;
	j3=700;
	j5=900;
	j6=1550;
	j8=1930;
	j9=1930;
	j11=2180;
	j12=2750;
	j14=2900;
	j15=3150;
	j17=3350;
	j18=3550;
	j23=4300;
	j24=4450;
	j26=4550;
	j27=4550;
	j29=4700;
	j30=7000;
	Aa2=300;
	Aa3=450;
	Ab2=350;
	Ab3=400;
	Ac2=1860;
	Ac3=1960;
	Ad2=2060;
	Ad3=2410;
	Ae2=2150;
	Ae3=2450;
	Af2=2600;
	Af3=2850;
	Ag2=4000;
	Ag3=4000;
	Ah2=4170;
	Ah3=4170;
	Ga2=970;
	Ga3=970;
	Gb2=1230;
	Gb3=1230;
	Gc2=2950;
	Gc3=3100;
	Gd2=3050;
	Gd3=3100;
	Ge2=3100;
	Ge3=3100;
	Gf2=3350;
	Gf3=3350;
	Gg2=3350;
	Gg3=3400;
	Gh2=3350;
	Gh3=3450;
	Gi2=3350;
	Gi3=3500;
	Sa2=1570;
	Sa3=1570;
	Sb2=1660;
	Sb3=1660;
	Fa2=1810;
	Fa3=1810;
	Fb2=2010;
	Fb3=2010;
	Fc2=2500;
	Fc3=2550;
	Fd2=4600;
	Fd3=4650;
	Fay=110;
	Fby=110;
	Fcy=230;
	Fdy=430;
	Ya2=-40;
	Ya3=110;
	Yb2=180;
	Yb3=430;
	Yc2=180;
	Yc3=430;
	Yd2=130;
	Yd3=4300;
	Ye2=130;
	Ye3=430;
	Yf2=130;
	Yf3=430;
	Yg2=-300;
	Yg3=0;
	Yh2=-20;
	Yh3=330;
	Yax=2460;
	Ybx=3150;
	Ycx=3300;
	Ydx=3750;
	Yex=3800;
	Yfx=3850;
	Ygx=3750;
	Yhx=4300;
	Ua2=3600;
	Ua3=3650;
	Uay=430;
	Ha2=-90;
	Ha3=60;
	Hb2=280;
	Hb3=380;
	Hax=2350;
	Hbx=2700;
	Da2=3000;
	Da3=3000;
	Pa2=3050;
	Pa3=3100;
	Ma2=3200;
	Ma3=3250;
	Ca2=4100;
	Ca3=4100;
	Wa2=4700;
	Wa3=4700;
	Wb2=4725;
	Wb3=4725;
	haikei2=0;
	haikei4=1434;

	// while(裏画面を表画面に反映, メッセージ処理, 画面クリア, キーの更新)
	while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && gpUpdateKey()==0 )
	{
		//Sは消す

		for(haikei=haikei2; haikei<=3840; haikei+=1434)
		{
			DrawGraph(haikei,0,HaikeiPicture,TRUE);
		}

		for(haikei3=haikei4; haikei3<=3840; haikei3+=2868)
		{
			DrawGraph(haikei3,0,HaikeiPicture2,TRUE);
		}

		for(j1=j2; j1<=j3; j1+=50)
		{
			DrawGraph(j1,430,b,TRUE);
		}

		for(j4=j5; j4<=j6; j4+=50)
		{
			DrawGraph(j4,430,b,TRUE);
		}

		for(j7=j8; j7<=j9; j7+=50)
		{
			DrawGraph(j7,430,b,TRUE);
		}

		for(j10=j11; j10<=j12; j10+=50)
		{
			DrawGraph(j10,430,b,TRUE);
		}

		for(j13=j14; j13<=j15; j13+=50)
		{
			DrawGraph(j13,430,b,TRUE);
		}

		for(j16=j17; j16<=j18; j16+=50)
		{
			DrawGraph(j16,430,b,TRUE);
		}

		for(j22=j23; j22<=j24; j22+=50)
		{
			DrawGraph(j22,430,b,TRUE);
		}

		for(j25=j26; j25<=j27; j25+=50)
		{
			DrawGraph(j25,430,b,TRUE);
		}

		for(j28=j29; j28<=j30; j28+=50)
		{
			DrawGraph(j28,430,b,TRUE);
		}

		for(Aa=Aa2; Aa<=Aa3; Aa+=50)
		{
			DrawGraph(Aa,310,a,TRUE);
		}

		for(Ab=Ab2; Ab<=Ab3; Ab+=50)
		{
			DrawGraph(Ab,200,a,TRUE);
		}

		for(Ac=Ac2; Ac<=Ac3; Ac+=50)
		{
			DrawGraph(Ac,110,a,TRUE);
		}

		for(Ad=Ad2; Ad<=Ad3; Ad+=50)
		{
			DrawGraph(Ad,110,a,TRUE);
		}

		for(Ae=Ae2; Ae<=Ae3; Ae+=50)
		{
			DrawGraph(Ae,230,a,TRUE);
		}

		for(Af=Af2; Af<=Af3; Af+=50)
		{
			DrawGraph(Af,230,a,TRUE);
		}

		for(Ag=Ag2; Ag<=Ag3; Ag+=50)
		{
			DrawGraph(Ag,200,b,TRUE);
		}

		for(Ah=Ah2; Ah<=Ah3; Ah+=50)
		{
			DrawGraph(Ah,400,b,TRUE);
		}

		for(Ya=Ya2; Ya<=Ya3; Ya+=50)
		{
			DrawGraph(Yax,Ya,a,TRUE);
		}

		for(Yb=Yb2; Yb<=Yb3; Yb+=50)
		{
			DrawGraph(Ybx,Yb,b,TRUE);
		}

		for(Yc=Yc2; Yc<=Yc3; Yc+=50)
		{
			DrawGraph(Ycx,Yc,b,TRUE);
		}

		for(Yd=Yd2; Yd<=Yd3; Yd+=50)
		{
			DrawGraph(Ydx,Yd,b,TRUE);
		}

		for(Ye=Ye2; Ye<=Ye3; Ye+=50)
		{
			DrawGraph(Yex,Ye,b,TRUE);
		}

		for(Yf=Yf2; Yf<=Yf3; Yf+=50)
		{
			DrawGraph(Yfx,Yf,b,TRUE);
		}

		for(Yg=Yg2; Yg<=Yg3; Yg+=50)
		{
			DrawGraph(Ygx,Yg,b,TRUE);
		}

		for(Yh=Yh2; Yh<=Yh3; Yh+=50)
		{
			DrawGraph(Yhx,Yh,b,TRUE);
		}

		for(Ga=Ga2; Ga<=Ga3; Ga+=50)
		{
			DrawGraph(Ga,380,b,TRUE);
		}

		for(Gb=Gb2; Gb<=Gb3; Gb+=50)
		{
			DrawGraph(Gb,380,b,TRUE);
		}

		for(Gc=Gc2; Gc<=Gc3; Gc+=50)
		{
			DrawGraph(Gc,380,b,TRUE);
		}
		
		for(Gd=Gd2; Gd<=Gd3; Gd+=50)
		{
			DrawGraph(Gd,280,b,TRUE);
		}		
		
		for(Ge=Ge2; Ge<=Ge3; Ge+=50)
		{
			DrawGraph(Ge,230,b,TRUE);
		}

		for(Gf=Gf2; Gf<=Gf3; Gf+=50)
		{
			DrawGraph(Gf,230,b,TRUE);
		}

		for(Gg=Gg2; Gg<=Gg3; Gg+=50)
		{
			DrawGraph(Gg,280,b,TRUE);
		}

		for(Gh=Gh2; Gh<=Gh3; Gh+=50)
		{
			DrawGraph(Gh,330,b,TRUE);
		}

		for(Gi=Gi2; Gi<=Gi3; Gi+=50)
		{
			DrawGraph(Gi,380,b,TRUE);
		}

	/*	for(Sa=Sa2; Sa<=Sa3; Sa+=50)
		{
			DrawGraph(Sa,310,b,TRUE);
		}

		for(Sb=Sb2; Sb<=Sb3; Sb+=50)
		{
			DrawGraph(Sb,160,b,TRUE);
		}*/

		for(Fa=Fa2; Fa<=Fa3; Fa+=50)
		{
			DrawGraph(Fa,Fay,a,TRUE);
		}

		for(Fb=Fb2; Fb<=Fb3; Fb+=50)
		{
			DrawGraph(Fb,Fby,a,TRUE);
		}

		for(Fc=Fc2; Fc<=Fc3; Fc+=50)
		{
			DrawGraph(Fc,Fcy,a,TRUE);
		}

		for(Fd=Fd2; Fd<=Fd3; Fd+=50)
		{
			DrawGraph(Fd,Fdy,b,TRUE);
		}

		for(Ua=Ua2; Ua<=Ua3; Ua+=50)
		{
			DrawGraph(Ua,Uay,b,TRUE);
		}

		for(Ha=Ha2; Ha<=Ha3; Ha+=50)
		{
			DrawGraph(Hax,Ha,c,TRUE);
		}

		for(Hb=Hb2; Hb<=Hb3; Hb+=50)
		{
			DrawGraph(Hbx,Hb,d,TRUE);
		}

		for(Da=Da2; Da<=Da3; Da+=50)
		{
			DrawGraph(Da,330,e,TRUE);
		}

		for(Pa=Pa2; Pa<=Pa3; Pa+=50)
		{
			DrawGraph(Pa,330,b,TRUE);
		}

		for(Ma=Ma2; Ma<=Ma3; Ma+=50)
		{
			DrawGraph(Ma,430,f,TRUE);
		}

		for(Ca=Ca2; Ca<=Ca3; Ca+=50)
		{
			DrawGraph(Ca,300,b,TRUE);
		}

		for(Wa=Wa2; Wa<=Wa3; Wa+=75)
		{
			DrawGraph(Wa,380,g,TRUE);
		}

		for(Wb=Wb2; Wb<=Wb3; Wb+=75)
		{
			DrawGraph(Wb,30,h,TRUE);
		}

		if(x>=Ac2&&x<=Hax+50&&y<=110-32)
		{
			Hax-=10;
		}

		if(x>=j1
以下省略です。
そもそも、短くする方法が分かりません。ゲーム自体はマリオみたいなものです。

足りないところがあれば記載しますので、よろしくお願いします。

かずま

Re: プログラムの短縮方法

#2

投稿記事 by かずま » 8年前

マクロを使えば?

コード:

#define DRAWX(a, b, c, y, h) for (i = a; i <= b, i += c) DrawGraph(i, y, h, TRUE)
#define DRAWY(a, b, c, x, h) for (i = a; i <= b, i += c) DrawGraph(x, i, h, TRUE)

        DRAWX(haikei2, 3840, 1434, 0, HaikeiPicture);
        DRAWX(haikei4, 3840, 2868, 0, HaikeiPicture2);
        DRAWX(j2,   j3, 50, 430, b);  DRAWX(j5,   j6, 50, 430, b);
        DRAWX(j8,   j9, 50, 430, b);  DRAWX(j11, j12, 50, 430, b);
        DRAWX(j14, j15, 50, 430, b);  DRAWX(j17, j18, 50, 430, b);
        DRAWX(j23, j24, 50, 430, b);  DRAWX(j26, j27, 50, 430, b);
        DRAWX(j29, j30, 50, 430, b);
        DRAWX(Aa2, Aa3, 50, 310, a);  DRAWX(Ab2, Ab3, 50, 200, a);
        DRAWX(Ac2, Ac3, 50, 110, a);  DRAWX(Ad2, Ad3, 50, 110, a);
        DRAWX(Ae2, Ae3, 50, 230, a);  DRAWX(Af2, Af3, 50, 230, a);
        DRAWX(Ag2, Ag3, 50, 200, b);  DRAWX(Ah2, Ah3, 50, 400, b);

        DRAWY(Ya2, Ya3, 50, Yax, a);  DRAWY(Yb2, Yb3, 50, Ybx, b);
        DRAWY(Yc2, Yc3, 50, Ycx, b);  DRAWY(Yd2, Yd3, 50, Ydx, b);
        DRAWY(Ye2, Ye3, 50, Yex, b);  DRAWY(Yf2, Yf3, 50, Yfx, b);
        DRAWY(Yg2, Yg3, 50, Ygx, b);  DRAWY(Yh2, Yh3, 50, Yhx, b);

        DRAWX(Ga2, Ga3, 50, 380, b);  DRAWX(Gb2, Gb3, 50, 380, b);
        DRAWX(Gc2, Gc3, 50, 380, b);  DRAWX(Gd2, Gd3, 50, 280, b);
        DRAWX(Ge2, Ge3, 50, 230, b);  DRAWX(Gf2, Gf3, 50, 230, b);
        DRAWX(Gg2, Gg3, 50, 280, b);  DRAWX(Gh2, Gh3, 50, 330, b);
        DRAWX(Gi2, Gi3, 50, 380, b);  DRAWX(Fa2, Fa3, 50, Fay, a);
        DRAWX(Fb2, Fb3, 50, Fby, a);  DRAWX(Fc2, Fc3, 50, Fcy, a);
        DRAWX(Fd2, Fd3, 50, Fdy, b);  DRAWX(Ua2, Ua3, 50, Uay, b);

        DRAWY(Ha2, Ha3, 50, Hax, c);  DRAWY(Hb2, Hb3, 50, Hbx, d);

        DRAWX(Da2, Da3, 50, 330, e);  DRAWX(Pa2, Pa3, 50, 330, b);
        DRAWX(Ma2, Ma3, 50, 430, f);  DRAWX(Ca2, Ca3, 50, 300, b);
        DRAWX(Wa2, Wa3, 75, 380, g);  DRAWX(Wb2, Wb3, 75,  30, h);

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

Re: プログラムの短縮方法

#3

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

ゲーム画面の生成の様ですが、数学的に記述できないのなら配列の利用を考えてはどうでしょうか?
マップの描画というやつです。50ピクセル周期のやつは、メンテナンス性も考えてマップ的に扱うべきだと思います。
データを拾うのはしんどいので適当ですが、
{ 1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,0,1,1,1,1,0,0,0,0,0,1 },
{ 1,1,0,1,1,1,1,0,0,0,0,0,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1 },
と書いたほうがメンテしやすいですよ。

それと、変数に代入するより即値のほうが分かりやすい場合もあります(現在は定数に変数を利用している方が分かりづらいです)。

【補足】
かずまさんの方法は解決方法ではありますが、ゲーム画面の生成においてメンテナンス性・拡張性を考えて採用されることはまず無い方法です。
テクニックとしては知っておいて欲しいですが。

【補足の補足】
マップの描画の参考。
http://dixq.net/g/26.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

baby2478nishi
記事: 52
登録日時: 8年前
住所: 兵庫県姫路市

Re: プログラムの短縮方法

#4

投稿記事 by baby2478nishi » 8年前

分かりました。

が、マクロというのの書き方がわかりません。
教えてください。

DxLibさん、確かにあなたの方法だと簡単そうですね。空中ブロックなんかも。ただ、動くブロックなどはどうすればできますか?

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

Re: プログラムの短縮方法

#5

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

>が、マクロというのの書き方がわかりません。
>教えてください。

こういうのが有ると覚えておいて、今は別に理解は不要かと。
それとマクロはC言語の基本文法ですから、サイトをめぐれば詳しいサイトも有りますよ。

>DxLibさん、確かにあなたの方法だと簡単そうですね。空中ブロックなんかも。ただ、動くブロックなどはどうすればできますか?

私はsoftya(ソフト屋)ですよ~。まぁそれは置いておいて。
動くブロックは、高度な応用ですね。
まず普通のブロックをちゃんと処理できるようになってから考えるべきだと思います。
ヒントとしては、動くブロックもキャラクタというのも一つの手ですかね。
これは敵キャラの発生を作るときに同時に作れます。

なぉ、効率を考えるとゲーム・ステージのデザインはマップエディタと言うツール(自作またはフリーツール)を使います。
そういう所まで、うまく作れるように成ってからですかね(バイナリのファイルロードなども必要)。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

baby2478nishi
記事: 52
登録日時: 8年前
住所: 兵庫県姫路市

Re: プログラムの短縮方法

#6

投稿記事 by baby2478nishi » 8年前

softyaさん、失礼しました。

一応現在のソースでは動くブロックを作れるのですが・・。

ところで、マップエディターというのを一例で構いませんので教えてもらえますか?
自分もいくつか試してみたのですが・・。
お勧めをお願いします!

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

Re: プログラムの短縮方法

#7

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

tiled map editorとかPlatinumとかですかね。

>一応現在のソースでは動くブロックを作れるのですが・・。

動くブロックに乗れたりとか、当たり判定まで出来ているのなら良いのですが、それがまだなら作れているとは言えませんので、私の提案はそこまで考えての提案です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

baby2478nishi
記事: 52
登録日時: 8年前
住所: 兵庫県姫路市

Re: プログラムの短縮方法

#8

投稿記事 by baby2478nishi » 8年前

こんにちは。

マップエディターについては使ってみます

ただ、画像をロードしてその背景画像を移動するにはどうすればいいのですか?

また、出力形式はcsvでいいのでしょうか?

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

Re: プログラムの短縮方法

#9

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

>ただ、画像をロードしてその背景画像を移動するにはどうすればいいのですか?

画面スクロールするのと、画面の一部だけが移動するのでは話がだいぶ変わります。
後者の場合、汎用のマップツールのデータでは専用レイヤーに移動パーツの開始位置ぐらいしか指定できないと思います。
なので、専用のマップツールを自分で作るか、移動バーツをキャラクタにして動かすかが選択肢になると思います。
と言うことで私の提案は、移動するパーツはキャラクタにするです。

> また、出力形式はcsvでいいのでしょうか?
自分が扱いやすい方でよいです。
tiled map editorの場合は出力のファイル形式はxmlしか選択肢はありません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

baby2478nishi
記事: 52
登録日時: 8年前
住所: 兵庫県姫路市

Re: プログラムの短縮方法

#10

投稿記事 by baby2478nishi » 8年前

XML形式はDxlibに対応しているのでしょうか?

ちなみに、その読み込んだファイルをどうすれば表示できますか?

自分が作りたいのは、真ん中にキャラクタを固定して背景を移動させるマリオ系のものなのですが・・・。大変なのですか。。

とりあえず、Tiledを使ってみようと思うのですがタイルの描画順序,タイルの大きさ, はどうすればいいのでしょうか?

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

Re: プログラムの短縮方法

#11

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

どちらかと言うとxml形式であるTiled Map Editorの方が難易度は高いです。機能は上ですけど。
初心者向きなのは、Platinumのcsv形式でしょう。
DXLIBはcsvの読み込みもサポートしていないので、それより難易度の高いxmlも当然対応してません。
基本的に、それはゲームを作る人が用意するものというスタンスです。

バイナリのfmfはありましたが、csvの読み込みが過去ログにはなかったので、googleさんに聞いてみてください。
Platinum添付のテキストにも解説はあります。

【参考リンク】
http://romgameblog.blog33.fc2.com/blog-entry-218.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

baby2478nishi
記事: 52
登録日時: 8年前
住所: 兵庫県姫路市

Re: プログラムの短縮方法

#12

投稿記事 by baby2478nishi » 8年前

ありがとうございます。

一応、csvの対応してたような。。

ところで、csvにしろ、xmlにしろ、変換してtxtにしろ、これをどうすればいいのでしょうか?


お願いします。
添付ファイル
キャプチャ.PNG
これを見る限りCSVイケそうな・・・・?
キャプチャ.PNG (11.35 KiB) 閲覧数: 6389 回

baby2478nishi
記事: 52
登録日時: 8年前
住所: 兵庫県姫路市

Re: プログラムの短縮方法

#13

投稿記事 by baby2478nishi » 8年前

画像見すってました。
添付ファイル
キャプチャ.PNG
キャプチャ.PNG (10.9 KiB) 閲覧数: 6388 回

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

Re: プログラムの短縮方法

#14

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

Tiled Map EditorのcsvはPlatinumのcsv形式と大差ないと思います。
0が透明パーツで、1からは-1したものがタイル画像のパーツの番号となります。
読み込み方は参考リンクのとおりです。
幅と高さは、あなたが用意したタイル画像のサイズです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

baby2478nishi
記事: 52
登録日時: 8年前
住所: 兵庫県姫路市

Re: プログラムの短縮方法

#15

投稿記事 by baby2478nishi » 8年前

すみません。旅行行ってました。

やってみます。

このすれはこれで解決とさせていただきます。

baby2478nishi
記事: 52
登録日時: 8年前
住所: 兵庫県姫路市

Re: プログラムの短縮方法

#16

投稿記事 by baby2478nishi » 8年前

先ほど押せてませんでした。

閉鎖

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