Курсы создания компьютерных игр на C/C++ ( Часть 6 )

Для самых-самых начинающих программистов :] Часть 5.5 - http://pikabu.ru/story/_3453747
Курсы создания компьютерных игр на C/C++ ( Часть 6 ) Для самых-самых начинающих программистов :]  Часть 5.5 - <a href="http://pikabu.ru/story/kursyi_sozdaniya_kompyuternyikh_igr_na_cc__chast_55__3453747">http://pikabu.ru/story/_3453747</a>
3
Автор поста оценил этот комментарий
я меееедлено делаю свои члены приватными... надеваю на себя конструктор...
раскрыть ветку (1)
5
Автор поста оценил этот комментарий
Иллюстрация к комментарию
3
Автор поста оценил этот комментарий

Суть в том, что std::string - это класс (точнее даже конкретная версия шаблонного типа - std::basic_string<char>), который сам по себе кое-что умеет. Например, сам управляет памятью - сам где-то хранит char-буфер, изменяет, копирует и даже освобождает. Есть кучка вспомогательных методов, вроде поиска подстроки. К этому буферу мы напрямую даже прикоснуться не имеем права - управляем только через итераторы и методы класса.

http://www.cplusplus.com/reference/string/string/


А в Си широко используются строки с нулем на конце. То есть тупой сырой массив, где логический конец строки обозначается следующим за ней символом '\0' (от него и до конца буфера все, включая другие нуль-символы, считается мусором и игнорируется строковыми функциями).


const char cstr[] = "САБАКА-КУСАКА";
char *str = (char*)malloc((strlen(cstr) + 1)*sizeof('Ю'));
strcpy(str, cstr);
// С|А|Б|А|К|А|-|К|У|С|А|К|А|\0


const cstr2[] = "Молоко";

strcpy(str, cstr2);
// М|о|л|о|к|о|\0|К|У|С|А|К|А|\0
printf("%s", str); // Молоко

Резюме: zero-terminated string оперировать проще, т.к. это обыкновенный массив. std::string - это хитромудрая штука со своими нюансами и использованием С++ во все поля, поэтому ТС предлагает ньюби научиться пользоваться языком постепенно.

раскрыть ветку (1)
5
Автор поста оценил этот комментарий

Развернутый ответ :)

Иллюстрация к комментарию
показать ответы
Автор поста оценил этот комментарий

Запускались предыдущие проекты... Но я не делал там раскрашивание теста. Может в консольных штуках дело? работаю в Notepad++. Не помню там настройки проекта или чего-то подобного. 

раскрыть ветку (1)
4
Автор поста оценил этот комментарий
Иллюстрация к комментарию
Автор поста оценил этот комментарий

меня походу скоро будут гнать ссаными тряпками из обсуждения, но все таки.

переделал проект нормально, теперь игра запускается, но выскакивает такая ошибка

Иллюстрация к комментарию
раскрыть ветку (1)
2
Автор поста оценил этот комментарий
Во втором цикле вместо столбцов увеличиваются строки:

for( int c = 0; c < columnsCount; r++ )

показать ответы
Автор поста оценил этот комментарий

добрые люди, объясните пожалуйста человеческим языком что это означает:

const char* WeaponName_None = "None";


Значит ли это, что в указателе "WeaponName_None" хранится адрес памяти где должна быть сохранена строка "None", но никакой переменной с таким значеним нет? Т.е. имеется область памяти занятая данными, но не имеющая имени? Зачем?

раскрыть ветку (1)
2
Автор поста оценил этот комментарий

Так и есть :)

Это указатель на строковую константу неимеющую имени :)

Это просто удобный способ создать несколько глобальных константных строк.


Если интересно, можно вот тут почитать про такие тонкости:

http://www.cyberforum.ru/blogs/18334/blog97.html

показать ответы
1
Автор поста оценил этот комментарий

О Великий Мастер! Подскажи, пожалуйста, я правильно понял то, что на скриншоте:

сначала мы создаем тип данных "перечисление"(UnitType). На скриншоте слева создается функция "типа перечисления"(???), которая использует переменную символьного типа "CellSymbol". Когда эта функция принимает CellSymbol равный герою, орку и скелетону, она дает этой клетке соответствующий тип. 

В правой части создается переменная типа "перечисления", которая равна функции GetUnitTypeFromCell, а вместо переменной "CellSymbol" используется "destinationCellSymbol"(равная клетке, куда ходить). 

И вопрос: почему CellSymbol меняют на destinationCellSymbol, точнее как это работает?

Иллюстрация к комментарию
раскрыть ветку (1)
2
Автор поста оценил этот комментарий

cellSymbol - это не тип, это просто имя параметра( считай переменной ) в функции :) Ее тип - unsigned char( символ ) :)

А UnitType - это отдельный тип, чисто для перечисления возможных типов юнитов :)

Ну а функция GetUnitTypeFromCell просто конвертирует символ(unsigned char) в тип юнита(UnitType).


И ответ: destinationCellSymbol - это просто переменная :) При передаче переменной в функцию ее значение просто скопируется во внутренний параметр( считай переменную, cellSymbol ) :)

показать ответы
1
Автор поста оценил этот комментарий

А почему нужно обращаться к жизни существа через if (pointerToUnitData->health<=0), почему нельзя без адреса, через переменную if (существо.health<=0).

раскрыть ветку (1)
2
Автор поста оценил этот комментарий

Самая главная причина - научится работать с указателями :) Потому что именно так потом происходит работа с динамическими объектами :)

Вторая причина - это то, что на данном моменте я не рассказывал о механизме "ссылок" в C/C++, а без этого при обычной передаче существа в фунцию создастся его копия :)

показать ответы
Автор поста оценил этот комментарий

структуры... ну вот опять С )))

раскрыть ветку (1)
1
Автор поста оценил этот комментарий
Мы же плавно подходим к объектам )))
показать ответы
Автор поста оценил этот комментарий

а почему здесь нельзя использовать string? статья хорошая, спасибо.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий
да пользуйтесь, кто ж запрещал? Это ж просто уже несколько другой уровень :)
показать ответы
Автор поста оценил этот комментарий
раскрыть ветку (1)
1
Автор поста оценил этот комментарий
Вероятно проблема в том, что этот код не компилируется и там ошибки.

Например:

printf("\n\t);

показать ответы
Автор поста оценил этот комментарий

прочёл. спасибо. Как я понял, такой финт ушами только для строковых литералов нужен, да?

раскрыть ветку (1)
1
Автор поста оценил этот комментарий
По сути да :) Да и только пока для нашего обучения ))

Перейдем на С++ и ООП будем использовать std::string объекты :)

показать ответы
3
Автор поста оценил этот комментарий

Автор, давай начистоту! Через сколько частей я смогу устроиться джуниором в варгейминг?

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Вот это запросы :) Я думаю, что вы сами поймете когда :)

1
Автор поста оценил этот комментарий
Добрые люди,помогите прошу.Недавно начал разбираться в этой теме и вот захотелось сделать что бы были нпс с квестами от которых можно будет получать вещи в инвентарь чтобы открыть дверь,которая и будет вести к выходу + с доп .картами кроме основной,как это правильно сделать?
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Ну я могу лишь посоветовать для начала закончить весь курс уроков для более глубокого понимания архитектуры игровой логики, а потом вернуться к реализации таких сложных механик :)

1
Автор поста оценил этот комментарий

Я понимаю что прошло уже очень много времени,я весьма на много опоздал,но у вас кода вашей игры не осталось?

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Тут можно найти исходники всех уроков:
https://github.com/Tinaynox/gamedev

показать ответы
1
Автор поста оценил этот комментарий
Странно, а что пишет за ошибку? У меня просто файл запускается. Может дело в Visual Studio?
раскрыть ветку (1)
1
Автор поста оценил этот комментарий
Похоже, что каких-то библиотек не хватает. Студия 2013? Конфигурация Release?
показать ответы
1
Автор поста оценил этот комментарий

По моему я слегка опоздал на эту серию постов.... Ну да ладно. Начал по тебе учится, очень хорошо объясняешь. Вот что забацал: https://yadi.sk/d/JvUyn-vqszqrV
Сделал квесты, доп комнаты, инвентарь, босса и т.д. Движение WASD, инвентарь на Q. Жаль что только русский не получилось включить - баги вызывал, поэтому там мой кривой английский

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Чот не то собрано, не запускается :)

показать ответы
1
Автор поста оценил этот комментарий

Сначала хотел похвастаться какой я молодец, до 4 утра пилил игру по данному мануалу, пока не заработала. Потом вспомнил что всем насрать и передумал. Но всё же комент оставлю. Автор спасибо за очередной длиннопост. Если хоть один человек попытался сделать всё по уроку и что-то почерпнул, то у тебя уже появился +1 к карме. А так как нас много, то ты уже почти святой.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий
Насчет "всем насрать" ты зря )) Можно было бы и выложить :)
показать ответы
1
Автор поста оценил этот комментарий

Автор, извини что обращаюсь, но я сейчас вскрываться начну, можешь пожалуйста проверить, что я делаю не так. Как можно тебе код скинуть?

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Ну залей на дропбокс/гуглдиск/яндексдиск/гитхаб и ссылку дай :)

показать ответы
1
Автор поста оценил этот комментарий

https://pp.vk.me/c633922/v633922334/fbe/6rMjiYJBPSc.jpg

 Может быть где-то очепятался или упустил чего?

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Да, вы смешали WeaponType и WeaponName :)

WeaponType - это перечисляемый тип ( Вид оружия )

WeaponName - это текстовые константы( Имя оружия )

показать ответы
1
Автор поста оценил этот комментарий

Попробовал набрать програмку . На этапе описания оружия выдает ошибку . Говорит WeaponName должны иметь константные значения. Вроде все написал как у вас.В чем может быть проблема?

раскрыть ветку (1)
1
Автор поста оценил этот комментарий
Скриншот с кодом и ошибкой можно плиз?
показать ответы
Автор поста оценил этот комментарий

Ага(

раскрыть ветку (1)
1
Автор поста оценил этот комментарий
Покажи код файла main.cpp плиз )
показать ответы
Автор поста оценил этот комментарий

Господа, такой вопрос, остановился на моменте с просмотром уровня. 

При компиляции окно сразу закрывается не хватало библиотек, разобрался как докачать их.

Но это не помогло, теперь пишет что библиотеки успешно загружены и выдает такое сообщение

The program '[5708] ConsoleApplication6.exe' has exited with code 0 (0x0).

Пытался через систем пазуа задержать, все равно просто закрывает окно и все.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий
Эээм, isGameActive переменная равна true? :)
показать ответы
1
Автор поста оценил этот комментарий

Вторые Герои рулят!)

раскрыть ветку (1)
Автор поста оценил этот комментарий

Любимая часть серии :)

Иллюстрация к комментарию
показать ответы
Автор поста оценил этот комментарий

да вот он весь:


#pragma once

#include "level.h"

enum WeaponType {

WeaponType_None,

WeaponType_Fist,

WeaponType_Stick,

WeaponType_Club,

WeaponType_Spear,

WeaponType_Saber,

}

//имена оружия

const char* WeaponName_None = "None";

const char* WeaponName_Fist = "Fist";

const char* WeaponName_Stick = "Stick";

const char* WeaponName_Club = "Club";

const char* WeaponName_Spear = "Spear";

const char* WeaponName_Saber = "Saber";

//возвращает название оружия

const char* GetWeaponName(WeaponType Weapon){

switch(WeaponType){

case WeaponType_Fist: return WeaponName_Fist;

case WeaponType_Stick: return WeaponName_Stick;

case WeaponType_Club: return WeaponName_Club;

case WeaponType_Spear: return WeaponName_Spear;

case WeaponType_Saber: return WeaponName_Saber;

}

return WeaponName_None;

}

//вернет цыфру какая штука сколько бьет

int GetWeaponDamage(WeaponType Weapon){

switch(WeaponType){

case WeaponType_Fist: return 2;

case WeaponType_Stick: return 16;

case WeaponType_Club: return 24;

case WeaponType_Spear: return 32;

case WeaponType_Saber: return 40;

}

return 0;

}

//вернет тип оружия в зависимости от символа

WeaponType GetWeaponTypeFromCell(unsigned char CellSymbol){

switch( CellSymbol ){

case CellSymbol_Stick: return WeaponType_Stick;

case CellSymbol_Club: return WeaponType_Club;

case CellSymbol_Spear: return WeaponType_Spear;

case CellSymbol_Saber: return WeaponType_Saber;

}

return WeaponType_None;

}

раскрыть ветку (1)
Автор поста оценил этот комментарий
Точки с запятой после закрывающей скобки енама:

WeaponType_Saber,

};

//имена оружия

показать ответы
Автор поста оценил этот комментарий

Стока ошибок я наделал пока набирал код... С некоторыми справился, а вот с этой не пойму что происходит:

WeaponType.h:14:13: error: two or more data types in declaration of 'WeaponName_None'

const char* WeaponName_None = "None";

раскрыть ветку (1)
Автор поста оценил этот комментарий

А можно посмотреть блок кода пять строк вверх над это строкой и пять строк вниз под этой строкой? :)

показать ответы
Автор поста оценил этот комментарий

Скомпилировалось, но не запускается, типа не может запуститься на 64-разрядной системе (((

Иллюстрация к комментарию
раскрыть ветку (1)
Автор поста оценил этот комментарий

16-разрядное приложение? О_о А предыдущие уроки собирались нормально?

показать ответы