Bonjour,
Depuis quelques semaines maintenant j'essaye de programmer un petit jeu 2D en utilisant Qt, jusqu'à présent je n'ai rencontré aucun réel problèmes, mais là je dois dire que je bloque complètement.
Je vous explique mon problème, je crée une map à partir d'un fichier xml en dessinant chaque cases (Tiles) sur un QImage que je stocke ensuite dans l'instance de la classe Map ainsi créée.
Cependant si pour une raison ou une autre, je veux mettre à jour une de ces Tiles, j'ai mis en place un système de signal relié à un slot qui met à jour le QImage de l'instance. Le problème c'est que ce système ne fonctionne pas, mon premier réflexe a été de vérifier mon code, dans lequel je n'ai trouvé aucun soucis, ensuite j'ai tenté de débugger le code et là comme par magie, le code fonctionne, la Map se met à jour. N'y comprenant plus rien je m'adresse à vous.
Pour vous aidez à mieux cerner mon problème voici le code "fautif":
map.cpp
tile.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 #include "map.h" Map::Map(QString filename) { _tilesets = new QHash<QString, Tileset>(); _layers = new QVector<QVector<Tile*>* >(); QFile *file = Map::loadFile(filename); _reader = new QXmlStreamReader(file->readAll()); parse(); QPixmap p = createPixmap(); setImage(p); setRect(p.rect()); QVectorIterator<QVector<Tile*>* > layers(*_layers); while(layers.hasNext()) { QVector<Tile*> layer = *layers.next(); for(int i=0; i<layer.size(); i++) { Tile* t = layer.value(i); Map::connect(t, SIGNAL(changed()), this, SLOT(reloadPixmap())); } } } void Map::reloadPixmap() { setImage(createPixmap()); } Tile* Map::getTile(int layer, int idx) const { Tile *t = _layers->at(layer)->value(idx); return t; }
mainwindow.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 #include "tile.h" Tile::Tile(QPixmap image, QPoint pos, bool walkable): Drawable(image, pos), _walk(walkable) { } bool Tile::isWalkable() const { return _walk; } void Tile::changeImage(QPixmap newImage) { _image = newImage; emit changed(); }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 void MainWindow::keyPressEvent(QKeyEvent *KeyEvent) { switch(KeyEvent->key()) { case Qt::Key_Escape: close(); break; case Qt::Key_A: Tileset t = ((Map*)_map)->getTileset("main"); Tile *tt = ((Map*)_map)->getTile(0, 1); tt->changeImage(t.getPixmap(14)); break; } }
Partager