Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Peliohjelmointialkeet

Sivun loppuun

Zmyrgel [01.09.2005 15:02:06]

#

Elikkäs olisin tässä kokeilemassa pikkasen pelin tekoa C++:lla. Täältä näyttää puuttuvan aikalailla ohjeet c++:n käyttöön mutta Qbasicille on oma peliohjelmointi tutoriaali. Aattelin tässä nyt c++ kurssin ohessa kyhätä c++ käännöksen tuosta pelitutoriaalin merkkigrafiikka pelistä ja kaipaisin apua.

Elikkäs homma kulkee kutakuinkin samaa malliin kuin basicilla mutta mitenkä...
-Ruudun leveys? [Width komento on basicissa]
-Locate komennon vastine?
-ilmeisesti C++:ssa ei ole Do-Until loop vaan pelkästään while?
-InKey vastine C++?

Tässä nyt näin aluksi kysymykset. C++:sta on vasta alkeet hallussa mutta tästä se taito lähtee kasvuun kun kokeilee vaan tehdä. Mitenkä on, kannattaako ylipäätään lähteä tekemään tällälailla Basicista kääntäen vai ihan eri malliin? Oliot ovat varmaan oleellisia tälläisissä sitten kun projekti kasvaa mutta noin muuten onko mitään huomioitavaa C++ ja Basicin eroja?

squid [01.09.2005 15:17:17]

#

Veikkaanpa, että tarvitsee jotain kirjastoa, kuten PDCureses(Windows), ja NCurses(Linux), jotta tämä onnistuu.

Mazuli [01.09.2005 15:28:06]

#

itse olen tehnyt char taulukon jota olen käyttänyt näytön merkkien säilyttämiseen ja sitten piirtänyt sen kerralla tyyliin

char naytto[25][80]; //konsoli on suunnilleen 25 riviä ja 80 merkkiä, mutta kokeile itse
void piirra_naytto() //piirtä merkit konsoliin
{
  for(int y=0;y<25;y++){ //käydään jokainen rivi läpi
    for(int x=0;x<80;x++) //jokainen merkki
      cout<<naytto[y][x]; //Tulostetaan
    cout<<endl; //rivin vaihto
  }
}
int main()
{
  naytto[10][10] = 'a'; //asetetaan merkki kohtaan 10,10
  naytto[12][4] = 'f'; //asetetaan toinen merkki kohtaan 12,4
  piirra_naytto();
  return 0;
}

Zmyrgel [01.09.2005 15:30:56]

#

kirjastoja.... hmm... Elikkäs ne sisältää komentoja joita voi sitten käyttää omassa ohjelmassa, eikö? Käytetään kuten iostream eli #include <kirjasto>... Onko näille kirjastoille joku kätevä paikka mistä nämä saa ja vielä jos olisi joku sivusto mikä listaisi mitä missäkin on niin helpottaisi elämä kummasti.

Zach [01.09.2005 19:01:59]

#

C++:lla ja QBasicilla on kyllä eroa aika lailla, eikä QB:n periaatteita aina kannata väkisin kääntää C++:lle. Lukemalla kirjoja tai muita oppaita ja lähtemällä alkeista oppii parhaiten; ensin kannattaakin tyytyä ainoastaan esim. iostreamin käyttöön. Kokeile vaikka netistä löytyviä esimerkkejä, muutat niitä, tarkkailet muutoksia ohjelman toiminnassa ja sovellat niitä sitten omissa ohjelmissa. Ja noihin kysymyksiin:
-Width ja locate eivät sisälly c++-standardiin, squidin mainitsemat kirjastot ovat hyviä merkkipohjaisiin ohjelmiin.
-Do-until -komentoa vastaava c++:ssa on do-while, esim:

int a=0;
do
{
  a++;
}while (a < 10);

-Näppäinten lukukaan ei kuulu standardiin, PD- ja NCursesista varmaankin löytyy siihen funktiot, Windowsille ohjelmoitaessa voi käyttää Winapin GetAsyncKeyState-käskyä, peliohjelmoinnissa SDL:llä, OpenGl:llä ja Directx:llä on omat funktiot jne...

Zmyrgel [01.09.2005 19:21:36]

#

Tuskasaa, mutta eiköhän tämä projekti lähde näillä eväillä käyntiin ja loppu tulee sitten varmaan opiskeltua tuon c++ kurssin ohessa.

Metabolix [01.09.2005 21:53:51]

#

Sanoisin, ettei kannata lähteä kirjoittamaan opasta itselleen heikosti tunnetulla kielellä, jos ei ole kummempaa ohjelmointikokemusta. Sitä paitsi yleispätevää tapaa ei ole pelkällä C++:lla, kun ruudun leveys voi olla mitä tahansa, eikä C++ sisällä sen muuttamiseen funktiota.

jutti [05.09.2005 10:57:56]

#

Jos "pelkällä" C++:lla haluaa tehdä pelejä, kannattaa tehdä pelkästään tekstipohjaisia pelejä. Voihan sitä luoda ASCII-grafiikkaa, mutta siinä vaiheessa kannattaa ehdottomasti tutustua johonkin grafiikkakirjastoon. Itse käytän Allegroa, joka toimii Windowsissa, Linuxessa ja MacOSX:ssä. Lähes samat koodit toimii sellaisenaan kaikissa järjestelmissä.

Tältä näyttää ohjelma, joka ei tee muuta kuin kirjoittaa oranssilla tervehdystekstin grafiikkaikkunaan:

#include <allegro.h>

void init();
void deinit();

int main() {
	init();

	textout(screen, font, "Welcome to Allegro", 100, 50, makecol(255, 128, 0));

	while (!key[KEY_ESC]) {
		/* put your code here */
	}

	deinit();
	return 0;
}
END_OF_MAIN();

void init() {
	int depth, res;
	allegro_init();
	depth = desktop_color_depth();
	if (depth == 0) depth = 32;
	set_color_depth(depth);
	res = set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0);
	if (res != 0) {
		allegro_message(allegro_error);
		exit(-1);
	}

	install_timer();
	install_keyboard();
	install_mouse();
	/* add other initializations here */
}

void deinit() {
	clear_keybuf();
	/* add other deinitializations here */
}

Jotta tämä toimii, allegron kirjasto pitää olla käännettynä ja linkitettynä. allegro.h pitää tietenkin myös olla oikeassa hakemistossa. Allegro on kirjoitettu C:llä, mutta se sopii aika kivuttomasti C++:lla ohjelmoivalle.

Zmyrgel [04.10.2005 11:43:02]

#

Heh, täällä taas. Nyt peliprojekti ottaa Tetriksen muodon. Aattelin että se on sopivan simppeli homma rakentaa. Elikkäs ongelma kohtina on seuraavat:
-Inkey$ -vastine C++ ja miten sitä käyttää
-Randomize ja Timer ja niiden käyttö (nämä kyllä on helppo katsoa itsekkin mutta kysytään nyt kuitenkin)
-DOS-boxin mitat? Näkyy yllä mutta entä miten saan DOS-boxin koko ruudulle suoraan ohjelman käynnistyessä?


Tässä nämä pääongelmat. Muuten homma on mietitty aika valmiiksi jo. Kiitoksia jo etukäteen.

Metabolix [04.10.2005 12:08:20]

#

Kuten täällä muistaakseni jo aiemmin sanottiin, niin pelkkä yleispätevä C++ ei tuohon riitä, ja siksipä onkin aika turhaa käsitellä tällaisia C++-peliohjelmointioppaassa. Tuolta opasosiosta löytyy NCurses / PDCurses -opas. Myöskään konsolin asetuksiin ei C++:lla ole mitään sanomista; toimiihan samainen C++ myös DOSissa, jossa ei mitään ikkunavaihtoehtoa ole.

Mitään Randomize-funktiota ei ole standardi-C++:n kirjastoissa. (Et kai käytä Borlandia?) Timer ei myöskään kuulosta tutulta...

Zmyrgel [04.10.2005 12:44:57]

#

Metabolix kirjoitti:

Kuten täällä muistaakseni jo aiemmin sanottiin, niin pelkkä yleispätevä C++ ei tuohon riitä, ja siksipä onkin aika turhaa käsitellä tällaisia C++-peliohjelmointioppaassa. Tuolta opasosiosta löytyy NCurses / PDCurses -opas. Myöskään konsolin asetuksiin ei C++:lla ole mitään sanomista; toimiihan samainen C++ myös DOSissa, jossa ei mitään ikkunavaihtoehtoa ole.

No, en mielellään ala kikkailemaan kirjastojen kanssa kovinkaan paljon. Kai tämä nyt on mahdollista äärimmäisen yksinkertaisesti. Tekee palikka-olion joka tippuu sitten dos-boxissa alas pelikentällä. (menee samaan malliin kuin VB:n oppaassa). On tämä kömpelö tapa mutta näin opettelun kannalta ajattelin tehdä. Eikö C++:ssa ole mitään millä tulkita mitä näppäintä käyttäjä painoi?

lainaus:

Mitään Randomize-funktiota ei ole standardi-C++:n kirjastoissa. (Et kai käytä Borlandia?) Timer ei myöskään kuulosta tutulta...

Käytän visual c++ tai Bloodshed dev-c++. Nämä funktiot olivat Basicissa mutta mikä olisi niitä vastaava juttu c++:ssa. En pyri tekemään mitään hienoa vaan kokeilla miten täälläinen yksinkertainen juttu toimisi C:llä.

Metabolix [04.10.2005 14:00:32]

#

No kun C++:n näppäimenlukufunktiot odottavat, että jotakin painetaan (Basicin INPUT tjsp). Tietysti voi yrittää käyttää conio.h:sta löytyvää getch-funktiota, mutta sekään ei ole C++:n standardia. Sitten pitää muistaa lisätä linkitettäväksi conio.o. (Projektin asetuksista, Linker ja jotakin...)

viznut [04.10.2005 14:06:02]

#

Mitäs täällä oikein höplötetään. "Randomize timer" on C:ksi srand(time(NULL)); ja sama toimii myös C++:ssa.

Tosin jos lähtötiedot ovat sitä luokkaa että etsitään qbasic-käskyille "c++-vastineita", niin kannattaa ihan suosiolla ottaa avuksi jokin kirjasto niiden merkkien lukuun ja piirtoon eikä edes yrittää väsätä lowlevel-pääterajapintaa itse :) Niin, ja C++:n opiskelu on vähemmän turhauttavaa, jos on opetellut ensin tavallisen C:n.

squid [04.10.2005 14:22:01]

#

Onhan time() funktio olemassa C++:ssa kanssa. No jos ei ole, niin jotain sinne päin.

Deewiant [04.10.2005 16:59:19]

#

viznut kirjoitti:

"Randomize timer" on C:ksi srand(time(NULL)); ja sama toimii myös C++:ssa.

Köh. Ei tässä suinkaan olla kelloa satunnaistamassa, vaan satunnaisgeneraattoria alustamassa. Eli haettu fraasi on "seed random generator with the current time".

Antti Laaksonen [04.10.2005 21:30:59]

#

Juju piileekin siinä, että QBASIC-komento kuuluu juuri "RANDOMIZE TIMER".

Megant [04.10.2005 21:46:41]

#

Niin, QBasic:in "RANDOMIZE TIMER" alustaa sen satunnaislukugeneraattorin.

Zmyrgel: Ei ehkä kannata ajatella C/C++ koodia QBasic-koodina.
Ja esimerkiksi https://www.ohjelmointiputka.net/oppaat/opas.php?tunnus=cohj_4 tuolla on satunnaisluvuista.

Jyri [05.10.2005 19:36:43]

#

http://www.nic.funet.fi/c opas/

tuolta löytää oikeastaan kaiken muun, paitsi ncursesin käytön, mutta sivuston tekijä vastaa nopeasti oikeastaan kaikkiin kysymyksiin, nimim. Kokemusta on. PALJON.

Zmyrgel [09.10.2005 17:13:42]

#

Megant kirjoitti:

Zmyrgel: Ei ehkä kannata ajatella C/C++ koodia QBasic-koodina.
Ja esimerkiksi https://www.ohjelmointiputka.net/oppaat/opas.php?tunnus=cohj_4 tuolla on satunnaisluvuista.

En ajattelekkaan sitä QBasic-koodina. Tiedän vaan QBasicista enemmän kuin C++:sta. Esim tiedän että ko. ongelmaan tarvitsen jonkin ajastimen (odotetaan joku tietty aika jatketaan ohjelman suoritusta sen jälkeen) ja random numeroita arpovan funktion (satunnaisuuksiin luonnollisesti). Eli Timer ja Randomize Basicissa tai jotain sinnepäin. En tiedä mitkä ko. funktiot ovat C++:ssa ja miten niitä käytetään joten kysyin.

Tuo ajastin on vielä hakusessa mutta tuossa linkissäsi oli kyllä tuo satunnaisluvut esitetty ihan kivasti.

Metabolix [09.10.2005 19:01:07]

#

Mutta juuri tuo, että "mikä ko. funktio on C++:ssa". Kun C++:ssa ei missään tapauksessa ole juuri tuota kyseisen kaltaista funktiota.

C++:ssa muutenkaan ei ole järjestelmäriippumatonta sekuntia tarkempaa ajastusta. DOSissa on omat funktionta (jotia mm. QB käyttää), Windowsissa (windows.h) on GetTickCount tai pienen säädön jälkeen timeGetTime ja sen kaverit, joilla pääsee millisekuntin tarkkuuteen. UNIX-puolelta löytyy funktiot periaatteessa nano- tai ainakin mikrosekuntien mittakaavaan (sys/gettime.h, clock_gettime tai gettimeofday).


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta