الشبكة العربية لمطوري الألعاب

مبتدئ  أحمد عبد العظيم مشاركة 1

السلام عليكم,


أخوكم المبتدئ يحتاج للمساعده فى لعبته التى لن تنتهى أبدا
فى اللعبة لدى class يمثل أى كيان متفاعل سواء مركبة اللاعب (هى لعبة فضاء أخرى,ماذا ظننتم) أو الأعداء أو الpower-ups الخ .. أسم الclass هو entity

// file entity.h
#ifndef ENTITY_H
#define ENTITY_H

class entity {
      private:
              int ent_x;
              int ent_y;
              int ent_speed;
              int ent_armor;
              bool ent_visible;
              bool ent_dead;
              ...الخ
      public:
             entity();
             ~entity();
             int getx();
             int gety();
             void move();
             void setx(int newx);
             void sety(int newy);                        
             int getspeed();
             ...الخ
       };

#endif

الحركة فى entity.move تتم بزيادة entx و enty بقيمة entity.speed حسب اتجاه الحركة. هو اسلوب بسيط و يعمل بكفاءة , المشكلة هى أننى قررت أن أجعل الأمر أكثر تعقيداً (أسلوبى المعتاد فى تعلم اساليب البرمجة الجديدة على) وذلك بأن أجعل حركة الentity بواسطة متجة vector .

أريد ببساطة أن أعطى للentity class متجه velocity بجانب خصاءصه الأخرى entx و enty ,
أنشأت class أخر هو avector يقوم بالمهمة



// file avector.h

#ifndef AVECTOR_H
#define AVECTOR_H

#include 

class avector {
      private:
              float vecx;
              float vecy;
              float vecmagn;
              float vecang;
      public:
             avector();
             ~avector();
             void setvecmagn(float newmagn);
             void setvecang(float newang);
             float getvecmagn();
             float getvecang();
             float getvecx();
             float getvecy();
      };
#endif



و هنا واجهت المشكلة التى أريد مساعدتكم فيها: كيف أجعل الentity يملك object من نوع avector فى متغيراته. طبعا حاولت الحل المبدءى  وهو

// file entity.h

...
#include "avector.h"
...
class entity {
      private:
              int ent_x;
              int ent_y;
              avector ent_velocity;
              ...

ثم أستخدام الmethods الخاصة بavector  بداخل entity كالتالى

// file entity.cpp
...
void entity::move() {
     ...
     entx+=int(ent_velocity.getvecx())
     ...
     }

 لكن هذا لم ينجح حيث يعطى الcompiler أخطاءا على غرار
ent_velocity undefined : first use
المهم أنى بعد البحث توصلت الى التالى

// file entity.h
#ifndef ENTITY_H
#define ENTITY_H

#include "avector.h"

class entity {
      private:
              avector ent_velocity;
              int ent_x;
              int ent_y;
              int ent_armor;
              bool ent_visible;
              bool ent_dead;
              ...
      public:
             //entity();
             entity(const avector &temp_velocity);
             ~entity();
             int getx();
             int gety();
             void move() {
                  ...
                  ent_x += int(ent_velocity.getvecx());
                  ent_y += int(ent_velocity.getvecy());
                  ...
                  }
             void setx(int newx);
             void sety(int newy);
             void setvelocity(float newmagn,float newang){
                   ent_velocity.setvecmagn(newmagn);
                   ent_velocity.setvecang(newang);
                   }                          
             int getspeed(){
                 return int(ent_velocity.getvecmagn());
                 }
             float getangle(){
                 return ent_velocity.getvecang();
                 }
             ...
             };

#endif



// file entity.cpp
...
entity::entity(const avector &temp_velocity): ent_velocity(temp_velocity) {
                 ...
                 }

الكود يعمل. لاحظوا أنى نقلت كل ال entity methods التى تستخدم المتجه الجديد من entity.cpp الى entity.h


سؤالى هو: هل هذه الطريقة جيدة؟ هل هناك طريقة  أفضل؟

محترف  انس مشاركة 2

لدي مدة طويلة لم اتعامل مع السي++، لكن ما هي ال: Define الموجودة في ملف ال Entity.cpp ؟ (اتكلم هنا عن كودك الاول)

مبتدئ  أحمد عبد العظيم مشاركة 3

لست متأكدا أنى فهمت ما تقصد بالdefine  ولكن اليك الكود:

// file entity.cpp
#include "entity.h"

entity::entity(const avector &temp_velocity): ent_velocity(temp_velocity) {
                 ent_x=100;
                 ent_y=100;
                 ent_armor=100;
                 ...
                 }

entity::~entity(){
                 }

int entity::getx(){ 
    return ent_x;
    }

int entity::gety(){
    return ent_y;
    }
...

محترف  انس مشاركة 4

بهذا الكود يحدث الخطاء ؟

محترف  انس مشاركة 5

ما قصدته بال Define هو الـ Include
عذرا