Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
LightGameStudio
6 / 6 / 0
Регистрация: 03.11.2015
Сообщений: 132
#1

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

25.06.2016, 21:30. Просмотров 180. Ответов 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 - C++
Всем доброго времени суток! Решил сделать простую 2d игру, но появился вопрос: как создать систему, которая при каком-то событии...

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

Удаление указателя - C++
Доброго времени суток! Возник вопрос: безопасно ли таким способом удалять указатели? std::vector&lt;MyClass*&gt; vec; //создание ...

Удаление указателя на матрицу - C++
Здравтвуйте есть фу-я удаления матрицы void DeleteMatrix(double **obj) { for (int i = 0; i &lt; n; i++) { delete...

Удаление указателя на объект класса - C++
Что-то ни как не могу разобраться, где у меня ошибка?! Ниже приведен фрагмент кода: //... shapes *ptr=0; //ptr - указатель базового...

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

4
Krock21rus
74 / 74 / 19
Регистрация: 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
57 / 31 / 7
Регистрация: 22.02.2015
Сообщений: 261
26.06.2016, 00:34 #3
LightGameStudio, каша если честно. Через дебаг ловите где падает, скорее всего где-то используется не обнулённый указатель после удаления.
0
LightGameStudio
6 / 6 / 0
Регистрация: 03.11.2015
Сообщений: 132
26.06.2016, 11:57  [ТС] #4
Я сделал, теперь удаляет и Sharkbear, но он всё равно появляется..
0
Krock21rus
74 / 74 / 19
Регистрация: 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
Привет! Вот еще темы с ответами:

Создание указателя на объект и выделение памяти - C++
Не пойму почему при добавлении одного указателя выдает ошибку Этот код работает class A { public: class B { public: ...

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

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

Почему увеличение указателя на sizeof(тип) не тождественно инкременту этого же указателя? - C++
Всем доброго дня.:) Можете обьяснить ,почему при инкриментировании указателя,его значение(адресс) увеличивается на 4 (размер int в...


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

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

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