Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Tetris-palikan kääntö

kayttaja-3842 [10.04.2008 11:18:45]

#

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.
*/

TsaTsaTsaa [10.04.2008 12:23:35]

#

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);
   }
}

Metabolix [10.04.2008 13:34:08]

#

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.

kayttaja-3842 [10.04.2008 13:57:50]

#

Joo nytten toimaa, Kiitos paljon teille ;)

DumTom [14.04.2008 21:20:13]

#

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

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta