Eli olen tekemässä simppeliä tetris peliä C/C++ ja multimedia kirjasto SDL:ää hyödyntäen.
Eli ongelma on se, että mine saisin käänettyä tetriksessä tulevia palikoita
eli jokainen objekti koostuu 4 palikasta ja jokaiselle palikalle on oma
koordinaattinasa
esim
palikka[1].x = 0; palikka[1].y = 0; palikka[2].x = 32; palikka[2].y = 0; palikka[3].x = 0; palikka[3].y = 32; palikka[4].x = 0; palikka[4].y = 64; //Eli nytten palikka muotoituisi /* [1][2] [3] [4] */ //...niin miten voin kääntää objektia esim et se olisi /* Esim: [4][3][1] [2] ...tähän varmasti löytyy joku kätevä laskutapa, mutta en oikein saa nytten päähäni sellaista. */
Olisiko tämmöisestä mihinkään:
class Palikka { public: Palikka(); // Rakentajalle joku järkevä toteutus, että saa palikat tehtyä fiksusti ~Palikka(); void kaanna(); void piirra(); private: struct Pala { int offsetx, offsety; // kertoo paljonko eroa keskuspalaan }; std::vector< Pala > palat_; int keskusx_; int keskusy_; }; // Kääntää myötäpäivään keskuspalikan ympäri void Palikka::kaanna() { for (unsigned int i = 0 ; i < palat_.size() ; ++i) { int tmp = palat_.at(i).offsety; // tämä toimii jos 0,0 on vasen ylänurkka palat_.at(i).offset(y) = palat_.at(i).offsetx; palat_.at(i).offset(x) = -tmp; } } void Palikka::piirra() { // piirraPala on joku funktio, mikä piirtää jonkun pökäleen annettuihin koordinaatteihin piirraPala(keskusx_, keskusy_); for (unsigned int i = 0 ; i < palat_.size() ; ++i) { piirraPala(keskusx_ + palat_.at(i).offsetx, keskusy_ + palat_.at(i).offsety); } }
Ei ole lainkaan tyhmempi ajatus myöskään laittaa eri asentoja suoraan ohjelmaan.
4x4-ruudukon kääntö keskustan ympäri taitaisi mennä näin:
for (i = 0; i < 4; ++i) { for (j = 0; j < 4; ++j) { uusi[i][j] = vanha[3-j][i]; } }
Eli toisin sanoen
for (i = 0; i < palat.size(); ++i) { int x = palat[i].x, y = palat[i].y; palat[i].y = x; palat[i].x = -y + 3; }
Tämän voi johtaa TsaTsaTsaan koodista toteamalla, että muunnoksen (x, y) = (-y, x) jälkeen kappale on siirtynyt kolme ruutua negatiiviselle x-akselille. Aluksi pienin koordinaatti on (0, 0) ja suurin (3, 3), lopuksi taas "suurin" on (-3, 3), joten lisäämällä x:ään kolme päästään taas oikeaan paikkaan.
Joo nytten toimaa, Kiitos paljon teille ;)
unsigned char blocks[7][64]= { // Mod. huom. Älä nyt kuitenkaan floodaa, kysyjä voinee itse laatia taulukon kaikista eri asennoista. Ja johan tätä ehdotettiin. };
Mod. lisäsi kooditagit
Aihe on jo aika vanha, joten et voi enää vastata siihen.