Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++ kuvan koon määrittäminen

Sivun loppuun

mika132 [20.11.2009 15:21:05]

#

Eli miten voin määrittää kuvan koon? Esimerkiksi kuvan koko on 100 niin siitä piirretäänkin vain muuttujan_arvo px?

Legu [20.11.2009 15:38:38]

#

Kristallipallo kertoo, että kun olet nyt räpiköinyt SDL:n kanssa, niin tämäkin kysymys koskee sitä.
Eikös se aika selvästi oppaassa lue?

mika132 [20.11.2009 16:05:56]

#

En tarkoittanut tuota kuvaa vaan siis kuva SDL_LoadBMP().

mika132 [20.11.2009 16:23:43]

#

Et ymmärtänyt. Eli teen

int leveys = kuva->w;
int korkeus = kuva->h;
leveys=leveys-jokumuuttuja
//korkeudelle sama

Vai onko helpompi tapa?

Grez [20.11.2009 16:26:56]

#

Taisin ymmärtää kysymyksesi ensin väärin.

Eli siis luulin, että haluat selvittää SDL_LoadBMP:llä ladatun kuvan koon, mutta ilmeisesti halusitkin ottaa kuvasta vain osan ja piirtää sen.

SDL_BlitSurface:n esittely:

int SDL_BlitSurface(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect);

Se siis ottaa paitsi lähde- ja kohdepinnat, myös laatikkomäärittelyn kummallekin. Eli määrittele kuvaa pienempi laatikko srcrect:iksi niin saat vain osan kuvasta.

Metabolix [20.11.2009 16:44:27]

#

Ei, ei ole helpompaa tapaa vähentää leveydestä jotain lukua kuin vähennyslasku. Se ei ole kovin mutkikasta, vai onko sinusta? Jos tiedät valmiiksi, että haluat piirtää esim. 32 pikseliä, voit tietysti kirjoittaa suoraan tämän 32:n siihen. (Olisikin typeryyden huippu laskea se joka kerta jostain lausekkeesta näennäisesti kuvan leveyden perusteella...)

Ennen kuin kysyt, miten Grezin neuvo toteutetaan, mene takaisin lukemaan opasta – siinä on esimerkki.

mika132 [20.11.2009 20:37:30]

#

Tuli tässä vain mieleen, että tämän hetken koodissani ei ole mitään logiikkaa. Eikä se edes toimi, joten mitä teen?

Koodi ei ole tälläisessä pötkössä vaan sijoitin kaikki nuo koodit tänne.

int leveys = elama_plus->w;
int korkeus = elama_plus->h;



void Huone8Piirto(void) {
	leveys=elama;
	elama_plus.w = leveys; //tarkoitus muuttaa leveys leveys muuttujaksi.
	PiirraKuva(kentta_1, naytto, 0, 0);
	KatsoOikeaHahmoKokonaan(1);
	PiirraKuva(koko_hahmo_1, naytto, vasX, vasY);
	PiirraKuva(elama_miinus, naytto, 10, 10);
	PiirraKuva(elama_plus, naytto, 10, 10);
}

Härppäää windowsin 8 ja 5 erroreita.

Teuro [20.11.2009 21:01:43]

#

mika132 kirjoitti:

Tuli tässä vain mieleen, että tämän hetken koodissani ei ole mitään logiikkaa. Eikä se edes toimi, joten mitä teen?
- -
Härppäää windowsin 8 ja 5 erroreita.

Sanon tämän nyt vielä kerran, että siirry helpompien tehtävien pariin ihan oikeasti. Tee kunnollinen tekstiseikkailu, jonka juoni ladataan ulkoisesta tiedostosta. Tee siis kunnollinen moottori, jonka ympärille peli rakentuu.

mika132 [20.11.2009 23:52:20]

#

minulla on. Ainut vain et taistelun elämäpalkki ei näy.

vehkis91 [21.11.2009 01:27:06]

#

KUNNOLLINEN MOOTTORI!!! No joo, mutta sun pitää rakentaa se palkki monesta pienestä osasta, eikä venyttää yhtä osaa.

mika132 [21.11.2009 16:57:08]

#

eikun minulla on 100px kokoinen elama_plus kuva (vihreä väri) ja elämä miinus kuva (punainen väri) Tuohon elämä miinus kuvan kokoon ei kosketa kun taas elämä plus kuva pienenee sitä tahtia, kun elämäkin. Olen tuollaisen joskus PHP:llä tehnyt yhteen selainpeliini, mutta ongelma on siinä, että siihen oli valmiit pohjat. nimittäin .CSS ja PHP muuttujat. C++ en löydä mitään valmista mihin saisi suoraan laittaa kuvan koon. :)

Metabolix [21.11.2009 17:00:31]

#

Sanoin jo edellisessä viestissäni, että oppaassa on esimerkki, jossa piirretään kuvasta vain osa. Jos et itse löydä sitä, kannattaisi kyllä lopettaa ohjelmointi, kunnes opit lukemaan kunnolla. (Jos et halua leikata kuvaa vaan skaalata sitä, niin eräässä aiemmassa keskustelussa käytit jo siihen sopivaa funktiota... Muistatko? Vast'ikään kehuit, että opit tekemällä, joten todistapa nyt oppineesi.)

Teuro [21.11.2009 19:51:27]

#

Pääohjelma

#include "funktiot.hpp"

int main (int maara, char **argumentit){
	SDL_alusta(640, 480, 16, SDL_HWSURFACE|SDL_DOUBLEBUF);
	bool kaynnissa = true;

	while(kaynnissa){
		kaynnissa = kasittele_viestit();

		piirra();
		SDL_Delay(150);
	}

    return EXIT_SUCCESS;
}

funktiot.hpp

#ifndef _FUNKTIOT_HPP
#define _FUNKTIOT_HPP

#include <SDL/SDL.h>
#include "kuvavarasto.hpp"

void SDL_alusta(int leveys, int korkeus, int syvyys, Uint32 Liput);
SDL_Rect newRect(int x, int y);
int rnd(int ala, int yla);
void liikuta(double aika);
void piirra();
bool kasittele_viestit();

#endif

funktiot.cpp

#include "funktiot.hpp"

SDL_Surface *ruutu;
SDL_Surface *plus;
SDL_Surface *miinus;
int elama = 30;

void SDL_alusta(int leveys, int korkeus, int syvyys, Uint32 Liput){
	SDL_Init(SDL_INIT_VIDEO);
	std::atexit(SDL_Quit);

	plus = image_cache::common().get("kuvat\\elama_plus.png");
	miinus = image_cache::common().get("kuvat\\elama_miinus.png");

	ruutu = SDL_SetVideoMode(leveys, korkeus, syvyys, Liput);
}

void piirra(){
	SDL_Rect kuva_alue_plus;
	SDL_Rect kuva_alue_miinus;
	SDL_Rect naytolle_miinus = {80, 80};
	SDL_Rect naytolle_plus = {80, (80+(100-elama))};

	kuva_alue_plus.x = 0;
	kuva_alue_plus.y = 0;
	kuva_alue_plus.h = elama;
	kuva_alue_plus.w = 50;

	SDL_BlitSurface(miinus, 0, ruutu, &naytolle_miinus);
	SDL_BlitSurface(plus, &kuva_alue_plus, ruutu, &naytolle_plus);

	SDL_Flip(ruutu);
}

bool kasittele_viestit(){
	SDL_Event event;
	bool kaynnissa = true;

	while (SDL_PollEvent(&event)) {
		// Painettiinko ruksia?
		if (event.type == SDL_QUIT) {
			kaynnissa = false;
		}
		if (event.type == SDL_KEYDOWN){
			switch (event.key.keysym.sym) {
				// Escape ja Q lopettavat.
				case SDLK_ESCAPE:
				case 'q':
					kaynnissa = false;
					break;
				case 'a':
					elama += (elama < 100) ? 1 : 0;
					break;
				case 'z':
					elama += (elama > 0) ? -1 : 0;
					break;
				default:
					kaynnissa = true;
			}
		}
	}
	return kaynnissa;
}

Lopuksi vielä putkasta kuvavarasto

Tämän lisäksi tarvitaan vielä elama_plus.png (50 x 100 px) ja samankokoinen elama_miinus.png. Tuohon voisi vielä laittaa dynaamiset kuvien mitat, kun nyt ne ovat vielä kovakoodattuja numeroita.


Sivun alkuun

Vastaus

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

Tietoa sivustosta