Current time: 20.04.2024, 13:16 Hello There, Guest! (LoginRegister)
Language: english | russian  

Post Reply 
Threaded Mode | Linear Mode
С++, общая тема
Author Message
Efrit Offline
Administrators

Posts: 6183
Post: #361

Quote:у меня с паттернами вообще говоря практически шапочное знакомство
Да у меня тоже. Трогал только как раз абстрактную фабрику и визитора - ну и синглтон, естественно. Ещё "мост" пытался щупать, но уже позабыл всё. Ещё начинал читать книжку по ним - но там такая вода написана, что аж уши вянут Ab

Quote:а вот 6 базовых параметров практически на 100% незыблемы
Дык на класс же это не тянет. Это всего лишь enum. Класс - это "раса", "класс" (в Днд-шном смысле) или "оружие", но уж никак не конкретные параметры.


Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...
08.07.2012 17:27
Find all posts by this user Quote this message in a reply
NIKr0m@nceR Offline

Posts: 203
Post: #362

Или может быть билдером создавать расу с классом и т.п.?

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


всё на благо народа
08.07.2012 17:39
Find all posts by this user Quote this message in a reply
Efrit Offline
Administrators

Posts: 6183
Post: #363

Паттерн "билдер" я в своё время толком так и не понял. Точнее гря - я не нашёл особых различий между ним и MVC... Так что тут подсказать не могу.

Если у параметров есть какие-то "подхарактеристики" - тогда да, придётся делать их классом. Странновато выглядит, но придётся...


Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...
08.07.2012 18:14
Find all posts by this user Quote this message in a reply
NIKr0m@nceR Offline

Posts: 203
Post: #364

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


всё на благо народа
08.07.2012 18:20
Find all posts by this user Quote this message in a reply
Efrit Offline
Administrators

Posts: 6183
Post: #365

Quote:это базовое число, или текущее значение, или базовое число и список того что на него влияет, или вообще чёрти пойми что.
Вот именно поэтому я и рекомендую использовать проперти. По крайней мере, можно будет просто написать goblin.force = 10 - и не париться, что при этой операции будет изменяться ещё туева хуча "подхарактеристик" персонажа. Только не стоит забывать про ехplicit-конструкторы 118

Quote:в частности, от этого зависит какие методы должны извне просто получать значения а какие должны быть внутренними.
Я думаю, что все методы, которые принимают хар-ки в качестве параметров, должны быть внешними.

А вообще, можно не париться и юзать распространённый подход: делать всё private - а когда по ходу дальнейшей разработки понадобится "доступ извне", сделать такой метод публичным. Обычно, человеком с опытом уже видит, что какой-то из методов нарушает инкапсуляцию - и он тогда поймёт, что сейчас менять private на public нельзя (и стоит, например, разделить метод на два - "приватную" и "публичную" части).


Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...
08.07.2012 18:48
Find all posts by this user Quote this message in a reply
packa Offline

Posts: 1210
Post: #366

Есть такая штука:

Вектор объектов "танк". (class Enemy)
Вектор объектов "патрон" летящих в танки. (Class Ammo)

Среди параметров патрона есть Enemy *target (ссылка непосредственно на объект Enemy (танк) )

Проблема:
Танк "взрывается" До того как долетят все патроны. И после взрыва танка патроны теряют цель, и тупо улетают за экран ( и там вечно летят )

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

Есть еще мысли, чтобы патроны взрывались именно в том месте, где был танк (а потом взорвался)


подпись была удалена администрацией
просьба не использовать картинки с сайта heroeslibrary.net, так как на них ругается Chrome
(This post was last modified: 14.08.2012 19:18 by packa.)
14.08.2012 18:53
Find all posts by this user Quote this message in a reply
Efrit Offline
Administrators

Posts: 6183
Post: #367

У тебя сама модель построена неправильно. Зачем вообще "патрон" хранит в себе "врага-цель"? И логично, что если уж танк-цель взрывается каким-то "сторонним" образом - то "патрон" не знает, как себя вести. Ведь он перестаёт быть нужным!

Намного правильнее было бы, если бы "патроны" не были привязаны к конкретным "танкам", а летели сами по себе. А проверка "попал или нет" проводилась бы по координатам, а не по "целям". То бишь - проходимся по всем "танкам" и смотрим, не совпали ли их координаты с какими-либо "патронами". Если да - то взрываем все такие "патроны", ведь их может быть несколько (ну и сам танк заодно).

Как бы это решил я:

- для всех игровых объектов создал бы абстрактный класс GameObject, от которого уже затем наследовал бы конкретные (танки, патроны, башни);
- разбил бы игровое поле на квадратные клетки (класс Cell), представляющие из себя спрайты N*N пикселей;
- каждая Cell-клетка хранила бы в себе указатель на GameObject, который показывал бы, чем именно "занята" эта клетка;
- тогда попадание патрона в танк проверялось бы легко: если "новая" клетка патрона уже кем-то занята - то этот "кто-то" взрывается (ну, если умеет).
то бишь обыкновенный полиморфизм, ничего сложного


Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...
14.08.2012 21:36
Find all posts by this user Quote this message in a reply
packa Offline

Posts: 1210
Post: #368

Забавно) но все так, или практически так) За исключением клеток.

Quote:Намного правильнее было бы, если бы "патроны" не были привязаны к конкретным "танкам", а летели сами по себе. А проверка "попал или нет" проводилась бы по координатам, а не по "целям". То бишь - проходимся по всем "танкам" и смотрим, не совпали ли их координаты с какими-либо "патронами". Если да - то взрываем все такие "патроны", ведь их может быть несколько (ну и сам танк заодно).
Они и летят сами по себе, столкновение определяется так: есть структура Rect с 4 переменными (прямоугольник)
и в каждую 0,1 сек для всех объектов создается по этому Ректу, потом все эти ректы проверяются на столкновение.

Но есть одно Но! А куда им собственно лететь? Им нужно куда то лететь! Наиболее подходящим способом я избрал создать ссылку на объект (target) и черпать из него координаты (target->yy)

Quote:- для всех игровых объектов создал бы абстрактный класс GameObject, от которого уже затем наследовал бы конкретные (танки, патроны, башни);
Присутствует

Quote:- разбил бы игровое поле на квадратные клетки (класс Cell), представляющие из себя спрайты N*N пикселей;
Ну это будет оочень условно. У меня шаг 1 пиксель, и проверка на столкновение обрабатывается чуть ли не до касания бампера танка)

В общем вот можно пощупать (или хотя бы *ехе запустить, лучше 1 раз увидеть чем 100 раз услышать)
Просто не думаю, что у кого то есть желание копаться в моем коде) Но я старался очень и очень структурировано кодить и вроде как прибирался обычно.

P.S. У меня часто вылазит ошибка вектора - но ошибку кажет в _vector.h
Quote: __stl_throw_out_of_range("vector");
Нельзя ли как нибудь настроить, чтобы узнать ГДЕ именно происходит эта неправильность???
Вот опытным путем удалось установить что ошибка в строке 196, ну или +\- 20 строк )


подпись была удалена администрацией
просьба не использовать картинки с сайта heroeslibrary.net, так как на них ругается Chrome
14.08.2012 22:06
Find all posts by this user Quote this message in a reply
Efrit Offline
Administrators

Posts: 6183
Post: #369

Ошибка очевидна. Внутри вложенного цикла
   for (unsigned int j=0; j<ammo_tower_group.size(); j++)
вызывается метод
   Boom_Enemy(i)
который удаляет i-ый элемент из глобального массива enemy_group.
Однако i после этого не меняется (ведь это вложенный цикл, который работает по j, а не внешний), и поэтому в строке
   ammo_tower_group.at(j).target==&enemy_group.at(i)
вовсе не факт, что enemy_group.at(i) будет существовать.

А вообще, Пакка, твой код по-прежнему представляет из себя мешанину из: названий различного стиля, размазанных по всему файлу классов (что мешает их в отдельные файлы выделить?), отсутствия комментариев и кучи глобальных переменных. Особенно последнее огорчает... Если уж хочешь, чтобы твой код был понятен другому человеку - пиши его так, чтобы он был понятен. Чтобы человеку не приходилось рыскать по всему файлу, дабы узнать - что значит такая-то глобальная переменная...


Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...
15.08.2012 18:09
Find all posts by this user Quote this message in a reply
packa Offline

Posts: 1210
Post: #370

Quote:Ошибка очевидна. Внутри вложенного цикла
Кстати да, тоже заметил один раз, только потом забыл подумать и больше не возвращался. Эффект замыленности на лицо Sm

Quote:А вообще, Пакка, твой код по-прежнему представляет из себя мешанину
Sorry А я думал прибрался... Просто я как дома, для меня все там на полочках))) Не подумал как то что непонятно может быть (

Quote:(что мешает их в отдельные файлы выделить?)
Знания, спасибо что натолкнул, попробую.

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


подпись была удалена администрацией
просьба не использовать картинки с сайта heroeslibrary.net, так как на них ругается Chrome
(This post was last modified: 18.08.2012 20:13 by packa.)
15.08.2012 19:11
Find all posts by this user Quote this message in a reply
packa Offline

Posts: 1210
Post: #371

Не получается собрать воедино!
Решил вытащить классы в отдельный файл, а они так срослись!

есть Unit1.cpp в нём используется вектор ammo_tower_group;(ниже) пробовал писать extern vector <Ammo_First> ammo_tower_group; - не помогает. (#include "Unit1.h",#include "Unit2.h")
есть Unit1.h
есть Unit2.cpp в нём описание class Ammo_First; вектор vector <Ammo_First> ammo_tower_group; (#include "Unit2.h",#include "Unit1.h")
есть Unit2.h в нём объявление class Ammo_First; (#include "Unit1.h")

вылазит куча ошибок типа
[C++ Error] Unit2.cpp(7): E2238 Multiple declaration for 'vector'
[C++ Error] Unit2.cpp(6): E2141 Declaration syntax error

Вообще порядком запутался что и где екстернить нужно. =(


подпись была удалена администрацией
просьба не использовать картинки с сайта heroeslibrary.net, так как на них ругается Chrome
(This post was last modified: 20.08.2012 22:11 by packa.)
20.08.2012 22:07
Find all posts by this user Quote this message in a reply
packa Offline

Posts: 1210
Post: #372

Смотрел в интернете, есть ситуация 1 в 1, только вместо моего типа Ammo_First там int и все благополучно работает!


подпись была удалена администрацией
просьба не использовать картинки с сайта heroeslibrary.net, так как на них ругается Chrome
20.08.2012 22:12
Find all posts by this user Quote this message in a reply
Efrit Offline
Administrators

Posts: 6183
Post: #373

Пакка, выложи получившийся код, а то без него сложно что-то понять.
Только, плз, не на Залил.ру Ab


Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...
20.08.2012 22:32
Find all posts by this user Quote this message in a reply
packa Offline

Posts: 1210
Post: #374

Вот, только боюсь там немного путанно, ибо я запутался(

Изначальная идея - для каждого класса (всего их штук 5) выделить отдельный файл.
Конкретнее Враги\Патроны\Бункер\Интерфейс\Препятствия.

Попытался сначала на патронах. Встал вопрос - куда же девать глобальные вектора - решил положить в файл с классом, а в юнит1 екстерном прикрепить (пытался и наоборот, тоже не вышло)

P.S.А почему не залил?) мой любимый)


подпись была удалена администрацией
просьба не использовать картинки с сайта heroeslibrary.net, так как на них ругается Chrome
20.08.2012 23:45
Find all posts by this user Quote this message in a reply
Efrit Offline
Administrators

Posts: 6183
Post: #375

Так и не понял, где в твоём коде "разбиение классов по файлам". File1 - это всё, что ли? Ну да ладно.

Вообще, этот процесс происходит так. В хедерах описываются только прототипы классов. То есть - указывается имя класса и от чего он наследуется (если есть), а затем перечисляются его члены-переменные и члены-функции. Для функций указываются только заголовки, без каких-либо деталей реализации. У тебя же внутри хедера описан список инициализации конструктора, и это неверно.

"Заголовок" функции - это её тип, сигнатура и дополнительные атрибуты (explicit, inline, virtual, const, throw(), = 0). То есть всё, что стоит перед её фигурными скобками. При этом, внутри хедеров нужно указывать полный заголовок функции, а вот внутри цпп-шников лишь частичный: из атрибутов функции указываются лишь те, что стоят справа от сигнатуры.

Начинать "выделение классов в файлы" стоит с самых мелких классов, которые не зависят от других. И лишь затем переходит к более крупным. Кстати, у тебя строка с инклудом File1.h почему-то стоит выше строки с прагмой - это неверно, поскольку у тебя в этом хедере содержится не стандартный класс, а твой собственный (который может меняться).


Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...
21.08.2012 10:54
Find all posts by this user Quote this message in a reply
« Next Oldest | Next Newest »
Post Reply 


Forum Jump:

Powered by MyBB Copyright © 2002-2024 MyBB Group