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.