Advertisement
  1. Game Development
  2. Game Design

كيفية وضع رمز سري للأبواب والأقفال.

Scroll to top
Read Time: 14 min

Arabic (العربية/عربي) translation by osamagaradh (you can also view the original English article)

في الالعاب المصنوعة من غرف متصلة مثل أسطورة زيلدا،الأكثر حداثةً -ملزمة إسحاق-، أو أي نوع من روجويلايك أو حتى مثل مترويدفانيا، تلعب الأبواب جزءا أساسيا في الملاحة وتقدم محرز للاعب.

الابواب تسمح للاعب بالسفر من غرفة واحدة أو من مستوى إلى آخر، حتى يحتل مكاناً هاما في الملاحة والاتصال لمختلف الغرف واحدة إلى آخرى، وفي تعريف الخريطة بانها عالم مفتوح أو أرضية زنزانة. قد تعمل أيضا كحواجز مؤقتة التي على اللاعب  فك قفلها عن طريق ميكانيكية محددة (مثل الحصول على مفتاح، أو تنشيط مفتاح تبديل).

في هذا البرنامج التعليمي، سوف اظهر عدة ميكانيكيات اقفال ، واقتراح السبل لتزويدها في الألعاب الخاصة بك. هذه ليست بأي شكل من الأشكال قصدت لأن تكون التزويدات الوحيدة او الافضل؛ هي أمثلة عملية.

العروض التفاعلية في هذا البرنامج التعليمي قدمت مع أداةHTML5 2 لصنع اللعب كونستركت5  وينبغي أن تكون متوافقة مع اصدارها المجاني. (ملفات  كاب اكس متوفرة في تحميل المصدر). ومع ذلك، هذا البرنامج التعليمي يجب أن يساعدك على تعلم كيفية تنفيذ منطق الأبواب والأقفال في أي محرك تهوى. حالما تحصل على الفكرة وراء هذا المنطق، كل شيء سيعتمد على المعرفة ل  اداة /لغة الترميز الخاصة بك والطريقة التي تريد أن تكيفها مع اللعبة التي تصنعها حاليا.

دعنا نغوص في الموضوع !

الميكانيكية الأساسية

الباب هو أساسا كتلة من الديكور التي لا يمكن مرورها، تمنع اللاعب من المرور خلالها حتى يكون غير مقفل. يمكن أن يكون الباب في حالات مختلفة: مؤمن أو غير مؤمن، مغلق او مفتوح.

يجب أن يكون هناك تمثيل واضح لما سبق؛ يجب أن يكون اللاعب قادراً على أن يميز أن الباب هو باب فعلا وما إذا كان في حالة  مؤمن أو غير مؤمن.

في العروض التالية، الابواب ممثلة من خلال اثنتين من الرسومات:


هذا باب مغلق.

هذا باب مفتوح

لقد استعملت أيضا ألوان مختلفة لتمثيل مختلف المواد التي قد تكون الأبواب صنعت منها – ولكن، لنكون صادقين، الجانب المتعلق بالرسوم البيانية متروك لك ولللعبة الخاصة بك،الجزء الأكثر أهمية هو أن الباب ينبغي أن يكون محدد بوضوح بأنه باب، وينبغي أن يكون واضحا ما إذا كان سيعرقل تقدم اللاعب أو سيفتحه وسيقود  بقية العالم أو المستوى.

عندما تكون مغلقة أو مقفلة، ينبغي أن يكون الباب كتلة من حالة الصلابة. عند فتحه، يجب تعطيل الحالة الصلبة، مما يسمح للاعبين المرور من خلاله. تأكد من أنه اي محرك اصطدام مستخدم، فإنه يسمح لك بتعديل هذه الحالة على الطاير بسهولة جداً.

من وجهة نظر برمجية، يجب أن يحتوي الباب او يكون مرتبط إلى المتغير المنطقي is_locked. استناداً إلى قيمة هذا المتغير، يمكنك تحديد ما هي الحالة للعرض، وعما إذا كان ينبغي الكتلة أن تكون  صلبة أم لا.

لفتح الباب، اللاعب يجب أن يحتوي  المتغير المنطقي has_key نفسه عند اللاعب عندما التقطت المفتاح: true إذا كان لديهم، false إذا لم يكن

في هذه الميكانيكية الأساسية، المفتاح يشكل جزء من قائمة مخزون اللاعب، ومفتاح واحد يفتح جميع الأبواب. استخدام المفتاح على باب لا يستهلكه؛ يبقى المفتاح في المخزون للاعب.

 لتصور ذلك، نحن ببساطة ستطيع ان نعرض صورة للمفتاح في -ال هود- للسماح للاعب بان يعرف أنه "يملك" مفتاح الذي يمكن أن يفتح الأبواب بمجرد ان اللاعب التقطه (عن طريق تحرك اللاعب نحو المفتاح في الغرفة).

انظر في المثال الأساسي التالي:

انقر فوق العرض التوضيحي للتركيزعليه، ثم سيطر على اللاعب باستخدام مفاتيح الأسهم في لوحة المفاتيح وتنفيذ الاجراءات بالمسطرة. (في هذا المثال، الاجراء هو "فتح باب").

الجدران هي كتل صلبة  لا تسمح للاعب المرور من خلالها  عند الاصطدام بها. الأبواب المغلقة أيضا صلبة.

لفتح باب، يجب على اللاعب ان يكون داخل 64 بكسل من الباب ويمتلك مفتاح (أي، المنطق المتغيرhas_key  التي تحدد ما إذا كان اللاعب لديه المفتاح في قائمة الادوات الخاصة به يجب أن يكون true).

مع هذه الظروف، عندما يضغط اللاعب على مسطرة لوحة المفاتيح، يتم تغيير حالة الباب المناسبة. يتم تعيين المنطق المتغير له locked إلى false، وحالته "الصلبة" تتعطل.

في حالة ، هذا قد يبدو شيئا مثل:

1
Door.Locked = True
2
    Door.AnimationFrame = 0 
3
//The animation frame that displays the door as locked

4
    Door.Solid = Enabled 
5
//The solid state of the door is enabled

6
7
Door.Locked = False
8
    Door.AnimationFrame = 1 
9
//The animation frame that displays the door as opened

10
    Door.Solid = Disabled 
11
//The solid state of the door is disabled

12
13
Keyboard Key "Space" is pressed
14
and Distance(Character,Door) <= 64px
15
and Door.Locked = True
16
and Character.Has_Key = True 
17
//The player has a key

18
    Door.Locked = False
19
    
20
Keyboard Key "Space" is pressed
21
and Distance(Character,Door) <= 64px
22
and Door.Locked = True
23
and Character.Has_Key = False 
24
//The player does not have a key

25
    Text.text = "You don't have a key for that door"

تذكير: هذه التعليمات البرمجية لا تمثل لغة معينة؛ يجب أن تكون قادرعلى تنفيذها في أي لغة تريد.

يمكنك أيضا ملاحظة أننا نقوم بعملية تدقيق عندما اللاعب لا يكون يملك المفتاح المتوقع، وعرض  رسالة توضيحية تشرح لماذا لم يكن الباب غير مقفل. يمكنك التعامل شيكات مثل هذه التي بيد أن تناسب اللعبة الخاصة بك — فقط ادرك أنه من الجميل دائماً إعطاء توضيح للاعب أنه تم تسجيل اجراءه، وشرح السبب لماذا لم يتم إكماله.

هذا هو منطق الباب والقفل الأساسي جداً، وكيفية تنفيذه. في بقية البرنامج التعليمي، سوف ننظر في أنظمة تأمين أخرى تختلف  عن هذا النظام الأساسي.

نظم تأمين مختلفة

لقد شهدنا النظام الأساسي الذي فيه المفتاح جزء كامل من قائمة ادوات اللاعب ومفتاح واحد يفتح جميع الأبواب، ويمكن إعادة استخدامه  لفتح أبواب عدة. دعونا نبني على هذا.

مثال: كومة المفاتيح

في المثال التالي، سيكون للاعب كومة من المفاتيح في قائمة ادواته. على الرغم من أن هناك عدة ألوان مختلفة من الباب، والفرق  رسوميا بحتاً هنا – الباب المستخدم هو نفسه كما في المثال الأساسي، ونوع واحد من المفاتيح يمكنه فتح أي منها. لكن هذه المرة، كلما قمت باستخدام مفتاح لفتح باب، تتم إزالة هذا المفتاح من الكومة.

على قدر ما هو الترميزمهم، هذا التعديل غالبا على مستوى الشخصية للاعب. بدلاً من المنطق المتغير has_key، سوف تحتاج لأن يكون لديك متغير عددي  يحمل عدد المفاتيح للاعب "في رصيده".

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

تعديل آخر يكون عندما يضغط اللاعب على المسطرة للوحة المفاتيح: بدلاً من التحقق من أن المنطق المتغير has_key هو true،نريد فعلا أن تحقق من أن قيمة  KeyStack أكبر من الصفر، بذلك يمكننا أن نستهلك مفتاح بعد فتح الباب.

في الكود الزائف، هذا يبدو شيئا مثل:

1
Doors mechanics =  same as in the basic example above.
2
3
Keyboard Key "Space" is pressed
4
and Character.KeyStack > 0
5
and Distance(Character, Door) <= 64
6
and Door.Locked = True
7
    Character.KeyStack = Character.KeyStack - 1
8
    Door.Locked = False

مثال ويتش كيي-اي مفتاح-

في هذا المثال الجديد، سوف نفترض سيناريو حيث يتطلب كل نوع مختلف من الأبواب نوع مختلف من المفاتيح إلى أن يفتح قفله .

هنا، كما هو الحال في المثال الأساسي الأول، المفاتيح سوف تكون جزءا من قائمة ادوات اللاعب. وسوف نعود إلى استخدام المتغيرات المنطقية لتحديد ما إذا كان اللاعب قد التقطت المفاتيح المطلوبة. وبما انه سيكون لدينا مفاتيح مختلفة، سيكون لدينا أيضا أنواع مختلفة من الأبواب (باب اسود، وباب أحمر، باب ذهبي) الذين سيتطلبوا أيضا مفتاح مناسب للسماح لهم بالفتح (مفتاح أسود ، مفتاح أحمر، مفتاح ذهبي، على التوالي).

 الابواب سوف يستخدموا رسوم حاسوبية مختلفة لإظهارموادهم، وسوف تحتوي على متغير رقمي ,المسمى  WhichKey الذي سوف يشير إلى نوع المفتاح المتوقع ونوع الرسم الذي ينبغي  ان يعرضه.  القيم الرئيسية المختلفة للمتغيرات ثابتة، لتحسين إمكانية القراءة.

في الكود الزائف هذا :

1
CONSTANT BLACK_KEY = 0
2
CONSTANT RED_KEY = 1
3
CONSTANT GOLD_KEY = 2
4
5
Door mechanics are the same as in the basic example.
6
7
Keyboard Key "Space" is pressed
8
    //The door requires a black key but the character doesn't have one

9
    If Door.Locked = True
10
    and Door.WhichKey = BLACK_KEY
11
    and Character.Has_Black_Key = False
12
    and Distance(Door,Character) <= 64
13
        Text.text="You need a black key for this door"
14
    
15
    //The door requires a red key but the character doesn't have one

16
    Else If Door.Locked = True
17
    and Door.WhichKey = RED_KEY
18
    and Character.Has_Red_Key = False
19
    and Distance(Door,Character) <= 64
20
        Text.text="You need a red key for this door"
21
    
22
    //The door requires a gold key but the character doesn't have one

23
    Else If Door.Locked = True
24
    and Door.WhichKey = GOLD_KEY
25
    and Character.Has_Gold_Key = False
26
    and Distance(Door,Character) <= 64
27
        Text.text="You need a red key for this door"
28
    
29
    //The door requires a black key and the character has one

30
    Else If Door.Locked = True
31
    and Door.WhichKey = BLACK_KEY
32
    and Character.Has_Black_Key = True
33
    and Distance(Door,Character) <= 64
34
        Door.Locked = False
35
    
36
    //The door requires a red key and the character has one

37
    Else If Door.Locked = True
38
    and Door.WhichKey = RED_KEY
39
    and Character.Has_Red_Key = True
40
    and Distance(Door,Character) <= 64
41
        Door.Locked = False
42
    
43
    //The door requires a gold key and the character has one

44
    Else If Door.Locked = True
45
    and Door.WhichKey = GOLD_KEY
46
    and Character.Has_Gold_Key = True
47
    and Distance(Door,Character) <= 64
48
        Door.Locked = False

وهذا تغيير على المثال الأساسي الذي يسمح بعدة أنواع من المفاتيح والأبواب والذي لا يستهلك مفاتيح لفتح الأبواب. بمجرد امتلاك المفتاح، سيعتبر جزء من قائمة الادوات الخاصة بك — جزء من "احصاءات اللاعب".

مثال التبديل

هذه المرة، بدلاً من التطبيق المباشر على الأبواب، اللاعب يجب عليه تنشيط مفتاح تبديل معين لفتح أو إغلاق باب معين.

الأبواب هنا  ضرورية للعمل عليها كما هوالحال في المثال الأساسي.  يمكنها أن تعرض رسومات مختلفة، ولكن المنطق للباب لا يزال هو نفسه. لكن هناك اضافة : نقوم بإضافة اثنين من المتغيرات الرقمية DoorID و SwitchID، التي نستخدمها لمعرفة رمز التبديل الذي يرتبط فيه كل باب.

رموز التبديل هي نوع جديد من المستخدمات التي قد اخترتها لاضافة الصلابة (ولكن لا يجب عليك استخدامها). انها تحتوي على المتغير المنطقي , Activated والمتغيرات الرقمية DoorID و SwitchID التي، كما يمكنك التخمين، سنستخدمها لتحديد رمز التبديل الذي يرتبط فيه كل باب.

اذا عندما يكون رمز التبديل Activated: True،  الباب "المرتبط" سيكونLocked: False . عملنا مع شريط المسافة في لوحة المفاتيح سوف يحدث عندما نكون بجوار مفتاح تبديل، بدلاً من جوار باب. لاحظ عدم وجود مفتاح في هذا المثال، نظراً لان رموز التبديل بمثابة مفاتيح:

نحن فقط يمكننا استخدام الرموز البسيطة التي تتحقق من روابط تبديل الباب في نفس الغرفة (حيث يعرض هذا المثال ثلاثة أبواب ومفاتيح تبديل في نفس الغرفة)، ولكن في وقت لاحق، سوف نرى أننا قد نجد مفاتيح تعمل على الأبواب وفي غرفة أخرى ، وحيث ان عملها لن يحدث  في نفس اللحظة التي يقوم بها اللاعب بتنشيط رمز التبديل؛ سيحدث في وقت لاحق، سيحدث عندما يتم تحميل الغرفة الجديدة.

لهذا السبب، نحن بحاجة إلى استمرارية. خيار واحد لذلك وهو استخدام صفائف لتعقب البيانات مثل في حالة مفاتيح التبديل (وهذا، إذا كان كل رمزتبديل منشط أم لا).

في صيغة الكود الزائف:

1
CONSTANT SWITCH_DOORID = 0
2
CONSTANT SWITCH_ACTIVATION = 1
3
//Those constants will allow us to keep a readable reminder of the array coordinates

4
<br>//Define some array

5
//The X coordinate of the array will correspond to the SwitchID value

6
//The Y-0 coordinate will be the DoorID

7
//The Y-1 coordinate will be the activation state

8
aSwitch(number of switches,2)
9
//2 is the height (Y) number, often 0-based.

10
<br>Run some association of the SwitchIDs with DoorIDs
11
12
Door mechanic is still the same as in the basic example.
13
14
//Displaying the correct switch graphic according to their activation state

15
Switch.Activated = True
16
    Display the animation frame Switch_ON
17
Switch.Activated = False
18
    Display the animation frame Switch_OFF
19
20
Keyboard Key "Space" is pressed
21
and Distance(Character, Switch) <= 64
22
    Switch.Toggle(Activated) 
23
    //A function that will set the value to either True or False)

24
    aSwitch(Switch.SwitchID,SWITCH_ACTIVATION) = Switch.Activated
25
    //It can depend on your coding language, but the idea is to set the value in the array where X is the SwitchID and where Y is the state of activation of the switch. The value itself is supposed to be the equivalent of the Switch.Activated boolean value.

26
27
Door.DoorID = aSwitch(Switch.SwitchID,SWITCH.DOORID)
28
//Allows us to make sure we're applying/selecting the correct door instance

29
    //Now according to the activation value, we lock or unlock the door

30
    aSwitch(Switch.SwitchID,SWITCH.ACTIVATION) = True
31
        Door.Locked = False
32
    aSwitch(Switch.SwitchID,SWITCH.ACTIVATION) = False
33
        Door.Locked = True

لهذا المثال المحدد، حيث تكون المفاتيح في نفس غرفة الأبواب المرتبطة بها، استخدام تقنية المصفوفة يعتبرإفراط. إذا تم إعداد اللعبة الخاصة بك في مثل هذه الطريقة أن كل رمز تبديل لكل باب سوف يوضع في نفس الغرفة، اذا انتقل بكل الوسائل لأسلوب أبسط، وتخلص من المصفوفة، وتحقق من المعروضات التي على الشاشة فقط.

مثال لوحة مفتاح التبديل

تتشابه لوحة مفاتيح التبديل برموز التبديل، بمعنى أنهم أما ان يكونوا منشطين او لا، وبامكانية  ربطهم بالأبواب لقفلهم أو إلغاء قفلهم. الفرق يكمن في كيفية تنشيط لوحة مفتاح التبديل، الذي يتم عن طريق الضغط.

في المثال المعروض من أعلى إلى أسفل ، سيتم تنشيط  لوحة مفتاح التبديل كلما كان اللاعب يتداخلها ويضغطها. يمكنك الضغط على شريط المسافة لإسقاط صخرة على لوحة مفتاح التبديل، وتركها في حالة منشطة حتى عندما اللاعب لا يكون واقفا عليها.

 تنفيذ هذه مشابه للمثال السابق، مع تعديلين صغيرين:

  • يجب عليك تنشيط لوحة مفتاح التبديل عندما اللاعب أو الصخور فوقها.
  • عليك جعل شريط المسافة يسقط صخرة (من قائمة الادوات) على لوحة مفتاح التبديل.
1
//Most of the implementation is the same as the previous example replace the Switch object with PlateSwitch object

2
3
//Plate-Switch Mechanic

4
Character OR Rock is NOT overlapping PlateSwitch
5
    PlateSwitch.Activated = False
6
    aSwitch(PlateSwitch.SwitchID,SWITCH_ACTIVATION) = PlateSwitch.Activated
7
    
8
    Door.DoorID = aSwitch(PlateSwitch.SwitchID,SWITCH.DOORID)
9
    //Allows us to make sure we're applying/selecting the correct door instance

10
        Door.Locked = True
11
12
Character OR Rock is overlapping PlateSwitch
13
    PlateSwitch.Activated = True
14
    aSwitch(PlateSwitch.SwitchID,SWITCH_ACTIVATION) = PlateSwitch.Activated
15
16
    Door.DoorID = aSwitch(PlateSwitch.SwitchID,SWITCH.DOORID)
17
    //Allows us to make sure we're applying/selecting the correct door instance

18
        Door.Locked = False
19
        
20
Keyboard Key "Space" is pressed
21
And Character is overlapping PlateSwitch
22
    Spawn Rock at PlateSwitch.position
23

مثال الغوغاء-موبس-

ميكانيكية قفل اخرى ممكنة تتطلب من اللاعب التخلص من جميع الأعداء (تعرف أيضا باسم الغوغاء) في غرفة أو منطقة لتحفيز فتح الأبواب.

على سبيل المثال، لقد صنعت بعض من المناطق في غرفة واحدة؛ كل منطقة لها باب وعدة اعداء  (على الرغم من أن هؤلاء الأعداء لا تتحرك ولا تتعامل مع الضرر).
كل منطقة لها اللون الخاص بها.

شريط المسافة سيجعل اللاعب يطلق بعض المقذوفات؛ سوف يقتلغوغاء بثلاثة قذائف .

هذا النوع من الميكانيكية يستخدم في أسطورة زيلدا وربط إسحاق، وتدور حول وظيفة التحقق التحقق من عدد الأعداء الذين يعيشون في الغرفة أو في المنطقة. في هذا المثال، تحمل كل منطقة ملونة عدد من الغوغاء الذين يعيشون، تحفزت عند تحميل الغرفة، وهي مرتبطة بالباب. وفاة كل غوغاء ينقص 1 من هذا العداد؛ بمجرد أنه يصل إلى 0، يتم تغيير حالة الباب Locked   إلى False.

1
//On start of the game

2
For each Area
3
    For each Mob overlapping Area
4
        Area.AliveMobs = Area.AliveMobs + 1
5
<br>Door mechanic is the same as in the basic example<br>
6
Keyboard Key "Space" is pressed
7
    Spawn a Projectile from Character's position

8


9
Projectile collides with Mob

10
    Mob.HP = Mob.HP - 1

11
    Destroy Projectile

12


13
Mob.HP <=0 //Mob is dead

14
and Mob is overlapping Area

15
    Destroy Mob

16
    Area.AliveMobs = Area.AliveMobs - 1

17


18
Area.AliveMobs <= 0

19
and Door is linked to Area //By means of an ID, a pointer or whatever

20
    Door.Locked = False

في هذا المثال، Area   هي رسم حاسوبي ملون مع متغير رقمي مرتبطة بها، AliveMobs ، التي تحسب عدد الغوغاء التي تتداخل للمنطقة. عندهزم جميع الغوغاء في المنطقة ,الباب المقابل يفتح (باستخدام نفس الميكانيكية كما شاهدنا في المثال الأساسي).

مثال التنقل

كما ذكرت في المقدمة، الأبواب يمكن أن تعمل كعوائق حظر، ولكن يمكن استخدامها أيضا للسماح للاعب للانتقال من غرفة إلى أخرى.

في هذا المثال، تكون الأبواب مفتوحة بشكل افتراضي بما انّا مهتمون أكثر بالجانب المتعلق بالملاحة-التنقل- .

الميكانيكية هذه تعتمد كثيرا على اللعبة التي تصنعها، فضلا عن الطريقة التي تتعامل بها مع بنية البيانات للأرضيات الخاصة بك. لن أخوض في تفاصيل كيفية عمل جهاز التنفيذ هنا، لانها خاصة ب كونستركت 2-بناء2-، ولكن يمكنك العثور عليها في ملفات المصدر إذا كنت ترغب.

الخلاصة

 خلال هذه المقالة، شاهدنا كيف ان الأبواب هي عقبات مؤقتة  تتطلب مفاتيح أو ميكانيكية فتح مثل مفاتيح أو لوحة مفاتيح أو حتى الموت للغوغاء. كما شاهدنا كيف يمكن ان تكون بمثابة "جسور"، تتيح التنقل عبر مناطق مختلفة من العالم للعبة.

كتذكرة سريعة، إليك بعض ميكانيكات قفل ممكنة:

  • مفتاح واحد لجميع الأبواب، كجزء من قائمة الادوات.
  • مفاتيح قابلة للاستهلاك: في كل مرة تقوم بفتح باب، يذهب مفتاح واحد بعيداً عن الكومة الرئيسية الخاصة بك.
  • الأبواب المختلفة تتطلب مفاتيح مختلفة.
  • رموز التبديل، أو لوحات مفاتيح التبديل، حيث كنت لا تعمل مباشرة على الباب لفتحه ولكن عن طريق جهاز مستقل مرتبط.
  • قتل جميع الغوغاء في المنطقة تلقائياً يفتح باب.

إذا تم خلط جميع تلك الميكانيكات في لعبة، يمكن أن ينتهي بك الأمر مع شيء من هذا القبيل:

هنا لدينا مجموعة لطيفة من مختلف الأبواب و ميكانيكات قفل، التي تتطلب من اللاعب الذهاب  عديد من الغرف لفتح الأبواب المختلفة. لأغراض تعليمية، قد تحتاج إلى إعادة إنتاج هذا في بيئة البرمجة الخاصة بك، مستخدما جميع التطبيقات السابقة التي انتقلنا خلالها.

يحدوني الأمل بانك تمتعت بهذه المقالة، وأنها كانت مفيدة لك، وأود أن أذكر أنه يمكنك العثور على المصدر لجميع العروض في جيت هب. يمكنك فتحها وتحريرها في الإصدار المجاني كونترست2 -بناء 2 (الإصدار r164.2 أو أعلاه).

المراجع

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Game Development tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.