Program
/ tag : code
冬休み! というワケで、このダウンロードした C# 2005Express Edition (今なら無料だよ) をいじくってます。
ヘルプを眺めていたら、アルファチャンネル付き png が読み込めそうな記述があったのでテストしてみました。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Imaging;
namespace WindowsApplication1
{
public partial class Form1 : Form
{
Bitmap screenGraph, bgGraph, chrGraph;
int mx, my;
int fps = 0;
int fpsTime = System.Environment.TickCount;
int frameTime = System.Environment.TickCount;
float[][] matrixItems ={
new float[] {1, 0, 0, 0, 0},
new float[] {0, 1, 0, 0, 0},
new float[] {0, 0, 1, 0, 0},
new float[] {0, 0, 0, 0.3f, 0},
new float[] {0, 0, 0, 0, 1}};
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
mx = 100;
my = 100;
bgGraph = new Bitmap("bg.jpg");
chrGraph = new Bitmap("chr.png");
screenGraph = new Bitmap("bg.jpg");
Application.Idle += new EventHandler(OnIdle);
}
private void OnIdle(object s, EventArgs e)
{
if (fpsTime + 1000 <= System.Environment.TickCount)
{
this.label1.Text = fps.ToString() + "FPS";
fpsTime = System.Environment.TickCount;
fps = 0;
}
if (frameTime + 16 <= System.Environment.TickCount)
{
fps++;
frameTime = System.Environment.TickCount;
Graphics g = Graphics.FromImage(screenGraph);
g.DrawImage(bgGraph, 0, 0);
g.DrawImage(chrGraph, new Rectangle(mx, my, chrGraph.Width - 1, chrGraph.Height - 1));
ColorMatrix colorMatrix = new ColorMatrix(matrixItems);
ImageAttributes imageAtt = new ImageAttributes();
imageAtt.SetColorMatrix(colorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
g.DrawImage(chrGraph,new Rectangle(0, 0, chrGraph.Width-1,chrGraph.Height-1),0.0f,0.0f,chrGraph.Width-1,chrGraph.Height-1,GraphicsUnit.Pixel,imageAtt);
g.Dispose();
this.BackgroundImage = screenGraph;
}
System.Threading.Thread.Sleep(1);
this.Invalidate();
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
mx = e.X - (chrGraph.Width / 2);
my = e.Y - (chrGraph.Height / 2);
}
}
}
ほえー、あっさり読めた。知らなかったー。行列使えば全体の透明度も設定できた。
TextRenderingHint 使うとやたらリッチなテキスト描画もできるのも最近知ったし、ウラシマ状態だなあ。
まあ上のは、べたべたのベタなコードだからスピードはあんまり出ないね。とはいえこれだけのコードでそれなりに動いてくれるんだから贅沢は言うまい。
あとループは delphi からの定石的に OnIdle 使ってるんだけど、いまいち自信薄です。