Avatar billede joggy Nybegynder
22. oktober 2003 - 15:21 Der er 20 kommentarer og
2 løsninger

C++/Grafik/DOS

Jeg kunne godt tænke mig at lære og få grafik med i mine programme. Indtil kan jeg dog kun finde ud af at programmere til DOS.. Det jeg leder er nogen der evt. har nogle ekspempler jeg kan kigge på, eller nogen steder hvor der ligge nogle gode tutorial, eller noget i den art.

Udover grafik vil jeg også gerne lære hvordan jeg får mine programme til at reagere på pile tasterne f.eks.

Håber der er nogen der kan hjælp.
Avatar billede soreno Praktikant
22. oktober 2003 - 15:30 #1
Der er en masse tutorials til OpenGL her:
http://nehe.gamedev.net/
Avatar billede overchord Nybegynder
22. oktober 2003 - 15:31 #2
Start evt med at laese noget om Bitblt (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_0fzo.asp) hvis det er windooze du vil lave grafik til.
Du kan selvfoelgeligt ogsaa hoppe direkte i OpenGL (http://fly.cc.fer.hr/~unreal/theredbook/) eller DirectX (http://www.scorpioncity.com/djdirectxtut.html eller http://www.codeguru.com/directx/index.shtml)

Det er en stejl indlaeringskurve....men go fornoejelse
Avatar billede soreno Praktikant
22. oktober 2003 - 15:32 #3
Det er en fordel hvis du i forvejen har styr på grundlæggende c/c++.
Avatar billede joggy Nybegynder
22. oktober 2003 - 17:48 #4
Jeg har nemlig ikke 100% styr på det endnu, så det jeg faktisk søger er hvordan jeg laver grafik til DOS.. Ligesom de gamle basic spil. Ganske almindelig 2D grafik, evt lavet i paint :)
Avatar billede soreno Praktikant
22. oktober 2003 - 18:06 #5
Du finder lidt om grafik i DOS her:
http://nomad.openglforums.com/tutorials.html
Avatar billede joggy Nybegynder
22. oktober 2003 - 18:10 #6
Kanon.. Nu tror jeg har lidt stof, så vil jeg gå i gang med at læse :)

Takker for hjælpen.. Deler pointene op.
Avatar billede joggy Nybegynder
22. oktober 2003 - 18:32 #7
Lige et lille ekstra spørgsmål.. Har i nogle forslag til en god compiler, fordi den jeg har som hedder bloodshed, synes ikke den vil virke til de eksempler der på http://nomad.openglforums.com/tutorials.html
Avatar billede soreno Praktikant
22. oktober 2003 - 18:38 #8
Du skal en tur på museum.

Det er nemlig en DOS compiler du skal bruge.

Du finder Turbo-c her:
http://community.borland.com/museum/

(Du bør nok holde dig fra Turbo-c++)
Avatar billede soreno Praktikant
22. oktober 2003 - 18:39 #9
Avatar billede joggy Nybegynder
22. oktober 2003 - 18:41 #10
Hehe.. Okay, men jeg takker igen :)
Avatar billede joggy Nybegynder
23. oktober 2003 - 19:49 #11
Hvis nogen af jer kloge hoveder, stadig kigger med på denne tråd har jeg desværre stadig brug for lidt hjælp..

Jeg har fået det til at virke såen lidt.. Men har nogle problemer.. Der er ingen problemer når den bruger BIOS til at køre grafikken, men når jeg går over til at bruge memory går den i sort.. Plus at jeg har nogle problemer med at det grafik jeg sætter ind bliver det helt sindsygt i min dos-prompt.

Nogen gode forslag?
Avatar billede soreno Praktikant
23. oktober 2003 - 19:52 #12
Det med memory kan være fordi du ikke må adressere hardware direkte under Windows (går ud fra du kører DOS under Windows).

Ang. hastighed.
Du skal sætte et wait-for-vertical-retrace ind i koden.

F.eks
#include <dos.h>
#include <stdio.h>
#include <stdlib.h>

void render();
void changeMode(int mode);
void putPixel(int x, int y, unsigned char color);
void setPalette(char colorNum, char r, char g, char b);
void getPalette(char colorNum, char *r, char *g, char *b);
void vsync();

void main()
{
  changeMode(0x13);
  render();
  getch();
  changeMode(0x03);
}

void render()
{
  int i;
  int colorNum;

  for(i=0;i<1000;i++)
  {
    putPixel(random(320), random(200), random(256));
    vsync();
  }

  getch();

  for(colorNum=0;colorNum<256;colorNum++)
  {
    setPalette(colorNum, 63, 63, 63);
    vsync();
  }
}

void changeMode(int mode)
{
  union REGS regs;
  regs.x.ax = mode;
  int86(0x10, &regs, &regs);
}

void putPixel(int x, int y, unsigned char color)
{
  pokeb(0xa000, x+(y*320), color);
}

void setPalette(char colorNum, char r, char g, char b)
{
  outp(0x3c8, colorNum);
  outp(0x3c9, r);
  outp(0x3c9, g);
  outp(0x3c9, b);
}

void getPalette(char colorNum, char *r, char *g, char *b)
{
  outp(0x3c7, colorNum);
  (*r) = inp(0x3c9);
  (*g) = inp(0x3c9);
  (*b) = inp(0x3c9);
}

void vsync()
{
  /* wait until any previous retrace has ended */
  do
  {
  }while(inportb(0x3da & 8));

  /* wait until a new retrace has just begun */
  do
  {
  }while(!(inportb(0x3da) & 8));
}

Avatar billede joggy Nybegynder
23. oktober 2003 - 19:57 #13
Det så ud til at virke det der i hvertfald.. Den startede med en masse prikker, så trykkede jeg enter, så kom der nogle andre prikker og så kom der en helt hvid skærm.. Er dette korrekt? Kan ikke lige læse koden endnu.. Ville ikke gå igang med at lære det, før jeg vidste at det virkede på min computer :)

En anden ting jeg tænkte på.. Kan man virkelig ikke få den til at køre med en anden opløsning?
Avatar billede soreno Praktikant
23. oktober 2003 - 19:59 #14
Joooe, det kan du godt.

Men glem bekymringer om det indtil du har fået styr på det grundlæggende.

Det er nemlig ret besværligt at gøre i DOS.
Avatar billede joggy Nybegynder
23. oktober 2003 - 20:00 #15
Hehe okay.. Jamen så takker jeg igen.. :)
Avatar billede joggy Nybegynder
24. oktober 2003 - 14:02 #16
Jeg ved at jeg har spurgt en del efter hånden.. Men jeg håber virkelig i gider og hjælpe mig, med forhåbenlig den sidste ting. Jeg har lavet et lille stykke kode, som jeg overhovedet ikke ved om at rigtigt.. Men så vidt jeg kan forstå skulle den lave en blå streg på skærmen.. Men når jeg køre den, er det som om at den bare springer ud af programmet, dog ser min dos-promt meget sjov ud bagefter, men en masse underlige farver.

Kode:

#include <graphics.h>
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
#include <DOS.H>
#include <MEM.H>

  /*--[ SETS SCREEN TO MODE 13H ]------------*/
  void setGFXMODE() {
    _AX = 0x0013;
    geninterrupt(0x10);
  }

  /*--[ SETS SCREEN TO TEXT MODE ]----------*/
  void setTXTMODE() {
    _AX = 0x0003;
    geninterrupt(0x10);
  }

void pixelBIOS(int x,int y,char color) {
    _AH = 0x0C;
    _AL = color;
    _CX = x;
    _DX = y;
    _BX = 0x01;
    geninterrupt(0x10);
}

void main() {
    setTXTMODE();

    printf("Test1\n");

    (void)getch();

    setGFXMODE();
    setcolor(19);
    line(0,0,200,150);

    (void)getch();

    setTXTMODE();

    printf("Test2\n");
}
Avatar billede soreno Praktikant
24. oktober 2003 - 18:00 #17
Når du bruger:
line(...)

så mener jeg den kommer fra:
#include <graphics.h>


For at bruge de funktioner der er i graphics skal du initialisere graphics på en anden, for mig ukendt, måde.
Avatar billede joggy Nybegynder
24. oktober 2003 - 21:28 #18
Okay.. Du skulle vel ikke en kende en anden måde man kan laver streger på så? Bare fordi, at det er fedt nok at jeg kan få den til at komme med x antal pixels, jeg kan bare ikke bruge det til så meget, hvis jeg nu gerne vil have en kasse af en art :)
Avatar billede soreno Praktikant
25. oktober 2003 - 06:58 #19
Brug pixelBIOS(x, y, color)

Sådan er de fleste grafiske biblioteker faktisk bygget op (når bare man dykker langt nok ned i dem).
De har en metoden til at tegne en pixel med en bestemt farve.
Metoder til at tegne mere abstrakte ting (linier, polygoner) laver man metoder til (oftest er disse også en del af det grafiske bibliotek - bare ikke i mode13h).

Start med at kigge lidt på, hvad er en linie ?
  En linie består af nogle pixels.
  Det må man kunne lave via pixelBIOS


(Jeg havde egentlig mere jeg ville skrive - men jeg står og skal til at ud af døren. Fortsættelse følger - måske :-)
Avatar billede soreno Praktikant
25. oktober 2003 - 07:09 #20
Du kan evt prøve at tegne en tyk streg på et stykke ternet papir.
Så vil du se hvad jeg mener.

Start med at lave en metode der kan tegne horisontale (eller vertikale) linier.
Avatar billede joggy Nybegynder
25. oktober 2003 - 13:39 #21
Har fået den til at lave linie nu.. Men det er ikke så godt.. Fordi jeg kan ikke bestemme hvor på skærmen den skal starte.. Jeh gjorde sådan her:

for(n=0;n<1000;n++) {
  putPixel(random(99), 150, 150);
}

Så laver den nemlig en linie. Men den starter jo helt ude ved kanten. Hvis jeg nu gerne vil have den til at starte på midten af siden, hvad gør jeg så?
Avatar billede soreno Praktikant
27. oktober 2003 - 07:07 #22
Kig lidt i de tutorials fra linksene, feks.
http://nomad.openglforums.com/part05.html
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester