Суть в том, что 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 - это хитромудрая штука со своими нюансами и использованием С++ во все поля, поэтому ТС предлагает ньюби научиться пользоваться языком постепенно.
Запускались предыдущие проекты... Но я не делал там раскрашивание теста. Может в консольных штуках дело? работаю в Notepad++. Не помню там настройки проекта или чего-то подобного.
меня походу скоро будут гнать ссаными тряпками из обсуждения, но все таки.
переделал проект нормально, теперь игра запускается, но выскакивает такая ошибка
for( int c = 0; c < columnsCount; r++ )
добрые люди, объясните пожалуйста человеческим языком что это означает:
const char* WeaponName_None = "None";
Значит ли это, что в указателе "WeaponName_None" хранится адрес памяти где должна быть сохранена строка "None", но никакой переменной с таким значеним нет? Т.е. имеется область памяти занятая данными, но не имеющая имени? Зачем?
Так и есть :)
Это указатель на строковую константу неимеющую имени :)
Это просто удобный способ создать несколько глобальных константных строк.
Если интересно, можно вот тут почитать про такие тонкости:
О Великий Мастер! Подскажи, пожалуйста, я правильно понял то, что на скриншоте:
сначала мы создаем тип данных "перечисление"(UnitType). На скриншоте слева создается функция "типа перечисления"(???), которая использует переменную символьного типа "CellSymbol". Когда эта функция принимает CellSymbol равный герою, орку и скелетону, она дает этой клетке соответствующий тип.
В правой части создается переменная типа "перечисления", которая равна функции GetUnitTypeFromCell, а вместо переменной "CellSymbol" используется "destinationCellSymbol"(равная клетке, куда ходить).
И вопрос: почему CellSymbol меняют на destinationCellSymbol, точнее как это работает?
cellSymbol - это не тип, это просто имя параметра( считай переменной ) в функции :) Ее тип - unsigned char( символ ) :)
А UnitType - это отдельный тип, чисто для перечисления возможных типов юнитов :)
Ну а функция GetUnitTypeFromCell просто конвертирует символ(unsigned char) в тип юнита(UnitType).
И ответ: destinationCellSymbol - это просто переменная :) При передаче переменной в функцию ее значение просто скопируется во внутренний параметр( считай переменную, cellSymbol ) :)
А почему нужно обращаться к жизни существа через if (pointerToUnitData->health<=0), почему нельзя без адреса, через переменную if (существо.health<=0).
Самая главная причина - научится работать с указателями :) Потому что именно так потом происходит работа с динамическими объектами :)
Вторая причина - это то, что на данном моменте я не рассказывал о механизме "ссылок" в C/C++, а без этого при обычной передаче существа в фунцию создастся его копия :)
Например:
printf("\n\t);
Перейдем на С++ и ООП будем использовать std::string объекты :)
Ну я могу лишь посоветовать для начала закончить весь курс уроков для более глубокого понимания архитектуры игровой логики, а потом вернуться к реализации таких сложных механик :)
Я понимаю что прошло уже очень много времени,я весьма на много опоздал,но у вас кода вашей игры не осталось?
По моему я слегка опоздал на эту серию постов.... Ну да ладно. Начал по тебе учится, очень хорошо объясняешь. Вот что забацал: https://yadi.sk/d/JvUyn-vqszqrV
Сделал квесты, доп комнаты, инвентарь, босса и т.д. Движение WASD, инвентарь на Q. Жаль что только русский не получилось включить - баги вызывал, поэтому там мой кривой английский
Сначала хотел похвастаться какой я молодец, до 4 утра пилил игру по данному мануалу, пока не заработала. Потом вспомнил что всем насрать и передумал. Но всё же комент оставлю. Автор спасибо за очередной длиннопост. Если хоть один человек попытался сделать всё по уроку и что-то почерпнул, то у тебя уже появился +1 к карме. А так как нас много, то ты уже почти святой.
Автор, извини что обращаюсь, но я сейчас вскрываться начну, можешь пожалуйста проверить, что я делаю не так. Как можно тебе код скинуть?
https://pp.vk.me/c633922/v633922334/fbe/6rMjiYJBPSc.jpg
Может быть где-то очепятался или упустил чего?
Да, вы смешали WeaponType и WeaponName :)
WeaponType - это перечисляемый тип ( Вид оружия )
WeaponName - это текстовые константы( Имя оружия )
Попробовал набрать програмку . На этапе описания оружия выдает ошибку . Говорит WeaponName должны иметь константные значения. Вроде все написал как у вас.В чем может быть проблема?
Господа, такой вопрос, остановился на моменте с просмотром уровня.
При компиляции окно сразу закрывается не хватало библиотек, разобрался как докачать их.
Но это не помогло, теперь пишет что библиотеки успешно загружены и выдает такое сообщение
The program '[5708] ConsoleApplication6.exe' has exited with code 0 (0x0).
Пытался через систем пазуа задержать, все равно просто закрывает окно и все.
да вот он весь:
#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;
}
Стока ошибок я наделал пока набирал код... С некоторыми справился, а вот с этой не пойму что происходит:
WeaponType.h:14:13: error: two or more data types in declaration of 'WeaponName_None'
const char* WeaponName_None = "None";
А можно посмотреть блок кода пять строк вверх над это строкой и пять строк вниз под этой строкой? :)
Скомпилировалось, но не запускается, типа не может запуститься на 64-разрядной системе (((