Crunchez vos adresses URL
|
Rejoignez notre discord
|
Hébergez vos photos
Page 10 sur 15 PremièrePremière ... 23456789101112131415 DernièreDernière
Affichage des résultats 271 à 300 sur 448
  1. #271
    Ouvre plutôt un topic spécial pour ça. Comme ça ceux qui veulent tester, te répondre, whatever, ne pollueront pas ce topic qui est avant tout destiné à une rubrique de CanarcPC.
    I am Moanaaaaaaa !!! (et en version legit!)

  2. #272
    Tu penses ? Vu que c'est un jeu XNA et que le but est d'apprendre le C# via XNA, je me suis dit que le lieu était propice au partage des codes sources documentés.

  3. #273
    Oui, mais ce topic-ci fait référence à une série d'articles dans CPC, pour apprendre à programmer un Shoot'em up. Donc ouvre bien un topic dédié à ton projet, ce sera mieux, et tu seras aussi visible.
    I am Moanaaaaaaa !!! (et en version legit!)

  4. #274
    Bonjour tout le monde.

    Je voudrais dire un gros merci à monsieur Sébum. Grâce à lui, je réalise le rêve de mon fils, un fan de Terraria qui s'était imaginé un jeu dans le même genre et avait même déjà dessiné les sprites sous gimp. En lisant Développez couché (et en me souvenant de mes cours d'algo), je lui ai programmé un mini-jeu ...

    capture2.jpg

    On saute, on creuse, on stock la pierre et on construit.

    Il est ravi.

    Donc : merci Canard PC !

  5. #275

  6. #276
    Citation Envoyé par Famnusix Voir le message
    Bonjour tout le monde.

    Je voudrais dire un gros merci à monsieur Sébum. Grâce à lui, je réalise le rêve de mon fils, un fan de Terraria qui s'était imaginé un jeu dans le même genre et avait même déjà dessiné les sprites sous gimp. En lisant Développez couché (et en me souvenant de mes cours d'algo), je lui ai programmé un mini-jeu ...

    capture2.jpg

    On saute, on creuse, on stock la pierre et on construit.

    Il est ravi.

    Donc : merci Canard PC !
    Ton fils a bon gout

    Tu comptes passer le code source pour faire profiter la communauté ou ça reste confidentiel ?

    Beau boulot en tout cas

  7. #277
    Non, non, rien de confidentiel.

    Par contre, c'est de la programmation artisanale, roulée à la main sous les aisselles. Pas sûr que ce soit lisible ... ou un modèle à suivre !

    Code:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using Microsoft.Xna.Framework;
    using Microsoft.Xna.Framework.Audio;
    using Microsoft.Xna.Framework.Content;
    using Microsoft.Xna.Framework.GamerServices;
    using Microsoft.Xna.Framework.Graphics;
    using Microsoft.Xna.Framework.Input;
    using Microsoft.Xna.Framework.Media;
    
    namespace VGame
    {
        /// <summary>
        /// This is the main type for your game
        /// </summary>
        public class Game1 : Microsoft.Xna.Framework.Game
        {
            const int MAXX = 512, MAXY = 256;
    
            GraphicsDeviceManager graphics;
            SpriteBatch spriteBatch;
            Random aleatoire = new Random();
    
            Texture2D[] textures = new Texture2D[5];
            Texture2D[] mobs = new Texture2D[2];
            Texture2D[] items = new Texture2D[4];
            Texture2D blank, bouton;
            SpriteFont _font;
    
            int[,] terrain = new int[MAXX, MAXY];
            int[,] arrièreplan = new int[MAXX, MAXY];
            int x, y;
            int[] ceinture = new int[10];
            int[] nombre = new int[10];
            int outilActifGauche, outilActifDroite;
            int hauteurSaut;
            bool peutSauter, peutAgir;
            bool modeFantome;
            TimeSpan attenteAction, tempsAction;
            TimeSpan attenteMouvement, tempsMouvement;
            TimeSpan attenteChute, tempsChute;
            
            MouseState ms;
            int xs, ys;
            int xf, yf;
                
            public Game1(){
                graphics = new GraphicsDeviceManager(this);
                Content.RootDirectory = "Content";
            }
    
            /// <summary>
            /// Allows the game to perform any initialization it needs to before starting to run.
            /// This is where it can query for any required services and load any non-graphic
            /// related content.  Calling base.Initialize will enumerate through any components
            /// and initialize them as well.
            /// </summary>
            protected override void Initialize()
            {
                // TODO: Add your initialization logic here
    
                base.Initialize();
            }
    
            /// <summary>
            /// LoadContent will be called once per game and is the place to load
            /// all of your content.
            /// </summary>
            protected override void LoadContent()
            {
                // Create a new SpriteBatch, which can be used to draw textures.
                spriteBatch = new SpriteBatch(GraphicsDevice);
    
                int[,] densite = new int[MAXX, MAXY];
                const int propagationAir = 20, propagationRoche = 40;
                            
                textures[0] = Content.Load<Texture2D>("textures/terre");
                textures[1] = Content.Load<Texture2D>("textures/terre avec herbe");
                textures[2] = Content.Load<Texture2D>("textures/pierre");
                textures[3] = Content.Load<Texture2D>("textures/pierretaillée");
                textures[4] = Content.Load<Texture2D>("textures/blocs d'or");
                mobs[0] = Content.Load<Texture2D>("mob/perso");
                mobs[1] = Content.Load<Texture2D>("mob/fantome de brume");
                items[0] = Content.Load<Texture2D>("curseur");
                items[1] = Content.Load<Texture2D>("items/pioche de bois");
                items[2] = Content.Load<Texture2D>("textures/terre");
                items[3] = Content.Load<Texture2D>("textures/pierre");
                blank = Content.Load<Texture2D>("vierge");
                bouton = Content.Load<Texture2D>("bouton");
    
                _font = Content.Load<SpriteFont>("VFont");
    
                // du ciel partout
                for (int i = 0; i < MAXX; i += 1)
                    for (int j = 0; j < 50; j += 1)
                    {
                        terrain[i, j] = -1;
                        arrièreplan[i, j] = 0;
                    }
    
                // collines
                for (int debut = 0, fin, hauteur; debut < MAXX; debut = fin)
                {
                    fin = debut + aleatoire.Next(5, 25);
                    if (fin > MAXX) fin = MAXX;
                    hauteur = (int)MathHelper.Min(aleatoire.Next(0, 30),aleatoire.Next(0, 15));
                    for (int i = debut; i < fin; i += 1)
                        for (int j = 50; j > 50-hauteur; j -= 1)
                        {
                            terrain[i, j] = 0;
                            arrièreplan[i, j] = 1;
                        }
                }
    
                // terre
                for (int i = 0; i < MAXX; i += 1)
                    for (int j = 50; j < MAXY; j += 1)
                    {
                        terrain[i, j] = 0;
                        arrièreplan[i, j] = 1;
                    }
    
                // ajout de roche
                for (int i = 0; i < MAXX; i += 1)
                    for (int j = 0; j < MAXY / 3; j += 1)
                        if ((terrain[i, j] == 0) && (aleatoire.Next(20) == 0)) terrain[i, j] = 2;
                for (int i = 0; i < MAXX; i += 1)
                    for (int j = (MAXY / 3); j < 2 * (MAXY / 3); j += 1)
                        if ((terrain[i, j] == 0) && (aleatoire.Next(10) == 0)) terrain[i, j] = 2;
                for (int i = 0; i < MAXX; i += 1)
                    for (int j = 2 * (MAXY / 3); j < MAXY; j += 1)
                        if ((terrain[i, j] == 0) && (aleatoire.Next(5) == 0)) terrain[i, j] = 2;
    
                // ajout de poches d'air
                for (int debut = aleatoire.Next(5), fin, haut, bas; debut < MAXX; debut = fin + aleatoire.Next(5))
                {
                    fin = debut + aleatoire.Next(5, 25);
                    if (fin > MAXX) fin = MAXX;
                    haut = (int)MathHelper.Min(aleatoire.Next(40, MAXY), aleatoire.Next(40, MAXY));
                    bas = haut + aleatoire.Next(3, 8);
                    if (bas > MAXY) bas = MAXY;
                    for (int i = debut; i < fin; i += 1)
                        for (int j = haut; j < bas ; j += 1)
                            terrain[i, j] = -1;
                }
                
                
                // propagation
                for (int rep = 0; rep < 16; rep += 1)
                {
                    for (int i = 1; i < MAXX - 1; i += 1)
                        for (int j = 1; j < MAXY - 1; j += 1)
                        {
                            if (terrain[i, j] == -1)
                            {
                                if (aleatoire.Next(propagationAir) == 0) terrain[i - 1, j] = -1;
                                if (aleatoire.Next(propagationAir) == 0) terrain[i + 1, j] = -1;
                                if (aleatoire.Next(propagationAir) == 0) terrain[i, j - 1] = -1;
                                if (aleatoire.Next(propagationAir) == 0) terrain[i, j + 1] = -1;
                            }
                            if (terrain[i, j] == 2)
                            {
                                if (aleatoire.Next(propagationRoche) == 0) terrain[i - 1, j] = 2;
                                if (aleatoire.Next(propagationRoche) == 0) terrain[i + 1, j] = 2;
                                if (aleatoire.Next(propagationRoche) == 0) terrain[i, j - 1] = 2;
                                if (aleatoire.Next(propagationRoche) == 0) terrain[i, j + 1] = 2;
                            }
                        }
                }
    
                // lisse les contours
                for (int i = 1; i < MAXX - 1; i += 1)
                        for (int j = 1; j < MAXY - 1; j += 1)
                            if ((terrain[i - 1, j] == terrain[i, j - 1]) && (terrain[i - 1, j] == terrain[i, j + 1]))
                                terrain[i, j] = terrain[i - 1, j];
                            else if ((terrain[i + 1, j] == terrain[i, j - 1]) && (terrain[i + 1, j] == terrain[i, j + 1]))
                                terrain[i, j] = terrain[i + 1, j];
                            else if ((terrain[i, j - 1] == terrain[i - 1, j]) && (terrain[i, j - 1] == terrain[i + 1, j]))
                                terrain[i, j] = terrain[i, j - 1];
                            else if ((terrain[i, j + 1] == terrain[i - 1, j]) && (terrain[i, j + 1] == terrain[i + 1, j]))
                                terrain[i, j] = terrain[i, j + 1];
                                  
                // enlève les blocs isolés
                for (int i = 1; i < MAXX - 1; i += 1)
                    for (int j = 1; j < MAXY - 1; j += 1)
                        if ((terrain[i - 1, j] == terrain[i,j+1])
                            && (terrain[i - 1, j] == terrain[i + 1, j])
                            && (terrain[i - 1, j] == terrain[i, j - 1] ))
                            terrain[i, j] = terrain[i - 1, j];
    
                // on retire l'arrière-plan en trop
                Boolean continuer;
                for (int i = 0; i < MAXX; i += 1)
                {
                    continuer = true;
                    for (int j = 0; (j < MAXY) && continuer; j += 1)
                    {
                        if (terrain[i, j] != -1)
                            continuer = false;
                        else
                            arrièreplan[i, j] = 0;
                    }
                }
                for (int i = 1; i < MAXX - 1; i += 1)
                {
                    for (int j = 1; j < MAXY; j += 1)
                        
                    {
                        if (((arrièreplan[i-1, j] == 0) || (arrièreplan[i+1, j] == 0)) && (terrain[i,j] == -1))
                            arrièreplan[i, j] = 0;
                    }
                }
               
                // on pose le bonhomme, et on regarde où il tombe
                x = 256;
                y = 0;
                continuer = true;
                for (int j = 0; (j < MAXY) && continuer; j += 1)
                    if ((terrain[x, j] != -1) || (terrain[x - 1, j] != -1))
                    {
                        y = j;
                        continuer = false;
                    }
                if (terrain[x, y] == -1) terrain[x, y] = 1;
                if (terrain[x - 1, y] == -1) terrain[x - 1, y] = 1;
                modeFantome = false;
                hauteurSaut = 0;
                peutSauter = true;
    
                // Pose l'herbe
                for (int i = 0; i < MAXX; i += 1)
                {
                    Boolean herbe = false;
                    for (int j = 0; j < MAXY; j += 1)
                        if ((terrain[i, j] != -1) && !herbe)
                        {
                            if (terrain[i, j] == 0) terrain[i, j] = 1;
                            herbe = true;
                        }
                }
                for (int i = 0; i < MAXX; i += 1)
                {
                    for (int j = 49; j < MAXY; j += 1)
                        if (terrain[i, j] == 1)
                        {
                            if ((i != 0) && (terrain[i - 1, j] == 0) && (terrain[i - 1, j - 1] == -1)) terrain[i - 1, j] = 1;
                            if ((i != (MAXX - 1)) && (terrain[i + 1, j] == 0) && (terrain[i + 1, j - 1] == -1)) terrain[i + 1, j] = 1;
                        }
                }
    
                ceinture[0] = 1;
                for (int i = 1; i < 10; i += 1)
                {
                    ceinture[i] = -1;
                    nombre[i] = 0;
                }
                outilActifGauche = 0;
                outilActifDroite = -1;
    
                attenteAction = TimeSpan.Zero;
                tempsAction = TimeSpan.FromSeconds(0.25);
                attenteMouvement = TimeSpan.Zero;
                tempsMouvement = TimeSpan.FromSeconds(0.1);
                attenteChute = TimeSpan.Zero;
                tempsChute = TimeSpan.FromSeconds(0.05);
            }
    
    
            /// <summary>
            /// UnloadContent will be called once per game and is the place to unload
            /// all content.
            /// </summary>
            protected override void UnloadContent()
            {
                // TODO: Unload any non ContentManager content here
            }
    
            /// <summary>
            /// Allows the game to run logic such as updating the world,
            /// checking for collisions, gathering input, and playing audio.
            /// </summary>
            /// <param name="gameTime">Provides a snapshot of timing values.</param>
            protected override void Update(GameTime gameTime)
            {
                // Allows the game to exit
                if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                    this.Exit();
    
                if (attenteAction > TimeSpan.Zero) attenteAction -= gameTime.ElapsedGameTime;
                if (attenteAction < TimeSpan.Zero) attenteAction = TimeSpan.Zero;
                if (attenteMouvement > TimeSpan.Zero) attenteMouvement -= gameTime.ElapsedGameTime;
                if (attenteMouvement < TimeSpan.Zero) attenteMouvement = TimeSpan.Zero;
                if (attenteChute > TimeSpan.Zero) attenteChute -= gameTime.ElapsedGameTime;
                if (attenteChute < TimeSpan.Zero) attenteChute = TimeSpan.Zero;
    
                ms = Mouse.GetState();
                xs = ms.X / 16;
                ys = ms.Y / 16;
                xf = xs + x - 25;
                yf = ys + y - 16;
    
    
                if (Keyboard.GetState().IsKeyDown(Keys.Tab)) modeFantome = true;
                if (Keyboard.GetState().IsKeyUp(Keys.Tab)) modeFantome = false;
                
                // si on relâche la touche espace, on ne peut plus sauter à moins de toucher le sol
                if (Keyboard.GetState().IsKeyUp(Keys.Space))
                {
                    peutSauter = false;
                }
                if ((terrain[x, y] != -1) || (terrain[x - 1, y] != -1))
                {
                    peutSauter = true;
                    hauteurSaut = 0;
                }
                
                if (!modeFantome)
                {
                    if ((Keyboard.GetState().IsKeyDown(Keys.Q)) && (x > 26)
                        && (terrain[x-2, y-1] == -1) && (terrain[x-2, y-2] == -1) && (terrain[x-2, y-3] == -1)
                        && (attenteMouvement == TimeSpan.Zero)) { x -= 1; attenteMouvement += tempsMouvement; }
                    if ((Keyboard.GetState().IsKeyDown(Keys.D)) && (x < MAXX - 26)
                        && (terrain[x + 1, y - 1] == -1) && (terrain[x + 1, y - 2] == -1) && (terrain[x + 1, y - 3] == -1)
                        && (attenteMouvement == TimeSpan.Zero)) { x += 1; attenteMouvement += tempsMouvement; }
                    if ((Keyboard.GetState().IsKeyDown(Keys.Space)) && (hauteurSaut < 7) && (peutSauter) && (y > 17)
                        && (attenteChute == TimeSpan.Zero))
                    {
                        if ((terrain[x, y - 4] == -1) && (terrain[x - 1, y - 4] == -1))
                        {
                            y -= 1;
                            attenteChute += tempsChute;
                            hauteurSaut += 1;
                            if (hauteurSaut == 7) peutSauter = false;
                        }
                        else peutSauter = false;
                    }
                    else if ((terrain[x, y] == -1) && (terrain[x - 1, y] == -1) && (y < MAXY - 17) && (!peutSauter)
                        && (attenteChute == TimeSpan.Zero)) { y += 1; attenteChute += tempsChute; }
                }
                else
                {
                    if ((Keyboard.GetState().IsKeyDown(Keys.Q)) && (x > 26)) x -= 1;
                    if ((Keyboard.GetState().IsKeyDown(Keys.D)) && (x < MAXX - 26)) x += 1;
                    if ((Keyboard.GetState().IsKeyDown(Keys.Z)) && (y > 17)) y -= 1;
                    if ((Keyboard.GetState().IsKeyDown(Keys.S)) && (y < MAXY - 17)) y += 1;
                }
                if (Keyboard.GetState().IsKeyDown(Keys.D1)) outilActifGauche = 0;
                else if (Keyboard.GetState().IsKeyDown(Keys.D2)) outilActifGauche = 1;
                else if (Keyboard.GetState().IsKeyDown(Keys.D3)) outilActifGauche = 2;
                else if (Keyboard.GetState().IsKeyDown(Keys.D4)) outilActifGauche = 3;
                else if (Keyboard.GetState().IsKeyDown(Keys.D5)) outilActifGauche = 4;
                else if (Keyboard.GetState().IsKeyDown(Keys.D6)) outilActifGauche = 5;
                else if (Keyboard.GetState().IsKeyDown(Keys.D7)) outilActifGauche = 6;
                else if (Keyboard.GetState().IsKeyDown(Keys.D8)) outilActifGauche = 7;
                else if (Keyboard.GetState().IsKeyDown(Keys.D9)) outilActifGauche = 8;
                else if (Keyboard.GetState().IsKeyDown(Keys.D0)) outilActifGauche = 9;
                            
                // Action quand on clique ...
                if ((ms.LeftButton == ButtonState.Pressed) && (peutAgir == true) && ((x - 5 < xf) && (xf < x + 4) && (y - 7 < yf) && (yf < y + 3)) && (attenteAction == TimeSpan.Zero))
                {
                    if (ceinture[outilActifGauche] == 1)
                    {
                        int àajouter = -1;
                        if (terrain[xf, yf] == 0) { terrain[xf, yf] = -1; attenteAction += tempsAction; àajouter = 2; }
                        else if (terrain[xf, yf] == 1) { terrain[xf, yf] = 0; attenteAction += tempsAction; }
                        else if (terrain[xf, yf] == 2) { terrain[xf, yf] = 3; attenteAction += tempsAction; }
                        else if (terrain[xf, yf] == 3) { terrain[xf, yf] = -1; attenteAction += tempsAction; àajouter = 3; }
                        if (àajouter != -1)
                        {
                            int ou = -1;
                            for (int i = 0; i < 10; i += 1)
                                if ((ceinture[i] == àajouter) && (nombre[i] < 99)) ou = i;
                            if (ou == -1)
                                for (int i = 9; i >= 0; i -= 1)
                                    if (ceinture[i] == -1) ou = i;
                            if (ou != -1)
                            {
                                ceinture[ou] = àajouter;
                                nombre[ou] += 1;
                            }
                        }
                    }
                    else if (ceinture[outilActifGauche] == 2)
                    {
                        if ((terrain[xf, yf] == -1) && ((terrain[xf - 1, yf] != -1) || (terrain[xf + 1, yf] != -1) || (terrain[xf, yf - 1] != -1) || (terrain[xf, yf + 1] != -1)))
                        {
                            terrain[xf, yf] = 0;
                            nombre[outilActifGauche] -= 1;
                            if (nombre[outilActifGauche] == 0)
                            {
                                ceinture[outilActifGauche] = -1;
                                outilActifGauche = -1;
                                for (int i = 9; i >= 0; i -= 1)
                                    if (ceinture[i] == 2) outilActifGauche = i;
                                if (outilActifGauche == -1) outilActifGauche = 0;
                            }
                        }
                    }
                    else if (ceinture[outilActifGauche] == 3)
                    {
                        if ((terrain[xf, yf] == -1) && ((terrain[xf - 1, yf] != -1) || (terrain[xf + 1, yf] != -1) || (terrain[xf, yf - 1] != -1) || (terrain[xf, yf + 1] != -1)))
                        {
                            terrain[xf, yf] = 2;
                            nombre[outilActifGauche] -= 1;
                            if (nombre[outilActifGauche] == 0)
                            {
                                ceinture[outilActifGauche] = -1;
                                outilActifGauche = -1;
                                for (int i = 9; i >= 0; i -= 1)
                                    if (ceinture[i] == 3) outilActifGauche = i;
                                if (outilActifGauche == -1) outilActifGauche = 0;
                            }
                        }
                    }
                }
                if (ms.LeftButton == ButtonState.Released)
                    peutAgir = true;
                else
                    peutAgir = false;
    
                base.Update(gameTime);
            }
    
            /// <summary>
            /// This is called when the game should draw itself.
            /// </summary>
            /// <param name="gameTime">Provides a snapshot of timing values.</param>
            protected override void Draw(GameTime gameTime)
            {
                // fond bleu ciel
                GraphicsDevice.Clear(Color.LightBlue);
    
                spriteBatch.Begin();
    
                // on dessine le terrain
                for (int i = 0; i < 50; i += 1)
                    for (int j = 0; j < 32; j += 1)
                    {
                        if ((x + i - 25 > 0) && (x + i - 25 < MAXX) && (y + j - 16 > 0) && (y + j - 16 < MAXY))
                            if (terrain[x + i - 25, y + j - 16] != -1)
                                spriteBatch.Draw(textures[terrain[x + i - 25, y + j - 16]], new Vector2(16 * i, 16 * j), Color.White);
                            else if (arrièreplan[x + i - 25, y + j - 16] == 1)
                                spriteBatch.Draw(textures[0], new Vector2(16 * i, 16 * j), Color.DarkGray);
                    }
    
                // on dessine le bonhomme (ou un fantôme)
                if (!modeFantome) spriteBatch.Draw(mobs[0], new Vector2(16 * 24, 16 * 13), Color.White);
                else spriteBatch.Draw(mobs[1], new Vector2(16 * 24, 16 * 13), Color.White);
    
                // barre d'outils de la ceinture
                for (int i = 0; i < 10; i += 1)
                {
                    if (i == outilActifGauche)
                        spriteBatch.Draw(bouton, new Vector2(8 + i * 48, 8), Color.DarkGray);
                    else
                        spriteBatch.Draw(bouton, new Vector2(8 + i * 48, 8), Color.White);
                    if (ceinture[i] != -1)
                    {
                        spriteBatch.Draw(items[ceinture[i]], new Vector2(16 + i * 48, 16), Color.White);
                        if (nombre[i] > 9)
                            spriteBatch.DrawString(_font, nombre[i].ToString(), new Vector2(22 + i * 48, 22), Color.Black);
                        else if (nombre[i] > 1)
                            spriteBatch.DrawString(_font, nombre[i].ToString(), new Vector2(28 + i * 48, 22), Color.Black);
                    }
                }
    
                // curseur (ou outil si assez proche du perso)
                if ((x - 5 < xf) && (xf < x + 4) && (y - 7 < yf) && (yf < y + 3))
                {
                    if (peutAgir == true)
                        spriteBatch.Draw(items[ceinture[outilActifGauche]], new Vector2(ms.X, ms.Y), Color.White);
                    else
                        spriteBatch.Draw(items[ceinture[outilActifGauche]], new Vector2(ms.X, ms.Y), Color.Gray);
                }
                else
                    spriteBatch.Draw(items[0], new Vector2(ms.X, ms.Y), Color.White);
    
                spriteBatch.End();
    
                // TODO: Add your drawing code here
    
                base.Draw(gameTime);
            }
        }
    }
    Actuellement, le scrolling se fait par à-coup d'une "brique de base" (16 pixels !). Ma prochaine étape consiste à lisser ça.

  8. #278
    Petite astuce, quand tu écris par exemple
    Code:
    continuer = true;
    for (int j = 0; (j < MAXY) && continuer; j += 1)
         if ((terrain[x, j] != -1) || (terrain[x - 1, j] != -1))
         {
               y = j;
               continuer = false;
         }
    Tu peux remplacer ça par :
    Code:
    for (int j = 0; j < MAXY; j += 1)
         if ((terrain[x, j] != -1) || (terrain[x - 1, j] != -1))
         {
               y = j;
               break;
         }
    Le "break" signifie "sauter après la fin de la boucle for ou while dans laquelle on se trouve"

    Par contre tu ne peux pas sauter en dehors de deux boucles d'un coup
    Certains langages permettent d'écrire "break 2" qui veut dire "sortir de 2 boucles en cours" mais apparemment pas le C#

    De même tu peux remplacer "j += 1" par "j++". Ça veut dire la même chose, mais le second est plus classe.

    S'il y avait pas ces petits détails, je serais persuadé que c'est pas la première fois que tu programmes un jeu
    Rust fanboy

  9. #279
    Je suis noob du C#, et je me demande :
    Code:
    int[,]
    c'est pour déclarer un tableau à 2 dimensions ?

  10. #280
    Merci pour tes astuces. Je fais ajouter les break de ce pas !

    Effectivement, j'ai déjà programmé des petits jeux, mais en Pascal (au lycée) et en C++ ou en Javascript à la fac ... Mais jamais sous windows, et toujours des trucs en mode texte.

    ---------- Post added at 13h10 ---------- Previous post was at 13h09 ----------

    Citation Envoyé par LaVaBo Voir le message
    Je suis noob du C#, et je me demande :
    Code:
    int[,]
    c'est pour déclarer un tableau à 2 dimensions ?
    Yep !

  11. #281
    Je suis le seul à pas arriver à télécharger les sons de la leçon 5 et 6 ou bien? en cliquant dessus ou avec le clic droit "enregistrer la cible", ça charge mais ça n'aboutit jamais?!

    Edit : Ah bah ça me le fait aussi avec les images des leçons précédentes.... Mystère.

    Edit² : Ok résolu en utilisant Internet explorer, ça ne fonctionnait pas avec Chrome.
    Dernière modification par olaf ; 03/02/2012 à 23h10.

  12. #282
    C'est mes yeux ou il manque les images du ciel et des nuages de la leçon 6 ?

    PS. Non jeune canard, je ne suis pas malpoli. C'est une référence à un must du cinéma français.
    ¯\_(シ)_/¯ ♫♪♪♫ .......d(oO)b....... ♫♪♪♫ ¯\_(ひ)_/¯

  13. #283
    Hello,

    Effectivement, les liens n'ont pas été mis sur le site, mais les fichiers sont bien sur le serveur FTP de CoinCoin PC :
    ftp://ftp.canardpc.com/ciel.jpg
    ftp://ftp.canardpc.com/ciel1.png
    ftp://ftp.canardpc.com/ciel2.png

    Chris

  14. #284
    Merci beaucoup. C'était mes yeux alors.
    ¯\_(シ)_/¯ ♫♪♪♫ .......d(oO)b....... ♫♪♪♫ ¯\_(ひ)_/¯

  15. #285
    Non c'est pas tes yeux, ils manquent bien les liens dans le 1er post même si les fichiers sont disponibles

    Tout le monde ne pensera pas forcément à aller fouiller dans le ftp. D'ailleurs, à mon grand regret, les ftp sont blacklisté sur le wifi public que j'ai l'habitude d'utiliser, c'est bien dommage.

  16. #286
    Toutes mes confuses. C'est réparé. Je sais pas comment j'ai fait pour penser à mettre le son tout en oubliant de mettre les images.
    Faut dire qu'à force d'écrire les "développez couché" en avance, je ne sais plus quel fichier est nécessaire à quelle leçon...

    Encore désolé pour le contretemps.

  17. #287
    Wifi éducation nationale peut-être...

    Sinon, c'est plus de l'avance que tu as L-F, c'est du DeLorean-Spoilo-temporel.
    Dernière modification par Djinn42 ; 06/02/2012 à 17h30.
    ¯\_(シ)_/¯ ♫♪♪♫ .......d(oO)b....... ♫♪♪♫ ¯\_(ひ)_/¯

  18. #288
    Est-ce que vous comptez publier au bout d'un certain temps sur le site les différentes leçons ? Parce que je souhaite m'intéresser maintenant à la chose mais j'ai perdu ma leçon 3 & 4 dans un déménagement...
    Dernière modification par Woulfo ; 11/02/2012 à 23h43.
    Citation Envoyé par Jack Bonheur Voir le message
    L'anglais c'est jamais que du français mal prononcé

  19. #289
    Tu peux trouver les codes sources des différentes leçons en première page.
    Par contre, je ne sais pas si le code est commenté.

    // Ce serait une bonne chose.
    ¯\_(シ)_/¯ ♫♪♪♫ .......d(oO)b....... ♫♪♪♫ ¯\_(ひ)_/¯

  20. #290
    Bonjour.
    Afin d'être pédagogique, je souhaite une leçon de type "comment ajuster la jouabilité de vos jeux selon votre souhait".
    La jouabilité est souvent le point faible des jeux, et le but de leur pratique.
    Merci.
    Dernière modification par RedGuff ; 13/02/2012 à 01h49. Motif: votre => vos jeux

  21. #291
    La jouabilité c'est assez facile à modifier

    Par exemple si tu fais un FPS et que tu veux un feeling à la quake/UT, tu mets une vitesse de déplacement assez élevée, dès que le joueur appuie sur une touche il se déplace à la vitesse maximale, dès qu'il relâche il s'arrête, les mouvements de souris sont instantanés, etc.
    Par contre si tu veux un feeling à la Call of Duty, tu mets une vitesse de déplacement assez faible, et tu rajoutes un paramètre "accélération". Quand le joueur appuie sur la touche avant, ce n'est pas sa vitesse qui augmente mais son accélération. Ensuite à chaque instant, la vitesse du joueur augmente en fonction de son accélération, de façon à avoir une certaine inertie.

    La jouabilité ça dépend aussi de quelques choix, comme par exemple la vitesse de déplacement qui diminue pendant que tu recharges, la durée de la recharge, la quantité de points de vie que tu possèdes (un jeu où tu te fais tuer en un seul coup se joue différemment que si tu peux tanker un peu), etc.

    Si tu expérimentes un petit peu en modifiant le code de déplacement, tu verras rapidement quelle incidence ont tes modifs sur le gameplay
    Rust fanboy

  22. #292
    D'où l'intérêt de tout paramétrer au même endroit, plutôt que de mettre des valeurs absolues un peu partout dans le code.

    Mais c'est impossible de faire le tour de la question "comment ajuster le gameplay d'un jeu", vu que tout va changer d'un jeu à l'autre (même dans le même type de jeu, comme l'exemple de tomaka sur les FPS, il y a 10000 gameplays différents, avec parfois des différences minimes mais qui changent tout, ou deux jeux totalement différent avec un gameplay proche).
    C'est plus un article qu'il faudrait, c'est un magazine.

  23. #293
    C'est vrai. Néanmoins, un article de présentation (ne serait-ce que pour dire "il faudrait un magazine", et donner quelques exemples) ne serait pas idiot. Et il faudra de toute façon aborder la question, la jouabilité faisant partie intégrante de n'importe quel jeu (même les Point & Click).
    I am Moanaaaaaaa !!! (et en version legit!)

  24. #294
    Citation Envoyé par Djinn42 Voir le message
    Tu peux trouver les codes sources des différentes leçons en première page.
    Par contre, je ne sais pas si le code est commenté.

    // Ce serait une bonne chose.
    Real men don't comment their code.

    Citation Envoyé par RedGuff Voir le message
    Bonjour.
    Afin d'être pédagogique, je souhaite une leçon de type "comment ajuster la jouabilité de votre jeux selon votre souhait".
    La jouabilité est souvent le point faible des jeux, et le but de leur pratique.
    Merci.
    Si tu parles d'ajuster le gameplay de Canardage en particulier, il suffit de modifier les vitesses de déplacement du joueur/des autres éléments dans Update().
    Si tu as suivi les leçons jusqu'ici, tu devrais pouvoir le faire sans grosse difficulté.

    Si tu parles du gameplay en général, comme dit LaVaBo, il faudrait des dizaines de pages ne serait-ce que pour effleurer le sujet.

  25. #295
    Et puis c'est pas comme si il existait une recette parfaite de gameplay. C'est plus souvent une question de gout ou de compromis.
    "For someone with such an intense need to be liked you'd think I would have figured out how to be less of an asshole."

  26. #296
    Bonjour.
    Merci pour vos réponses.
    Je pense qu'une page s'impose sur la jouabilité et l'accessibilité en général, en effet. Une partie sur "Canardage" et les jeux de tir en général, et une autre sur le reste.
    Au minimum, parlez d'ergonomie, et de tous les défauts gênants que vous voyez tous les jours dans votre dur métier. (Ceci afin d'éviter une conclusion de test de type : "Ce jeu aurait mérité 10/10 avec un peu d'efforts dès le début de sa conception, mai l'ergonomie a été mal pensée, et il est injouable par manque de réflexion sur la jouabilité dès le départ. Note finale : 3/10.").
    Au pire, il reste le forum...

  27. #297
    Plop Je viens de découvrir cette section et j'aime beaucoup Merci !

  28. #298
    Petite question, je suis prêt a suivre la publication mais je commence au numéro 248... à l'étape 6 donc... J'ai tout installé et tout. Y aurait moyen d'accéder aux éditions précédentes histoires de faire l'app depuis le début ? Ça serais super cool

  29. #299
    Tout est disponible sur la première page de ce topic.
    Je dis souvent de la merde...

  30. #300
    Dis Monsieur Sébum,

    Tu n'aurais pas plus de screen sur ton projet de jeu 3D avec XNA ? Autant en 2D j'ai pas mal avancé sur mes tests, autant pour ce qui est la 3D j'ai beaucoup moins de source et j'aimerai voir ce que ça permet de faire.

    En fait j'aimerai faire un truc en 3D mais très old school (à la Might and Magic 3) où l'on regarde toujours devant soit (pas de mouvement de regard vers le haut et le bas). Un truc simpliste, coloré sans pousser forcément très loin mais au moins me déplacer dans une scène 3D "plate".

    Si qq à des exemples à me linker je suis preneur
    Anatidaephobia : Peur panique quand un canard t'observe

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •