C#游戏编程第二章:地图编辑器

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

控制面板中的地形物
if (this.toolStripComboBox1.SelectedItem.ToString().Equals("地形物 地形物")) 地形物 { for (int i = 0; i < tiles.Length; i++) { if (i == 2 || i == 3 || i==6) continue; PictureBox box = new PictureBox(); box.Width = Tile.TILE_WIDTH; box.Height = Tile.TILE_HEIGHT; box.Image = tiles[i].Bits; box.Tag = tiles[i]; box.Click += new EventHandler(box_Click); box.Dock = DockStyle.Left;
3
Tile类 Tile类
• 图片文件是有分辨率区别的,不同的分别率,图 图片文件是有分辨率区别的,不同的分ቤተ መጻሕፍቲ ባይዱ率, 片的大小不同。因此,我们在保存图片的时候, 片的大小不同。因此,我们在保存图片的时候, 要进行处理
Bitmap bit = new Bitmap(IMAGE_WIDTH, IMAGE_HEIGHT); Graphics g = Graphics.FromImage(bit); Rectangle sr = new Rectangle(0, 0, 32, 32); Rectangle dr = new Rectangle(0, 0, 32, 32); g.DrawImage(this.Bits, dr, sr, GraphicsUnit.Pixel); this.Bits = bit; 4
rbt.Left = left; rbt.Top = top; left += rbt.Width + 10; rbt.Click += new EventHandler(rbt_Click); this.pnlTile.Controls.Add(rbt); }
17
地形和地形物转换的事件
private void toolStripComboBox1_SelectedIndexChanged(object sender, EventArgs e) { this.InitPnlTile(); }
this.pnlTile.Controls.Add(box); }
16
控制面板中的地形物属性
string[] texts = { "坦克子弹都可通过 "只能被子弹打破 "只有子弹可以穿过 不能通过不能破坏 " 坦克子弹都可通过", 只能被子弹打破 只能被子弹打破", 只有子弹可以穿过 不能通过不能破坏", 只有子弹可以穿过","不能通过不能破坏 坦克子弹都可通过 是军旗" 是军旗 }; for (int i = 0; i < texts.Length; i++) { RadioButton rbt = new RadioButton(); rbt.Text = texts[i] ; rbt.Tag = i; rbt.Width = 120; if (i == 0) rbt.Checked = true;
测试一下Tile类 测试一下Tile类
• 创建一个 的对象,并将其绘制到界面进行测试 创建一个Tile的对象 的对象, • 测试保存和加载的方法
5
Cell类 Cell类
• 单元格属于地图,因此有定位属性 单元格属于地图,
public void Save(Stream output) { BinaryWriter bw = new BinaryWriter(output); bw.Write(yer); bw.Write(this.row); bw.Write(this.col); this.tile.Save(output); } public void Load(Stream input) { BinaryReader br = new BinaryReader(input); yer = br.ReadInt32(); this.row = br.ReadInt32(); this.col = br.ReadInt32();
19
选择不同的地形物的事件
void box_Click(object sender, EventArgs e) { for (int i = 0; i < pnlTile.Controls.Count;i++ ) { PictureBox box = pnlTile.Controls[i] as PictureBox; if (box == null) continue; box.BorderStyle = BorderStyle.None; } PictureBox currentBox = sender as PictureBox; if (currentBox != null) { currentBox.BorderStyle = BorderStyle.Fixed3D; this.currentTile = currentBox.Tag as Tile; } for (int i = 0; i < pnlTile.Controls.Count; i++) { RadioButton rbt = pnlTile.Controls[i] as RadioButton; if (rbt == null) continue; rbt.Checked = rbt.Tag.ToString().Equals(((int)this.currentTile.Attribute).ToString()); }
18
改变当前地形物属性的事件
void rbt_Click(object sender, EventArgs e) { if (this.currentTile == null) return; RadioButton rbt = sender as RadioButton; if (rbt != null) { int attrNum = int.Parse(rbt.Tag.ToString()); this.currentTile.Attribute = (TileAttribute)attrNum; } }
12
初始化地图
private void InitMap() { this.map = new Map(tiles[2].Bits); }
13
初始化地形物控制面板
private void InitPnlTile() { if (this.toolStripComboBox1.SelectedIndex<0) { this.toolStripComboBox1.SelectedIndex = 0; } this.pnlTile.Controls.Clear();
tile.Load(input);
6
}
测试一下Cell类 测试一下Cell类
• 创建一个 创建一个Cell的对象,并将其绘制到界面进行测试 的对象, 的对象 • 测试保存和加载的方法
7
Map类 Map类
• 地图由单元格组成
– private Cell[,,] maps;
private void InitMaps(Bitmap image) { for (int layer = 0; layer < MAP_LAYERS; layer++) { for (int row = 0; row < MAP_ROWS; row++) { for (int col = 0; col < MAP_COLS; col++) { // 地形使用同样的图片 if (layer == 0) { maps[layer, row, col] = new Cell(layer, row, col, image); } else { maps[layer, row, col] = new Cell(layer, row, col, new Bitmap(Tile.TILE_WIDTH, Tile.TILE_HEIGHT)); } } } }
14
控制面板中的地形
if (this.toolStripComboBox1.SelectedItem.ToString().Equals("地形 地形")) 地形 { for (int i = 2; i < tiles.Length; i+=4) { PictureBox box = new PictureBox(); box.Width = Tile.TILE_WIDTH; box.Height = Tile.TILE_HEIGHT; box.Image = tiles[i].Bits; box.Tag = tiles[i]; box.Click += new EventHandler(box_Click); box.Dock = DockStyle.Left; this.pnlTile.Controls.Add(box); } this.currentLayer = 0; } 15
C#游戏编程:第二章 游戏编程: 游戏编程 地图编辑器
Version 4.0
地图子系统
• 枚举:TileAttribute 枚举:
– 可以通过、图片可以被打破、子弹可以通过、不可通 过,不可打破,该图片是军旗
• 类
– Tile,Cell,Map
2
TileAttribute
/// <summary> /// 一个图片的属性 /// </summary> public enum TileAttribute { CanPasse, // 可以通过 CanBreak, // 可以打破 BulletCanPass, // 子弹可以穿过 None, // 不可通过不可破坏 Flag // 是军旗 }
}
11
地形物数据的初始化
private void InitTiles() { Bitmap bmp = new Bitmap("map.bmp"); for (int i = 0; i < tiles.Length-1; i++) { Bitmap bit = new Bitmap(Tile.TILE_WIDTH, Tile.TILE_HEIGHT); Graphics g = Graphics.FromImage(bit); Rectangle sr = new Rectangle(Tile.TILE_WIDTH * i, 0, Tile.TILE_WIDTH, Tile.TILE_HEIGHT); Rectangle dr = new Rectangle(0, 0, Tile.TILE_WIDTH, Tile.TILE_HEIGHT); g.DrawImage(bmp, dr, sr, GraphicsUnit.Pixel); Tile tile = new Tile(bit); tile.Bits.MakeTransparent(Map.MAP_TRANSPARENT_COLOR); this.tiles[i] = tile; } this.tiles[this.tiles.Length - 1] = new Tile(new Bitmap("symbol.bmp")); this.tiles[this.tiles.Length - 1].Attribute = TileAttribute.Flag; this.tiles[this.tiles.Length 1].Bits.MakeTransparent(Map.MAP_TRANSPARENT_COLOR); }
8
}
DrawBuffer();
地图编辑器的实现
9
界面设计
• 菜单栏可以设置组合框、文本框等特殊组件 菜单栏可以设置组合框、
10
初始化的顺序
public MapForm() { InitializeComponent(); // 初始化双缓冲绘图环境 InitBufferedGraphics(); // 初始化地形物数据 InitTiles(); // 初始化地图 InitMap(); // 初始化地形物控制面板 InitPnlTile();
相关文档
最新文档