C#とDXライブラリでマップの描画
Posted: 2012年4月15日(日) 13:43
]C#とDXライブラリの組み合わせでアクションゲームのサンプルを作っています。
とりあえずマップを描画(マリオのようなブロックの配置)しようと思い,二次元配列とfor文を組み合わせてやってみたのですが,描画されません。
エラーはなく,実行はされるのですが,描画されないのです。
今まで軽いシューティングゲームぐらいしか作ったことがなかったので,二次元配列とfor文を組み合わせたものはちょっと苦手です。
以下にコードを載せました。どこがダメなのでしょうか。。。
自分が思うに,
と,
の部分が間違っているのではないかと思うのですが…
ご教授願います。これができたら次はブロックと自機の当たり判定をとって自機の位置補正の処理を付けようと思っています。
とりあえずマップを描画(マリオのようなブロックの配置)しようと思い,二次元配列とfor文を組み合わせてやってみたのですが,描画されません。
エラーはなく,実行はされるのですが,描画されないのです。
今まで軽いシューティングゲームぐらいしか作ったことがなかったので,二次元配列とfor文を組み合わせたものはちょっと苦手です。
以下にコードを載せました。どこがダメなのでしょうか。。。
using System;
using System.Windows.Forms;
using DxLibDLL;
namespace SampleGame
{
public class Game
{
[STAThread]
public static void Main()
{
Ziki ziki; //Zikiクラスのziki変数を用意
Block[] blocks;//Blockクラスのblocks配列を用意
int input;//自機の操作を割り当てる変数
int zikigraph;//自機のグラフィック
int blockgraph;//ブロックのグラフィック
const int BLOCK_NUM = 300;//ブロックの個数
int[,] haiti =
{
{ 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1},
{ 0,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,0,0,0},
{ 0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,1,1,1,0,0},
{ 0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0},
{ 0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0},
{ 0,1,0,0,1,1,0,0,0,0,0,1,1,1,0,1,1,1,0,0},
{ 0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,0},
{ 0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1},
{ 0,1,0,0,1,0,1,0,0,0,1,0,0,0,1,1,0,0,0,1},
{ 0,1,1,1,1,0,1,0,1,1,1,0,0,0,1,1,1,1,1,1},
{ 0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,1,1},
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1},
{ 0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,1,1,1,0,0},
{ 0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1},
{ 0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0},
};//ブロックの配置,1なら配置,0なら配置しない
DX.ChangeWindowMode(1);
if (DX.DxLib_Init() == -1) return;
DX.SetDrawScreen(DX.DX_SCREEN_BACK);
zikigraph = DX.LoadGraph("data\\自機.png");//画像データの読み込み
blockgraph = DX.LoadGraph("data\\ブロック.png");//同上
ziki = new Ziki(zikigraph);
blocks = new Block[BLOCK_NUM];
for (int i = 0; i < blocks.Length; i++)
{
blocks[i] = new Block(blockgraph);//Blockクラスコンストラクタにblockgraphを渡す
}
while (DX.ProcessMessage() == 0)
{
input = DX.GetJoypadInputState(DX.DX_INPUT_KEY);//inputにこのキー操作を割り当てる
ziki.Update(input);//Update関数(操作)にinputを渡す
foreach (Block bl in blocks)
{
for (int i = 0; i < 15; i++)
{
for (int j = 0; j < 20; j++)
{
bl.blockflag = haiti[i, j];//int型変数blockflagにhaitiの1か0を渡す
}
}
}
ziki.gravityflag = true;//重力のフラグをたてる
ziki.Gravity();//重力を実際に与える関数
DX.ClearDrawScreen();
ziki.Draw();//自機の描画
foreach (Block bl in blocks)
{
for (int i = 0; i < 15; i++)
{
for (int j = 0; j < 20; j++)
{
bl.Draw(i,j);//ブロックの描画,iとjを渡して,ブロックの大きさをそれぞれにかけて座標を割り当てる
}
}
}
DX.ScreenFlip();
}
DX.DxLib_End();
}
}
public class Character//後で敵キャラクターを作るためにひとまずキャラクター全体の基盤クラスをつくる
{
int graph;
public int gravity = 2;//重力の大きさ
public bool gravityflag;//重力がかかっているかないかのフラグ
protected int x, y;//キャラクターの座標
protected int width, height;//キャラクターのタテヨコの長さ
public Character(int gr)
{
graph = gr;
}
public void Draw()
{
DX.DrawGraph(x, y, graph, 1);//描画
}
public void Gravity()
{
while (gravityflag == true)
{
y += gravity;
break;
}
}
}
public class Ziki : Character
{
public Ziki(int gr)
: base(gr)
{
x = 320;
y = 0;
width = 32;
height = 32;
}
public void Update(int input)//自機の操作
{
if ((input & DX.PAD_INPUT_UP) != 0) y -= 2;
if ((input & DX.PAD_INPUT_DOWN) != 0) y += 2;
if ((input & DX.PAD_INPUT_LEFT) != 0) x -= 2;
if ((input & DX.PAD_INPUT_RIGHT) != 0) x += 2;
}
}
public class Block
{
int x, y;//ブロックの座標
int graph;
public int blockflag;//ブロックがあるかないか,haitiのそれぞれの1と0をここに入れる
const int CHIP_SIZE = 32;//ブロックひとつあたりの大きさ
const int XKOSUU = 640 / CHIP_SIZE;//ブロックが画面横(X)に埋まる個数
const int YKOSUU = 480 / CHIP_SIZE;//ブロックが画面縦(Y)に埋まる個数
public Block(int gr)
{
graph = gr;
}
public void Draw(int i, int j)
{
if (blockflag == 1)
{
DX.DrawGraph(j * CHIP_SIZE, i * CHIP_SIZE, graph, 1);
}
}
}
}
foreach (Block bl in blocks)
{
for (int i = 0; i < 15; i++)
{
for (int j = 0; j < 20; j++)
{
bl.blockflag = haiti[i, j];//int型変数blockflagにhaitiの1か0を渡す
}
}
}
foreach (Block bl in blocks)
{
for (int i = 0; i < 15; i++)
{
for (int j = 0; j < 20; j++)
{
bl.Draw(i,j);//ブロックの描画,iとjを渡して,ブロックの大きさをそれぞれにかけて座標を割り当てる
}
}
}
ご教授願います。これができたら次はブロックと自機の当たり判定をとって自機の位置補正の処理を付けようと思っています。