C# spil (del 2) - Tilstandmaskiner i spil

Størrelse: px
Starte visningen fra side:

Download "C# spil (del 2) - Tilstandmaskiner i spil"

Transkript

1 Denne guide er oprindeligt udgivet på Eksperten.dk C# spil (del 2) - Tilstandmaskiner i spil Denne artikkel omhandler brugen af tilstandmaskiner i spil. Tilstandsmaskiner kan bruges til at styre logikken i et spil. Artiklen indeholder et eksempel til demonstation. I næste artikel (del 3) implementeres space invaders Skrevet den 11. Feb 2009 af sovsekoder I kategorien Programmering / C# Introduktion til tilstandmaskiner Kilde koden tilknyttet denne artikel kan findes sidst i artiklen i afsnitet kaldet: "Komplet Kilde Kode Her". De skarpe læsere vil se at BlockSprite og SpriteCollision klasserne er opdateret i forhold til artiklen C# spil (del 1). BlockSprite har fået en property kaldet, visible. Denne property angiver om spriten er synlig eller ej. Hvis spriten ikke er synlig kan den ikke kollidere med andre sprites, og den vises heller ikke. Listener klassen i SpriteCollision.cs har også fået en ny property, remove. Denne property sættes til true, hvis man ønsker at fjerne sin listener (som hører efter om 2 sprites er kollideret). Funktionaliteten bruges ikke i denne artikel, men bliver taget i brug i næste artikel C# spil (del 3), hvor space invaderes bliver implementeret. Denne artikel vil være rar at forstå, da space invaders spillet gør brug af tilstandsmaskiner til at styre spillet med. Desuden er det en god viden at sidde inde med, når du skal igang med dit eget spil! Før jeg plastrer kode ud over det hele vil jeg give et indblik i hvad tilstandsmaskiner er. For at forstå hvad tilstandsmaskiner er, er det første spørgsmål, der skal besvares nok endnu mere simpelt: Hvad er en tilstand egentlig?...en tilstand defineres af programmøren selv (eller af designeren af tilstandmaskinen :D) - følgende overskrifter kan f.eks dække over tilstande, der kunne forekomme i et spil: [Game Over] : spillet er slut og du er død! [In Game] : du er inde i spillet og kan f.eks styre et objekt [Wait For New Game] : venter til at brugeren sætter et spil igang [Lost a Life] : du har tabt et liv, men er ikke game over endnu Ovenstående tilstande dækker over "overordnede" tilstande i et spil - som vi alle kender. Man kan også have tilstande for mere specifikke områder i spillet, som f.eks for bevægn af invaders i "space invaders": [Move Left] : flytter invaders til venstre [Move Down in Left Side] : flytter invaders ned i venstre side [Move Right] : flytter invaders til højre [Move Down in Right Side] : invaders ned i højre side Jeg vil nu prøve at holde fast i det sidste eksempel, med bevægn af space invaders,et øjeblik. For nemhedens skyld bruger jeg navnene MoveLeft, MoveLeftDown, MoveRight, MoveRightDown for de enkelte tilstande. Vi ønsker at der skal ske nget bestemt i hver enkelt tilstand. I MoveLeft skal alle invaders flytte sig til venstre. Når de kommer til den venstre kant af skærmen, skal de gå ned. Tilstanden MoveLeftDown beskriver denne situation. Bemærk at det er ikke nok med bare een tilstand der hedder MoveDown, da det i en sådan model ikke er muligt at finde ud af om vores invaders er i højre eller venstre side af skærmen. Vi definerer altså en tilstand, som dækker over en overordnet tilstand/begivenhed i spillet, og en arbejdsproces (som siger noget om hvad der skal ske i den pågældene tilstand - f.eks invaders flyttes til venstre), samt en beting for hvad der gør at man kommer til en ny tilstand (f.eks at invaders stopper

2 med at gå til venstre, men går ned i stedet). I tilfældet med space invaders bevæg, vil vi gerne have at de går fra venstre mod højre, og derefter ned - så fra højre mod venstre, og ned igen. Herefter gentages processen med at gå fra venstre mod højre osvosv. Det er lige netop dette mønster der kan genskabes ved brug af en tilstandsmaskine. Lad os sige at invaders starter med at gå til højre. Vi starter derfor i tilstand: MoveRight. Vi siger nu at der er en overgang til tilstanden MoveRightDown. Dette betyder at når visse betingr er opfyldt, så hopper vi over i tilstanden MoveRightDown. Dette kan vi skrive: [MoveRight] -> [MoveRightDown] Betingn for overgangen er, at invaders er nået ud til kanten i højre side af skærmen. Når denne beting er opfyldt går vi til tilstanden, MoveRightDown. På denne måde kan vi give et overblik over vores tilstande, og hvordan de hænger sammen: [MoveRightDown] -> [MoveLeft], hvor betingn er at vi har gået en hvis længe ned i pixels (sådan er spillet bare). Næste overgang er: [MoveLeft] -> [MoveLeftDown], hvor betingn er at invaders er nået ud i venstre skærmkant. Sidste overgang er givet ved: [MoveLeftDown] -> [MoveRight], hvor betingn er at invaders har gået langt nok ned. Vi er nu endt i tilstanden MoveRight, hvor vi jo startede. Tilstandmaskinen går nu i ring, hvilket også hedder en infinite state machine (den er uendelig). Tilstandmskinen behøver ikke gå i ring. Vi kunne vælge at lade vores invaders stoppe i MoveLeftDown, så invaders bare forsatte ned. I sådan et tilælde er det så en endelig tilstands maskine (finite state machine), hvor slut tilstanden er: MoveLeftDown. Implementering af tilstandsmaskiner Vi stopper nu med eksemplet ang. space invaders, og går over til demonstrations projektet. Vi skal prøve at implmenetere en tilstandsmaskine der styrer en sprite, sprite1. Sprite'en skal bevæge sig rundt langs kanten på et raktangel. Vi ønsker følgende tilstande og overgange: Tilstande: [Right] sprite1 går til højre [Down] sprite1 går ned [Left] sprite1 går til venstre [Up] sprite1 går op Overgange: [Right] -> [Down] [Down] -> [Left] [Left] -> [Up] [Up] -> [Right] Betingn for overgangene er at vi er nået kanten af retanglet. Disse betingr implementeres senere. Resultatet af tilstandsmaskine er således at sprite1 vandrer rundt og rundt langs kanten på et rektangel. Vi skal nu definere de 4 tilstande: Left, Right, Down og Up. Disse tilstande defineres i en enumeration, og vi erklærer en variabel, der indeholder den aktuelle tilstand: Tilstande for sprite1 enum Sprite1States

3 Left, Right, Down, Up ; Denne variable indeholder den aktuelle tilstand Sprite1States sprite1state = Sprite1States.Right; Vores variabel sprite1state indeholder nu start tilstanden Right. Det kan godt blive aktuelt at have flere tilstands-variable, dette vil jeg dog ikke kommer nærmere ind på. I denne serie af artikeler bruges kun tilstandsmaskiner med en variabel der beskriver tilstanden. Hvis vi ønsker at hoppe over i en anden tilstand, skal vi blot tildele vores variabel værdien for den nye tilstand. Hvis vi skal over i f.eks. Up skriver vi blot: sprite1state = Sprite1States.Up; Vi har nu defineret de nødvendige tilstande for at beskrive spritens bevæg, samt oprettet en variabel til at holde styr på den tilstand vi er i nu. Vi mangler nu at implementere betingr for de enkelte overgange samt den arbejdsopgave der skal udføres i hver enkelt tilstand (såsom at flytte sprite'en en tak til højre, hvis vi er i tilstand: Right). Funktionaliteten og betingrne af tilstandsmaskinen placeres i gameloopet (=timer1_tick, som nævnes i artiklen C# spil del 1, hvor step1 viser hvorledes denne metode sættes op). Gameloopet bliver kaldt et vist antal gange i sekundet. Denne metode bliver altså kørt igen og igen. Følgende kode viser implementeringen af tilstandsmaskinen (koden placeres før Invalidate(true), som er sidste linie): switch(sprite1state) case Sprite1States.Down: Tjek om spriten holder sig inden for y-grænsen if(sprite1.y >= LowerBorder) Down -> Left sprite1state = Sprite1States.Left; sprite1.y++; case Sprite1States.Left: Tjek om spriten holder sig inden for x-grænsen if(sprite1.x <= LeftBorder) Left -> Up sprite1state = Sprite1States.Up; sprite1.x--; case Sprite1States.Right: Tjek om spriten holder sig inden for x-grænsen if(sprite1.x >= RightBorder) Right -> Down sprite1state = Sprite1States.Down;

4 sprite1.x++; case Sprite1States.Up: Tjek om spriten holder sig inden for y-grænsen if(sprite1.y <= TopBorder) Up -> Right sprite1state = Sprite1States.Right; sprite1.y--; Overnstående kode kræver at følgende konstanter er erklæret: Statiske konstanter der bruges til at definere rammen public static int TopBorder = 10; public static int LeftBorder = 10; public static int RightBorder = 150; public static int LowerBorder = 150; Som man kan se er tilstandsmaskinen i bund og grund bare en switch-case. Så hvordan virker den? Koden bliver placeret inde i gameloopet, som tidligere nævnt bliver kaldt flere gange i sekundet. Hver gang gameloopet kaldes gennemgås switch sætningen altså. Vi startede med at sætte sprite1state (vores tilstands variabel) til at være Right. Dette betyder altså at vi ryger ind i Right-casen, hver gang gameloopmetoden kaldes. I right-casen har vi både en aktion (jobbet) og en beting. Beting og job er, i tilstanden Right, givet ved: if(sprite1.x >= RightBorder) Right -> Down sprite1state = Sprite1States.Down; sprite1.x++; Det der står er altså populært sagt: "hvis sprite1 kommer udover kanten i højre side, så skal vi gå til tilstand Down (det var betingn!). Hvis ikke dette er tilfældet så flytter vi spriten en tak til højre, ved at lægge 1 til spritens nuværende x-koordinat (og det var så arbejdsopgaven!). På denne måde vil spriten flytte sig en tak til højre lige indtil den når kanten. Når kanten er nået ændres tilstanden til Down, og så er vi altså over i Down-tilstanden, hvor der så vil være en ny beting og en ny arbejdsopgave for tilstanden. De andre tilstande implementeres i samme stil som Right. Det er ikke en nødvendighed at indsætte tilstandsmaskinen i gameloopet. Hvor tilstandsmaskinen placeres i koden, afhænger af hvad den skal gøre/udføre. I dette tilfælde er det smart at placere tilstandsmaskinen i gameloopet, da spriten skal flytte sig hver gang gameloopet kaldes (og derved holde et konstant tempo). Sprite'ens position opdateres hver gang gameloop'et kaldes. Tilstands maskinen kan også være delt. Dette har jeg valgt at vise ved at putte en ny sprite på (sprite2). Denne sprite's bevæg er afhængig af om den er kollideret med sprite1 eller ej. Sprite2 starter med at vente i venstre side. Når den kolliderer med sprite1 (som hele tiden kører rundt vha. tilstandmaskinen der

5 lige er beskrevet), så flytter sprite2 sig over i højre side og venter. Når de to sprites kolliderer igen (hvilket så vil være i højre side når sprite1 er nået derover), så flytter sprite2 sig tilbage i venstre side igen. - Når de to sprites kolliderer herefter, så flytter sprite2 sig i en cirkelbevæg tilbage til startpunktet og bevægn starter forfra (så sprite2's tilstandsmaskine er, som sprite1's, uendelig). Det nye er at vi har en speciel beting iform af en kollision. Sprite2 skal have en overgang der er betinget af kollisionen - når de to sprites kolliderer så skal der ske "noget nyt". Dette betyder at noget af implementeringen af tilstandsmaskinen for sprite2, flyttes over i collisionhandleren. Følgende skridt skal tages for at sætte sprite 2 op samt den tilhørende tilstandsmaskine. 0) tilføj tilstandene for sprite2, samt en tilstandsvariabel 1) tilføj (sprite 1) og sprite 2 2) opret en collision handler for sprite 1 og 2. 3) tilføj en collision listener for sprite 1 og 2, der kaldet collision handleren 4) implementer noget af tilstandmaskinen i gameloopet (de dele der ikke afhænger af kollisionen) 5) implementer resten af tilstandsmaskinen i collision handleren (de tilstande som afhænger af kollisionen) Vi går igang, kig på overskriften og så på koden - måske kan du genkende principperne fra sprite1... 0) tilføj tilstandene for sprite2 og tilstands variabelen Tilstande for sprite2 enum Sprite2States Left, Circle, WaitCollisionLeft, WaitCollisionLeft2, Right, WaitCollisionRight ; Tilstandsvariablen for sprite2 Sprite2States sprite2state = Sprite2States.Right; 1) tilføj sprite 1 og sprite 2 Opret sprite1 (sort) og sprite2 (rød) sprite1 = new BlockSprite(LeftBorder, TopBorder, spritesize,spritesize); sprite2 = new BlockSprite(LeftBorder, (LowerBorder-TopBorder)/2+TopBorder, spritesize,spritesize); sprite2.color = Color.Red; 2) Opret en collision handler for sprite 1 og 2. void CollisionHandler(object sender) Her indsættes noget af sprite2's tilstands-maskine senere..

6 Kollisions handleren vist ovenfor skal senere fyldes ud med en del af sprite2's tilstandsmaskine. Kollisions handleren kaldes så længe at sprite1 og sprite2 overlapper (de er kollideret). 3) tilføj en collision listener for sprite 1 og 2, der kalder collision handleren collisions.addlistener(sprite1, sprite2, new CollisionDelegate(CollisionHandler)); hvor collisions variablen er en instans af SpriteCollision klassen. Denne variabel bliver initialiseret i konstruktøren, som SpriteCollision collisions = new SpriteCollision(); - det er denne klasse der administrerer, hvordan der tjekkes efter kollisioner. Dette gøre ved at kalde collisions.check(); hvilket typisk kan skal ske, som det første i gameloopet (se evt. kilde koden for Form1). 4) implementer noget af tilstandmaskinen i gameloopet (de tilstande der ikke afhænger af kollisionen) switch(sprite2state) case Sprite2States.Left: if(sprite2.x <= LeftBorder) Left -> WaitCollisionLeft sprite2state = Sprite2States.WaitCollisionLeft; sprite2.x--; case Sprite2States.Circle: double amp = (LowerBorder-TopBorder)/3; sprite2.x = tempx + (int)(amp*(1-math.cos(t))); sprite2.y = tempy + (int)(-amp*(math.sin(t))); if(t >= 2*Math.PI) Circle -> WaitCollisionLeft2 sprite2state = Sprite2States.WaitCollisionLeft2; sprite2.x = tempx; sprite2.y = tempy; t+= Math.PI/100d; case Sprite2States.Right: if(sprite2.x >= RightBorder) Right -> WaitCollisionRight sprite2state = Sprite2States.WaitCollisionRight; sprite2.x++; Ovenstående tilstandsmaksine sørger altså for at flytte sprite 2 til siderne og i den omtalte cirkel bevæg. Som det ses behandles følgende tilstande ikke: WaitCollisionLeft, WaitCollisionLeft2, WaitCollisionRight. Disse tilstande bliver behandlet i vores collision handler som vi tilføjede i punkt 2.

7 Implementeringen af denne del af tilstandsmaskinen kan ses i det følgende: 5) Implementer resten af tilstandsmaskinen i collision handleren (de tilstande som afhænger af kollisionen) Tilstandsmaskine for sprite2 switch(sprite2state) case Sprite2States.WaitCollisionLeft: Initialiser circel variable og overgå til ny tilstand: WaitCollisionLeft -> Circle t=0; tempx = sprite2.x; tempy = sprite2.y; sprite2state = Sprite2States.Circle; case Sprite2States.WaitCollisionLeft2: WaitCollisionLeft2 -> Right sprite2state = Sprite2States.Right; case Sprite2States.WaitCollisionRight: WaitCollisionRight -> Left sprite2state = Sprite2States.Left; Som det ses behandler vi tilstandene: WaitCollisionLeft, WaitCollisionLeft2, WaitCollisionRight. Denne del af tilstandsmaskinen besøges kun når sprite1 og sprite2 er kollideret. De tilstande der håndteres her håndteres ikke i gameloopet, hvilket betyder at der ikke foretages noget arbejdsproces før der sker en kollision. Når kollisionen er sket, kan vi se på overgangene at vi gå over til: Circle, Right eller Left. Disse tilstande behandles så i gameloopet, og kollisionen mellem sprite1 og sprite2 vil ignoreres da disse tilstande ikke håndteres her (i collisionhandleren)! - det var kringlet, men det hjælper at se demonstrationen. Vi har nu implementeret tilstandsmaskinen og den fornødne funktionalitet bag sprite2. Det samme gælder for sprite1. Jeg håber jeg har givet et godt indblik i tilstandsmaskiner, og hvordan de virker. Demo projektet viser, hvordan man kan implementere regler for bevægn af sprites. Disse regler kan dog også overføres på andre ting i spillet, såsom spillets "gang", som indikerer hvorvidt spilleren er død, gameover eller måske nået til næste level. Det er fantasien der sætter grændserne. Man kan måske sige lidt generelt, at tilstandsmaskinerne kan bruges til at udføre et reglsæt. Om reglsættet gælder for spritens bevæg eller spillets gang eller noget helt tredie - det bestemmer programmøren. Den næste artikel C# spil (del 3), vil ikke forklare teknikken bag tilstandsmaskiner (det skulle gerne være dækket af denne artikkel) - men vil derimod vise hvordan man bruger dem til at lave et rigtigt spil, nemlig den gamle klassiker: "Space Invaders". Når man vender sig til den - nok lidt - specielle måde at tænke på (ved brug af tilstandsmaskiner), så synes jeg selv at det letter arbejdet, og gør spil-logikken mere overskuelig. Der findes mange gode måde at afbilde tilstandsmaksiner på grafisk. Det kan jeg desværre ikke vise i denne artikkel, da jeg ikke har mulighed for at indsætte billeder. Det gode ved en grafisk afbildning er ellers, at den er relativt simpel, men illustrerer reglsættet rigtigt godt! - Når man er kommet godt ind i brugen af tilstandsmaskiner, vil en grafisk afbildning af tilstandsmaskinen også være en god/let skabelon at implementere spillet efter...

8 Komplet Kilde Kode Her Sådan får du koden op at køre: Opret et windows form projekt med namespace: StatemachineDemo. Filen med formen hedder form1.cs. Herudover skal der være to filer: spritecollsion.cs og blocksprite.cs. Disse filer opretter du ved at højre klikke på projektet og vælge add New Item, og så vælge Class..., navnet på klassen skal være det samme som filnavnet - dvs: SpriteCollision og BlockSprite. Når filerne er oprettet copy/pastes koden ind i hver enkelt fil, og så skulle det kunne køre! Demo programmet viser udover spritenes bevæg også de tilstand de to tilstandsmaskiner bevægersig i. Kilde koden til filerne kan findes herunder (overskriften markerer filens navn): Form1.cs using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; namespace StatemachineDemo public class Form1 : System.Windows.Forms.Form Statiske konstanter der bruges til at definere rammen public static int TopBorder = 10; public static int LeftBorder = 10; public static int RightBorder = 150; public static int LowerBorder = 150; Tilstande for sprite1 enum Sprite1States Left, Right, Down, Up ; Tilstande for sprite2 enum Sprite2States Left, Circle, WaitCollisionLeft, WaitCollisionLeft2, Right, WaitCollisionRight ;

9 Erklæring af sprites og deres tilstande BlockSprite sprite1; BlockSprite sprite2; int spritesize = 20; Sprite1States sprite1state = Sprite1States.Right; Sprite2States sprite2state = Sprite2States.Right; Variabler der bruges af sprite2 til circel bevæg double t; int tempx, tempy; Håndtering af Kollisioner SpriteCollision collisions = new SpriteCollision(); Komponenter på formen private System.Windows.Forms.Timer timer1; private System.ComponentModel.IContainer components; private System.Windows.Forms.Label label1; private System.Windows.Forms.Label label2; private System.Windows.Forms.Label label3; private System.Windows.Forms.Label label4; private System.Windows.Forms.Label label5; private System.Windows.Forms.Label label6; private System.Windows.Forms.Label label7; private System.Windows.Forms.Label label8; private System.Windows.Forms.Label label9; private System.Windows.Forms.Label label10; public Form1() Required for Windows Form Designer support InitializeComponent(); Tegn med double-buffering SetStyle(ControlStyles.UserPaint, true); SetStyle(ControlStyles.AllPaintingInWmPaint, true); SetStyle(ControlStyles.DoubleBuffer, true); Opret sprite1 (sort) og sprite2 (rød) sprite1 = new BlockSprite(LeftBorder, TopBorder, spritesize,spritesize); sprite2 = new BlockSprite(LeftBorder, (LowerBorder- TopBorder)/2+TopBorder, spritesize,spritesize); sprite2.color = Color.Red; Opret Collision listener for sprite1 og sprite2 - når sprite1 og sprite2 støder sammen kaldes CollisionHandler collisions.addlistener(sprite1, sprite2, new CollisionDelegate(CollisionHandler)); protected override void Dispose( bool disposing ) if( disposing ) if (components!= null)

10 components.dispose(); base.dispose( disposing ); #region Windows Form Designer generated code / <summary> / Required method for Designer support - do not modify / the contents of this method with the code editor. / </summary> private void InitializeComponent() this.components = new System.ComponentModel.Container(); this.timer1 = new System.Windows.Forms.Timer(this.components); this.label1 = new System.Windows.Forms.Label(); this.label2 = new System.Windows.Forms.Label(); this.label3 = new System.Windows.Forms.Label(); this.label4 = new System.Windows.Forms.Label(); this.label5 = new System.Windows.Forms.Label(); this.label6 = new System.Windows.Forms.Label(); this.label7 = new System.Windows.Forms.Label(); this.label8 = new System.Windows.Forms.Label(); this.label9 = new System.Windows.Forms.Label(); this.label10 = new System.Windows.Forms.Label(); this.suspendlayout(); timer1 this.timer1.enabled = true; this.timer1.interval = 10; this.timer1.tick += new System.EventHandler(this.gameLoop); label1 this.label1.location = new System.Drawing.Point(216, 16); this.label1.name = "label1"; this.label1.tabindex = 0; this.label1.text = "Up"; label2 this.label2.location = new System.Drawing.Point(216, 40); this.label2.name = "label2"; this.label2.tabindex = 1; this.label2.text = "Down"; label3 this.label3.location = new System.Drawing.Point(216, 64); this.label3.name = "label3"; this.label3.tabindex = 2; this.label3.text = "Left";

11 label4 this.label4.location = new System.Drawing.Point(216, 88); this.label4.name = "label4"; this.label4.tabindex = 3; this.label4.text = "Right"; label5 this.label5.location = new System.Drawing.Point(216, 152); this.label5.name = "label5"; this.label5.tabindex = 4; this.label5.text = "Left"; label6 this.label6.location = new System.Drawing.Point(216, 176); this.label6.name = "label6"; this.label6.tabindex = 5; this.label6.text = "Wait(Left)"; label7 this.label7.location = new System.Drawing.Point(216, 200); this.label7.name = "label7"; this.label7.tabindex = 6; this.label7.text = "Right"; label8 this.label8.location = new System.Drawing.Point(216, 224); this.label8.name = "label8"; this.label8.tabindex = 7; this.label8.text = "Wait(Right)"; label9 this.label9.location = new System.Drawing.Point(216, 248); this.label9.name = "label9"; this.label9.tabindex = 8; this.label9.text = "Circle"; label10 this.label10.location = new System.Drawing.Point(216, 272); this.label10.name = "label10"; this.label10.tabindex = 9; this.label10.text = "Wait(Left2)"; Form1 this.autoscalebasesize = new System.Drawing.Size(5, 13); this.clientsize = new System.Drawing.Size(520, 454); this.controls.add(this.label10); this.controls.add(this.label9);

12 this.controls.add(this.label8); this.controls.add(this.label7); this.controls.add(this.label6); this.controls.add(this.label5); this.controls.add(this.label4); this.controls.add(this.label3); this.controls.add(this.label2); this.controls.add(this.label1); this.name = "Form1"; this.text = "Form1"; this.paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint); this.resumelayout(false); #endregion [STAThread] static void Main() Application.Run(new Form1()); CollisionHandler: Håndterer hvad der sker når sprite1 og sprite2 - kolliderer void CollisionHandler(object sender) Tilstandsmaskine for sprite2 switch(sprite2state) case Sprite2States.WaitCollisionLeft: Initialiser circel variable og overgå til ny tilstand: WaitCollisionLeft -> Circle t=0; tempx = sprite2.x; tempy = sprite2.y; sprite2state = Sprite2States.Circle; case Sprite2States.WaitCollisionLeft2: WaitCollisionLeft2 -> Right sprite2state = Sprite2States.Right; case Sprite2States.WaitCollisionRight: WaitCollisionRight -> Left sprite2state = Sprite2States.Left; private void gameloop(object sender, System.EventArgs e) collisions.check(); switch(sprite1state) case Sprite1States.Down:

13 Tjek om spriten holder sig inden for y-grænsen if(sprite1.y >= LowerBorder) Down -> Left sprite1state = Sprite1States.Left; sprite1.y++; case Sprite1States.Left: Tjek om spriten holder sig inden for x-grænsen if(sprite1.x <= LeftBorder) Left -> Up sprite1state = Sprite1States.Up; sprite1.x--; case Sprite1States.Right: Tjek om spriten holder sig inden for x-grænsen if(sprite1.x >= RightBorder) Right -> Down sprite1state = Sprite1States.Down; sprite1.x++; case Sprite1States.Up: Tjek om spriten holder sig inden for y-grænsen if(sprite1.y <= TopBorder) Up -> Right sprite1state = Sprite1States.Right; sprite1.y--; switch(sprite2state) case Sprite2States.Left: if(sprite2.x <= LeftBorder) Left -> WaitCollisionLeft sprite2state = Sprite2States.WaitCollisionLeft; sprite2.x--; case Sprite2States.Circle: double amp = (LowerBorder-TopBorder)/3; sprite2.x = tempx + (int)(amp*(1-math.cos(t))); sprite2.y = tempy + (int)(-amp*(math.sin(t))); if(t >= 2*Math.PI) Circle -> WaitCollisionLeft2 sprite2state = Sprite2States.WaitCollisionLeft2; sprite2.x = tempx; sprite2.y = tempy;

14 t+= Math.PI/100d; case Sprite2States.Right: if(sprite2.x >= RightBorder) Right -> WaitCollisionRight sprite2state = Sprite2States.WaitCollisionRight; sprite2.x++; Gentegn vinduet Invalidate(true); Tegn grafik private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e) Graphics g = e.graphics; Tegn de to sprites sprite1.draw(g); sprite2.draw(g); Tegn et rektangel der hvor spritene holder sig indenfor g.drawrectangle(new Pen(Color.Black),LeftBorder, TopBorder, RightBorder-LeftBorder+spriteSize, LowerBorder-TopBorder+spriteSize); Følgende kode markerer hvilken tilstand der er aktiv for sprite1 - og sprite2 Label[] labels = new Label[] label1, label2, label3, label4, label5, label6, label7, label8, label9, label10 ; int index1=0, index2=0; switch(sprite1state) case Sprite1States.Down: index1=1; case Sprite1States.Left: index1=2; case Sprite1States.Right: index1=3;

15 case Sprite1States.Up: index1=0; switch(sprite2state) case Sprite2States.Left: index2=4; case Sprite2States.WaitCollisionLeft: index2=5; case Sprite2States.Right: index2=6; case Sprite2States.WaitCollisionRight: index2=7; case Sprite2States.Circle: index2=8; case Sprite2States.WaitCollisionLeft2: index2=9; Marker de aktuelle tilstande ved at tegne med gul baggrund for(int i=0; i<labels.length; i++) if(i==index1 i==index2) labels[i].backcolor = Color.Yellow; labels[i].backcolor = Color.Transparent; BlockSprite.cs using System; using System.Drawing; namespace StatemachineDemo public class BlockSprite protected int x=0; protected int y=0; protected int width=0; protected int height = 0;

16 protected Color color = Color.Black; protected bool visible = true; Konstruktør, der giver mulighed for at sætte spritens properties public BlockSprite(int x, int y, int width, int height) this.x = x; this.y = y; this.width = width; this.height = height; Tegning af spriten public void Draw(Graphics g) if(visible == false) return; g.fillrectangle(new SolidBrush(color), x,y, width, height); Sprite properties herunder public int X get return this.x; set this.x = value; public int Y get return this.y; set this.y = value; public int Height get return this.height; set this.height = value; public int Width get return this.width; set this.width = value; public System.Drawing.Color Color get return this.color; set this.color = value; public bool Visible get return this.visible; set this.visible = value;

17 SpriteCollision.cs using System; using System.Collections; using System.Drawing; namespace StatemachineDemo public delegate void CollisionDelegate(object sender); public class SpriteCollision ArrayList listeners = new ArrayList(); d ) Tilføj en listener, der lytter efter kollision mellem sprite1 og 2 public void AddListener(BlockSprite s1, BlockSprite s2, CollisionDelegate Listener l = new Listener(s1, s2, d); listeners.add(l); Tjek for kollisioner, ved at gennemløbe alle listeners public void Check() for(int i=0; i<listeners.count; i++) Listener listener = (Listener) listeners[i]; Fjern listener hvis remove property'en er true if(listener.remove) listeners.remove(listener); i--; continue; Tjek om listenerens sprites er kollideret if(listener.collide()) listener.firecollisionevent(); public class Listener BlockSprite sprite1; BlockSprite sprite2; bool remove = false;

18 event CollisionDelegate CollisionEvent; public Listener(BlockSprite s1, BlockSprite s2, CollisionDelegate d) sprite1 = s1; sprite2 = s2; CollisionEvent += d; Tjek for kollision mellem sprite1 og sprite2 public bool Collide() if(sprite1.visible == false sprite2.visible == false) return false; Tjek for kollision her if(sprite1.x < (sprite2.x+sprite2.width)) if((sprite1.x+sprite1.width) > sprite2.x) if(sprite1.y < (sprite2.y+sprite2.height)) if((sprite1.y+sprite1.height) > sprite2.y) return true; return false; Fyr kollisions eventet public void FireCollisionEvent() CollisionEvent(this); public BlockSprite Sprite1 get return this.sprite1; set this.sprite1 = value; public BlockSprite Sprite2 get return this.sprite2; set this.sprite2 = value; Afgører hvorvist denne listener skal fjernes fra listener kollektionen public bool Remove get return this.remove; set this.remove = value;

19 Kommentar af skwat d. 07. Nov Det er ganske simpelt knald godt, jeg tror at sovsekoder ved hvad de unge vil ha' - skide godt. Kommentar af cronck d. 13. May Er sq'da rart at se at der virkelig findes nogen som gider at bruge tid på at skrive deres artikler ordentligt! Super flot! Kommentar af zeroaim d. 27. Jan Det kunne simpelthen ikke forklares bedre! (er du i virkeligheden pædagog?):-d SUPER Kommentar af sorenbs d. 31. Oct Lang og kompleks :) Kommentar af andr3as d. 02. Nov virkelig godt :o) ser frem til den næste i rækken :) Kommentar af tobiasahlmo d. 24. Jan Meget god artikel. Men forstår den ikke helt :) Kommentar af sovsekoder d. 23. Feb kig evt. på mit codeplex projekt ang. XNA og platform spil:

C# spil (del 3) - Space Invaders, sådan!

C# spil (del 3) - Space Invaders, sådan! Denne guide er oprindeligt udgivet på Eksperten.dk C# spil (del 3) - Space Invaders, sådan! Artiklen indeholder implementeringen af spillet Space Invaders, og forklarer overordnet ideen bag. Sprite- og

Læs mere

C# spil (del 1) - Kom i gang med et simpelt spil

C# spil (del 1) - Kom i gang med et simpelt spil Denne guide er oprindeligt udgivet på Eksperten.dk C# spil (del 1) - Kom i gang med et simpelt spil Denne artikel starter helt fra grunden (med GDI). Den viser hvordan man undgår flimmer, og hvordan man

Læs mere

Hvad er Objekter - Programmering

Hvad er Objekter - Programmering Denne guide er oprindeligt udgivet på Eksperten.dk Hvad er Objekter - Programmering En rigtig god gennemgang af hvad objekter er! Hvordan de oprettes og anvendes! Det er helt klart til nybegyndere, som

Læs mere

Singleton pattern i C#

Singleton pattern i C# Denne guide er oprindeligt udgivet på Eksperten.dk Singleton pattern i C# Denne artikel beskriver Singleton pattern og implementation i C#. Den forudsætter kendskab til C# men ikke til Singleton. Der er

Læs mere

Som sagt kræves der helst lidt viden om OOP hvis man virkelig vil lærer noget, og ikke bare lave copypaste

Som sagt kræves der helst lidt viden om OOP hvis man virkelig vil lærer noget, og ikke bare lave copypaste Denne guide er oprindeligt udgivet på Eksperten.dk Indkøbsvogn i PHP I denne artikel vil jeg prøve at lave en indkøbskurv som let kan udvides, og som ikke er svær at forstå. Det er bedst med viden om OOP(klasser),

Læs mere

Mircobit Kursus Lektion 3 (Du skal her vælge Lets Code Og nederst Microsoft Block Editor.)

Mircobit Kursus Lektion 3   (Du skal her vælge Lets Code Og nederst Microsoft Block Editor.) Mircobit Kursus Lektion 3 http://microbit.org/ (Du skal her vælge Lets Code Og nederst Microsoft Block Editor.) I sidste lektion var der en opgave man selv skulle prøve at løse. Man skulle lave et tabel

Læs mere

Introduktion til ActionScript, fortsat

Introduktion til ActionScript, fortsat Introduktion til ActionScript, fortsat Kaspar Rosengreen Nielsen kaspar@interactivespaces.net i n t e r a c t i v e s p a c e s. n e t Kaspar Nielsen, kaspar@interactivespaces.net 1 Dagens program Opsamling

Læs mere

Threads i Java. Denne artikel giver en introduktion til threads i Java. Den beskriver hvad tråde er og forklarer hvordan de bruges i Java

Threads i Java. Denne artikel giver en introduktion til threads i Java. Den beskriver hvad tråde er og forklarer hvordan de bruges i Java Denne guide er oprindeligt udgivet på Eksperten.dk Threads i Java Denne artikel giver en introduktion til threads i Java. Den beskriver hvad tråde er og forklarer hvordan de bruges i Java Den forudsætter

Læs mere

Michael Jokil 11-05-2012

Michael Jokil 11-05-2012 HTX, RTG Det skrå kast Informationsteknologi B Michael Jokil 11-05-2012 Indholdsfortegnelse Indledning... 3 Teori... 3 Kravspecifikationer... 4 Design... 4 Funktionalitet... 4 Brugerflade... 4 Implementering...

Læs mere

Java Klasse nedarvninger

Java Klasse nedarvninger Denne guide er oprindeligt udgivet på Eksperten.dk Java Klasse nedarvninger Et let lille overblik i hvordan klasse nedarvning virker i java Skrevet den 07. dec 2011 af mochners I kategorien Programmering

Læs mere

Lektion 6. Grundlæggende programmering i VR

Lektion 6. Grundlæggende programmering i VR Lektion 6 Grundlæggende programmering i VR Plan for i dag Simpelt FPS Triggerzones og animationer C# og objekt orienteret programmering Interfaces Generics Google Cardboard Video om VRs fremtid App til

Læs mere

I denne artikel vil vi bruge en User klasse som vi så vil gruppere på forskellige måder.

I denne artikel vil vi bruge en User klasse som vi så vil gruppere på forskellige måder. Denne guide er oprindeligt udgivet på Eksperten.dk Collections i.net Når du kigger i namespacet System.Collections finder du over 10 forskellige klasser. At vælge den rigtige til netop din applikations

Læs mere

Kontrol-strukturer i PHP

Kontrol-strukturer i PHP Denne guide er oprindeligt udgivet på Eksperten.dk Kontrol-strukturer i PHP Denne artikel gennemgår kontrolstrukturer i PHP. 'if', 'switch', 'while' og 'for' bliver gennemgået. Den forudsætter lidt grundlæggende

Læs mere

Forelæsning Uge 2 Torsdag

Forelæsning Uge 2 Torsdag Forelæsning Uge 2 Torsdag Niveauer af programbeskrivelser Statiske / dynamiske beskrivelser Klassevariabler og klassemetoder Variabler og metoder der et tilknyttet klassen (i stedet for at være tilknyttet

Læs mere

Forelæsning Uge 3 Torsdag

Forelæsning Uge 3 Torsdag Forelæsning Uge 3 Torsdag Billedredigering (bl.a. brug af for-løkker) Gråtonebilleder (som er lidt simplere end farvebilleder) Arrays Kan "opbevare" et antal objekter (som ArrayList) Fast (på forhånd kendt)

Læs mere

//Udskriver System.out.println("Hej " + ditfornavn + " " + ditefternavn + "."); System.out.println("Du er " + dinalder + " aar gammel!

//Udskriver System.out.println(Hej  + ditfornavn +   + ditefternavn + .); System.out.println(Du er  + dinalder +  aar gammel! Denne guide er oprindeligt udgivet på Eksperten.dk Brugerinput i Java Denne her artikel gennemgår diverse ting ved brug af brugerinput i Java. Den starter med det simple og fortæller derefter skridt for

Læs mere

Tree klassen fra sidste forelæsning

Tree klassen fra sidste forelæsning Programmering 1999 Forelæsning 12, fredag 8. oktober 1999 Oversigt Abstrakte klasser. Grænseflader. Programmering 1999 KVL Side 12-1 Tree klassen fra sidste forelæsning class Tree { int age; // in years

Læs mere

Forelæsning Uge 2 Torsdag

Forelæsning Uge 2 Torsdag Forelæsning Uge 2 Torsdag Niveauer af programbeskrivelser Statiske / dynamiske beskrivelser Klassevariabler og klassemetoder Variabler og metoder der et tilknyttet klassen (i stedet for at være tilknyttet

Læs mere

Forelæsning Uge 4 Mandag

Forelæsning Uge 4 Mandag Forelæsning Uge 4 Mandag Algoritmeskabeloner Kan (ved simple tilretningerne) bruges til at implementere metoder, der gennemsøger en arrayliste (eller anden objektsamling) og finder objekter, der opfylder

Læs mere

Forelæsning Uge 2 Torsdag

Forelæsning Uge 2 Torsdag Forelæsning Uge 2 Torsdag Niveauer af programbeskrivelser Statiske / dynamiske beskrivelser Klassevariabler og klassemetoder Variabler og metoder der et tilknyttet klassen (i stedet for at være tilknyttet

Læs mere

Plugin-arkitektur med.net

Plugin-arkitektur med.net Denne guide er oprindeligt udgivet på Eksperten.dk Plugin-arkitektur med.net Denne artikel viser hvordan du kan lave en plugin-arkitektur i dit program. Gør det muligt for andre at skrive udvidelser til

Læs mere

Anvendelse af metoder - Programmering

Anvendelse af metoder - Programmering Denne guide er oprindeligt udgivet på Eksperten.dk Anvendelse af metoder - Programmering En forhåbentlig rigtig god forklaring på hvad metoder er og hvordan de anvendes. Lidt om private og public, retur

Læs mere

Forelæsning Uge 3 Torsdag

Forelæsning Uge 3 Torsdag Forelæsning Uge 3 Torsdag Billedredigering Gråtonebilleder (som er lidt simplere end farvebilleder) Arrays Kan "opbevare" et antal objekter (som ArrayList) Fast (på forhånd kendt) antal elementer Afleveringsopgave:

Læs mere

Datalogi OB, Efterår 2002 OH er, forelæsning 10/ Klasser og nedarvning

Datalogi OB, Efterår 2002 OH er, forelæsning 10/ Klasser og nedarvning Datalogi OB, Efterår 2002 OH er, forelæsning 10/9-2002 Klasser og nedarvning Hvad er formålet? Typer, generisk kode, typeparameterisering Kritisk kig på, hvordan man gør i Java. Eftermiddagens opgave:

Læs mere

Singleton pattern i Java

Singleton pattern i Java Denne guide er oprindeligt udgivet på Eksperten.dk Singleton pattern i Java Denne artikel beskriver Singleton pattern og implementation i Java. Den forudsætter kendskab til Java men ikke til Singleton.

Læs mere

Parameters. Denne artikel beskriver hvorfor parameters er gode. Den forudsætter lidt kendskab til C# og ADO.NET.

Parameters. Denne artikel beskriver hvorfor parameters er gode. Den forudsætter lidt kendskab til C# og ADO.NET. Denne guide er oprindeligt udgivet på Eksperten.dk Parameters Denne artikel beskriver hvorfor parameters er gode. Den forudsætter lidt kendskab til C# og ADO.NET. Der findes en tilsvarende artikel med

Læs mere

RMI introduktion. Denne artikel beskriver Java RMI (Remtote Method Invocation).

RMI introduktion. Denne artikel beskriver Java RMI (Remtote Method Invocation). Denne guide er oprindeligt udgivet på Eksperten.dk RMI introduktion Denne artikel beskriver Java RMI (Remtote Method Invocation). Den beskriver teorien bag RMI, viser et simpelt kode eksempel og forklarer

Læs mere

Greenfoot En kort introduktion til Programmering og Objekt-Orientering

Greenfoot En kort introduktion til Programmering og Objekt-Orientering Greenfoot En kort introduktion til Programmering og Objekt-Orientering Greenfoot er et computer-program, som kan benyttes til at skrive andre computer-programmer, i et programmeringssprog kaldet Java.

Læs mere

Programmering for begyndere Lektion 2. Opsamling mm

Programmering for begyndere Lektion 2. Opsamling mm Lektion 2 Opsamling mm God tone Der er indlagt spørge sessioner Lektion 2 - Agenda Programmering for Lidt ændringer til teknikken, herunder hvordan du genser en lektion Lidt generelle tilbagemeldinger

Læs mere

Abstrakte datatyper C#-version

Abstrakte datatyper C#-version Note til Programmeringsteknologi Akademiuddannelsen i Informationsteknologi Abstrakte datatyper C#-version Finn Nordbjerg 1/9 Abstrakte Datatyper Denne note introducerer kort begrebet abstrakt datatype

Læs mere

I denne artikel vil du ved hjælp af arrays kunne afrunde et decimaltal til et helt tal.

I denne artikel vil du ved hjælp af arrays kunne afrunde et decimaltal til et helt tal. Denne guide er oprindeligt udgivet på Eksperten.dk Afrund til helt tal I denne artikel vil du ved hjælp af arrays kunne afrunde et decimaltal til et helt tal. Skrevet den 03. Feb 2009 af tjomsen I kategorien

Læs mere

Indledning. Hvorfor det forholder sig sådan har jeg en masse idéer om, men det bliver for meget at komme ind på her. God fornøjelse med læsningen.

Indledning. Hvorfor det forholder sig sådan har jeg en masse idéer om, men det bliver for meget at komme ind på her. God fornøjelse med læsningen. Indledning...2 Variabler...13 Eksempel: 1...13 Eksempel 2:...13 Eksempel 3:...15 Eksempel 4:...16 Metoder...17 Metode (intet ind og intet ud)...17 Metode (tekst ind)...18 Metode (tekst ind og tekst ud)...19

Læs mere

Algoritmeskabeloner: Sweep- og søgealgoritmer C#-version

Algoritmeskabeloner: Sweep- og søgealgoritmer C#-version Note til Programmeringsteknologi Akademiuddannelsen i Informationsteknologi Algoritmeskabeloner: Sweep- og søgealgoritmer C#-version Finn Nordbjerg 1/9 Indledning I det følgende introduceres et par abstrakte

Læs mere

Upload af billeder/filer for nybegyndere Del. 2

Upload af billeder/filer for nybegyndere Del. 2 Denne guide er oprindeligt udgivet på Eksperten.dk Upload af billeder/filer for nybegyndere Del. 2 I denne Del vil jeg ikke gaa saa dybt i fil upload som i sidste. Jeg vil i stedet forklare om funktioner

Læs mere

Ide med Diff. Mål. Tidsplan. 1.uge: 2.uge:

Ide med Diff. Mål. Tidsplan. 1.uge: 2.uge: Side 1 af 5 Ide med Diff. Min ide med differenertierings modulet er at lave et program som kan vise 3d objekter, og få lavede en konverter som kan konventer 3ds filer over til noget som flash kan bruge.

Læs mere

Forelæsning Uge 4 Torsdag

Forelæsning Uge 4 Torsdag Forelæsning Uge 4 Torsdag Algoritmeskabeloner findone, findall, findnoof, findsumof (i mandags) findbest Levetid for variabler og parametre Virkefeltsregler Hvor kan man bruge de forskellige variabler?

Læs mere

Offset til terminalskærm i Java

Offset til terminalskærm i Java Denne guide er oprindeligt udgivet på Eksperten.dk Offset til terminalskærm i Java Ikke en atikkel - men en Classe til java der gør det nemt at skrive ud på avancerede måder når man kun opererer i dosvindue.

Læs mere

PROGRAM. using System; using System.Collections.Generic; using System.Text; using System.Collections;

PROGRAM. using System; using System.Collections.Generic; using System.Text; using System.Collections; PROGRAM using System; using System.Collections.Generic; using System.Text; using System.Collections; namespace EventManager class Program static void Main(string[] args) string hovedmenu = ""; string svar;

Læs mere

Forelæsning Uge 4 Torsdag

Forelæsning Uge 4 Torsdag Forelæsning Uge 4 Torsdag Algoritmeskabeloner findone, findall, findnoof, findsumof (sidste mandag) findbest Levetid for variabler og parametre Virkefeltsregler Hvor kan man bruge de forskellige variabler?

Læs mere

Undtagelseshåndtering i C#

Undtagelseshåndtering i C# Denne guide er oprindeligt udgivet på Eksperten.dk Undtagelseshåndtering i C# I modsætning til C++ kan man i C# ikke skrive et program uden undtagelseshåndtering, så derfor har jeg skrevet denne guide

Læs mere

SWC eksamens-spørgsmål. Oversigt

SWC eksamens-spørgsmål. Oversigt SWC eksamens-spørgsmål Oversigt #1 Typer og variable #2 Aritmetik og logik #3 Klasser (definition, objekter) #4 Klasser (metoder) #5 Klasser (nedarvning, polymorfi) #6 Conditional statements #7 Repetition

Læs mere

Arrays i PHP. Denne guide er oprindeligt udgivet på Eksperten.dk. Skrevet den 04. Feb 2009 af taskmgr I kategorien Programmering / PHP

Arrays i PHP. Denne guide er oprindeligt udgivet på Eksperten.dk. Skrevet den 04. Feb 2009 af taskmgr I kategorien Programmering / PHP Denne guide er oprindeligt udgivet på Eksperten.dk Arrays i PHP De fleste som har skrevet omfattende scripts, er før eller siden stødt på problemet med at de bliver vanskelige at overskue hvis man bruger

Læs mere

I denne artikel, vil der blive gennemgået de grundlæggende PHP-funktioner, såsom udskrift til skærmen, tid og dato og if-sætningen.

I denne artikel, vil der blive gennemgået de grundlæggende PHP-funktioner, såsom udskrift til skærmen, tid og dato og if-sætningen. Denne guide er oprindeligt udgivet på Eksperten.dk Grundlæggende PHP I denne artikel, vil der blive gennemgået de grundlæggende PHP-funktioner, såsom udskrift til skærmen, tid og dato og if-sætningen.

Læs mere

Test med JUnit 3. Denne artikel introducerer JUnit 3. Den forklarer ideen med JUnit. Og den viser hvordan man konkret bruger det.

Test med JUnit 3. Denne artikel introducerer JUnit 3. Den forklarer ideen med JUnit. Og den viser hvordan man konkret bruger det. Denne guide er oprindeligt udgivet på Eksperten.dk Test med JUnit 3 Denne artikel introducerer JUnit 3. Den forklarer ideen med JUnit. Og den viser hvordan man konkret bruger det. Den forudsætter kendskab

Læs mere

Software Construction 1 semester (SWC) Spørgsmål 1

Software Construction 1 semester (SWC) Spørgsmål 1 Spørgsmål 1 Objekter #1 Giv en kort præsentation af begrebet objekt, samt hvorledes du erklærer(declare), opretter(create) og bruger objekter Du kan beskrive o Datatyper o Variable / Instans variable /

Læs mere

2013 SP1. Konfiguration af koncernindblik. Configuration Guide

2013 SP1. Konfiguration af koncernindblik. Configuration Guide 2013 SP1 Konfiguration af koncernindblik Configuration Guide Intellectual Property Rights This document is the property of ScanJour. The data contained herein, in whole or in part, may not be duplicated,

Læs mere

Send fra Java. Denne artikel fortæller hvad man skal bruge og hvordan man skal kode for at sende fra Java.

Send  fra Java. Denne artikel fortæller hvad man skal bruge og hvordan man skal kode for at sende  fra Java. Denne guide er oprindeligt udgivet på Eksperten.dk Send email fra Java Denne artikel fortæller hvad man skal bruge og hvordan man skal kode for at sende email fra Java. Simple eksempler ikke noget vildt

Læs mere

Kapitel 6 Events i C#

Kapitel 6 Events i C# Kapitel 6 i C# Når vi snakker programmering er en Event når der aktiveres specielt indbygget kode. Der sker en hændelse (event). Man siger at eventet bliver udført. De events vi skal gennemgå i dette kapitel

Læs mere

Den forudsætter kendskab til XML og C# men ikke til brug af XML i C#.

Den forudsætter kendskab til XML og C# men ikke til brug af XML i C#. Denne guide er oprindeligt udgivet på Eksperten.dk Brug af XML i C# Denne artikel vil vise lidt om hvordan man kan bruge XML i C#. Den forudsætter kendskab til XML og C# men ikke til brug af XML i C#.

Læs mere

Kapitel 4 Løkker i C#

Kapitel 4 Løkker i C# Kapitel 4 Løkker i C# Løkker en vigtig del af alle programmeringssprog, og C# er ikke andeles. En løkke er en måde at udføre en del af koden gentagne gange. Ideen er at du fortsætter med at udføre en opgave

Læs mere

Mircobit Kursus Lektion 4 (Du skal her vælge Lets Code Og herefter Block Editor.)

Mircobit Kursus Lektion 4   (Du skal her vælge Lets Code Og herefter Block Editor.) Mircobit Kursus Lektion 4 http://microbit.org/ (Du skal her vælge Lets Code Og herefter Block Editor.) I sidste lektion var der en opgave man selv skulle prøve at løse. I skulle lave et stop ur man kunne

Læs mere

Fang Prikkerne. Introduktion. Scratch

Fang Prikkerne. Introduktion. Scratch Scratch 2 Fang Prikkerne All Code Clubs must be registered. Registered clubs appear on the map at codeclubworld.org - if your club is not on the map then visit jumpto.cc/ccwreg to register your club. Introduktion

Læs mere

1B fil database. //globale variabler DateTime tid; // erklærer en variabel af typen datetime DateTime dag; // erklærer en variabel af typen datetime

1B fil database. //globale variabler DateTime tid; // erklærer en variabel af typen datetime DateTime dag; // erklærer en variabel af typen datetime 1B fil database using System; //eksterne klasser using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks;

Læs mere

Objektorienteret design med arv og polymorfi:

Objektorienteret design med arv og polymorfi: Note til Programmeringsteknologi Akademiuddannelsen i Informationsteknologi Objektorienteret design med arv og polymorfi: Substitutionsprincippet Composite Design Pattern Finn Nordbjerg Side 1 Objektorienteret

Læs mere

Lynkursus i Stencyl. Lynkursus: Lad os lave et spil! (del 1 af 5) Introduktion download programmet. Download kittet til lynkurset

Lynkursus i Stencyl. Lynkursus: Lad os lave et spil! (del 1 af 5) Introduktion download programmet. Download kittet til lynkurset Lynkursus i Stencyl Lynkursus: Lad os lave et spil! (del 1 af 5) Introduktion download programmet Den korte tutorial gennemgår trin for trin, hvad du skal gøre for at kreere en simple platform med brug

Læs mere

Ghostbusters. Introduktion. Scratch. Du skal lave et fangelegsspil med spøgelser! Arbejdsliste. Test dit Projekt. Gem dit Projekt

Ghostbusters. Introduktion. Scratch. Du skal lave et fangelegsspil med spøgelser! Arbejdsliste. Test dit Projekt. Gem dit Projekt Scratch 1 Ghostbusters All Code Clubs must be registered. By registering your club we can measure our impact, and we can continue to provide free resources that help children learn to code. You can register

Læs mere

Udvikling af DOTNET applikationer til MicroStation i C#

Udvikling af DOTNET applikationer til MicroStation i C# Udvikling af DOTNET applikationer til MicroStation i C# Praktiske tips for at komme i gang. Gunnar Jul Jensen, Cowi Hvorfor nu det? Mdl og Vba kan det hele Fordelene er : udviklingsmiljøet er eksternt

Læs mere

Listen over reserverede ord er meget lang, men de væsentligste vil jeg beskrive her i denne artikel:

Listen over reserverede ord er meget lang, men de væsentligste vil jeg beskrive her i denne artikel: Denne guide er oprindeligt udgivet på Eksperten.dk SQL og ASP En artikel omkring simpel SQL og hvordan disse opbygges, udformes og udføres, sådan at man kan få et brugbart resultat i ASP. Dette ligefra

Læs mere

Med register_globals = On får du automatisk adgang til en række variabelnavne i dit script.

Med register_globals = On får du automatisk adgang til en række variabelnavne i dit script. Denne guide er oprindeligt udgivet på Eksperten.dk Register Globals Off Lad os slå en ting fast med det samme - register_globals = Off er en god ting, i hvert fald set ud fra et sikkerhedsmæssigt synspunkt.

Læs mere

class subklasse-navn extends superklasse-navn { } NorwaySpruce har superklassen Spruce, som igen har superklassen Tree.

class subklasse-navn extends superklasse-navn { } NorwaySpruce har superklassen Spruce, som igen har superklassen Tree. Programmering 1999 Forelæsning 11, tirsdag 5. oktober 1999 Oversigt Klasse-hierarkier: superklasser og subklasser Nedarvning Polymorfi Programmering 1999 KVL Side 11-1 Hierarkier En klasse repræsenterer

Læs mere

Afsending af s vha. ASP

Afsending af  s vha. ASP Denne guide er oprindeligt udgivet på Eksperten.dk Afsending af emails vha. ASP Det kan ofte være praktisk at afsende emails fra sin hjemmeside. Denne artikel tager udgangspunkt i komponenten JMail fra

Læs mere

Tagwall med Php & MySQL

Tagwall med Php & MySQL Denne guide er oprindeligt udgivet på Eksperten.dk Tagwall med Php & MySQL Her laver vi en tagwall i Php & MySQL... jeg forklarer dog ikke så meget, men jeg håber du kan få det til at blive til en tagwall

Læs mere

Database for udviklere. Jan Lund Madsen PBS10107

Database for udviklere. Jan Lund Madsen PBS10107 Database for udviklere Jan Lund Madsen PBS10107 Indhold LINQ... 3 LINQ to SQL og Arkitektur... 3 O/R designere... 5 LINQ Den store introduktion med.net 3.5 er uden tvivl LINQ(udtales link): Language-INtegrated

Læs mere

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer DM507 Algoritmer og datastrukturer Forår 2012 Projekt, del II Institut for matematik og datalogi Syddansk Universitet 15. marts, 2012 Dette projekt udleveres i tre dele. Hver del har sin deadline, således

Læs mere

Klasser og nedarvning

Klasser og nedarvning Datalogi C, Efterår 2004 OH er, forelæsning 21/9-2004 Klasser og nedarvning Hvad er formålet? Typer, generisk kode, typeparameterisering Kritisk kig på, hvordan man gør i Java. Opgaven til senere: Generalisere

Læs mere

Grundlæggende Programmering ITU, Efterår 1999. Skriftlig eksamen i Grundlæggende Programmering

Grundlæggende Programmering ITU, Efterår 1999. Skriftlig eksamen i Grundlæggende Programmering Skriftlig eksamen i Grundlæggende Programmering ITU, 20. januar 2000 Alle hjælpemidler tilladt, dog ikke datamat. Eksamen er skriftlig, fire timer, og bedømmes efter 13-skalaen. Opgavesættet består af

Læs mere

Test med NUnit. Denne artikel introducerer NUnit. Den forklarer ideen med NUnit. Og den viser hvordan man konkret bruger det.

Test med NUnit. Denne artikel introducerer NUnit. Den forklarer ideen med NUnit. Og den viser hvordan man konkret bruger det. Denne guide er oprindeligt udgivet på Eksperten.dk Test med NUnit Denne artikel introducerer NUnit. Den forklarer ideen med NUnit. Og den viser hvordan man konkret bruger det. Den forudsætter kendskab

Læs mere

Viditronic NDVR Quick Guide. Ver. 2.0

Viditronic NDVR Quick Guide. Ver. 2.0 Viditronic NDVR Quick Guide Ver. 2.0 1 Indholdsfortegnelse 1. HOVEDMENU 3 1.1 START 5 1.2 AKTIVITETSINDIKATOR: 7 1.3 INFORMATIONS VINDUE: 7 1.4 PTZ KAMERA KONTROL: 7 1.5 SKÆRMMENU 8 1.5.1 AKTIVER BEVÆGELSE:

Læs mere

Den forudsætter kendskab til C++ og lidt kendskab til SQL og MySQL C API.

Den forudsætter kendskab til C++ og lidt kendskab til SQL og MySQL C API. Denne guide er oprindeligt udgivet på Eksperten.dk Brug af MySQL i C++ Denne artikel bygger ovenpå artiklen "MySQL C API" og forklarer hvordan man kan programmere mere objekt orienteret. Den forudsætter

Læs mere

ActiveBuilder Brugermanual

ActiveBuilder Brugermanual ActiveBuilder Brugermanual Forfatter: TalkActive I/S Dato: Juni 2004 Version: R. 1.01 Sprog: Dansk Copyright 2004 - Talk Active - all rights reserved. Indhold: 1. INDLEDNING...2 2. QUICK-START...3 3. OPBYGNINGEN

Læs mere

Python 3 kursus lektion 1:

Python 3 kursus lektion 1: Python 3 kursus lektion 1: Her laves et nyt program Her køre programmet! Her skrives koden: Gem (CTRL-s) Tryk F5 (for at køre) www.madsmatik.dk d.14-01-2016 1/5 At skrive til skærmen: Hello World Man kan

Læs mere

Læringsprogram. Christian Hjortshøj, Bjarke Sørensen og Asger Hansen Vejleder: Karl G Bjarnason Fag: Programmering Klasse 3.4

Læringsprogram. Christian Hjortshøj, Bjarke Sørensen og Asger Hansen Vejleder: Karl G Bjarnason Fag: Programmering Klasse 3.4 Læringsprogram Christian Hjortshøj, Bjarke Sørensen og Asger Hansen Vejleder: Karl G Bjarnason Fag: Programmering Klasse 3.4 R o s k i l d e T e k n i s k e G y m n a s i u m Indholdsfortegnelse FORMÅL...

Læs mere

At klippe en streng over på det mest hensigtsmæssige sted

At klippe en streng over på det mest hensigtsmæssige sted Denne guide er oprindeligt udgivet på Eksperten.dk At klippe en streng over på det mest hensigtsmæssige sted Formålet med denne artikel er at kaste lidt lys over, hvordan man klipper en streng over på

Læs mere

Ratingsystem i PHP og MySQL

Ratingsystem i PHP og MySQL Denne guide er oprindeligt udgivet på Eksperten.dk Ratingsystem i PHP og MySQL Lær at lave et system til at vise rating/bedømmelse på artikler og nyheder. Skrevet den 03. Feb 2009 af virtual1ty I kategorien

Læs mere

Tracking af YouTube i Google Tag Manager og Universal Analytics (Seneste version)

Tracking af YouTube i Google Tag Manager og Universal Analytics (Seneste version) Tracking af YouTube i Google Tag Manager og Universal Analytics (Seneste version) Introduktion til Google Tag Manager og Youtube... 1 Opsæt Tags, Variabler og Triggers... 4 A) Variabler (variables)...

Læs mere

Database design for begyndere

Database design for begyndere Denne guide er oprindeligt udgivet på Eksperten.dk Database design for begyndere Denne artikel beskriver hvordan man kommer fra ide til database design. Den stopper inden normal former. Den forudsætter

Læs mere

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 4

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 4 DM502 Forelæsning 4 Flere kontrolstrukturer for-løkke switch-case Metoder Indhold Arrays og sortering af arrays String-funktioner for-løkke Ofte har man brug for at udføre det samme kode, for en sekvens

Læs mere

Dynamisk PHP design OPDATERET

Dynamisk PHP design OPDATERET Denne guide er oprindeligt udgivet på Eksperten.dk Dynamisk PHP design OPDATERET I har måske undret jer over "http://bla.dk/?side=kontakt", her beskriver jeg hvordan, og hvorfor Skrevet den 03. Feb 2009

Læs mere

Specifikation Abstrakt OO OS-API Rev. 1.7. Specifikation. Abstrakt, objektorienteret operativsystem-api

Specifikation Abstrakt OO OS-API Rev. 1.7. Specifikation. Abstrakt, objektorienteret operativsystem-api Specifikation Abstrakt, objektorienteret operativsystem-api Indhold 1 Indledning... 3 1.1 Introduktion... 3 1.2 Formål... 3 1.3 Overordnede krav... 3 2 Ressourcer i OS-API et... 4 2.1 Tråde... 4 2.2 Timere...

Læs mere

Denne artikel er en detaljeret gennemgag af det fundamentale i batchfiler til hjemmebrug :-) FEEL THE POWER! ;-)

Denne artikel er en detaljeret gennemgag af det fundamentale i batchfiler til hjemmebrug :-) FEEL THE POWER! ;-) Denne guide er oprindeligt udgivet på Eksperten.dk Batch genopfriskning Denne artikel er en detaljeret gennemgag af det fundamentale i batchfiler til hjemmebrug :-) FEEL THE POWER! ;-) Skrevet den 03.

Læs mere

Forelæsning Uge 4 Mandag

Forelæsning Uge 4 Mandag Forelæsning Uge 4 Mandag Algoritmeskabeloner findone, findall, findnoof, findsumof Primitive typer (forfremmelse og begrænsning) Identitet versus lighed (for objekter, herunder strenge) Opfølgning på Skildpadde

Læs mere

Eksempel: et ordresystem note 5 Lagdeling s. 1

Eksempel: et ordresystem note 5 Lagdeling s. 1 Eksempel: et ordresystem note 5 Lagdeling s. 1 Eksempel: et ordre-system NiceHair er et firma, som sælger udstyr, inventar og frisørartikler til frisørsaloner over hele landet. Det er ejet af et ægtepar

Læs mere

Forelæsning Uge 2 Torsdag

Forelæsning Uge 2 Torsdag Forelæsning Uge 2 Torsdag Java syntax og style guide Sætninger Simple sætninger (assignment, interne og eksterne metodekald) Sammensatte sætninger (blok, selektion, gentagelse) Udtryk og operatorer Brug

Læs mere

Om binære søgetræer i Java

Om binære søgetræer i Java Om binære søgetræer i Java Mads Rosendahl 7. november 2002 Resumé En fix måde at gemme data på er i en træstruktur. Måden er nyttig hvis man får noget data ind og man gerne vil have at det gemt i en sorteret

Læs mere

Introduktion til Flash, fortsat

Introduktion til Flash, fortsat Introduktion til Flash, fortsat Kaspar Rosengreen Nielsen kaspar@interactivespaces.net Dagens program Opsamling på sidste forelæsning. Vi vil beskæftige os med følgende emner i dagens forelæsning: Komponenter

Læs mere

ViKoSys. Virksomheds Kontakt System

ViKoSys. Virksomheds Kontakt System ViKoSys Virksomheds Kontakt System 1 Hvad er det? Virksomheds Kontakt System er udviklet som et hjælpeværkstøj til iværksættere og andre virksomheder som gerne vil have et værktøj hvor de kan finde og

Læs mere

A Profile for Safety Critical Java

A Profile for Safety Critical Java A Profile for Safety Critical Java Martin Schoeberl Hans Søndergaard Bent Thomsen Anders P. Ravn Præsenteret af: Henrik Kragh-Hansen November 8, 2007 Forfatterne Martin Schoeberl Udvikler af JOP processoren

Læs mere

Introduktion til SQL queries

Introduktion til SQL queries Denne guide er oprindeligt udgivet på Eksperten.dk Introduktion til SQL queries Denne artikel beskriver nogle forskellige muligheder i SQL queries. Eksemplerne skulle gerne være standard SQL og virke i

Læs mere

Setup Guide Do It Now Work Smarter

Setup Guide Do It Now Work Smarter Setup Guide Do It Now Work Smarter Best Practice Education +45 4070 3035 um@bestpractice.dk Indbakke: Fjern læserude og første linje i mails 1. Vælg Vis (View) i Startside menuen 2. Vælg Læserude (Reading

Læs mere

Bits, bit operationer, integers og floating point

Bits, bit operationer, integers og floating point Denne guide er oprindeligt udgivet på Eksperten.dk Bits, bit operationer, integers og floating point Denne artikel beskriver hvordan data gemmes som bits og hvordan man kan manipulere med bits. Den forudsætter

Læs mere

Opret en formular i Dreamweaver

Opret en formular i Dreamweaver Opret en formular i Dreamweaver. Åben det html-dokument hvor du vil have din formular skal være på. 2. Klik i det felt (DIV eller tabel) hvor du vil have din formular skal være. Du kan se du er i feltet

Læs mere

Introduktion til datastrukturer. Introduktion til datastrukturer. Introduktion til datastrukturer. Datastrukturer

Introduktion til datastrukturer. Introduktion til datastrukturer. Introduktion til datastrukturer. Datastrukturer Introduktion til datastrukturer Introduktion til datastrukturer Philip Bille Datastrukturer Datastruktur. Metode til at organise data så det kan søges i/tilgås/manipuleres effektivt. Mål. Hurtig Kompakt

Læs mere

Forelæsning Uge 4 Mandag

Forelæsning Uge 4 Mandag Forelæsning Uge 4 Mandag Algoritmeskabeloner Kan (ved simple tilretningerne) bruges til at implementere metoder, der gennemsøger en arrayliste (eller anden objektsamling) og finder objekter, der opfylder

Læs mere

SWC Elementer i klassedefinition

SWC Elementer i klassedefinition SWC Elementer i klassedefinition Indhold Eksempel... 2 Karakteristika for en klasse... 3 Karakteristika for et instance field... 4 Karakteristika for en constructor... 5 Karakteristika for en property...

Læs mere

Gem dine dokumenter i BON s Content Management System (CMS)

Gem dine dokumenter i BON s Content Management System (CMS) 24. august 2007 Gem dine dokumenter i BON s Content Management System (CMS) INDHOLDSFORTEGNELSE 1. Indledning... 2 2. Se indholdet i dit Content Management System... 3 3. Tilgå dokumenterne i My Content

Læs mere

Introduktion til datastrukturer. Introduktion til datastrukturer. Introduktion til datastrukturer. Datastrukturer

Introduktion til datastrukturer. Introduktion til datastrukturer. Introduktion til datastrukturer. Datastrukturer Introduktion til datastrukturer Introduktion til datastrukturer Philip Bille Datastrukturer Datastruktur. Metode til at organise data så det kan søges i/tilgås/manipuleres effektivt. Mål. Hurtig Kompakt

Læs mere

Brugerdefineret menuer i Access

Brugerdefineret menuer i Access Denne guide er oprindeligt udgivet på Eksperten.dk Brugerdefineret menuer i Access Denne artikel henvender sig primært til let øvede brugere af Access, der ønsker at komme i gang med at tilpasse egne menuer

Læs mere

Kursusgang 12. Oversigt: Sidste kursusgang Layout-manager Event-håndtering. Design af brugerflader 12.1

Kursusgang 12. Oversigt: Sidste kursusgang Layout-manager Event-håndtering. Design af brugerflader 12.1 Kursusgang 12 Oversigt: Sidste kursusgang Layout-manager Event-håndtering Design af brugerflader 12.1 Sidste kursusgang Oversigt: Sidste kursusgang Værktøjer til udvikling og implementering af HCI-design

Læs mere

Skriftlig eksamen i Datalogi

Skriftlig eksamen i Datalogi Roskilde Universitetscenter side 1 af 9 sider Skriftlig eksamen i Datalogi Modul 1 Vinter 1999/2000 Opgavesættet består af 6 opgaver, der ved bedømmelsen tillægges følgende vægte: Opgave 1 5% Opgave 2

Læs mere