GalFortier
-
Modifié le 6 juin 2018 à 12:20
Whismeril
Messages postés18400Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention29 mai 2023
-
6 juin 2018 à 17:58
Bonjour,
je code un jeu en 2D de style pokémon et je veux que les textures de 30x30 pixels s'affichent au complet sur un Panel. Pour ce faire, j'ai créé un projet de référence (qui donne un .dll) dans lequel la classe "Core" s'y trouve. J'y ai déclaré mon Panel appelé "World" et une classe appelé "Tile" où les paramètres des tuiles (image en arrière-Plan, Image en avant-plan, collision, Position).
Mon problème est que lorsque j'appelle la méthode dans Core.Render(), celle-ci déclanche l'événement Paint correctement, Mais seulement 1 tuile a été dessiné.
public void OnRender(string renders)
{
//Call Paint Event of World.
Renders = renders;
WORLD.Paint += new PaintEventHandler(RenderWorld);
}
private void RenderWorld(object sender, PaintEventArgs e)
{
OnPaint(e);
}
protected override void OnPaint(PaintEventArgs e)
{
Graphics g = e.Graphics;
if (Renders == "Player")
{
}
else if (Renders == "World")
{
for (int y = 0; y < XC - 2; y++)
{
for(int x = 0; x < YC - 2; x++)
{
base.OnPaint(e);
g.DrawImage(TILE[x, y].BACK_TEXTURE, TILE[x, y].DIM, TILE[x, y].DIM, GraphicsUnit.Pixel);
g.DrawImage(TILE[x, y].FORE_TEXTURE, TILE[x, y].DIM, TILE[x, y].DIM, GraphicsUnit.Pixel);
}
}
}
else
{
}
}
Whismeril
Messages postés18400Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention29 mai 2023623 6 juin 2018 à 07:25
Bonjour
tout d'abord, pour augmenter tes chances de réponses, mieux utiliser les outils du site est conseillé.
Pour la coloration syntaxique, il faut précisé le langage, sinon ça fait un block tout gris et pas scrollable. Voir ici http://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code Sur la même page, tu trouveras comment insérer des images directement dans le message plutôt que chez un autre hébergeur.
De façon générale, à propos de ton code:
Si comme, je le suppose, la méthode OnRender est appelée à de multiples reprises alors cette ligne ne doit pas y figurer
WORLD.Paint += new PaintEventHandler(RenderWorld);
(c'est mieux avec des couleurs non?) en effet à chaque fois tu abonnes une nouvelle instance de RenderWorld à cette évènement. Cette ligne doit être écrite à une endroit où elle sera exécuté une seule fois (le constructeur par exemple).
Faire des choix avec des string est déconseillé, en effet si pour une raison ou une autre, la méthode reçoit
"player"
au lieu de
"Player"
ça ne marchera pas. Il est préférable d'utiliser des énumérations.
Pour ton problème:
Impossible de te réponse sans connaitre
le comportement que tu as observé en exécutant en pas à pas,
le contenu des variables lors de cet exécution
De plus on ne voit pas le code ou tu ajoutes tes tuiles dans le panel.
En fait, OnRender() est appelé une seule fois dans CORE.Init(). Mais avant que OnRender() soit appelé, la méthode calcule le nombre de tuile qu'il y a dans un ficher .map (exemple: 48:00:00:06 = 1 tuile avec 4 paramètres, soit les 2 premiers étant les textures et le dernier étant si il y a une collision) et la méthode va lire chaque paramètres et va configurer chaque tuiles. Par la suite, une fois que toutes les tuiles ont été configurées, OnRender() est lancée.
Whismeril
Messages postés18400Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention29 mai 2023623 6 juin 2018 à 17:58
Alors soit, ça n'est appelé qu'une fois, mais ça resterait plus logique d'abonner un évènement dans le constructeur ou dans ta méthode Init() que dans une méthode de rendu.
Quand au reste, ça ne répond pas à mes questions, on ne peut toujours pas te répondre.
Au passage, merci à Jordane d'avoir corrigé ta coloration syntaxique.
6 juin 2018 à 16:40