Eli, minulla on "pelissäni" tietue nimeltä "turf". Siitä sitten aina tilanteen mukaan teen erinäisiä "turffeja" esim. ruohoa tai seiniä. Tässä esimerkki:
struct turf { char letter; int density; int color; }; turf wall = {'#',1,COLOR_WHITE}; turf grass = {',',0,COLOR_GREEN};
Nyt meillä on wall ja grass nimiset "turffit". Nyt kun teen karttaa ja yritän laittaa esim. paikkaan map[30][30] grass:ia niin saan tälläisen virheen:
D:\C++\peli\main.cpp||In function `int mapgen()':|
D:\C++\peli\main.cpp|80|error: cannot convert `turf' to `char' in assignment|
||=== Build finished: 1 errors, 0 warnings ===|
Tässä on tuo mapgen funktio:
char map[50][60]; int mapgen() { for(int yy=0;yy<50;yy++) for(int xx=0;xx<60;xx++) map[yy][xx]=grass; return 1; }
Tiedän, että virhe tulee siitä kun yritän muuttaa char-muuttujaa turf-muuttujaksi en vain tiedä, että mitä pitäisi tehdä jotta tuon saisi toimimaan. IDEnä käytän Code::Blocksia ja ja käytän pelintekoon pdcursesia.
Ei vaan yrität muuttaa turf-muuttujaa char-muuttujaksi. Sinun pitää joko tehdä kartasta turf-taulukko tai sijoittaa kartaan grassin sijaan grass.letter. Jälkimmäisessä tapauksessa et pysty helposti piirtämään kirjaimia oikealla värillä, ensimmäisessä tapauksessa taas pitää piirtovaiheessa yhdistää turfin merkki ja väri curses-kirjastolle sopivaan muotoon.
Ongelma todellakin siis on että yrität laittaa char-tyyppiseen taulukon alkioon turf-tyyppistä muuttujaa, jonka ei ainakaan pitäisi olla mahdollista.
Selvä ratkaisu tähän toki olisi se että muuttaisit tuon map-taulukonkin char-tyyppisestä turf-tyyppiseksi, mikäli map-taulukko tulee sisältämään vain turf-tyypin muuttujia.
Jos taas kyse on siitä, että haluaisit mapin pystyvän sisältämään muitakin kuin turfeja, sanotaan vaikka esimerkiksi pörfejä. Silloin täytyy tehdä erilainen ratkaisu mapin tyypiksi: esimerkiksi tehdään erillinen structi mappiobjekteille, jotka sisältävät kaikki niille yleiset kentät, kuten letter ja muuttuja type, joka kertoo minkä tyyppinen kyseinen laatta on, ja sitten siinä olisi unioni jossa on structi, joka sisältää tyypin yksilölliset ominaisuudet, esim. seuraavanlainen, jossa on tehty esimerkkiotus poerfer joka on tyyppiä poerf:
#include <stdio.h> struct turf { int density; int color; }; struct poerf { int poerfness; int tomatance; }; #define MAP_OBJECT_TYPE_TURF 0 #define MAP_OBJECT_TYPE_POERF 1 struct map_object { char letter; int type; union { turf turf_properties; poerf poerf_properties; }; }; map_object wall = {'#',MAP_OBJECT_TYPE_TURF}; map_object grass = {',',MAP_OBJECT_TYPE_TURF}; map_object poerfer = {';',MAP_OBJECT_TYPE_POERF}; map_object map[50][60]; int mapgen() { /* Asetetaan wallin ja grassin turf-ominaisuudet ja poerferin poerf-ominaisuudet (tämän kai voi jotenkin tehdä myös alustuksessa, mutten ole ihan varma) */ wall.turf_properties.density = 1; wall.turf_properties.color = 0; grass.turf_properties.density = 0; grass.turf_properties.color = 1337; poerfer.poerf_properties.poerfness = 51; poerfer.poerf_properties.tomatance = 10; for(int yy=0;yy<50;yy++) for(int xx=0;xx<60;xx++) map[yy][xx]=grass; return 1; }
Kiitos! Kokeilen tätä tapaa.
Tuo sinun tapasi antaa tälläisen errorin:
D:\C++\peli\main.cpp||In function `int main()':|
D:\C++\peli\main.cpp|87|error: cannot convert `map_object' to `chtype' for argument `3' to `int mvaddch(int, int, chtype)'|
||=== Build finished: 1 errors, 0 warnings ===|
Tässä tämä kohta mistä error tulee:
for(int yy=0;yy<56;yy++) for(int xx=0;xx<93;xx++) mvaddch(yy,xx,map[yy][xx]);
Eli tuo mvaddch tarvitsisi muuttaa niin, että se tukisi noita map_objecteja. Tarvitsee yrittää saada tuo toimimaan. Kiitos kuitenkin!
Edit. Muokkailin noita pdcursesin joitakin funktioita niin, että ne tukisivat map_objecteja. Nyt saan tälläisen errorin:
obj\Debug\main.o||In function `main':|
D:\C++\peli\main.cpp|56|undefined reference to `_mvaddchmap'|
||=== Build finished: 1 errors, 0 warnings ===|
Tuossa koodissa siis tökkäät pdcursesin mvaddch:lle structin, joka sisältää kaikki sen kohdan tiedot, mutta ilmeisesti siis haluat laittaa näytölle sen objektin merkin, joka on kohdassa xx,yy: siis map[yy][xx].letterin, ei koko structia.
Ratkaisin ongelmani tällä tavalla:
struct turf { int density; int tunniste; }; struct mob { int x; int y; }; struct map_object { char letter; int type; int tunniste; int color; union { turf turf_properties; mob mob_properties; }; }; map_object wall = {'#',MAP_OBJECT_TYPE_TURF}; map_object grass = {',',MAP_OBJECT_TYPE_TURF}; char map[56][93]; int mapgen() { wall.turf_properties.density = 1; init_pair(0,COLOR_WHITE,COLOR_BLACK); wall.tunniste = 1; grass.turf_properties.density = 0; init_pair(1,COLOR_GREEN,COLOR_BLACK); grass.tunniste = 2; for(int yy=0;yy<56;yy++) for(int xx=0;xx<93;xx++) map[yy][xx]=grass.tunniste; map[20][40]=wall.tunniste; return 1; } int mapinpiirto() { for(int yy=0;yy<56;yy++) for(int xx=0;xx<93;xx++) switch (map[yy][xx]) { case 1: mvaddch(yy,xx,wall.letter|COLOR_PAIR(0)); continue; case 2: mvaddch(yy,xx,grass.letter|COLOR_PAIR(1)); continue; } return 1; }
Tällä tavalla toimii sekä törmäyksen tunnistus, että mapin piirtäminen! Kiitos Sharphille tuosta esimerkistä!
Jatkankin tästä sitten toisen kysymyksen parissa. Elikkäs onko kellään ideaa, että mikä tässä on vialla:
int mobgen() { int b; for(int a=0;a<10;a++) b=a; mobb[b].letter='b'; mobb[b].mob_properties.x=rand()%91+1; mobb[b].mob_properties.y=rand()%54+1; mvaddch(mobb[b].mob_properties.y,mobb[b].mob_properties.x,mobb[b].letter|COLOR_PAIR(pcolor)); srand(time(NULL)); return 1; } int mobienpiirto() { int b; for(int a=0;a<10;a++) b=a; mvaddch(mobb[b].mob_properties.y,mobb[b].mob_properties.x,mobb[b].letter|COLOR_PAIR(pcolor)); printw("Mob numero %i on koordinaateissa %i %i.",b,mobb[b].mob_properties.y,mobb[b].mob_properties.x); return 1;
Eli tämä piirtä vain yhden mobin eikä kaikkia kymmentä. Jos joku tietää syyn niin toivottavasti viitsit minulle kertoa vian.
Koodilohkon ympärillä pitää olla aaltosulut. Nyt for-silmukkasi käsittää vain rivin b=a, eli silmukassa vain sijoitat b:hen a:n arvon. Silmukan jälkeen b on 9, koska se on suurin a:n arvo, jolla silmukkaa kierretään, ja muu koodi suoritetaan ainoan kerran vasta tässä vaiheessa. Sama virhe on kummassakin funktiossa.
Olet ilmeisesti lisännyt muuttujan b siinä vaiheessa, kun kääntäjä on huomauttanut virheestä (a:ta ei löydy silmukan jälkeen) etkä ole ymmärtänyt, mistä on kyse. Ratkaisu on siis täysin väärä. Ota b pois, korvaa se a:lla ja korjaa sitten aaltosulut niin, että koodi toimii.
Tällaisten perusasioiden opetteluun suosittelen vaikkapa jotain opasta.
Ohhoh. Kiitos! En tuollaista huomannutkaan. Nyt toimii tuokin koodi! Kiitos erityisen paljon!
Edit. Olipas rumaa koodia...
Teepä ensin niin, että sisennät koodisi siististi ja nimeät muuttujat ymmärrettävästi. Mallia voit ottaa vaikka C++-oppaiden koodeista.
En jaksa perehtyä noin sotkuiseen koodiin kovin tarkasti, mutta yksi ongelma saattaa olla, että vertaat kohdesijaintia (xx, yy, nimetty todella huonosti!) toisen yksilön sijaintiin (x, y), kun sitä pitäisi ennemmin verrata toisen yksilön seuraavaan sijaintiin (xx, yy).
Järkevällä muuttujien nimeämisellä voisi olla mukavampi lukea tuota koodia. Sisennys on myös aika karmealla tolalla. Ilmeisesti AI() funktiossa jokaisen mobin liike lasketaan SGN(int) funktion avulla. px lienee pelaajan x-koordinaatti, samoin kuin py lienee pelaajan y-koordinaatti?
mobliiktark(int) funktiossa verrataan aivan epämääräisiä lukuja keskenään. Miksi mob_properties_x ja mob_properties_xx muutujat? Mutta siis jos nämä mob_properties_x ja mob_properties_xx, sekä mob_properties_y ja mob_properties_yy ovat samoja sijoitetaan mob_properties_xx muutujaan mob_properties_x, sekä mob_properties_yy muuttujaan mob_properties_y, sekä palautetaan 0, joka lopettaa AI() funktion, eikä muita mobeja käsitellä ollenkaan.
Tällainen sepustus tuli kirjoiteltua, sen pohjalta mitä tuosta pätkästä sain irti.
EDIT Metabolix näköjään vastasikin jo
EDIT 2 Ei se taida sitä kuitenkaan lopettaa, virhe lienee muualla.
Löysin virheen jo... En nyt osaa selittää että miksi se ei toiminut (En osaa...) mutta nyt se toimii... Kiitos taas auttajille ja Metabolixille kun käski sisentää paremmin... Näyttää heti paremmalta :P
Aihe on jo aika vanha, joten et voi enää vastata siihen.