الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

[ تمت الإجابة ]ارجو المساعدة في تحريك الاجسام

بدأه Game11 في 21 فبراير 2010 · 3 رد · 815 مشاهدة · في قسم برمجة الألعاب و الرسوميات العام
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

انا لدي احدى كتب لتعليم برمجة الالعاب بXNA و حبيت استفسر عن التحكم بالاجسام بواسطة الكيبورد ,, سويت كل شي لكن مو راضي يتنفذ مثل ما هو مطلوب, ماني عارف هل الكود فيه خطأ منطقي او لا و هذا هو الكود:

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;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;

namespace WindowsGame3
{
    /// <summary>
    /// This is the main type for your game
    /// </summary>
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        Texture2D texture;
        Texture2D textureT;
        int speed = 20;
        Vector2 post =new Vector2(300,300);
        KeyboardState state = Keyboard.GetState();
        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);
            texture = Content.Load<Texture2D>(@"images/images");
            textureT = Content.Load<Texture2D>(@"images/كرة");

            // TODO: use this.Content to load your game content here
        }

        /// <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(state.IsKeyDown(Keys.Right))
                post.X+=speed;
            if (state.IsKeyDown(Keys.Left))
                post.X -= speed;
            if(state.IsKeyDown(Keys.Up))
                post.Y-=speed;
            if (state.IsKeyDown(Keys.Down))
                post.Y += speed;


            // TODO: Add your update logic here

            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)
        {
            GraphicsDevice.Clear(Color.Black);
            spriteBatch.Begin(SpriteBlendMode.Additive, SpriteSortMode.BackToFront, SaveStateMode.None);
            spriteBatch.Draw(texture, post, null, Color.White, 0, Vector2.Zero, 1, SpriteEffects.None, 0);
            spriteBatch.Draw(textureT, Vector2.Zero, null, Color.White, 0, Vector2.Zero, 1, SpriteEffects.None, 1);
            spriteBatch.End();
            base.Draw(gameTime); 


            // TODO: Add your drawing code here


        }
    }
}

تم تعديل هذه المشاركة بواسطة الشمري في 21 فبراير 2010 في 03:59 — السبب: تنسيق الكود

#2

السلام عليكم

أخي الكريم في مثل هذه الحالات أعتقد ان الافضل ان تقوم بوضع بتنقيح الكود وذلك بعمل debugging

في البداية يمكنك وضع عدة

breakpoints

عند الاسطر

post.X+=speed;
post.X-=speed;

وذلك حتي يمكنك التأكد أنه عند الضغط علي احدي ازرار الاتجاهات بلوحة المفاتيح يتم تنفيذ الكود

حيث ربما يكون هناك خطأ في انشاء الكائن state

اذا تم تنفيذ الكود وتم تعديل المتجه الذي يمثل المكان الذي تود تحريكه

فقط بوضع

breakpoint

اخري في الدالة Draw

وتأكد ان القيم التي يتم الرسم بها هي نفس القيم الاخيرة التي تم تعديلها بعد تنفيذ الكود في الدالة Update

ومن هنا يمكنك ان يقع الخطأ بالظبط

ثانيا: يفضل في طريقة التحريك ان تعتمد علي الزمن الذي يتم تمريره لك في المتغير gameTime

حيث سيضمن لك ذلك حركة سلسلة ولن يقوم ذلك بتغيير مفاجئ في طريقة الحركة حسب امكانيات الكمبيوتر التي تعمل عليه

وهذا مثال بسيط للتعديل

post.X -= speed * gameTime;

اعتذر فليس لدي ال XNA

لاجرب عليه واخبرك بالمشكلة

اذا كانت هناك اية مشكلة اخري فلا تترد في السؤال

بالتوفيق

Ahmed Ezz

Software Engineer

ezzelden.ahmed@yahoo.com

http://ahmedezz.110mb.com/

انما عمرك بأعمالك ، فكم تريد أن تعيش؟

#3

حياك الله أخي

المشكلة بسيطة جدا بإذن الله،

كل ما عليك عمله هو إضافة السطر التالي قبل جملة ال if الخاصة بالمفاتيح في الدالة Update:

state = Keyboard.GetState();

ستصبح الدالة Update بالشكل التالي:

        protected override void Update(GameTime gameTime)
        {
            // Allows the game to exit
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
            {
                this.Exit();
            }

            state = Keyboard.GetState();

            if (state.IsKeyDown(Keys.Right))
                post.X += speed;
            if (state.IsKeyDown(Keys.Left))
                post.X -= speed;
            if (state.IsKeyDown(Keys.Up))
                post.Y -= speed;
            if (state.IsKeyDown(Keys.Down))
                post.Y += speed;


            // TODO: Add your update logic here

            base.Update(gameTime);
        }

سبب ذلك أنك في الحالة الأولى تقوم بقراءة حالة لوحة المفاتح لمره واحدة فقط (عند تشغيل البرنامج)

ولكن الأصح أن تقوم بقراءة حالة لوحة المفاتيح في كل إطار في اللعبة (60 مره في الثانية) ويتم ذلك من خلال وضع السطر المذكور في المكان المذكور...

بالتوفيق

#4

اشكركم اخواني على مشاركتكم في مشكلتي,,,,

و فعلا كان هناك خطأ فادح يا اخي خالد لم انتبه به :blush: و اشكرك على توضيحك

وفقكم الله.............

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…