Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
LightGameStudio
8 / 8 / 1
Регистрация: 03.11.2015
Сообщений: 137
#1

Удаление и создание указателя в игре - C++

25.06.2016, 21:30. Просмотров 192. Ответов 4
Метки нет (Все метки)

Добрый вечер. Долгое время сижу с кодом, не придет в голову:
Нужно, чтобы при пересечении на тайлмапе координат игрока/64 и символа 'b' создавался указатель с координатами символа 'b' а после сражения с персонажем удалялся пока он не наткнется на след. 'b'...
Приложение постоянно вылетало из-за утечек памяти или же указатель появлялся снова в тот же момент
(B определяет, создавать его или нет). Код большой, поэтому я привел лишь фрагмент:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
//#include"objs.h"
#define MaxSharkbears 40
 
using namespace std;
using namespace sf;
int QuestNumber = 1;
int CountSharkBear = 0;//
bool B = 1;//Создавать монстра или нет
 
int QuestRectY = 1;
 
class SharkBears : public Person
{
public:
    SharkBears(){};
    SharkBears(int X_, int Y, int D, int L)
    {
        x = X_, y = Y, damage = D, lives = L;
    };
};
class Player 
{
public:
#pragma region r1
    float x, y;
    int State = 0;
    float dx, dy, speed = 0;
    int w, h;
    string File;
    Image image;
#pragma endregion r1
    Player(){};
    Player(string F, float X, float Y, int W, int H)
    {
        File = F;
        x = X; y = Y;
        w = W; h = H;
        image.loadFromFile(File);
        texture.loadFromImage(image);
        sprite.setTexture(texture);
        sprite.setTextureRect(IntRect(0, 0, w, h));
        lives = 20;
        damage = 4;
    };
};
class GameEngine
{
public:
    SharkBears* SharkBear;
    void Init()
    {
        Loot.sprite.setScale(Vector2f(0.9f, 0.9f));
        Inventory.sprite.setScale(Vector2f(0.7f, 0.7f));
        generate();
        for (int k = 0; k < MaxSharkbears; k++)
        {
            //SharkBear[k] = new SharkBears(random(33) + 1, random(38) + 1, random(2) + 2, random(4) + 8);
            TileMap[random(33) + 1][random(38) + 1] = 'b';
        }
        for (int k = 0; k < MaxDragons; k++)
        {
            dragon[k] = new Dragons(random(33) + 1, random(38) + 1, random(6) + 2, random(10) + 25);
            TileMap[dragon[k]->x][dragon[k]->y] = 'd';
        }
    }
    int Update(int time)
    {
        for (int i = player.y / BlockSize; i < (player.y + player.h) / BlockSize; i++)
        {
            for (int j = player.x / BlockSize; j < (player.x + player.w) / BlockSize; j++)
            {
#pragma region
                if (TileMap[i][j] == 'b')
                {
                    if (B){
                        SharkBear = new SharkBears(player.x, player.y, random(2) + 2, random(4) + 8);
                        B = 0;
                        cout << "S8: FIGHT";
                    }
                    player.State = FIGHT_SB;
                }
#pragma endregion
            }
        }
        switch (player.State)
        {
        case FIGHT_DR:fight(dragon[NumberOfMonster]); return dragon[NumberOfMonster]->lives; break;
        case FIGHT_SB:fight(SharkBear); return SharkBear->lives; break;
        }
        
    }
    bool fight(Monster *FightDragon);
};
bool GameEngine::fight(Monster *FightDragon)
{
    if (Action == PLAYER_ACTION)
    {
        if (Keyboard::isKeyPressed(Keyboard::Space))
        {
            FightDragon->lives -= random(player.damage);
            Action = DRAGON_ACTION;
            if (FightDragon->lives <= 0)
            {
                //DROP
                TileMap[int(FightDragon->x / 64)][int(FightDragon->y / 64)] = ' ';//Исчезновение с ТайлМапа
                 CountSharkBear++;
                cout << "S8: WIN" << endl;
                cout << endl << TileMap[int(FightDragon->x / 64)][int(FightDragon->y / 64)];
                delete FightDragon;
                B = 1;//Для след. монстра
                player.State = UP;//not fight
            }
        }
    }//Player action
    else if (Action == DRAGON_ACTION)
    {
        //ИИ ДРАКОНА
        Sleep(90);
        player.lives -= random(FightDragon->damage);
        Action = PLAYER_ACTION;
        if (player.lives <= 0){ player.lives = 0; isLife = false; }
    }
    return 0;
}
int main()
{
    RenderWindow window(sf::VideoMode(933.33333, 700), "The Castle");//Window
    view.reset(sf::FloatRect(0, 0, Width, Height));
 
    //-sf::SoundBuffer buffer;
    //buffer.loadFromFile()
    GameEngine game;
    game.Init();  //Game init
    float Frame = 0;//for animation
    float time;
    while (window.isOpen())
    {
        time = clock.getElapsedTime().asMicroseconds();
        clock.restart();
        time = time / 650;
 
        game.Update(time);
        game.render(window);
        window.display();
    }
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.06.2016, 21:30
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Удаление и создание указателя в игре (C++):

Динамическое создание/удаление и перебор противников в 2D игре visual studio
Всем доброго времени суток! Решил сделать простую 2d игру, но появился...

Создание указателя на экземпляр класса, описанного после объявления указателя
Здравствуйте! Проблема в том, что нужно сделать так: class A{ public: B*...

удаление указателя
char* func() { char *str = new char; strcpy(str, &quot;I am string!&quot;); return...

Удаление указателя
Доброго времени суток! Возник вопрос: безопасно ли таким способом удалять...

Удаление указателя на матрицу
Здравтвуйте есть фу-я удаления матрицы void DeleteMatrix(double **obj)...

Удаление указателя на объект класса
Что-то ни как не могу разобраться, где у меня ошибка?! Ниже приведен фрагмент...

4
Krock21rus
74 / 74 / 27
Регистрация: 18.11.2013
Сообщений: 373
Завершенные тесты: 2
25.06.2016, 22:09 #2
62 cтрочка
Цитата Сообщение от LightGameStudio Посмотреть сообщение
dragon[k] = new Dragons(random(33) + 1, random(38) + 1, random(6) + 2, random(10) + 25);
76 строчка
Цитата Сообщение от LightGameStudio Посмотреть сообщение
SharkBear = new SharkBears(player.x, player.y, random(2) + 2, random(4) + 8);
и на всё это лишь 109 строчка
Цитата Сообщение от LightGameStudio Посмотреть сообщение
delete FightDragon;
кажется вы мало удаляете
0
DUMP
73 / 47 / 26
Регистрация: 22.02.2015
Сообщений: 306
26.06.2016, 00:34 #3
LightGameStudio, каша если честно. Через дебаг ловите где падает, скорее всего где-то используется не обнулённый указатель после удаления.
0
LightGameStudio
8 / 8 / 1
Регистрация: 03.11.2015
Сообщений: 137
26.06.2016, 11:57  [ТС] #4
Я сделал, теперь удаляет и Sharkbear, но он всё равно появляется..
0
Krock21rus
74 / 74 / 27
Регистрация: 18.11.2013
Сообщений: 373
Завершенные тесты: 2
26.06.2016, 14:49 #5
так delete FrightDragon не удаляет массив dragon
0
26.06.2016, 14:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.06.2016, 14:49
Привет! Вот еще темы с решениями:

Удаление указателя, в классе не содержащем объекта
Подскажите, в классе объявляю указатель на объект, сам объект создан в не этого...

Создание указателя на объект и выделение памяти
Не пойму почему при добавлении одного указателя выдает ошибку Этот код...

Создание паузы в игре
Подскажите, пожалйста, как грамотно можно реализовать паузу в игре? Т.е. чтобы...

Создание программы со своей библиотекой ( удаление элементов с N по M в строке и удаление лишних пробелов(если 2 и более оставить один))
добрый день. помогите, пожалуйста понять мои ошибки в работе. Мне нужно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru