[PR]
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
プログラミング、3DCGとその他いろいろについて
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
久々にJavaを使っていると(JOGL)、
列挙型の使い方がわからなくなったので
今後のためメモしておきます。
まず文脈を話しておくと、
Java用のOpenGL(JOGL)を使っていたのですが、
この定数が汚いんですね。
多くの定数がGLというクラスの中に定義されていて、
しかもその定数の種類というのが、
プリミティブのタイプもカリングモードも
行列の種類もアルファブレンディングも
なにもかもごっちゃになっています。
//プリミティブのタイプを表す定数
GL.GL_POINTS
GL.GL_LINES
GL.GL_LINE_STRIP
GL.GL_LINE_LOOP
GL.GL_TRIANGLES
GL.GL_TRIANGLE_FAN
...
//行列
GL.GL_PROJECTION
GL.GL_MODELVIEW
...(以下略)
ごちゃごちゃです。
まず第一、"GL"をなぜ2度も書かなければならないのか、
そこが不条理です。
そして第二に、目的の異なる定数を1つのクラスに
大量に詰め込むのはよくありません。
どのくらい大量かというと、このくらいです。
もうわけがわかりません。
こんなときには列挙型を使って用途別に分別すべきです。
(そしてGLクラス全体のラッパーを作り始めたのですが、
ここではあまり関係ありません)
とりあえず最初は描画する図形のタイプを
表す定数を列挙型にすることにしました。
しくじってしまったのはここで、
C#のようなやり方をしてはいけません。
Compile Error!
import javax.media.opengl.*; public enum PrimitiveType { Points = GL.GL_POINTS, Lines = GL.GL_LINES, LineStrip = GL.GL_LINE_STRIP, LineLoop = GL.GL_LINE_LOOP, Triangles = GL.GL_TRIANGLES, TriangleFan = GL.GL_TRIANGLE_FAN, Quads = GL.GL_QUADS, QuadStrip = GL.GL_QUAD_STRIP, Polygon = GL.GL_POLYGON }
import javax.media.opengl.*; public enum PrimitiveType { Points(GL.GL_POINTS), Lines(GL.GL_LINES), LineStrip(GL.GL_LINE_STRIP), LineLoop(GL.GL_LINE_LOOP), Triangles(GL.GL_TRIANGLES), TriangleFan(GL.GL_TRIANGLE_FAN), Quads(GL.GL_QUADS), QuadStrip(GL.GL_QUAD_STRIP), Polygon(GL.GL_POLYGON); private int value; PrimitiveType(int value){ this.value = value; } public int value(){ return value; } }
using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Content; class MyGame : Game { GraphicsDeviceManager graphics; BasicEffect basicEffect; VertexPositionNormalTexture[] vertices; ContentManager content; Texture2D texture; public MyGame() { graphics = new GraphicsDeviceManager(this); content = new ContentManager(Services); vertices = new VertexPositionNormalTexture[3]; vertices[0].Position = new Vector3(0, 1, 0); vertices[0].Normal = new Vector3(0, 0, 1); vertices[0].TextureCoordinate = new Vector2(0.5f, 0); vertices[1].Position = new Vector3(1, 0, 0); vertices[1].Normal = new Vector3(0, 0, 1); vertices[1].TextureCoordinate = new Vector2(1, 1); vertices[2].Position = new Vector3(-1, 0, 0); vertices[2].Normal = new Vector3(0, 0, 1); vertices[2].TextureCoordinate = new Vector2(0, 1); } protected override void LoadGraphicsContent(bool loadAllContent) { if (loadAllContent) { basicEffect = new BasicEffect(graphics.GraphicsDevice, null); basicEffect.View = Matrix.CreateLookAt( new Vector3(0, 0, 3), new Vector3(0, 0, 0), new Vector3(0, 1, 0) ); basicEffect.Projection = Matrix.CreatePerspectiveFieldOfView( MathHelper.ToRadians(45), Window.ClientBounds.Width/(float)Window.ClientBounds.Height, 1, 100 ); texture = content.Load<Texture2D>("FlyingSpaghettiMonster"); } } protected override void UnloadGraphicsContent(bool unloadAllContent) { if (unloadAllContent) { content.Unload(); } } protected override void Draw(GameTime gameTime) { graphics.GraphicsDevice.Clear(Color.CornflowerBlue); graphics.GraphicsDevice.VertexDeclaration = new VertexDeclaration( graphics.GraphicsDevice, VertexPositionNormalTexture.VertexElements ); basicEffect.TextureEnabled = true; basicEffect.Texture = texture; basicEffect.LightingEnabled = true; basicEffect.DirectionalLight0.Enabled = true; basicEffect.DirectionalLight0.Direction = new Vector3(1, 0, -1); basicEffect.DirectionalLight0.DiffuseColor = new Vector3(0.5f, 0.5f, 0.5f); basicEffect.DirectionalLight0.SpecularColor = Color.White.ToVector3(); basicEffect.Begin(); foreach (EffectPass pass in basicEffect.CurrentTechnique.Passes) { pass.Begin(); graphics.GraphicsDevice.DrawUserPrimitives<VertexPositionNormalTexture>( PrimitiveType.TriangleList, vertices, 0, vertices.Length / 3 ); pass.End(); } basicEffect.End(); } }
class Program { static void Main() { var id = 1; //Int32 System.Console.WriteLine(id); //1 } }
class Program { static void Main() { var id; id = 1; System.Console.WriteLine(id); } }
class Program { static void Main() { var id = "1"; //String System.Console.WriteLine(id); //1 } }
using System; class Program { static void Main() { var book = new { Name = "利己的な遺伝子", Price = 2940 }; Console.WriteLine("{0} ¥{1}", book.Name, book.Price); } }
using System; class Person { public int Age { get; set; } } static class PersonExtension { public static bool IsAdult(this Person person) { return person.Age >= 20; } } class Program { static void Main(string[] args) { Person child = new Person { Age = 10 }; Person father = new Person { Age = 35 }; Console.WriteLine(child.IsAdult()); //False Console.WriteLine(father.IsAdult()); //True } }
using System; using System.IO; interface IPerson { int Age { get; set; } } class Person : IPerson { public int Age { get; set; } } class PersonFile : IPerson { public int Age { get { return Int32.Parse(File.ReadAllText("person.txt")); } set { File.WriteAllText("person.txt", value.ToString()); } } } static class PersonExtension { public static bool IsAdult(this IPerson person) { return person.Age >= 20; } } class Program { static void Main(string[] args) { Person child = new Person { Age = 10 }; PersonFile father = new PersonFile { Age = 35 }; Console.WriteLine(child.IsAdult()); Console.WriteLine(father.IsAdult()); } }とりあえずPersonクラスに似た、PersonFileクラスを作りました。
遅ればせながら次期Visual Studio、
"Orcas" Express Editionをインストールしてあそんでみました。
インストールしてさっそく起動してみると、
・・・特に2005と変わらないように見えます。
しいて違うところをあげるならタブの色がよりLunaっぽく、
かっこよくなっているということくらいでしょうか。
とりあえずプロジェクトを作って何かやってみることにしました。
当たり前ですが作れるプロジェクトの種類が2005より少ないようですね。
ともかく、一番単純な、コンソールプログラムで遊ぶことにしました。
今回の目玉はLinqらしいので
おいしいものは最後に取っておくと言う意味で
まずは地味な機能を使うことにします。
なんでもC# 3.0ではプロパティの宣言が
簡単になったとの事ですので。(自動プロパティ)
結果はこうです:
x = 0, y = 1
Rubyのように、プロパティを宣言するだけで、
変数の宣言の必要は無いらしいです。
それにしてもこのプロパティの書き方はインターフェースで
プロパティを宣言するやり方に似ています。(伏線)
次にコンストラクタを書いてみました。
わざわざ2行使ってプロパティに値を代入するのは
面倒に思えたからです。
しかし、失敗しました
Compile Error!