Re: C++ -kysymykset
Posted: Sat Sep 18, 2010 5:21 pm
Näillä eväillä mennään, kiitos kaikille auttaneille avusta
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);
}
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();
}
}
Sain IRC:ssä vastauksen. Piti laittaa glFinish piirron loppuun.
Itse olen tykästynyt boostiin. Toimii useilla käyttöjärjestelmillä ja on hyvin dokumentoitu.DJ-Filbe wrote:Miten listaan nykyisen kansion tiedostot ja tallennan ne tiedostoon? Entä kansiossa siirtyminen tiedostosta saatavilla parametreilla?
Jea, boost on tähän hyvä.KilledWhale wrote:Itse olen tykästynyt boostiin. Toimii useilla käyttöjärjestelmillä ja on hyvin dokumentoitu.DJ-Filbe wrote:Miten listaan nykyisen kansion tiedostot ja tallennan ne tiedostoon? Entä kansiossa siirtyminen tiedostosta saatavilla parametreilla?
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.
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;
}
Sinulta puuttuu loopin sisästä SDL_Flip(screen);Sly_Jack0 wrote:Miksi kyseinen ohjelma katoaa heti ilmestyttyään?Code: Select all
SNIP
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>Sly_Jack0 wrote:Sain toimimaan. En älynnyt, että se ei hae niitä fontteja Winowsin kansiosta, vaan pitää kopioida projektin mukaan.
Tietenkin. Mutta siis, että ei hae automaagisesti.Grandi wrote:Kyllä ne voi sieltä Windowsin kansiostakin hakea. Polku: C:\\Windows/Fonts/<fontti>
Code: Select all
SDL_Rect *rect;
Code: Select all
SDL_Rect* rect;
Code: Select all
Ei enää mitään..
No annas tulla kaikki mitä siinä on vialla? C++:a linkitys ja kaikki muukin on niin sekavaa, että luovutin sen kanssa pelleilemisen.Grandi wrote:Tuo koodi on niin vialla kuin voi vain olla.
Ohups niinpäs puuttui maini... Joo palautuipa nyt C++ mieleeni.Grandi wrote:Tuossa muutama juttu, mitä pikaisella vilkaisulla huomasin.
- 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.