C#로 RPG 작성첫 번째: Windows Forms를 사용하여 지도를 표시합니다.

17102 단어 C#WindowsFormRPG
RPG 좋아하세요?좋아하죠?만들자.
좋아해요?좋아하죠?쓰세요.
따라서 C#로 RPG 게임을 적절히 제작하기로 했다.
그렇다면 C# 게임을 좋은 프레임으로 만들기(라이브러리?)그럼 어떡하지?
이제 유닛 선택이야?
XNA가 개발을 멈춘 것 같아요.
예전에는 모노게임 만질 때 느낌이 좋았는데 전혀 유행이 아니었어요.
DXLib도 괜찮은데.내가 처음 게임을 만들 때 사용한 것은 DX 라이브러리였다.
이 때문에 틀은 고르고 고르지만 조사 사용법은 까다롭다.
열심히 하기 싫어서 공연이나 사용 편의를 고려하고 싶지 않았다.
어쨌든 편한 게 좋을 거야.
따라서 RPG를 제작할 프레임워크가 필요하지 않습니다.
정확히 Windows Forms를 사용하여 드로잉을 그립니다.
Windows Forms를 사용해야 하는 이유
내가 익숙하니까.
어, Windows Forms는 오래되었습니까?
게임하기 좀 그런가?
WPF라도 줘야겠지?
괜찮죠?Windows Forms는 매우 간단합니다.
그럼 바로 RPG 제작에 들어가겠습니다. RPG는 무엇일까요?
나는 RPG=지도가
상상해 보세요.단지 지도를 가득 그려 "아, RPG다!"이런 느낌이죠?
그래서 첫 번째 목적은'지도 그리기'라고 생각합니다.

프로그램 설계 이전의 말이지만, 게임은 그림이 필요하다.
3D 게임을 전혀 몰라서 2D 게임을 선택했다.
나는 10년 전에 점화 편집기가 EDGE가 좋다는 말을 들은 적이 있는 것을 기억한다. 그러나 최근의 유행 추세는 전혀 모른다.
그나저나 왼쪽부터 초원, 산, 집입니다.

게임 제작 화면.
Form에 PictureBox와 Timer만 붙였습니다.
PictureBox에 게임 화면을 그리고 Timer를 사용하여 드로잉을 업데이트합니다.
홀가분하네.
    /// <summary>
    /// クラスの名前に迷ったらとりあえずManagerをつければいい。
    /// </summary>
    public class MapManager
    {
        public Bitmap MapImage { get; set; }
        public int MapChipSize = 32;
        public List<Map> Maps { get; private set; } = new List<Map>();
        //指定したマップチップのMapImage上での開始位置を返します。
        public Point GetMapChipPoint(int nth)
        {
            return new Point(nth * MapChipSize, 0);
        }
        //指定したマップチップの画像を返します
        public Bitmap GetMapChip(int nth)
        {
            var mcpoint = GetMapChipPoint(nth);
            Rectangle rect = new Rectangle(mcpoint.X, mcpoint.Y, MapChipSize, MapChipSize);
            Bitmap bmpNew = MapImage.Clone(rect, MapImage.PixelFormat);
            return bmpNew;
        }
        //指定したマップの画像を返します。
        public Bitmap GetMap(int nth)
        {
            var mapdata = this.Maps[nth];
            var xLen = mapdata.MapChips.GetLength(1);
            var yLen = mapdata.MapChips.GetLength(0);
            var bmp = new Bitmap(xLen * this.MapChipSize, yLen * this.MapChipSize);

            Graphics g = Graphics.FromImage(bmp);
            for(int y = 0; y < yLen; y++)
            {
                for (int x = 0; x < xLen; x++)
                {
                    var mapchip = this.GetMapChip(mapdata.MapChips[y, x]);
                    g.DrawImage(mapchip, new PointF(x * this.MapChipSize, y * this.MapChipSize));
                    mapchip.Dispose();
                }
            }
            g.Dispose();
            return bmp;
        }
        public MapManager()
        {
            this.MapImage = (System.Drawing.Bitmap)Bitmap.FromFile("data/image/map.png");
            //今回表示するマップのマップチップ配列。0:草原,1:山,2:家
            var integerMapChips = new int[,] {
                { 0,0,0,0,0,0,0,0,0 },
                { 0,0,0,0,0,0,0,0,0 },
                { 0,0,2,0,0,0,0,0,0 },
                { 0,0,0,0,1,0,0,0,0 },
                { 0,1,0,0,0,0,0,0,0 },
                { 0,0,0,0,0,0,0,0,0 },
                { 0,0,0,0,0,0,0,0,0 }
            };
            this.Maps.Add(new Map() { MapChips = integerMapChips });
        }
    }
    /// <summary>
    /// これいるの?
    /// </summary>
    public class Map
    {
        public int[,] MapChips { get; set; }
    }
integerMapChips의 정수 2차원 배열이 비트맵 이미지의 코드로 변환됩니다.
C#로 이미지를 처리하면 많은 정보가 나오기 때문에 아무것도 힘들지 않습니다.
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            this.pictureBox1.Refresh();
        }

        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {

            Graphics g = e.Graphics;
            g.Clear(Color.Black);
            using (var map = Game.MapManager.GetMap(0))
            {
                g.DrawImage(map, PointF.Empty);
            }
        }
    }
timer에서 픽처박스를 정기적으로 다시 그리는 코드만 지정해야 합니다.
아주 간단하네요.

미국 전역을 뒤흔든 RPG 게임의 완성이다.
그 집에는 도대체 누가 살고 있습니까?
그 두 산은 도대체 무슨 의미가 있는 거야?
설렌다.
그게 다야.단지 이 기사를 쓰는 것만으로도 만족해서 두 번은 없는 것 같다.

좋은 웹페이지 즐겨찾기