372

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

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

Суть в том, что 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)
Автор поста оценил этот комментарий

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

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

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

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

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

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

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

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

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

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

const char* WeaponName_None = "None";


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

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

Так и есть :)

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

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


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

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)
Автор поста оценил этот комментарий
Мы же плавно подходим к объектам )))
показать ответы
Автор поста оценил этот комментарий

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

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

Например:

printf("\n\t);

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

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

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

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

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

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

раскрыть ветку (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)
Автор поста оценил этот комментарий
Покажи код файла main.cpp плиз )
показать ответы
Автор поста оценил этот комментарий

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

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

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

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

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

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

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

раскрыть ветку (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-разрядное приложение? О_о А предыдущие уроки собирались нормально?

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

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества