zaqqoZeq Skrevet 12. mars 2009 Del Skrevet 12. mars 2009 (endret) Hei Jeg lager for tiden en slags map editor, foreløpig har jeg bare konsentrert meg om terreng. Det jeg er interessert i er å vite hva slags ytelse dere får, siden denne bruker C# grafikkmotoren min (glorg) Andre som har testet det har fått problemer med at noe går kjempesakte. Fortelle gjerne hvilket OS dere har, og hva slags hardware. Og selvsagt feilmeldinger hvis dere får noen. Programmet er ganske enkelt i bruk, midterste museknapp roterer rundt brettet, scroll med hjulet zoomer inn og ut, begge museknappene flytter kameraet rundt. Venstre museknapp utfører valgt kommando(opphøy terreng eller myk ut) høyre museknapp senker terrenget. Fin sak. Fungerer bra hos meg. Ingen delay. Vet ikke om brush setup skal fungerere med det gjør det ihvertfall ikke; det skjer ingenting når jeg klikker på den. Maskinen: XP SP 2. 2 GB RAM 2,40 GHZ CORE 2. NVIDIA Quadro FX560. Hva slags kunnskaper trenger man får å lage noe sånt? Kan du peke på noe litteratur? Fikk lyst til å prøve på noe "visualiseringsgreier" jeg har tenkt litt på. Windows Vista Home Premium 64 bit E8400 4 GB RAM 4870 Funker bra, men musa forsvinner og bugger (plutselig reiser terrenget seg en annen plass enn der jeg peker) hvis jeg maksimerer vinduet Endret 12. mars 2009 av zaqqoZeq Lenke til kommentar
GeirGrusom Skrevet 21. april 2009 Forfatter Del Skrevet 21. april 2009 (endret) Skrev noen extension metoder som kanskje noen synes er nyttig public static class WriterExtensions { public static TextWriter EndLine(this TextWriter obj) { obj.WriteLine(); return obj; } public static TextWriter Commit<T>(this TextWriter obj, T value) { obj.Write(value); return obj; } } Poenget med disse er at de returnerer stream objektet. Dette gjør at en kan skrive ting som dette: Console.Out.Commit("Mitt navn er:").Commit(my_name).Endline() .Commit("Alder:").Commit(my_age).EndLine(); Endret 21. april 2009 av GeirGrusom Lenke til kommentar
GeirGrusom Skrevet 9. mai 2009 Forfatter Del Skrevet 9. mai 2009 Dette er en tekstbox jeg laget for databasedesign-programmet mitt. Den er laget for å begrense hva brukeren skriver og vise hva som er tillatt. Istedet for masks så bruker denne regular expressions. En kan sette den slik at den nekter å ta imot en ny bokstav dersom den nye bokstaven vil føre til at teksten ikke matcher regexen, eller at den bare fargelegger teksten rød. public partial class CheckedTextEditor : TextBox { protected Regex m_reg; protected string m_reg_exp; protected bool m_ignore_case; protected bool m_allow_invalid_text; [DefaultValue(false)] public bool IgnoreCase { get { return m_ignore_case; } set { m_ignore_case = value; RebuildRegex(); } } [DefaultValue(false)] public bool AllowInvalidText { get { return m_allow_invalid_text; } set { m_allow_invalid_text = value; } } [DefaultValue(true)] public bool IsTextValid { get { if ( m_reg != null ) return ValidateText( Text ); else return true; } } protected void RebuildRegex() { m_reg = new Regex(m_reg_exp, m_ignore_case ? RegexOptions.IgnoreCase : RegexOptions.None); System.Net.Sockets.TcpListener lst; } [DefaultValue("")] public string RegularExpression { get { return m_reg_exp; } set { m_reg_exp = value; m_reg = new Regex( m_reg_exp ); RebuildRegex(); } } public CheckedTextEditor() { m_reg_exp = ""; m_reg = null; } protected override void OnKeyPress( KeyPressEventArgs e ) { base.OnKeyPress( e ); if ( e.KeyChar != (char)8 && !m_allow_invalid_text) { string text = Text + e.KeyChar; e.Handled = !ValidateText( text ); } } protected bool ValidateText( string text ) { Match m = m_reg.Match( text ); return (m.Index == 0) && (m.Length == text.Length); } protected override void OnTextChanged( EventArgs e ) { ForeColor = IsTextValid ? SystemColors.WindowText : Color.Red; base.OnTextChanged( e ); } } For eksempel, regex for tall: [0-9]* regex for flyttall: -?[0-9]*(\.[0-9]+)? Lenke til kommentar
GeirGrusom Skrevet 15. juni 2009 Forfatter Del Skrevet 15. juni 2009 (endret) Jeg skrev en extension klasse for binaryreader og binarywriter. Disse er skrevet for at en skal kunne lese og skrive structures direkte til/fra filer. Klikk for å se/fjerne innholdet nedenfor using System; using System.Runtime.InteropServices; public static class IOExtensions { public static unsafe T Read<T>(this System.IO.BinaryReader rd) where T : struct { T item = new T(); int size = Marshal.SizeOf(typeof(T)); byte[] b = rd.ReadBytes(size); fixed (byte* ptr = b) item = (T)Marshal.PtrToStructure(new IntPtr(ptr), typeof(T)); return item; } public static unsafe T[] ReadArray<T>(this System.IO.BinaryReader rd, int count) where T : struct { int size = Marshal.SizeOf(typeof(T)); T[] arr = new T[count]; GCHandle handle; // Pin array to prevent GC from moving it handle = GCHandle.Alloc(arr, GCHandleType.Pinned); int real_size = count * size; // Retrieve array address byte* ptr = (byte*)handle.AddrOfPinnedObject().ToPointer(); for (int i = 0; i < real_size; i++) *ptr++ = rd.ReadByte(); // Unpin array handle.Free(); return arr; } public static unsafe void Write<T>(this System.IO.BinaryWriter wr, T value) where T : struct { int size = Marshal.SizeOf(typeof(T)); // Allocate temporary memory IntPtr ptr = Marshal.AllocHGlobal(size); Marshal.StructureToPtr(value, ptr, false); byte* v_ptr = (byte*)ptr.ToPointer(); for (int i = 0; i < size; i++) wr.Write(*v_ptr++); // Free temporary memory Marshal.FreeHGlobal(ptr); } public static void Write<T>(this System.IO.BinaryWriter wr, T[] arr) where T : struct { for (int i = 0; i < arr.Length; i++) Write<T>(wr, arr[i]); } } Merk at denne skriver dem nøyaktig slik de ligger i minnet, IKKE bruk reference types i strukturen (dette inkluderer selvsagt strings) Kun byte, sbyte, shot, ushort, int, uint, long, ulong, float, double, decimal og andre valuetypes kan brukes. For å bruke funksjonene, bruker en rett og slett BinaryReader og BinaryWriter struct Chunk3DS { public short id; public int length; } struct Vertex { public float X; public float Y; public float Z; } void SomeFunction(Stream src) { var reader = new BinaryReader(src); Chunk3DS chunk = reader.Read<Chunk3DS>(); Vertex[] vertex_array = reader.ReadArray<Vertex>(chunk.length / Marshal.SizeOf(Vertex)); } Endret 15. juni 2009 av GeirGrusom Lenke til kommentar
Gjest Slettet-aNZFa3 Skrevet 7. juli 2009 Del Skrevet 7. juli 2009 Liten morsom klasse (den har ingen hensikt). NB: Den er ikke testet! Klikk for å se/fjerne innholdet nedenfor using System; namespace Baking { class Cake { static bool isBaked = false; static bool isEaten = false; static bool isKilled = false; static bool is_A_lie = false; static bool isDisposed = false; public Cake(bool is_A_Lie) { is_A_lie = is_A_Lie; } public static void Bake() { isBaked = true; } public static void Eat() { if (is_A_lie) { throw new Exception("The cake is a lie."); } else { if (!isBaked) { throw new Exception("Bake the cake first."); } else if (isKilled) { throw new Exception("Can't eat cake, it is killed :("); } else if (isDisposed) { throw new Exception("Can't eat cake, it is disposed."); } else { isEaten = true; } } } public static void Kill() { if (is_A_lie) { throw new Exception("The cake is a lie."); } else { if (!isBaked) { throw new Exception("Bake the cake first."); } else if (isEaten) { throw new Exception("Can't kill cake, it is eaten."); } else if (isDisposed) { throw new Exception("The cake can not be killed, it is disposed."); } else { isKilled = true; } } } public static void Dispose() { if (is_A_lie) { throw new Exception("The cake is a lie."); } else { if (!isBaked) { throw new Exception("Bake the cake first."); } else if (isEaten) { throw new Exception("Can't throw cake, it is eaten."); } else if (isKilled) { throw new Exception("Cannot dispose of the cake, it is killed and not alive, bake a new one, or as GLADOS"); } else { isDisposed = true; } } } } } Lenke til kommentar
Knast Skrevet 31. juli 2009 Del Skrevet 31. juli 2009 Liten kreativ (men ikke veldig god) løsning på henting av variabler fra en fil med valgfri seperator (her ",". "\n" kan brukes om man vil separere med linjeskift): { FileInfo fi = new FileInfo(@"c:\bane\mål.txt); StreamReader sr = new StreamReader(fi.OpenRead()); string config = sl.ReadLine(); string param = ""; int teller,start,slutt = 0; while (config.IndexOf(',') >= 0) { param = config.Substring(0, config.IndexOf(',')); start = config.IndexOf(',')+1; slutt = config.Length-start; config = config.Substring(start, slutt); if (teller == 1) _var1 = param; if (teller == 2) _var2 = param; //osv teller++; } Lenke til kommentar
GeirGrusom Skrevet 28. oktober 2009 Forfatter Del Skrevet 28. oktober 2009 Jeg skrev en ray-tracer i C++ og jeg gjentok (nesten) samme opplegget i C# Jeg har dog ikke lagt til skygger, men grunnlaget er der RayTrace.zip Programmet er skrevet for .NET 3.5 men tviler på at det er noe stress å kjøre det under .NET 2.0 med en rekompilering. Jeg laget det for multi-threading, men kan ikke se at det hadde noen effekt på ytelsen overhode... som jeg synes var litt snedig siden denne maskinen har 2 kjerner. I C++ utgjorde det en enorm forskjell, men det kan være at det er jeg som har gjort noe feil. Lenke til kommentar
HDSoftware Skrevet 29. oktober 2009 Del Skrevet 29. oktober 2009 (endret) Kjempe kult eksempel. Skjønnte plutselig hvor enkelt det er å lage 3d animasjon i C# Men dette gikk treeeeeeegt på min maskin. Har ingen 3d akksellerator så det er nok årsaken. Mens vi er inne på temaet. Er det noen form for kollisjons analyse i dette? Edit: For å få kompillert i net2 så må referansen til LINQ og alle USING av LINQ tas vekk Endret 29. oktober 2009 av HDSoftware Lenke til kommentar
GeirGrusom Skrevet 29. oktober 2009 Forfatter Del Skrevet 29. oktober 2009 (endret) Det er ren software rendering (all kode for rendring ligger i kildekoden) sannsynligvis derfor det går tregt ^^ 3d akselleratoren er veldig uegnet til ray-tracing. Men det er noen fordeler med ray-tracing, for eksempel realtistiske refleksjoner og refraksjoner, som er temmelig vanskelig å få til med vanlig raster-3D. Ray-tracing brukes ofte av 3D programmer som 3ds max og lignende. edit:lief Endret 29. oktober 2009 av GeirGrusom Lenke til kommentar
HDSoftware Skrevet 29. oktober 2009 Del Skrevet 29. oktober 2009 Ahh. Så det nå. Glimrende eksempel. Lenke til kommentar
HDSoftware Skrevet 29. oktober 2009 Del Skrevet 29. oktober 2009 (endret) Måtte jo bare teste. Endret litt på posisjoneringen og animasjonen inne i løkka sp1.Position = new Vector(Math.Cos(ang) * 4, 0, Math.Sin(ang) * 4 + 5); sp2.Position = new Vector(0, Math.Sin(ang) * 4, Math.Cos(ang) * 4 + 5); Ikke så fancy greier, men var litt artig å betrakte animasjonen innenifra objektene. Masse morro man kan gjøre med dette. Endret 29. oktober 2009 av HDSoftware Lenke til kommentar
GeirGrusom Skrevet 29. oktober 2009 Forfatter Del Skrevet 29. oktober 2009 Jeg burde lagt til mulighet for å flytte kameraet og slikt, men da måtte jeg skrevet en matriseklasse, som ble litt mer jobb enn jeg gadd å legge i det Lenke til kommentar
HDSoftware Skrevet 29. oktober 2009 Del Skrevet 29. oktober 2009 Tja, var vel egentlig ikke ViewPoint jeg flyttet, men origo til objektene pluss at jeg endret objekt 2 til å spinne rundt x aksen i stedet for y aksen. Programmet ditt gir ideer.... Siden vi er på det 3dimensjonale planet. Har du eksempelkode på hvordan man kan animere på samme måte uten å bruke Ray Tracing? Tenker litt mere DirectX stuff som demonstrerer den samme effekten uten å rendre RT selv nb! Ikke kast bort tid hvis det er kompliserte greier... Lenke til kommentar
GeirGrusom Skrevet 29. oktober 2009 Forfatter Del Skrevet 29. oktober 2009 Tja, hvis du er interessert i 3D grafikk så er SlimDX å anbefale. Dette er en Wrapper for DirectX 9/10/11 for .NET. Det er litt mye å kode å skrive et eksempel for det, men jeg skal se hva jeg får til. Lenke til kommentar
GeirGrusom Skrevet 30. oktober 2009 Forfatter Del Skrevet 30. oktober 2009 Vel, jeg hadde ingen forelesninger på skolen i dag, så derfor la jeg til soft shadows og specular highlighting i C# ray-traceren RayTrace.zip Tror det er siste jeg gidder å gjøre med den. Forhåpentligvis lærer noen noe av den ihvertfall. Lenke til kommentar
GeirGrusom Skrevet 14. november 2009 Forfatter Del Skrevet 14. november 2009 (endret) Hei! Jeg har jobbet litt med å lage en virtual machine noen dager, og lurte på hva dere synes om den. Det er en virtuell prosessor (ikke operativsystem ) I bunn og grunn litt general purpose, men den har egne registre og instruksjoner for vektorregning. Her er instruksjonssettet: Klikk for å se/fjerne innholdet nedenfor Registers: ra-d 64-bit integer or floating point ri 64-bit integer, instruction pointer rs 64-bit integer, stack pointer rva-d 256-bit vector a, b : integer register va, vb : vector register Mnemonic Description Function Add Signed addition a <= (a + b) Sub Signed subtraction a <= (a - b) Mul Signed multiplication a <= (a * b) Div Signed division a <= (a / b) Mod Signed modulo a <= (a mod b) UAdd Unsigned addition a <= (a + b) USub Unsigned subtraction a <= (a - b) UMul Unsigned multiplication a <= (a * b) UDiv Unsigned division a <= (a / b) And Bitwise and a <= (a and b) Or Bitwise or a <= (a or b) Xor Bitwise exclusive or a <= (a xor b) Bsh Bitshift a <= (a <<>> b) Not Bitwise not a <= not a Jmp Unconditional jump ip <= a Je Jump if equal ip <= b if a = 0 Jne Jump if not equal ip <= b if a <> 0 Jl Jump if less ip <= b if a < 0 Jg Jump if grater ip <= b if a > 0 Jle Jump if less or equal ip <= b if a <= 0 Jge Jump if great or equal ip <= b if a >= 0 Call Call procedure push ip; ip <= a ECall Call extern procedure a <= function return int Call interrupt Ret Return from procedure ip <= stack[sp]; sp <= sp - 1 Cmp Compare values a <= (a - b) Push Push value to stack stack[sp] <= a; sp <= sp + 1 Pop Pop value from stack sp <= sp -1; a <= stack[sp] Inc Increment value a <= (a + 1) Dec Decrement value a <= (a - 1) Fadd Floating point add a <= (a + b) Fsub Floating point sub a <= (a - b) Fmul Floating point mul a <= (a * b) Fdiv Floating point div a <= (a / b) fcos Cosine a <= cos(a) fsin Sine a <= sin(a) fsincos Cosine and sine b <= cos(a); a <= sin(a) fsqrt Square root a <= sqrt(a) fpow Value raised to power a <= (a ^ b) floor Floor of value a <= floor(a) ceil Ceiling of value a <= ceil(a) Ftoi Float to integer a <= int(a) Itof Integer to float a <= float(a) Mov Copy value a <= b MOvh Copy half-word a <= (b & 0xffffffff) Movq Copy quarter-word a <= (b & 0xffff) Movb Copy byte a <= (b & 0xff) Lea Load effective address a <= a * 8 + stack quit Exit program no change vadd Add vectors va <= (va + vb) vsub Subtract vectors va <= (va - vb) vmul Multiply vec or scalar va <= (va * ?b) vdiv Divide vec or scalar va <= (va * ?b) vdot Dot product of vectors ra <= (va dot vb) vmov Move vector or scalars va <= ?b vpush Push vector to stack stack[sp] <= va; sp <= sp + 4 vpop Pop vector from stack sp <= sp - 4; va <= stack[sp] vlen Length of vector a <= length(vb) vnorm Normalize vector va <= normalize(va) jump funksjonene er litt annerledes enn i x86 assembly, ved at alle conditional jump instruksjoner tar to parameter, resultatet av sammenligningen, og hvor hoppet skjer. Det er også noen ting med adresser som en må merke seg, jxx og call bruker ikke absoluttadresser, men adresser som er både 8-byte alignet, og relativt i forhold til adresseområdet til maskinen. Eksempel på bruk av je: cmp ra, rb je ra, MyLabel jmp main MyLabel: Det er også en egen instruksjon som heter ecall, denne er laget for å kalle .NET funksjoner som er lagt til. Foreløpig er bare MsgBox lagt til, og den tar en absolutt adresse til et minneområde med tekst i ra. I disassembly vil alle disse funksjonene bli lagt til på slutten (jump table) main er en spesiell label (dersom den står noen andre steder enn på toppen) den vil føre til at assembleren legger til en jmp instruksjon til main labelen. Registrene er som følger: ra, rb, rc, rd som er general purpose. rs er stack pekeren, og ri er instruksjonspekeren (begge er 8-byte alignet og relativ i forhold til adresseområdet) Bruk lea for å gjøre om en 8-byte alignet og relativ adresse til en absolutt adresse. rva, rvb, rvc, rvd er vektorregistre. Disse har 4 elementer: x, y, z og w. En kan kopiere fra vektor-element til general purpose slik: mov ra, rva.x mov rb, rva.y mov rc, rva.z mov rd, rva.w Det er en interrupt funksjon også, foreløpig er denne laget for å vise grafikk. int 1 vil legge adressen til grafikkområdet (32-bit rgb) i rd, og dytte width og height til stack i den rekkefølgen. For å hente bredden kan en kalle mov rc, rs lea rc mov ra, [rc - 16] // Bredde mov rb, [rc - 8] // Høyde Jeg må legge til flere debug muligheter vet jeg, men det har vært en del jobb å lage denne foreløpig, så får se. edit: Rettet opp masse bugs og lagt til debugger. Det følger med et eksempelprogram som farger én pixel etter verdien i rva registeret. VectorVM.zip Endret 15. november 2009 av GeirGrusom Lenke til kommentar
GeirGrusom Skrevet 20. desember 2009 Forfatter Del Skrevet 20. desember 2009 (endret) Jeg laget et snakespill. Tenkte kanskje noen var litt interessert i dette. Snake.zip Endret 20. desember 2009 av GeirGrusom Lenke til kommentar
HDSoftware Skrevet 21. desember 2009 Del Skrevet 21. desember 2009 Morsomt. Var litt kjedelig å restarte programmet hver gang jeg feilet, men du kommer vel med en ARCADE versjon snart ;-) Lenke til kommentar
Gråskjegg Skrevet 29. desember 2009 Del Skrevet 29. desember 2009 Å skrive en raytracer er naturligvis imponerende. Hvis du er interessert i slikt, kan du for eksempel peke nettleseren din på http://code.msdn.microsoft.com/ParExtSampl...?ReleaseId=3354, og hente en raytracer skrevet med parallelle utvidelser for C#. Har du fire kjerner, klarer den nesten å kjøre en animert sekvens uten hakking. Hint: ikke kjør programmet i full skjerm om du bruker 2560x1600... (vel, den klarer fortsatt 0,3 fps, så noen krise er det ikke) Det ser ut til at CPUene har stoppet på omlag 3GHz, men at man øker antall kjerner i stedet. Parallell programmering kan derfor bli viktigere og viktigere - om ikke alt havner i Skyen, da. - Grå - Lenke til kommentar
GeirGrusom Skrevet 31. desember 2009 Forfatter Del Skrevet 31. desember 2009 (endret) Nice. Men parallelle utvidelser kommer vel ikke før i .NET 4.0? Laget btw. en Ubb syntax highlighter for C#. Poster koden her fargelagt med den [color="#0000FF"]using[/color] System; [color="#0000FF"]using[/color] System.Collections.Generic; [color="#0000FF"]using[/color] System.ComponentModel; [color="#0000FF"]using[/color] System.Data; [color="#0000FF"]using[/color] System.Drawing; [color="#0000FF"]using[/color] System.Windows.Forms; [color="#0000FF"]using[/color] System.Text.RegularExpressions; [color="#0000FF"]namespace[/color] LangUbbize { [color="#0000FF"]public[/color] partial [color="#0000FF"]class[/color] MainForm : Form { [color="#0000FF"]public[/color] List<[color="#0000FF"]string[/color]> Keywords; [color="#0000FF"]public[/color] Regex cs_reg = [color="#0000FF"]new[/color] Regex( [color="#A9A9A9"]@"(?<CodeInfo>(?m-s)///.*$)|(?<Comment>(?s-m)(/\*.*?\*/)|((?m-s)//.*$))|(?<String>((?-s)("[/color][color="#A9A9A9"]".*?"[/color][color="#A9A9A9"]"))|((?s)@"[/color][color="#A9A9A9"]".*?"[/color][color="#A9A9A9"]"))|(?<Character>('.+?'))|(?<Keyword>[a-z]+)"[/color], RegexOptions.Compiled ); [color="#708090"]/// <summary> [/color] [color="#708090"]/// Performs a code replace to UBB syntax highlighting [/color] [color="#708090"]/// </summary> [/color] [color="#708090"]/// <param name="input">C# code to syntax highlight</param> [/color] [color="#708090"]/// <returns>Resulting UBB code</returns> [/color] [color="#0000FF"]public[/color] [color="#0000FF"]string[/color] PerformReplace([color="#0000FF"]string[/color] input) { [color="#008000"]// Do replace. Check each match to se what [/color] [color="#008000"]// capture group they belong to. [/color] [color="#0000FF"]return[/color] cs_reg.Replace(input, m => { Color color = Color.Transparent; [color="#0000FF"]if[/color] (m.Groups[[color="#A9A9A9"]"Comment"[/color]].Success) color = Color.Green; [color="#0000FF"]else[/color] [color="#0000FF"]if[/color] (m.Groups[[color="#A9A9A9"]"Character"[/color]].Success) color = Color.SlateGray; [color="#0000FF"]else[/color] [color="#0000FF"]if[/color] (m.Groups[[color="#A9A9A9"]"String"[/color]].Success) color = Color.DarkGray; [color="#0000FF"]else[/color] [color="#0000FF"]if[/color] (m.Groups[[color="#A9A9A9"]"CodeInfo"[/color]].Success) color = Color.SlateGray; [color="#0000FF"]else[/color] [color="#0000FF"]if[/color] (m.Groups[[color="#A9A9A9"]"Keyword"[/color]].Success) [color="#0000FF"]if[/color] (Keywords.Contains(m.Value)) color = Color.Blue; [color="#0000FF"]else[/color] color = Color.Transparent; [color="#0000FF"]if[/color] (color != Color.Transparent) [color="#0000FF"]return[/color] [color="#A9A9A9"]"[color="#colorcspancolorc colorToArgb amp 0x00ffffffToStringcoloro#A9A9A9span stylecolor#A9A9A9coloroX6colorcspancolorc coloro#A9A9A9span stylecolor#A9A9A9coloro"]"[/color] + m.Value + [color="#A9A9A9"]"[/color]"[/color]; [color="#0000FF"]else[/color] [color="#0000FF"]return[/color] m.Value; }); } [color="#0000FF"]public[/color] MainForm() { Keywords = [color="#0000FF"]new[/color] List<[color="#0000FF"]string[/color]>([color="#0000FF"]new[/color] [color="#0000FF"]string[/color][] { [color="#A9A9A9"]"abstract"[/color], [color="#A9A9A9"]"event"[/color], [color="#A9A9A9"]"new"[/color], [color="#A9A9A9"]"struct"[/color], [color="#A9A9A9"]"as"[/color], [color="#A9A9A9"]"explicit"[/color], [color="#A9A9A9"]"null"[/color], [color="#A9A9A9"]"switch"[/color], [color="#A9A9A9"]"base"[/color], [color="#A9A9A9"]"extern"[/color], [color="#A9A9A9"]"object"[/color], [color="#A9A9A9"]"this"[/color], [color="#A9A9A9"]"bool"[/color], [color="#A9A9A9"]"false"[/color], [color="#A9A9A9"]"operator"[/color], [color="#A9A9A9"]"throw"[/color], [color="#A9A9A9"]"break"[/color], [color="#A9A9A9"]"finally"[/color], [color="#A9A9A9"]"out"[/color], [color="#A9A9A9"]"true"[/color], [color="#A9A9A9"]"byte"[/color], [color="#A9A9A9"]"fixed"[/color], [color="#A9A9A9"]"override"[/color], [color="#A9A9A9"]"try"[/color], [color="#A9A9A9"]"case"[/color], [color="#A9A9A9"]"float"[/color], [color="#A9A9A9"]"params"[/color], [color="#A9A9A9"]"typeof"[/color], [color="#A9A9A9"]"catch"[/color], [color="#A9A9A9"]"for"[/color], [color="#A9A9A9"]"private"[/color], [color="#A9A9A9"]"uint"[/color], [color="#A9A9A9"]"char"[/color], [color="#A9A9A9"]"foreach"[/color], [color="#A9A9A9"]"protected"[/color],[color="#A9A9A9"]"ulong"[/color], [color="#A9A9A9"]"checked"[/color], [color="#A9A9A9"]"goto"[/color], [color="#A9A9A9"]"public"[/color], [color="#A9A9A9"]"unchecked"[/color], [color="#A9A9A9"]"class"[/color], [color="#A9A9A9"]"if"[/color], [color="#A9A9A9"]"readonly"[/color], [color="#A9A9A9"]"unsafe"[/color], [color="#A9A9A9"]"const"[/color], [color="#A9A9A9"]"implicit"[/color], [color="#A9A9A9"]"ref"[/color], [color="#A9A9A9"]"ushort"[/color], [color="#A9A9A9"]"continue"[/color], [color="#A9A9A9"]"in"[/color], [color="#A9A9A9"]"return"[/color], [color="#A9A9A9"]"using"[/color], [color="#A9A9A9"]"decimal"[/color], [color="#A9A9A9"]"int"[/color], [color="#A9A9A9"]"sbyte"[/color], [color="#A9A9A9"]"virtual"[/color], [color="#A9A9A9"]"default"[/color], [color="#A9A9A9"]"interface"[/color],[color="#A9A9A9"]"sealed"[/color], [color="#A9A9A9"]"volatile"[/color], [color="#A9A9A9"]"delegate"[/color], [color="#A9A9A9"]"internal"[/color], [color="#A9A9A9"]"short"[/color], [color="#A9A9A9"]"void"[/color], [color="#A9A9A9"]"do"[/color], [color="#A9A9A9"]"is"[/color], [color="#A9A9A9"]"sizeof"[/color], [color="#A9A9A9"]"while"[/color], [color="#A9A9A9"]"double"[/color], [color="#A9A9A9"]"lock"[/color], [color="#A9A9A9"]"stackalloc"[/color], [color="#A9A9A9"]"else"[/color], [color="#A9A9A9"]"long"[/color], [color="#A9A9A9"]"static"[/color], [color="#A9A9A9"]"enum"[/color], [color="#A9A9A9"]"namespace"[/color],[color="#A9A9A9"]"string"[/color] }); InitializeComponent(); } [color="#0000FF"]private[/color] [color="#0000FF"]void[/color] SourceCode_TextChanged([color="#0000FF"]object[/color] sender, EventArgs e) { UbbText.Text = PerformReplace(SourceCode.Text); } } } Den tøyser imidlertid på koden som danner color sakene, så jeg uploader også kildekoden. multiline verbatim strings er også støttet, uten at jeg har hatt spesielt bruk for det i denne kode. For å lage den for et annet språk, trengs det kun å skrives ny regex, samt legge inn andre keywords. edit: den resulterende koden må legges i codebox, og ikke code, siden sistnevnte ignorerer ubb tags. LangUbbize.zip Endret 31. desember 2009 av GeirGrusom Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå