C++ -kysymykset

Muu yhteisön välinen keskustelu.
DJ-Filbe
Devoted Member
Posts: 854
Joined: Sat Feb 20, 2010 2:18 pm

Re: C++ -kysymykset

Post by DJ-Filbe »

Näillä eväillä mennään, kiitos kaikille auttaneille avusta :)
Sami345
Advanced Member
Posts: 349
Joined: Fri Aug 31, 2007 4:52 pm
Contact:

Re: C++ -kysymykset

Post by Sami345 »

Eli siis ikkunaan piirtämäni kuva välkkyy. Jos laitan glBufferDataARB:n kutsun tuonne väliin, ohjelma toimii, mutta bufferiin tallennettu data saattaa kadota.

Koodi, jossa ongelma on:

Code: Select all

    void BasicWindow::flip()
    {
        HDC oldDC = wglGetCurrentDC();
        HGLRC oldRC = wglGetCurrentContext();

        wglMakeCurrent(hDC, hRC);

        if(GLEW_ARB_pixel_buffer_object)
        {
            glUnmapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB);
            glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, getWidth(), getHeight(), GL_RGBA, GL_UNSIGNED_BYTE, 0);
            //Jos poistan kommentoinnin seuraavasta rivistä toimii, mutta bufferiin tallennettu data saattaa muuttua
            //glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, getWidth() * getHeight() * 4, 0, GL_STREAM_DRAW_ARB);
            data = static_cast<unsigned int*>(glMapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, GL_READ_WRITE_ARB));
        }
        else
        {
            glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, getWidth(), getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, getData());
        }


        glBegin(GL_QUADS);
            glTexCoord2f(0.0f, 0.0f); glVertex2f(-1.0f, 1.0f);
            glTexCoord2f(1.0f, 0.0f); glVertex2f( 1.0f, 1.0f);
            glTexCoord2f(1.0f, 1.0f); glVertex2f( 1.0f,-1.0f);
            glTexCoord2f(0.0f, 1.0f); glVertex2f(-1.0f,-1.0f);
        glEnd();

        SwapBuffers(hDC);



        wglMakeCurrent(oldDC, oldRC);
    }
Koodi, jolla testaan kirjastoani:

Code: Select all

#include <AML.hpp>

#include <iostream>
#include <exception>

int main()
{

    bool exit = false;

    AML::init();

    AML::BasicWindow window;

    window.open(300, 300, "AML testi 1", AML_WS_WINDOWED | AML_WS_MINIMIZEBOX | AML_WS_SYSMENU | AML_WS_RESIZABLE);

    window.show();

    while(!exit)
    {
        //AML::drawFilledCircle(window, 400, 300, 300, red);
        //AML::drawFilledRectangle(window2, 0, 0, 800, 600, window.getFormat().getColor(0  , 255, 0));

        AML::Event *event = AML::peekEvent();

        if(event->target == &window)
        {
            std::cout << "Window 1: " << std::endl;
        }

        switch(event->type)
        {
            case AML::CLOSE:
            {
                exit = true;
                break;
            }
            case AML::KEYDOWN:
            {
                AML::KeyDownEvent *key_event = static_cast<AML::KeyDownEvent*>(event);
                std::cout << "Down: " << key_event->key << std::endl;
                break;
            }
            case AML::KEYUP:
            {
                AML::KeyUpEvent *key_event = static_cast<AML::KeyUpEvent*>(event);
                std::cout << "Up: " << key_event->key << std::endl;
                break;
            }
        }

        delete event;

        window.fillWithColor(AML::mapRGB(0, 0, 0));

        window.drawRectangle(0, 0, 300, 300, AML::mapRGB(255, 0, 0), true);

        window.flip();


        AML::update();
    }
}
Ongelma:
ongelma.png
ongelma.png (19.72 KiB) Viewed 11206 times
EDIT:

Sain IRC:ssä vastauksen. Piti laittaa glFinish piirron loppuun.

Projektit: Fiperus - Jäädytetty pidemmäksi aikaa.
Voitot: Viikkokisa XIII, Pikapelikisa 3, Pikapelikisa 13
http://www.sami345.tk/
DJ-Filbe
Devoted Member
Posts: 854
Joined: Sat Feb 20, 2010 2:18 pm

Re: C++ -kysymykset

Post by DJ-Filbe »

Miten listaan nykyisen kansion tiedostot ja tallennan ne tiedostoon? Entä kansiossa siirtyminen tiedostosta saatavilla parametreilla?
KilledWhale
Tech Developer
Tech Developer
Posts: 545
Joined: Sun Aug 26, 2007 2:43 pm
Location: Liminka

Re: C++ -kysymykset

Post by KilledWhale »

DJ-Filbe wrote:Miten listaan nykyisen kansion tiedostot ja tallennan ne tiedostoon? Entä kansiossa siirtyminen tiedostosta saatavilla parametreilla?
Itse olen tykästynyt boostiin. Toimii useilla käyttöjärjestelmillä ja on hyvin dokumentoitu.
Iso läjä hyödyllisiä ominaisuuksia muun muassa kansiorakenteessa selaaminen.

Boost filesystem lienee se mitä haet.

Tiedostoon kirjoitus onnistuu taas fstreamin avulla, mikä löytyy standardikirjastoista.
http://www.cppreference.com/
Linkin takaa C++ I/O.
CoolBasic henkilökuntaa
Kehittäjä

cbFUN Kello
cbSDL
Whale.dy.fi

<@cce> miltäs tuntuu olla suomen paras
User avatar
esa94
Guru
Posts: 1855
Joined: Tue Sep 04, 2007 5:35 pm

Re: C++ -kysymykset

Post by esa94 »

KilledWhale wrote:
DJ-Filbe wrote:Miten listaan nykyisen kansion tiedostot ja tallennan ne tiedostoon? Entä kansiossa siirtyminen tiedostosta saatavilla parametreilla?
Itse olen tykästynyt boostiin. Toimii useilla käyttöjärjestelmillä ja on hyvin dokumentoitu.
Iso läjä hyödyllisiä ominaisuuksia muun muassa kansiorakenteessa selaaminen.

Boost filesystem lienee se mitä haet.

Tiedostoon kirjoitus onnistuu taas fstreamin avulla, mikä löytyy standardikirjastoista.
http://www.cppreference.com/
Linkin takaa C++ I/O.
Jea, boost on tähän hyvä.

Jos taas haluat pelkästään keveän Win32- ja POSIX-yhteensopivan tiedostojärjestelmäkirjaston, Dao saattaisi olla kokeilemisen arvoinen.
Sly_Jack0
Devoted Member
Posts: 612
Joined: Mon Dec 10, 2007 8:25 am

Re: C++ -kysymykset

Post by Sly_Jack0 »

Miksi kyseinen ohjelma katoaa heti ilmestyttyään?

Code: Select all

#include "SDL.h"
#include "SDL_image.h"
#include "SDL_ttf.h"
#include <string>

const int SCREEN_W = 800;
const int SCREEN_H = 600;
const int SCREEN_BPP = 32;

SDL_Surface *image = NULL;
SDL_Surface *background = NULL;
SDL_Surface *message = NULL;
SDL_Surface *screen = NULL;

SDL_Event event;

TTF_Font *font = NULL;

SDL_Color textColor = {255,255,255};

SDL_Surface *load_image(std::string filename)
{
    SDL_Surface* loadedImage = NULL;
    SDL_Surface* optimizedImage = NULL;

    loadedImage = IMG_Load(filename.c_str());

    if (loadedImage != NULL)
    {
        optimizedImage = SDL_DisplayFormatAlpha(loadedImage);

        SDL_FreeSurface(loadedImage);

		/*
        if (optimizedImage != NULL)
        {
        	Uint32 colorKey = SDL_MapRGB(optimizedImage->format,255,0,255);
        	SDL_SetColorKey(optimizedImage,SDL_SRCCOLORKEY,colorKey);
        }
        */
    }

    return optimizedImage;
}

void apply_surface(int x,int y,SDL_Surface* source,SDL_Surface* dest,SDL_Rect* clip = NULL)
{
    SDL_Rect offset;

    offset.x = x;
    offset.y = y;

    SDL_BlitSurface(source,clip,dest,&offset);
}

bool init()
{
	if (SDL_Init(SDL_INIT_EVERYTHING) == -1)
	{
		return false;
	}

	screen = SDL_SetVideoMode(SCREEN_W,SCREEN_H,SCREEN_BPP,SDL_SWSURFACE);

	if (screen == NULL)
	{
		return false;
	}

	if (TTF_Init() == -1)
	{
		return false;
	}

	SDL_WM_SetCaption("TTF test",NULL);

	return true;
}

bool load_files()
{
	image = load_image("pallot.png");
	background = load_image("bg.png");

	font = TTF_OpenFont("arial.ttf",18);

	if (image == NULL || background == NULL || font == NULL)
	{
		return false;
	}

	return true;
}

void clean_up()
{
	SDL_FreeSurface(image);
	SDL_FreeSurface(background);
	SDL_FreeSurface(message);

	TTF_CloseFont(font);

	TTF_Quit();
	SDL_Quit();
}

int main(int argc, char* args[])
{
	bool quit = false;

	if (init() == false)
	{
		return 1;
	}

	if (load_files() == false)
	{
		return 1;
	}

	message = TTF_RenderText_Solid(font,"Hello TTF world!",textColor);

	if (message == NULL)
	{
		return 1;
	}

	apply_surface(0,0,background,screen);
	apply_surface(0,150,message,screen);

	if (SDL_Flip(screen) == -1)
	{
		return 1;
	}

	while(quit == false)
	{
		while(SDL_PollEvent(&event))
		{
			if(event.type == SDL_QUIT)
			{

				quit = true;
			}
		}
	}

	clean_up();

    return 0;
}
KilledWhale
Tech Developer
Tech Developer
Posts: 545
Joined: Sun Aug 26, 2007 2:43 pm
Location: Liminka

Re: C++ -kysymykset

Post by KilledWhale »

Sly_Jack0 wrote:Miksi kyseinen ohjelma katoaa heti ilmestyttyään?

Code: Select all

SNIP
Sinulta puuttuu loopin sisästä SDL_Flip(screen);
Ainakin itselläni ohjelma pysyi päällä kun sinne laitoin vielä sen.
CoolBasic henkilökuntaa
Kehittäjä

cbFUN Kello
cbSDL
Whale.dy.fi

<@cce> miltäs tuntuu olla suomen paras
Sly_Jack0
Devoted Member
Posts: 612
Joined: Mon Dec 10, 2007 8:25 am

Re: C++ -kysymykset

Post by Sly_Jack0 »

Ei auta. Ja sitä paitsi tuolla on SDL_Flip ennen sitä looppia. Ei sen pitäisi vaikuttaa ohjelman sulkeutumiseen.
EDIT:

Sain toimimaan. En älynnyt, että se ei hae niitä fontteja Winowsin kansiosta, vaan pitää kopioida projektin mukaan.

Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm

Re: C++ -kysymykset

Post by Koodiapina »

Sly_Jack0 wrote:Sain toimimaan. En älynnyt, että se ei hae niitä fontteja Winowsin kansiosta, vaan pitää kopioida projektin mukaan.
Kyllä ne voi sieltä Windowsin kansiostakin hakea. Polku: C:\\Windows/Fonts/<fontti>

Suosittelen muuten tekemään vähän selkeämmät virheenkäsittelyt, että löydät tällaiset virheet nopeammin.
Last edited by Koodiapina on Thu Jan 06, 2011 1:23 pm, edited 1 time in total.
Sly_Jack0
Devoted Member
Posts: 612
Joined: Mon Dec 10, 2007 8:25 am

Re: C++ -kysymykset

Post by Sly_Jack0 »

Grandi wrote:Kyllä ne voi sieltä Windowsin kansiostakin hakea. Polku: C:\\Windows/Fonts/<fontti>
Tietenkin. Mutta siis, että ei hae automaagisesti.
Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm

Re: C++ -kysymykset

Post by Koodiapina »

Ihmettelin vain tuota, kun väitit, että ne fontit pitää kopioida projektiin mukaan. Yritin tarjota vaihtoehtoisen ratkaisun.
Sly_Jack0
Devoted Member
Posts: 612
Joined: Mon Dec 10, 2007 8:25 am

Re: C++ -kysymykset

Post by Sly_Jack0 »

Mitä eroa on esim. tällä

Code: Select all

SDL_Rect *rect;
ja tällä

Code: Select all

SDL_Rect* rect;
?
Ja millaisissa tilanteissa tulee käyttää kumpaa?
Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm

Re: C++ -kysymykset

Post by Koodiapina »

Ne ovat täsmälleen sama asia.
Sly_Jack0
Devoted Member
Posts: 612
Joined: Mon Dec 10, 2007 8:25 am

Re: C++ -kysymykset

Post by Sly_Jack0 »

Kiitoksia. Vähän hämäs vaan kun tutoriaalis käytetään molempia sekasin.
DJ-Filbe
Devoted Member
Posts: 854
Joined: Sat Feb 20, 2010 2:18 pm

Re: C++ -kysymykset

Post by DJ-Filbe »

Miten piirrän yksinkertaisen pikselin näyttökoordinaatteihin?
Haluaisin kaiken tarpeellisen, eli jonkun hyvin yksinkertaisen kirjaston ja esimerkin. Funktion tulisi toimia kuten CB:n DOT -komento.
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: C++ -kysymykset

Post by MaGetzUb »

Noh kannattaapi melkein käyttää SDL multimedia kirjastoa. Ja GFX lisäosa kirjastoa. ;)

Code: Select all

 Ei enää mitään..
EN ole varma tuon koodin toimivuudesta, koska olen ohjelmoinut nyt FreeBASIC:la ja se on vähän sekoittanut päätä. :)
Last edited by MaGetzUb on Fri Feb 04, 2011 10:04 pm, edited 1 time in total.
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm

Re: C++ -kysymykset

Post by Koodiapina »

Tuo koodi on niin vialla kuin voi vain olla.
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: C++ -kysymykset

Post by MaGetzUb »

Grandi wrote:Tuo koodi on niin vialla kuin voi vain olla.
No annas tulla kaikki mitä siinä on vialla? C++:a linkitys ja kaikki muukin on niin sekavaa, että luovutin sen kanssa pelleilemisen.
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm

Re: C++ -kysymykset

Post by Koodiapina »

  • Isoilla ja pienillä kirjaimilla on merkitystä. Yrität käyttää mm. If ja While.
  • Toimintakoodisi ei ole minkään funktion sisällä.
  • SDL_init(...) palauttaa -1, kun alustus epäonnistuu, muutoin 0. Iffin sisällä oleva koodi siis suoritettaisiin vain, kun alustus epäonnistuu.
  • SDL_HWSURFACE||SDL_DOUBLEBUF <- Vain yksi |-merkki.
  • While(done = true) <- Et ole määritellyt mitään done-muuttujaa, ja tuskin sellaista noista SDL-kirjastoistakaan löytyy. Lisäksi en usko, että tarkoitat tuolla ehtolauseella sitä, mitä se oikeasti tarkoittaa. done = true asettaa done-muuttujan arvoksi 1, ja samalla koko "lausekkeen arvoksi" muodostuu 1. Se on siis eri asia kuin done == true, joka kertoo onko done-muuttujan arvo 1.
Tuossa muutama juttu, mitä pikaisella vilkaisulla huomasin.
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: C++ -kysymykset

Post by MaGetzUb »

Grandi wrote:
  • Isoilla ja pienillä kirjaimilla on merkitystä. Yrität käyttää mm. If ja While.
  • Toimintakoodisi ei ole minkään funktion sisällä.
  • SDL_init(...) palauttaa -1, kun alustus epäonnistuu, muutoin 0. Iffin sisällä oleva koodi siis suoritettaisiin vain, kun alustus epäonnistuu.
  • SDL_HWSURFACE||SDL_DOUBLEBUF <- Vain yksi |-merkki.
  • While(done = true) <- Et ole määritellyt mitään done-muuttujaa, ja tuskin sellaista noista SDL-kirjastoistakaan löytyy. Lisäksi en usko, että tarkoitat tuolla ehtolauseella sitä, mitä se oikeasti tarkoittaa. done = true asettaa done-muuttujan arvoksi 1, ja samalla koko "lausekkeen arvoksi" muodostuu 1. Se on siis eri asia kuin done == true, joka kertoo onko done-muuttujan arvo 1.
Tuossa muutama juttu, mitä pikaisella vilkaisulla huomasin.
Ohups niinpäs puuttui maini... :D Joo palautuipa nyt C++ mieleeni. :)
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
Post Reply