Mistä johtuu, että aina aloittaessani uuden projektin niin tulee tämä:
MSVCR90.dll ei löytynyt. Jos laitan sen pelin kanssa samaan kansiion tulee
MSCVR90.dll ei löytynyt. Lisään senkin niin tulee windows errori 142, joka taas tarkoittaa:
Järjestelmä ei voi suorittaa JOIN- tai SUBST-toimintoja tällä hetkellä.
Mistä se johtuu? Osa projekteistani alkaa toimimaan joskus ilman noita tiedostoja taas toinen puoli pyytää tuota koko ajan ja jos laitan ne niin alkaa windows errorien suur sade, enkä tiedä mistä johtuu, kun olen sen tähän mennessä vahinkossa korjannut, joten nyt kysyn mistä johtuu?
Joskus et luultavasti tarvitse niitä dll-tiedostoja pelin hakemistossa, koska ne löytyy jostain windowsin syövereistä(ympäristömuuttujien takaa). Tuohon toiseen virheilmotukseen en voi arvata kuin että dll-tiedoston versio on väärä.
Ei voi olla versio väärä, kun se toimii silloin tällöin.
Missä noiden tiedostojen pitäisi tarkalleen olla. Siis.
MSVCR90.dll
MSCVR90.dll
MSVCRTD.dll
Noniin laitoin tiedostot.
MSVCR90.dll
MSVCRTD.dll
Windows/system kansioon mihin ne selvästikkin kuuluu ja:
Errori on tälläinen pelin käynnistäessä:
Unhandled exception at 0x7c91b21a in openjasdl.exe: 0xC0000005: Access violation writing location 0x00000010.
Käsittääkseni tuo virheilmoitus liittyy muistinhallintaan sillä tavalla että ohjelma yrittää kirjoittaa muistialueelle jota se ei ole varannut itselleen, vika siis lienee koodissa.
#include "stdafx.h" #include <iostream> #include <string> #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include "windows.h" #include <cmath> #include <io.h> #include <SDL.h> #include <SDL_rotozoom.h> #include "SDL_ttf.h" #pragma comment(lib, "SDL_ttf.lib") #pragma comment(lib, "SDLmain.lib") #pragma comment(lib, "SDL.lib") #pragma comment(lib, "SDL_gfx.lib") int main(int argc, char *argv[]) { if( SDL_Init(SDL_INIT_VIDEO) < 0 ) { fprintf(stderr, "SDL:n alustus ei onnistunut: %s\n", SDL_GetError()); // virheestä tiedot tiedostoon return 0; } SDL_Surface *naytto; naytto = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE|SDL_FULLSCREEN|SDL_DOUBLEBUF); SDL_Quit(); return 0; }
Kokeile asentaa vcredist_x86.exe.
Tuo on "virallinen" tapa asentaa nuo puuttuvat palikat. Pelkkä DLL:ien kopiointi ei välttämättä riitä.
Koodi lienee kunnossa, ainakin linuxilla rullaa kunhan poistaa pragmat ja korjaa/poistaa ylimääräiset include-rivit. Vika siis kaiketi juuri noissa tiedostoissa.
Ei auttanut mikään noistakaan. Eli kerron tarkalleen mitä teen. (Projektinani on Console Application)
1. Käynnistän debuggerin.
2. Se lataa ongelmitta.
3. Tulee errori ikkuna KUVA
4. Painan OK
5. Tulee taas error ikkuna. "Sovelluksen alustus epäonnistui (0xc0000142). Lopeta sovellus valistemalla OK
6. Painan OK.
7. Tulee Visual C++ errori ikkuna. "Unhandled exception at 0x7c9666c6 in openjasdl.exe: 0xC0000142: DLL Initialization Failed."
8. Painan Continue.
9. Kuva menee mustaksi kuin peli yrittäisi käynnistyä, mutta palaakin takaisin Visual C++ errorin kanssa. "Unhandled exception at 0x7c91b21a in openjasdl.exe: 0xC0000005: Access violation writing location 0x00000010."
10. Nyt saan painaa Continue vaikka millä mitalla, mutta silti tuo ei tuosta katoa, vaan sama errori tulee. Joten painan Break ja tulee "There is no source code available for the current location."
11. huomasin myös, että consoli jäi auki. Eli peli ei sammunut kokonaan vain se ns. graaffinen fullscreen mode ei käynnisty. (Eikä auta vaikka ottaisin Fullscreenin pois).
Kokeile ilman mitään ylimääräisiä C-spesifisiä kirjastoja. Vaikka tällä koodilla:
#include <iostream> #include <SDL.h> int main(int argc, char *argv[]) { if( SDL_Init(SDL_INIT_VIDEO) < 0 ) { std::cout << "SDL:n alustus ei onnistunut: " << SDL_GetError() << std::endl; return 0; } SDL_Surface *naytto; naytto = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE|); SDL_Quit(); return 0; }
Jossain kuitenkin vikaa silti, kun kerran virhettäkin pukkaa.
Oletko kokeillut jotain toista IDEä? Esim. Code::Blocks saattaisi olla kokeilemisen arvoinen.
Sama Show tulee silti. Eli tuo ylempi viestini.
Mites sitten ihan perus helloworld ohjelma? Tähän tyyliin:
#include <iostream> int main() { std::cout << "Hello world!" << std::endl; return 0; }
Teet siis uuden projektin, console application, ja sitten isket tuon koodin sinne ja ajat sen.
Itse en noista Microsoftin työkaluista tai ympäristöstä ymmärrä niin paha muuta ehdottaa kun IDE:n vaihtoa.
Voisitko kertoa hieman tuosta Code Blocista? Miten SDL ja muut asennetaan siihen? Miten nämä lib:it haetaan siihen kun visual C++:
#pragma comment(lib, "joku.lib")
Ja miten muuten CodeBlock eroaa Visual C++ työkaluissaan yms?
Code::Blocks on varsin simppeli IDE(Ainakin verrattuna VC++:n), huomattavasti vähemmän toiminnallisuutta kuin Microsoftin tekeleissä. Kuitenkaan et tuota "ylimääräistä" toiminnallisuutta varmasti vielä tässä vaiheessa niin tarvitse ettetkö voisi hyvinkin käyttää tuota Code::Blocksia.
Code::Blocks täältä: http://www.codeblocks.org/
SDL-ohjeet täältä: http://www.lazyfoo.net/SDL_tutorials/index.php
Kyllä se siitä lähtee. ;)
Juuri tätä tarkoitan. Miksi kääntäjien pitää olla niin erillaisia, mutta asiaan:
#include "SDL/SDL.h" int main( int argc, char* args[] ) { SDL_Init( SDL_INIT_EVERYTHING ); SDL_Delay(5000); //Pistin siks et se ei sammu heti. SDL_Quit(); return 0; }
Kuitenkin debugger ei käynnisty vaan ilmoittaa error ikkunan jossa valitetaan, että debuggerin asetuksia ei ole määritelty. Mitä asetuksia?
Ja sitten koitin build and run niin tulee vain:
"RacePhysics - Debug" uses an invalid compiler. Skipping...
Nothing to be done.
Kai latasit sen paketin jossa tulee MinGW mukana? Eli sen isomman(19 Mt vrt. 10 Mt) paketin?
Jos näin on, niin googlettamalla tuota "uses an invalid compiler. Skipping..."-tekstiä löytyy tällainen aihe josta voi olla apua: http://forums.codeblocks.org/index.php?topic=6902.0
Mikäli latasit tuon pienemän paketin(jossa ei siis tule kääntäjää ja debuggeria mukana) niin lataa se isompi paketti ja kokeile sillä.
Kyllä se kohta toimii.
hmm.. En ymmärtänyt tuota täysin eli mitä pitää laittaa tuonne executableen? Tuon pelin osoite vain kansio missä pelit ovat?
Toolchain executables tarkoittaa kansiota josta löytyy kääntäjä, linkkeri, debuggeri jne. Eli siis sinne tarjotaan se MinGW kansio joka löytyy varmaan sieltä Code::Blocksin kansion syövereistä jostain.
Kannattaisi suoraan vain asentaa se oikea paketti, joka laittaa asetuksensa automaattisesti kuntoon.
Ja tämän löytää mistä, koska latasin Code Blocin omilta kotisivuilta tuon.
Lataat sieltä sivuilta sen isomman paketin, niin pitäis toimia.
Osaatko lukea?
http://www.codeblocks.org/downloads/5:
Windows 2000 / XP / Vista:
File Date Size Download from codeblocks-8.02-setup.exe 28 Feb 2008 10.8 MB Sourceforge or BerliOS codeblocks-8.02mingw-setup.exe 28 Feb 2008 19.3 MB Sourceforge or BerliOS NOTE: The codeblocks-8.02mingw-setup.exe file includes the GCC compiler and GDB debugger from MinGW.
NOTE: The compiler included in codeblocks-8.02mingw-setup.exe does not work reliable on Windows Vista. Please do not use it and install a more recent one from MinGW. That is because at the time Code::Blocks was released there was no working GCC for Windows Vista available. Meanwhile there is.
yes but my english not good.
Eli latasin silloin itse:
codeblocks-8.02mingw-setup.exe
tuon. Eikö se ole oikea?
Luitko vielä loppuun? Jos käytät Windows Vistaa, joudut asentamaan itse kääntäjästä uudemman version; linkki löytyy C++-oppaan liitteestä.
Käytän ihan Windows XP:tä.
En ole vieläkään onnistunut asentamaan tuota. Mistä näen, että onko kaikki asetukset kohdillaan? :O
poista se code::blocks jonka asensit ennen tota oikeeta. ja vistalla ainakin mulla tuli linkkerin virhe joskus.
Poistin kaiken mikä viittasi Code::Blocks ohjelmaan ja asensin uudestaan. Ei toiminut, mutta saan errorin yrittäessäni suorittaa debuggausta.
En nyt täysin ymmärrä mikä muka täytyy muuttaa? :O
Niin, siis valitset sen debugger-ohjelman sinne. En tiedä mikä se on MinGW-ympäristössä, mutta GCC:n debuggeri on gdb, joka voi myös olla sama MinGW:llä.
Miksi muuten yrität debuggausta edes? Se koodihan yleensä käännetään(compile) ensin. :)
Jos painan compile file niin ei tapahdu mitään ja sen jälkeen koitan painaa RUN niin ei tapahdu mitään. Pitääkö siis gdb ladata itse koneelle? sen jälkeen kun debuggaa niin käynnistyy lähdekoodin suorituskin? :O
En nyt muista miten code::blocksissa tuo homma toimii, mutta miten olis "Build & run"-namiska?
Kun menet tuonne Settings/compiler and debugger -> programs, niin mitä on siinä "compiler"-kohdassa?
öö...öö... Taidan laittaa kuvan selventämään olenko edes oikeassa paikassa:
siellä code blocksin pääikkunassa jossa on se ite koodi etti ylhäältä semmonen paikka missä lukee debug ja vaihda se releaseen. ainakin toi eka virhe näytti siltä ettei debuggeria (gdb) oo asennettu.
Mitä jos teet näin:
1: File -> New -> Project...
2: Listasta "SDL Project"
3: Project title jne kenttiin jotain randomia
4: Compiler kohdassa valitset "GNU GCC Compiler", ja valitset vain "Create release configuration".
5: Eteen hyppää tyhjä projekti, Build-valikosta valitset "Build and Run", tai vaihtoehtoisesti painat F9-nappia.
Tämä vaatinee sen että sinulla on Code::Blocks, MinGW ja SDL:n kehitystiedostot asennettuna. Jos ei toimi, vika mitä ilmeisimmin jossain noista. Tällä hetkellä näyttää siltä että Code::Blocks ei tunnista MinGW:n työkaluja jostain syystä.
No nyt on gdb asennettu. En vain ole täysin varma missä dpg.exe sijaitsee ja miten linkkaan sen kääntäjälle?
Settings -> Compiler and debugger -> Global compiler settings -valikosta pääset säätämään kääntäjien, linkkerin ja debuggerin polkuja.
C kääntäjä on gcc, C++ kääntäjä on g++, jne.
Tosin että niiden pitäisi olla jo valmiiksi asetettuina.
No siinä syy miksi tuolla on jo jokin .exe valmiina, mutta miksi sitten ei debuggaa eikä anna testata koodia?
Toimiiko noilla minun aiemin antamilla ohjeilla?
Se kysyy SDL polkua eikä hyväksy tuota jonka annan sille. (Miksei kääntäjän asennus voisi vain olla yhtä helppoa kuin Visual C++. (ei ole kysymys vaan oma pohdinta tähän väliin))
Kai olet seurannut näitä ohjeita?
http://www.lazyfoo.net/SDL_tutorials/lesson01/
Sinulta luultavasti puuttuu SDL:n kehitystiedostot, kaikki tarvittava on selitetty tuossa kyllä, minimaalisella englannintaidolla pärjää kun kuvista saa varmaan tarpeeksi selkoa.
Miten olet taas saanut homman sotkettua noin? Minulla Code::Blocks on aina toiminut suoraan ensimmäisellä asennuksella ilman minkäänlaisia lisäsäätöjä. Ehkä sinun kannattaa käyttää jotain helpompaa kieltä ja ympäristöä.
Ei vaan yksinkertaisesti tuo ei nyt ymmärrä minua enkä minä sitä. Seurasin tismalleen noita ohjeita joka sanasta joka kuvaan, mutta ei niin ei. En oikaissut missään kohdassa, enkä tehnyt mitään muutakaan.
Auttaisiko video-ohje Code::Blocksin asennuksesta?
Video auttoi sen verran, että sain toimimaan tuon lähes. Se nyt ei vain avaa mitään SDL funktiota. Johtuuko kenties siitä, että en tiedä onko SDL:än .lib tiedostot tuossa mukana? Miten ne otetaan käyttöön, kun pragma comment oli visual C++ niin mikä on Code::Blocissa?
en saa nyt millään noita linkkereitä asennettua vaan ilmoittaa:
Linking console executable: bin\Debug\TGRPEngine.exe
D:\SDL-1.2.14\lib\libSDL.la: file not recognized: File format not recognized
collect2: ld returned 1 exit status
Process terminated with status 1 (0 minutes, 0 seconds)
0 errors, 0 warnings
En tajua miksi ohjeessa on libSDL.a ja minulla taas koneessa .la? :o
Nyt oikeasti. En teen mitä vain se tekee saman. Jos muutan tuon tiedoston:
libSDL.la --> libSDL.a
tulee sama errori:
Linking console executable: bin\Debug\TGRPEngine.exe
D:\SDL-1.2.14\lib\libSDL.a: file not recognized: File format not recognized
collect2: ld returned 1 exit status
Process terminated with status 1 (0 minutes, 0 seconds)
0 errors, 0 warnings
Mistä se johtuu?
Ainakaan alimmassa ohjeessa ei mainita kertaakaan tiedostoa libSDL.a. Riittää, että linkkaat tiedostot libmingw32.a, libSDLmain.a ja libSDL.dll.a, kuten ohjeessakin.
No tästähän se hauskuus alkoikin sitten! :)
Missä ihmeen herculeksessa nyt mättää? :O
/Users/hercules/trunk/SDL-1.2/./src/main/win32/SDL_win32_main.c:227: undefined reference to `_SDL_strlcpy'
/Users/hercules/trunk/SDL-1.2/./src/main/win32/SDL_win32_main.c:243: undefined reference to `_SDL_SetModuleHandle'
D:\Code Block\CodeBlocks\MinGW\lib\libSDLmain.a(SDL_win32_main.o): In function `WinMain':
/Users/hercules/trunk/SDL-1.2/./src/main/win32/SDL_win32_main.c:303: undefined reference to `_SDL_strlcpy'
/Users/hercules/trunk/SDL-1.2/./src/main/win32/SDL_win32_main.c:304: undefined reference to `_SDL_strlcat'
/Users/hercules/trunk/SDL-1.2/./src/main/win32/SDL_win32_main.c:327: undefined reference to `_SDL_strlcpy'
/Users/hercules/trunk/SDL-1.2/./src/main/win32/SDL_win32_main.c:328: undefined reference to `_SDL_strlcat'
/Users/hercules/trunk/SDL-1.2/./src/main/win32/SDL_win32_main.c:370: undefined reference to `_SDL_strlcpy'
Lataa vaikka tästä libSDL.a ja libSDLmain.a. Varmista myös, että linkityksessä kirjastot ovat oikeassa järjestyksessä (mingw32, SDLmain, SDL).
Tuo oli ongelma. En tiennyt, että järjestykselläkin oli jokin väli, mutta kiitos paljon! :)
E: Nyt tulikin ongelmainen. Näiden "ylimäärä" tiedostojen kanssa.
Eikös seuraava tarkoita, että ei voida luoda linkkeriä:
Compiling: data\start.ss
mingw32-g++.exe: C:\Documents and Settings\Mika.KOTI-8FEC3C6EF1\Työpöytä\tyopoydan_kansiot\CPelit\
No minulla on koodirivissä:
#include "data/start.ss"
Eli pitäisi olla tehty. Vai tehdäänkö nuo omien tiedostojen lisät johonkin toiseen paikkaan?
Rivi pitäisi olla muodossa
#include "data\\start.ss"
Opettelepa sitten käyttämään niitä tiedostoja oikein, kuten on kai pari kymmentä kertaa kehotettu. Nimeä tiedostosi tavallisilla päätteillä (cpp ja h), jotta kehitysympäristö osaa käsitellä ne oikein, ja unohda nuo itse keksimäsi omituiset include-kikkailut ja katso mallia niistä kahdesta Koodin jakaminen -koodivinkistä.
\tyopoydan_kansiot\CPelit\World Leaders 2\data\start.c|3|error: syntax error before '*' token|
Ja koodina on:
SDL_Surface *naytto;
SDL_Surface *aloituskuva; //rivi 3!
SDL_Surface *aloituskuva2; /Sama errori tässä
bool pois=false;
Mitä tuo tarkoittaa?
Oletko ehkä jättänyt SDL.h:n liittämättä?
Kyllä se siellä on.
#include <iostream>
#include <SDL/SDL.h>
#include "data\start.c"
#include "data\functions.h"
Includeista sen verran, että poluissa olisi syytä käyttää vain forward slashejä ( / ), eikä suinkaan backslasheja, vaikka Windows niistä tykkääkin. '\'-merkillä on parempaakin tekemistä kuin toimia poluissa kansioerottimina.
Jos tuo on kerta rivi 3, niin sitten siellä ei mitenkään voi olla oikeita includeja ennen noita kyseisiä koodeja. Ymmärrät kai, että tiedoston jäsentely menee seuraavanlaisesti:
lainaus:
Includet
globaalit muuttujat
funktioprotot
funktiot
eli jos ensimmäisellä rivillä on esim "int sdl_main(int argc, char **argv) {" niin ei voi tosiaankaan includet olla kohillaan. Includet eivät ole globaaleja. Eli jos tiedostossa jotain.c includetaan ensin SDL ja sitten tuo "start.c", niin start.c:n täytyy itse huolehtia omista includeistaan, eli se _myös_ tarvitsee SDL:n includeihinsa.
Kuten Metabolix on jo monta kertaa sanonut, unohda ne include kikkailut ja tee niin kuin koodivinkki neuvoo.
Koodista tulee uskomattoman pitkää jos laitan kaiken samaan tiedostoon? Eikös katoss nyt.
#include <iostream> #include <SDL/SDL.h> #include "data\functions.h" using namespace std; SDL_Surface *naytto; SDL_Surface *aloituskuva; SDL_Surface *aloituskuva2; bool pois=false; void LadataanPeli(void) { aloituskuva=SDL_LoadBMP("data/grafiikat/world_leaders_logo.bmp"); aloituskuva2=SDL_LoadBMP("data/grafiikat/world_leaders_logo_2.bmp"); } void PiirraKuva(SDL_Surface *kuva, SDL_Surface *naytto, int x, int y) { SDL_Rect alue; alue.x = x; alue.y = y; SDL_BlitSurface(kuva, NULL, naytto, &alue); // piirto } void LopetusPainikkeet(SDL_Event tapahtuma){ SDL_PollEvent(&tapahtuma); if ( tapahtuma.type == SDL_QUIT ) { pois = true; } if ( tapahtuma.type == SDL_KEYDOWN ) { if ( tapahtuma.key.keysym.sym == SDLK_ESCAPE ) { pois = true; } } } int main(int argc, char *argv[]) { if( SDL_Init(SDL_INIT_VIDEO) < 0 ) { fprintf(stderr, "SDL:n alustus ei onnistunut: %s\n", SDL_GetError()); return 0; } Uint8* nappi; SDL_Event tapahtuma; SDL_PollEvent(&tapahtuma); naytto = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE|SDL_FULLSCREEN|SDL_DOUBLEBUF); LadataanPeli(); while (pois==false) { PiirraKuva(aloituskuva, naytto, 350, 250); SDL_Flip(naytto); LopetusPainikkeet(tapahtuma); } while (pois==false) { } SDL_FreeSurface(aloituskuva); SDL_Quit(); return 0; }
Mielestäni yksinkertaisempaa:
#include <iostream> #include <SDL/SDL.h> #include "data\start.c" //alustukset #include "data\functions.h" //funktiot int main(int argc, char *argv[]) { if( SDL_Init(SDL_INIT_VIDEO) < 0 ) { fprintf(stderr, "SDL:n alustus ei onnistunut: %s\n", SDL_GetError()); return 0; } Uint8* nappi; SDL_Event tapahtuma; SDL_PollEvent(&tapahtuma); naytto = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE|SDL_FULLSCREEN|SDL_DOUBLEBUF); LadataanPeli(); while (pois==false) { PiirraKuva(aloituskuva, naytto, 350, 250); SDL_Flip(naytto); LopetusPainikkeet(tapahtuma); } while (pois==false) { } SDL_FreeSurface(aloituskuva); SDL_Quit(); return 0; }
Mutta sitten ongelmaan. Vaikka laitan kaiken samaan tiedostoon se ei silti piirrä mitään, vaikka piirtofunktio käsky on laitettu?
Näyttää vain pelkän mustan näytön. Kyseessä on console application projekti. Eli olen kaiken tehnyt Code::Blocissa samalla tavalla kuin VisualC++ mutta mikään konsti ei ole toiminut. Ei includet eikä nyt piirtäminenkään, joten tehdäänkä sekin eri tavalla?
Tai sitten voit kokeilla tällaista versiota.
#include "funktiot.hpp" #include <iostream> int main(int argc, char **argv){ SDL_alusta(800, 600, 32, SDL_DOUBLEBUF); bool jatkuu = true; try{ lataa(); }catch(std::exception &e){ std::cout << e.what() << std::endl; } while(jatkuu){ jatkuu = kasittele_viestit(); piirra(); } tallenna(); return EXIT_SUCCESS; }
funktiot.hpp tiedosto sisältää funktioiden esittelyt.
#ifndef _FUNKTIOT_HPP #define _FUNKTIOT_HPP #include <string> #include <vector> #include <cmath> #include <sstream> #include <fstream> #include <exception> #include "kuvavarasto.hpp" #include <SDL/SDL.h> #include <SDL_ttf.h> #include <ctime> void SDL_alusta(int leveys, int korkeus, int syvyys, Uint32 Liput); bool kasittele_viestit(); void piirra(); float kulunut_aika(); SDL_Rect uusi_paikka(int x, int y); void tallenna(); void lataa(); std::vector <std::string> file(std::string nimi); std::vector<std::string> explode(std::string erotin, std::string rivi); #endif
käynnistyy kyllä, mutta ei piirrä mitään. Enkä nyt kopioinut koodistasi kuin muutaman kohdan, koska eikös koodini aja suurin piirtein saman asian tällä hetkellä? Mutta missä vika kun se ei piirrä?
main.cpp:
#include "data\functions.hpp" #include <iostream> int main(int argc, char *argv[]) { if( SDL_Init(SDL_INIT_VIDEO) < 0 ) { fprintf(stderr, "SDL:n alustus ei onnistunut: %s\n", SDL_GetError()); return 0; } Uint8* nappi; SDL_Event tapahtuma; SDL_PollEvent(&tapahtuma); naytto = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE|SDL_FULLSCREEN|SDL_DOUBLEBUF); LadataanPeli(); while (pois==false) { PiirraKuva(aloituskuva, naytto, 350, 250); SDL_Flip(naytto); LopetusPainikkeet(tapahtuma); } while (pois==false) { } SDL_FreeSurface(aloituskuva); SDL_FreeSurface(aloituskuva2); SDL_Quit(); return 0; }
functions.hpp:
#ifndef _FUNCTIONS_HPP #define _FUNCTIONS_HPP #include <SDL/SDL.h> using namespace std; SDL_Surface *naytto; SDL_Surface *aloituskuva; SDL_Surface *aloituskuva2; bool pois=false; void LadataanPeli(void) { aloituskuva=SDL_LoadBMP("data/grafiikat/world_leaders_logo.bmp"); aloituskuva2=SDL_LoadBMP("data/grafiikat/world_leaders_logo_2.bmp"); } void PiirraKuva(SDL_Surface *kuva, SDL_Surface *naytto, int x, int y) { SDL_Rect alue; // mille alueellä näyttöä kuva piirretään alue.x = x; // koordinaatit alue.y = y; SDL_BlitSurface(kuva, NULL, naytto, &alue); // piirto } void LopetusPainikkeet(SDL_Event tapahtuma){ SDL_PollEvent(&tapahtuma); if ( tapahtuma.type == SDL_QUIT ) { pois = true; } //poistumistapahtuma if ( tapahtuma.type == SDL_KEYDOWN ) { if ( tapahtuma.key.keysym.sym == SDLK_ESCAPE ) { pois = true; } // näinkin voi lukea näppäimiä } } #endif
MIks sulla on 2 while-silmukkaa tuolla? Ei tosin liity piirtämiseen mitenkään...
Kuka oikeasti jaksaa sinua neuvoa, kun taaskaan et ole noudattanut annettuja neuvoja? Muutamia mainitakseni: kenoviivat tiedostonimissä, koodin jako tiedostoihin vinkkien 1770 ja 1901 mukaisesti... Ottaisit vaikka matopelioppaasta mallia.
En tiedä missä vika oli, mutta tein jotain kyllästyessäni ja kuva ilmestyi, mutta kiitos kaikille. =)
E: Voiko muuten .avi tiedostoja avata ja näyttää jollakin tavalla?
Voit ladata tästä esimerkin, jota olen hetken aikaa rakennellut. Tuossa ladataan joitakin kuvia ja tehdään hiukan laskentaa ja lisänä on vielä tallennus- ja latausfunktiot. Tuo ei välttämättä täytä kaikkia hienoja koodaustapoja.
En löytänyt mistään, että miten voi luoda uusia olioita. Siis osaan luoda olion, mutta esimerkiksi jos painaa M kirjainta niin tulee uusi olio. Miten se toteutetaan? Eli käytännössä kloonataan uusi olio jolla on omat ominaisuutensa.
E: olioon liittyvät koodit:
class Panssarivaunut { public: int nopeus; void Piirretaan(int piste_x, int piste_y); void Ohjaus(); }; void Panssarivaunut::Piirretaan(int piste_x, int piste_y){ PiirraKuva(panssarivaunu, naytto, piste_x, piste_y); SDL_Flip(naytto); } void Panssarivaunut::Ohjaus(){ sijainti_x+=1; } Panssarivaunut SuomenPanssarivaunu; PiirraKuva(kentta_1, naytto, 0, 0); SuomenPanssarivaunu.Ohjaus(); SuomenPanssarivaunu.Piirretaan(sijainti_x, sijainti_y); SDL_Flip(naytto);
Katso matopelioppaasta mallia, siellä luodaan madolle uusia jaokkeita aina omenan kohdalla.
Teen varmaan jotain väärin, koska tämä ei toimi. Tai ei ainakaan tule lisää panssarivaunuja:
struct Panssarivaunut { public: int nopeus; void Piirretaan(int piste_x, int piste_y); void Ohjaus(); struct SuomenPanssarivaunu { float sijainti_x2, sijainti_y2; }; }; void Panssarivaunut::Piirretaan(int piste_x, int piste_y){ PiirraKuva(panssarivaunu, naytto, piste_x, piste_y); SDL_Flip(naytto); } void Panssarivaunut::Ohjaus(){ sijainti_x+=1; } if (huone==3) { Panssarivaunut SuomenPanssarivaunu; PiirraKuva(kentta_1, naytto, 0, 0); SuomenPanssarivaunu.Ohjaus(); SuomenPanssarivaunu.Piirretaan(sijainti_x, sijainti_y); nappi = SDL_GetKeyState(NULL); if (nappi[SDLK_m]) { new Panssarivaunut::SuomenPanssarivaunu; } SDL_Flip(naytto); }
Eli vaikka painan kuinka paljon M kirjainta niin ei tapahdu mitään.
Pitäisikö sinulla olla luokkana Panssarivanu, josta noita vaunuja luodaan? Suomen panssarivaunut eivät tarvitse omaa luokkaa.
mika132 kirjoitti:
if (nappi[SDLK_m]) { new Panssarivaunut::SuomenPanssarivaunu; }
Mitä ihmettä tuon rivin olisi tarkoitus tehdä?
... ja luitko sitä opasta? Ei siinä todellakaan noin tehty. Sitä paitsi eihän tuo koodi voi mitenkään edes kääntyä, joten miten voit muka testata sitä? Edit: Jaa, onhan siellä se SuomenPanssarivaunu-struct myös. Mutta miksi ihmeessä on myös muuttuja samalla nimellä? Toivottavasti ymmärrät, ettei noilla kahdella ole mitään yhteyttä toisiinsa.
Miksei se muka voi kääntyä?
Ja sen rivin tarkoitus on katsoa, että jos painetaan nappia M niin luodaan uusi panssarivaunu, mutta se ei luo mitään. Vain sen yhden mikä tehdään tuossa if (huone==3) alapuolella.
Kuten jo sanottua ymmärrätkö ollenkaan mitä olet koodaamassa, vai laitatko eri juttuja ja toivot, että se toimisi? Tuon if-lauseen jälkeen luodaan aina 'SuomenPanssarivaunu' niminen olio. Sen sijaan tuon toisen if-lauseen jälkeen tehdään jotain ihan kummallista. Ymmärrtäkö siis mitä siinä tapahtuu? Jos haluat uuden panssivaunun pitäisi se luoda jossakin, jota varten josakin olisi hyvä olla '=' merkki.
No enää en ymmärrä. Miten voin luoda panssarivaunun käyttäen = merkkiä?
No vaikka seuraavilla tavoilla tuo onnistuu. Kaikki tavat eivät vaadi '=' merkkiä.
Panssivaunut[seuraava_vapaa_indeksi] = new Panssarivaunu; Panssarivaunu *pv = new Panssarivaunu; Panssarivaunu pv; Panssarivaunut.push_back(Panssarivaunu());
Kysynpä vielä kerran: katsoitko matopelioppaasta, miten jaokkeita luodaan, minne ne tallennetaan ja miten kaikki luodut jaokkeet käydään läpi?
vähän offtopiccia mutta mitä tarkoitat jaokkeella?
alottelijaa kirjoitti:
vähän offtopiccia mutta mitä tarkoitat jaokkeella?
Matopelioppaassa puhutaan jaokkeista eli palluroista, jotka muodostavat madon. Ei varsinainen ohjelmointitermi. :>
Monet eläimet muodostuvat jaokkeista. Valitettavasti suomenkielisen Wikipedian resurssit aiheesta ovat aika heikot, mutta ehkä tämä artikkeli auttaa.
tgunner kirjoitti:
Ei varsinainen ohjelmointitermi.
Minusta on aivan perusteltua käyttää matopelissä oikeita biologian termejä, puhutaanhan sotapeleissäkin aseista ja ajoneuvoista oikeilla termeillä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.