Форум программистов, компьютерный форум, киберфорум
SFML
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
14 / 20 / 14
Регистрация: 20.03.2018
Сообщений: 485
1

Стрельба. Пуля вылетает очередью - Как исправить?

03.07.2018, 19:00. Показов 1859. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В примере все летит как надо, но как перенес эту схему
к себе в проект пуля стала очередью стрелять

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
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
#include<iostream>
 
#include"SFML\Graphics.hpp"
 
#include"SFML\Window.hpp"
 
#include"SFML\System.hpp"
 
#include<math.h>
 
#include<cstdlib>
 
#include<vector>
 
 
using namespace
sf;
 
 
 
 
class Bullet
{
public:
    Sprite shape;
 
    Bullet(Texture *texture, Vector2f pos)
    {
        this->shape.setTexture(*texture);
 
        this->shape.setScale(2.f, 2.f);
 
        this->shape.setPosition(pos);
    }
 
    ~Bullet(){}
};
 
class Player
{
public:
    Sprite shape;
    Texture *texture;
 
    int HP;
    int HPMax;
 
    std::vector<Bullet> bullets;
 
    Player(Texture *texture)
    {
        this->HPMax = 10;
        this->HP = this->HPMax;
 
        this->texture = texture;
        this->shape.setTexture(*texture);
 
        this->shape.setScale(2.f, 2.f);
    }
 
    //  ~Player() {}
 
};
 
 
 
 
 
int main()
{
    srand(time(NULL));
 
    RenderWindow window(VideoMode(800, 600), "Space war", Style::Default);
    window.setFramerateLimit(60);
 
    //Init text
    Font font;
    font.loadFromFile("Fonts/Dosis-Light.ttf");
 
    //Init textures
    Texture playerTex;
    playerTex.loadFromFile("DATA/IMG/MAN.png");
 
    Texture enemyTex;
    enemyTex.loadFromFile("DATA/IMG/PUTEN.JPG");
 
    Texture bulletTex;
    bulletTex.loadFromFile("DATA/IMG/VILKA.png");
 
    
 
 
 
    //Player init
    int score = 0;
    Player player(&playerTex);
    int shootTimer = 20;
    Text hpText;
    hpText.setFont(font);
    hpText.setCharacterSize(12);
    hpText.setFillColor(Color::White);
 
    
 
    
 
    while (window.isOpen())
    {
        Event event;
        while (window.pollEvent(event))
        {
            if (event.type == Event::Closed)
                window.close();
        }
 
        if (player.HP > 0)
        {
            //Player
            if (Keyboard::isKeyPressed(Keyboard::Up))
                player.shape.move(0.f, -10.f);
            if (Keyboard::isKeyPressed(Keyboard::Left))
                player.shape.move(-10.f, 0.f);
            if (Keyboard::isKeyPressed(Keyboard::Down))
                player.shape.move(0.f, 10.f);
            if (Keyboard::isKeyPressed(Keyboard::Right))
                player.shape.move(10.f, 0.f);
 
        
 
            
            //Collision with window                            столкновение игрока с окном
            if (player.shape.getPosition().x <= 0) //Left
                player.shape.setPosition(0.f, player.shape.getPosition().y);
            if (player.shape.getPosition().x >= window.getSize().x - player.shape.getGlobalBounds().width) //Right
                player.shape.setPosition(window.getSize().x - player.shape.getGlobalBounds().width, player.shape.getPosition().y);
            if (player.shape.getPosition().y <= 0) //Top
                player.shape.setPosition(player.shape.getPosition().x, 0.f);
            if (player.shape.getPosition().y >= window.getSize().y - player.shape.getGlobalBounds().height) //Bottom
                player.shape.setPosition(player.shape.getPosition().x, window.getSize().y - player.shape.getGlobalBounds().height);
 
            //Update Controls
            if (shootTimer < 15)
                shootTimer++;
 
            if (Keyboard::isKeyPressed(Keyboard::Space) && shootTimer >= 10) //Shooting
            {
                player.bullets.push_back(Bullet(&bulletTex, player.shape.getPosition()));
                shootTimer = 0; //reset timer
            }
 
            //Bullets
            for (size_t i = 0; i < player.bullets.size(); i++)
            {
                //Move
                player.bullets[i].shape.move(20.f, 0.f); // тут можно задать скорость и угол полёта пули
 
                
                
                //Out of window bounds Выход пули за окно
                                
                if (player.bullets[i].shape.getPosition().x > window.getSize().x)
                {
                    player.bullets.erase(player.bullets.begin() + i);
                    break;
                }
 
                //Enemy collision
 
 
 
                //player.bullets.erase(player.bullets.begin() + i);
                break;
 
            }
 
 
        }
 
        
 
            
 
        
        
        //Draw ===================================================================== DRAW
        window.clear();
 
        //player
        window.draw(player.shape);
 
        //Bullets
        for (size_t i = 0; i < player.bullets.size(); i++)
        {
            window.draw(player.bullets[i].shape);
        }
 
        
 
 
 
        window.display();
    }
 
    return 0;
}
Короче пытался по всякому ну например разделил на 2 цикла нажатие
C++
1
2
3
4
5
6
7
8
9
10
11
12
        //С Т Р Е Л Я Е М !
        if (Keyboard::isKeyPressed(Keyboard::Space) && shootTimer >= 16) //Shooting
        {
            shot = true;
            
        
        }
        if (shot == true) {
            p.bullets.push_back(Bullet(&bulletTex, p.sprite.getPosition()));
            shootTimer = 0; //reset timer
            shot = false;
        }
И это тоже не помогло

Добавлено через 8 минут
Ну как бы может вылетать по одной, но надо совсем очень быстро на клаву жать и отпускать

Добавлено через 5 минут
Есть конечно вариант добавить shot = false; в цикл отрисовки, но получается как то не цивильно
В таком варианте мы не сможем снова выстрелить пока пуля куда то не долетит
C++
1
2
3
4
5
6
//Bullets
        for (size_t i = 0; i < p.bullets.size(); i++)
        {
            window.draw(p.bullets[i].shape);
            shot = false;
        }
Добавлено через 25 минут
Проблема решена добавлено отжатие
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.07.2018, 19:00
Ответы с готовыми решениями:

Разработать программу «Пуля», в которой по вашей команде из ствола вылетает пуля, попадает в шарик, который
Разработать программу «Пуля», в которой по вашей команде из ствола вылетает пуля, попадает в шарик,...

Стрельба в игре: пуля меняет направление при повороте танка
здравствуйте я пишу игру наподобие Battle City. пока у меня есть только танк который стреляет....

Вылетает окно с ошибкой, не знаю как исправить
Здравствуйте, форумчане! Прошу помощи! Стоит виндовс 8.1, установил неделю назад. Перед установкой...

Прога вылетает в вижуал студии , как исправить?
#include &lt;stdio.h&gt; #include &lt;locale.h&gt; int main() { setlocale(LC_ALL, &quot;rus&quot;); float x1, x2,...

15
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
03.07.2018, 20:00 2
Цитата Сообщение от mrden777 Посмотреть сообщение
Ну как бы может вылетать по одной, но надо совсем очень быстро на клаву жать и отпускать
Ну как бы isKeyPressed проверяет текущее состояние кнопки. При 60-ти итерациях в секунду, получаем 60 успешных проверок, если клавиша была нажата секунду.
shootTimer >= 10
С этим условие будет срабатывать каждые 10 итераций, т.е. 6 раз в секунду.
Итого, чтобы выпустить одну пулю, клавиша должна быть зажата не более чем на 166 миллисекунд.
0
14 / 20 / 14
Регистрация: 20.03.2018
Сообщений: 485
03.07.2018, 20:13  [ТС] 3
Вылезла еще одна проблемка
пулька по оси Y следует за Y игрока, не могу пока понять почему это происходит
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
03.07.2018, 20:20 4
C++
1
2
3
4
5
6
7
8
9
10
            for (size_t i = 0; i < player.bullets.size(); i++)
            {
                player.bullets[i].shape.move(20.f, 0.f);                                
                if (player.bullets[i].shape.getPosition().x > window.getSize().x)
                {
                    player.bullets.erase(player.bullets.begin() + i);
                    break;//А другие пули не нужно двигать? Наверное, continue? Но это тоже будет не совсем корректно, т.к. пропустим одну пулю
                }
                break;//Двигаем только одну пулю? Зачем тогда цикл?
            }
0
14 / 20 / 14
Регистрация: 20.03.2018
Сообщений: 485
03.07.2018, 20:52  [ТС] 5
Почему одну ? Мы можем стрелять и очередями
Есть же параметр [i]той пули Проблема в том что вся выпущенная очередь привязана
к позиции Y игрока, но в примере то работает все корректно
я просто по другому класс игрока задал
потому что в примере неподвижная тема а у меня спрайты
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
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
#include <SFML/Graphics.hpp>
#include"SFML\Window.hpp"
#include"SFML\System.hpp"
#include <iostream>
#include <sstream>
#include <vector>
#include <list>
#include<cstdlib>
#include<math.h>
 
#define IDI_ICON                       102   //Создание слота для иконки при компиляции в EXE проект
using namespace sf;
 
float shootTimer;
 
bool storona = true; //Сторона куда бежит моб
//bool stay;
 
float offsetX = 0, offsetY = 0;//Скроллинг карты - смещение ее в обратную сторону движению
 
bool textos = false; // Разрешаем выводить текст только при взятии монетки
 
bool isShoot;
bool shot = false;
 
const int H = 14;
const int W = 195;
 
 
String TileMap[H] = {
 
    "00000000000000000000000000TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU0",
    "0N              NNNNNNNNN0TTTTTTTTTTTTTKKKTTTTTKKTTTTTTTTKKTTTTKKKKTTKKTTKKTTTKKKTTTTKKTTKKTTKKKTTTKKTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTU                                      0",
    "0N        NUNN  0000000NN0TTTTTTTTTTTTKKKKKTTTTTTTTTTTTTTTTTTTTTKKKKKKTTTTTTKKKKaaKKTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTU                                      0",
    "0N   ULLLLU      NNNNNNNN0TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTKKTTTTTTTTKKTaaaaTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTKKKKKKKKTTTTTTTTTTTU                                      0",
    "0    ULLLLUAAAUU0000000000TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTaaaZaaaO    NNNNNNUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU        NN NNN U      NNNU      00  U00000000  UU    0  0UUUUUUU0",
    "0UUUUUUUUUUbAUUAegAbAegYegTTTTTTTTaNaaNNNNaaTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTlaaaXaaa O   NNNNNNUNNNN                N        NNNNUN PQ   UUUUUUUUU   UUUUUUU      NN  U      0     O   0          0",
    "0         AAUUegfhegYfheghYYklllegNNNNaaaNWaaaaWTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTaaZaa    aOOO O OUU U U U     OULLLLLLU  PQ       UUN RS                  U        000  U    0 0        00  NN      0",
    "0NUN N  N AUUAfhegfhegeghAbiiieghhNNNXaVaaXaaaVaaabTTTTTTTTTTTTTTlllegegilll    X     aaaaa       NN  UU     UUUUUUUU  RS    UUNNUN    NUUUUUUUUUUU     U    O     U  U  UUU 0O PQ   00LLLOOLLLL0 0",
    "0 UN  PQ  YUAegeghYdfhfhbYiiddfhcWVWNZadaaZaaabVZVbbbLLUULLLlLLkliiifhfhiegeg   X     aaaZaaa     UU      U       0 N     N0N  NNU               UNNN  UUNU   PQ   U  U    0 0  RS 000LLLLLLLLL00 0",
    "0 UU  RS  UAAfhfhYdCGdddddddddYcWVaVWXddaaXadegbXbbegYLLLLLLLLLiiiiieghYeghfhO  Z     aaaXaaa000     UUUUUUUUUUU  0LLLLLLLL0 UUUUUUUUUUUUUUUUUU  UUUU   UUUU  RS  OU  UU   0 0UU     0LLLLLLLLLL0 0",
    "0    N  N AAUUUUUddddHdMFddddddcWVcVWZddddZdeghegYegegUUUULLLLLiiNNNfhAegegegA         aaZaa NNN     U            0000000000NNNNNU               U   UN U          UNNN    0 0NN     000000000000 0",
    "0  UUUUUUUUUUNNNUddBEIJddddddddddWXVdXddddXegheghegegUNNNULLULLiiNNNklYfhfhfheglbb       X  0NNN000000   00000UUUUU      UUUUUUU U    OOOOOOOOOOOUNNNUU U  UUUUUUUUUNNNNUUU0 0UUUUU  0NPQNNNNNNNN 0",
    "0         NNNNNNUUUUDdddddddddddddXdddddYbbfhYfhYfhfhUNNNLLLLLLiiNNNiiYhYYfhifhibYbb        0NNN0NNNN             NNNNNN                     NNNNUNNNN            ULLLLLUNNN   NN    0NRSNNNNNNNNN0",
    "0000000000000000000iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiUUUU000000iiiiiiiiiiiiiiiii0000000000000000000000000000000000000000000000000000000000000000000000000000000000UUUUUUU00000000000000000000000000",
};
 
 
using namespace sf;
 
///////////////////////////////////Общий класс-родитель//////////////////////////
 
 
 
 
 
 
 
 
class Bullet
{
public:
    Sprite shape;
 
    Bullet(Texture *texture, Vector2f pos)
    {
        this->shape.setTexture(*texture);
 
        this->shape.setScale(1.5f, 1.5f);
 
        this->shape.setPosition(pos);
    }
 
    ~Bullet(){}
 
    
};
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
////////////////////////////////////////////////////КЛАСС ИГРОКА////////////////////////
 
 
//________________________________________________________________________________________
class PLAYER {
 
public:
 
    float dx1, dy1;
    FloatRect rect;
    bool onGround;
    Sprite sprite;
    float currentFrame;
    std::map<std::string, bool > key;
 
    bool storonap;
    std::vector<Bullet> bullets;
 
    int money = 0;
    //int health; //Обьявили переменные для денег и здоровья
    //bool life; // Жив или мертв
 
 
    PLAYER(Texture &image)
    {
        sprite.setTexture(image);
 
        rect = FloatRect(50, 50, 50, 50);
 
        //Rect (T rectLeft, T rectTop, T rectWidth, T rectHeight);
 
        // Будьте осторожны, последние два параметра - это ширина
        // / и высота, а не правая и нижняя координаты!
        // /
        //     param rectLeft Левая координата прямоугольника
        //         param rectTop Верхняя координата прямоугольника
        // /          param rectWidth Ширина прямоугольника
        // /            param rectHeight Высота прямоугольника
 
 
 
 
 
 
        //  rect = FloatRect(50 * 50, 50 * 50, 40, 50);
        dx1 = dy1 = 0.1;
        currentFrame = 0;
 
        
    }
 
 
    void update(float time)
    {
 
        rect.left += dx1 * time;
        Collision(0);
 
        if (!onGround) dy1 = dy1 + 0.0005*time;
        rect.top += dy1*time;
        onGround = false;
        Collision(1);
 
 
        currentFrame += 0.008*time;
        if (currentFrame > 6) currentFrame -= 6;
 
        if (dx1<0) sprite.setTextureRect(IntRect(50 * int(currentFrame) + 50, 0, -50, 50));
        if (dx1<0) storonap= true;
 
        if (dx1>0) sprite.setTextureRect(IntRect(50 * int(currentFrame), 0, 50, 50));
        if (dx1>0) storonap = false;
        sprite.setPosition(rect.left - offsetX, rect.top - offsetY);
 
        dx1 = 0;
 
        //if (stay == true){ sprite.setTextureRect(IntRect(50 * int(currentFrame), 100, 50, 50)); }
    }
    ~PLAYER() {}
 
 
    void Collision(int dir)   // ПРОВЕРКА СТОЛКНОВЕНИЙ
    {
 
 
 
        for (int i = rect.top / 50; i<(rect.top + rect.height) / 50; i++)
        for (int j = rect.left / 50; j<(rect.left + rect.width) / 50; j++)
        {
            if (TileMap[i][j] == '0' || TileMap[i][j] == 'O' || TileMap[i][j] == 'U' ||
                TileMap[i][j] == 'X' || TileMap[i][j] == 'Z' || TileMap[i][j] == 'B' || TileMap[i][j] == 'E' ||
                TileMap[i][j] == 'I' || TileMap[i][j] == 'M' || TileMap[i][j] == 'F' ||
                TileMap[i][j] == 'i' || TileMap[i][j] == 'k' || TileMap[i][j] == 'l')
            {
                if ((dx1>0) && (dir == 0)) rect.left = j * 50 - rect.width;
                if ((dx1<0) && (dir == 0)) rect.left = j * 50 + 50;
                if ((dy1>0) && (dir == 1))  { rect.top = i * 50 - rect.height;  dy1 = 0;   onGround = true; }
                if ((dy1<0) && (dir == 1))  { rect.top = i * 50 + 50;   dy1 = 0; }
            }
 
            if (TileMap[i][j] == 'N')//Если берем МОНЕТКУ
            {
                money += +1;
                TileMap[i][j] = ' ';
 
                textos = true;
            }
 
        }
 
    }
};
//_______________________________________________________________________________________________________________________
class ENEMY
{
 
public:
    float dx, dy;
    FloatRect rect;
    Sprite sprite;
    float currentFrame;
    bool life;
 
 
    void set(Texture &image, int x, int y)
    {
        sprite.setTexture(image);
        rect = FloatRect(x, y, 50, 50); //рект в который загрузка спрайта врага
 
        dx = 0.05;
        currentFrame = 0;
        life = true;
    }
 
    void update(float time)
    {
        rect.left += dx * time;
 
        Collision();
 
 
        currentFrame += time * 0.005;
        if (currentFrame > 6) currentFrame -= 6;
 
        if (storona == true) sprite.setTextureRect(IntRect(50 * int(currentFrame), 0, +50, 50));         //Движение моба
        if (storona == false) sprite.setTextureRect(IntRect(50 * int(currentFrame) + 50, 0, -50, 50));
 
 
 
        if (!life) sprite.setTextureRect(IntRect(40, 150, 150, 50));
 
 
        sprite.setPosition(rect.left - offsetX, rect.top - offsetY);
 
 
    
 
    }
 
 
    void Collision()
    {
 
        for (int i = rect.top / 50; i<(rect.top + rect.height) / 50; i++)
        for (int j = rect.left / 50; j<(rect.left + rect.width) / 50; j++)
        if ((TileMap[i][j] == 'U') || (TileMap[i][j] == '0'))
        {
            if (dx>0)
            {
                rect.left = j * 50 - rect.width; dx *= -1;
                storona = false;
            }
            else if (dx<0)
            {
                rect.left = j * 50 + 50;  dx *= -1;
                storona = true;
            }
 
        }
    }
 
};
 
 
//______________________________________________________________________________________________________________________________
 
 
 
 
int main()      //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
 
 
{
    srand(time(NULL));
 
    sf::RenderWindow window;
    sf::VideoMode vidMode;
 
    vidMode.width = 1200;
    vidMode.height = 600;
 
 
 
    window.create(vidMode, "------------------START GAME -----------");
 
 
 
 
    Texture tileSet;
    tileSet.loadFromFile("DATA/IMG/MAIN001.png");
 
 
    Texture bulletTex;
 
    bulletTex.loadFromFile("DATA/IMG/bullet.png");
 
    
 
 
    ENEMY  enemy;
    enemy.set(tileSet, 180, 95); //  начальная позиция врага
    Sprite tile(tileSet);
 
 
 
    Font font;//шрифт 
    font.loadFromFile("DATA/deneon.ttf");//передаем нашему шрифту файл шрифта
    Text txt1("", font, 20); //шрифт на деньги
 
    Text txt10("", font, 20); //Стиралка текста
 
 
 
    Image BulletImage;//изображение для пули
    BulletImage.loadFromFile("DATA/IMG/bullet.png");//загрузили картинку в объект изображения
 
 
    
 
 
 
    Image map_image;
    map_image.loadFromFile("DATA/IMG/Nall000.png");
    Texture map;
    map.loadFromImage(map_image);
    Sprite s_map;
    s_map.setTexture(map);
 
 
    int shootTimer = 20;
 
 
 
    Texture t, t2;
 
 
    t.loadFromFile("DATA/IMG/MAN001.png");
 
    float currentFrame = 0;
 
  PLAYER p(t);
 
 
 
    Clock clock;
 
    RectangleShape rectangle(Vector2f(50, 50));
 
    while (window.isOpen())
 
 
    {
        float time = clock.getElapsedTime().asMicroseconds();
        clock.restart();
 
        time = time / 700;
 
        if (time>20) time = 20;
 
        Event event;
        while (window.pollEvent(event))
        {
            if (event.type == Event::Closed)
                window.close();
        }
 
 
        //if ((event.key.code == sf::Keyboard::Left) || (event.key.code == sf::Keyboard::Right)  //Если кноки не надавлены то положение стой
        //      || (event.key.code == sf::Keyboard::Down) || (event.key.code == sf::Keyboard::Up))
        //  {
        //      stay = true;
        //  }
 
        if (Keyboard::isKeyPressed(Keyboard::Left))
        {
 
            p.dx1 = -0.1;
 
            
            //stay = false;
        }
 
        if (Keyboard::isKeyPressed(Keyboard::Right))
        {
 
            p.dx1 = 0.1;
            //  stay = false;
        }
 
        if (Keyboard::isKeyPressed(Keyboard::Up))
        {
 
            
            if (p.onGround) { p.dy1 = -0.35; p.onGround = false; }
            //stay = false;
        }
 
        //Update Controls
        if (shootTimer < 16)
            shootTimer++;
 
            //С Т Р Е Л Я Е М !
                
        if (Keyboard::isKeyPressed(Keyboard::Space) && shootTimer >= 16) //Shooting
        {
            shot = true;
            
        
        }
        if (event.type == sf::Event::KeyReleased)
        {
 
            if (event.key.code == sf::Keyboard::Space)
 
            if (shot == true) {
                p.bullets.push_back(Bullet(&bulletTex, p.sprite.getPosition()));
                shootTimer = 0; //reset timer
                shot = false;
            }
 
        }
 
            //Bullets
 
        //Bullets
        for (size_t i = 0; i < p.bullets.size(); i++)
        {
            //Move
            if (p.storonap == false)    p.bullets[i].shape.move(1.f, 0.f); // тут можно задать скорость и угол полёта пули
 
            if (p.storonap == true) p.bullets[i].shape.move(-1.f, 0.f); // тут можно задать скорость и угол полёта пули
            //Out of window bounds Выход пули за окно
            //Out of window bounds Выход пули за окно
            if ((p.bullets[i].shape.getPosition().x > window.getSize().x - 10) || (p.bullets[i].shape.getPosition().x < 0))
            {
                p.bullets.erase(p.bullets.begin() + i);
                break;
            }
 
        }
 
            //...._____
        
            //Out of window bounds Выход пули за окно
        //Out of window bounds Выход пули за окно
    
 
 
            //..________
        
            p.update(time);
        enemy.update(time);  //Апдейды игрока и врага
 
 
        if (p.rect.left>300) offsetX = p.rect.left - 300;  //Скроллинг
        offsetY = p.rect.top - 300;
 
        window.clear(Color::Black);
 
        //__________________________Отрисовка карты _____________________________________________________
        for (int i = 0; i<H; i++)
        for (int j = 0; j < W; j++)
        {
 
 
            if (TileMap[i][j] == ' ')  s_map.setTextureRect(IntRect(50, 0, 50, 50));
 
            if (TileMap[i][j] == '0') s_map.setTextureRect(IntRect(300, 0, 350, 50));//КАМЕНЬ
            //rectangle.setFillColor(Color::Green);
            if (TileMap[i][j] == 'N') s_map.setTextureRect(IntRect(600, 0, 650, 50));//монетка
            if (TileMap[i][j] == 'O') s_map.setTextureRect(IntRect(100, 0, 150, 50));//Полуподног
            if (TileMap[i][j] == 'P') s_map.setTextureRect(IntRect(350, 0, 400, 50));//ВИТРАЖНОЕ ОКНО
            if (TileMap[i][j] == 'Q') s_map.setTextureRect(IntRect(400, 0, 450, 50));//ВИТРАЖНОЕ ОКНО
            if (TileMap[i][j] == 'R') s_map.setTextureRect(IntRect(450, 0, 500, 50));//ВИТРАЖНОЕ ОКНО
            if (TileMap[i][j] == 'S') s_map.setTextureRect(IntRect(500, 0, 550, 50));//ВИТРАЖНОЕ ОКНО
            if (TileMap[i][j] == 'T') s_map.setTextureRect(IntRect(550, 0, 600, 50));//н е б о
            if (TileMap[i][j] == 'U') s_map.setTextureRect(IntRect(0, 0, 50, 50));//РЫЖИЙ КИРПИЧ
            if (TileMap[i][j] == 'V') s_map.setTextureRect(IntRect(0, 50, 50, 100));//ЛЕВАЯ ЛИСТВА ДЕРЕВА
            if (TileMap[i][j] == 'W') s_map.setTextureRect(IntRect(50, 50, 100, 100));//ПРА ЛИСТВА ДЕРЕВА
            if (TileMap[i][j] == 'Y') s_map.setTextureRect(IntRect(100, 50, 150, 100));//КУСТ
            if (TileMap[i][j] == 'X') s_map.setTextureRect(IntRect(150, 50, 200, 100));//СТВОЛ1
            if (TileMap[i][j] == 'Z') s_map.setTextureRect(IntRect(200, 50, 250, 100));//СТВОЛ2
            if (TileMap[i][j] == 'a') s_map.setTextureRect(IntRect(250, 50, 300, 100));//ЛИСТВА БОЛЬШОГО ДЕРЕВА
 
            if (TileMap[i][j] == 'b') s_map.setTextureRect(IntRect(300, 50, 350, 100));//т р а в а
            if (TileMap[i][j] == 'A') s_map.setTextureRect(IntRect(0, 100, 50, 150));//т р а в а от делянки
 
            if (TileMap[i][j] == 'c') s_map.setTextureRect(IntRect(350, 50, 400, 100));//ЛИСТВА  ДЕРЕВА в тени
            if (TileMap[i][j] == 'd') s_map.setTextureRect(IntRect(400, 50, 450, 100));//в о д а
            if (TileMap[i][j] == 'e') s_map.setTextureRect(IntRect(450, 50, 500, 100));//делянка 1
            if (TileMap[i][j] == 'f') s_map.setTextureRect(IntRect(500, 50, 550, 100));//делянка 2
            if (TileMap[i][j] == 'g') s_map.setTextureRect(IntRect(550, 50, 600, 100));//делянка 3
            if (TileMap[i][j] == 'h') s_map.setTextureRect(IntRect(600, 50, 650, 100));//делянка 4
 
            //МОСТ
 
            if (TileMap[i][j] == 'B') s_map.setTextureRect(IntRect(50, 100, 100, 150));//МОСТ
            if (TileMap[i][j] == 'C') s_map.setTextureRect(IntRect(100, 100, 150, 150));//МОСТ
            if (TileMap[i][j] == 'D') s_map.setTextureRect(IntRect(150, 100, 200, 150));//МОСТ
            if (TileMap[i][j] == 'E') s_map.setTextureRect(IntRect(200, 100, 250, 150));//МОСТ
            if (TileMap[i][j] == 'G') s_map.setTextureRect(IntRect(250, 100, 300, 150));//МОСТ
            if (TileMap[i][j] == 'H') s_map.setTextureRect(IntRect(300, 100, 350, 150));//МОСТ
            if (TileMap[i][j] == 'I') s_map.setTextureRect(IntRect(350, 100, 400, 150));//МОСТ
            if (TileMap[i][j] == 'J') s_map.setTextureRect(IntRect(400, 100, 448, 148));//МОСТ
            if (TileMap[i][j] == 'K') s_map.setTextureRect(IntRect(450, 100, 500, 150));//о б л а к а
            if (TileMap[i][j] == 'L') s_map.setTextureRect(IntRect(500, 100, 550, 150));//В О Д А морская
            if (TileMap[i][j] == 'M') s_map.setTextureRect(IntRect(550, 100, 600, 150));//МОСТ
            if (TileMap[i][j] == 'F') s_map.setTextureRect(IntRect(600, 100, 650, 148));//МОСТ
 
 
            if (TileMap[i][j] == 'i') s_map.setTextureRect(IntRect(150, 0, 200, 50));//белая скала 1
            if (TileMap[i][j] == 'k') s_map.setTextureRect(IntRect(200, 0, 250, 50));//белая скала 2
            if (TileMap[i][j] == 'l') s_map.setTextureRect(IntRect(250, 0, 300, 50));//белая скала 3
 
 
            s_map.setPosition(j * 50 - offsetX, i * 50 - offsetY);//позиция перса относительно окна
            //rectangle.setPosition(j * 32 - offsetX, i * 32 - offsetY);
 
 
 
            //Отрисовка показателей
 
 
            window.draw(s_map);
 
            txt1.setPosition(p.dx1 + 55, p.dy1 + 55);
            //________________________
        }
 
        std::ostringstream  playerMoneyString;    // объявили переменную здоровья и времени
 
        //playerHealthString << p.health;   //формируем строку
        playerMoneyString << p.money;
 
 
        txt1.setFillColor(sf::Color::Yellow);
        if (textos == true) txt1.setString(" Money = " + playerMoneyString.str() + " $ ");//задаем строку тексту и вызываем сформированную выше строку методом .str()
 
 
        if (textos == true) window.draw(txt1);
 
 
        //
 
        //Bullets
        
 
        //Bullets
        for (size_t i = 0; i < p.bullets.size(); i++)
        {
            
            window.draw(p.bullets[i].shape);
            
        }
 
        //
 
        
        window.draw(rectangle);
 
 
        window.draw(p.sprite);
        window.draw(enemy.sprite);
 
        window.display();
        window.clear();
 
    }
 
    return 0;
}
Добавлено через 24 минуты
Ну почему в примере то все корректно работает ?
Нужно как то отвязать координаты каждой [i] той пули
от координат игрока, в момент когда она уже выпущена
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
03.07.2018, 21:31 6
Ужас, если честно. Я просто даже не знаю откуда начать думать, здесь очень много ошибок. Я бы порекомендовал почитать книги "SFML Game Development" и "SFML Game Development By Example", особенно вторую, там более практический подход. Правда, они обе на английском. А все эти "видео-уроки" послать куда подальше, ибо если в тамошних примерах такой код, то ничего хорошего оттуда не взять.
0
14 / 20 / 14
Регистрация: 20.03.2018
Сообщений: 485
05.07.2018, 09:11  [ТС] 7
А в чем разница записей
C++
1
shape.setTexture(*texture);
и
C++
1
shape.setTexture(image);
По идее одно и то же да ?

Книгу эту доставал - там просто каша
как в примерах так и в тексте нет последовательности
и примеры просто как винегрет по разным темам
Она даже на гитхабе вроде есть
0
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
05.07.2018, 09:27 8
Цитата Сообщение от mrden777 Посмотреть сообщение
Она даже на гитхабе вроде есть
все четко написанно, от малого до великого примеры, книга с переводчик понятна, только читать и запоминать
0
14 / 20 / 14
Регистрация: 20.03.2018
Сообщений: 485
05.07.2018, 11:59  [ТС] 9
Короче сделал код почище, концы все логически состыковал
пуля по оси Y летит теперь как надо отвязанная от координат игрока, но
осталась проблема, когда игрок поворачивается в другую сторону -
Все выпущенные пули летят обратно
Как это исправить ?

ВЕРСИЯ - 002

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
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
#include <SFML/Graphics.hpp>
#include"SFML/Window.hpp"
#include"SFML/System.hpp"
#include <iostream>
#include <sstream>
#include <vector>
#include <list>
#include<cstdlib>
#include<math.h>
 
 
#define IDI_ICON                       102   //Создание слота для иконки при компиляции в EXE проект
using namespace sf;
 
float shootTimer;
 
bool storona = true; //Сторона куда бежит моб
//bool stay;
 
float offsetX = 0, offsetY = 0;//Скроллинг карты - смещение ее в обратную сторону движению
 
bool textos = false; // Разрешаем выводить текст только при взятии монетки
 
bool isShoot;
bool shot = false;
 
const int H = 14;
const int W = 195;
 
 
String TileMap[H] = {
 
    "00000000000000000000000000TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU0",
    "0N              NNNNNNNNN0TTTTTTTTTTTTTKKKTTTTTKKTTTTTTTTKKTTTTKKKKTTKKTTKKTTTKKKTTTTKKTTKKTTKKKTTTKKTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTU                                      0",
    "0N        NUNN  0000000NN0TTTTTTTTTTTTKKKKKTTTTTTTTTTTTTTTTTTTTTKKKKKKTTTTTTKKKKaaKKTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTU                                      0",
    "0N   ULLLLU      NNNNNNNN0TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTKKTTTTTTTTKKTaaaaTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTKKKKKKKKTTTTTTTTTTTU                                      0",
    "0    ULLLLUAAAUU0000000000TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTaaaZaaaO    NNNNNNUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU        NN NNN U      NNNU      00  U00000000  UU    0  0UUUUUUU0",
    "0UUUUUUUUUUbAUUAegAbAegYegTTTTTTTTaNaaNNNNaaTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTlaaaXaaa O   NNNNNNUNNNN                N        NNNNUN PQ   UUUUUUUUU   UUUUUUU      NN  U      0     O   0          0",
    "0         AAUUegfhegYfheghYYklllegNNNNaaaNWaaaaWTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTaaZaa    aOOO O OUU U U U     OULLLLLLU  PQ       UUN RS                  U        000  U    0 0        00  NN      0",
    "0NUN N  N AUUAfhegfhegeghAbiiieghhNNNXaVaaXaaaVaaabTTTTTTTTTTTTTTlllegegilll    X     aaaaa       NN  UU     UUUUUUUU  RS    UUNNUN    NUUUUUUUUUUU     U    O     U  U  UUU 0O PQ   00LLLOOLLLL0 0",
    "0 UN  PQ  YUAegeghYdfhfhbYiiddfhcWVWNZadaaZaaabVZVbbbLLUULLLlLLkliiifhfhiegeg   X     aaaZaaa     UU      U       0 N     N0N  NNU               UNNN  UUNU   PQ   U  U    0 0  RS 000LLLLLLLLL00 0",
    "0 UU  RS  UAAfhfhYdCGdddddddddYcWVaVWXddaaXadegbXbbegYLLLLLLLLLiiiiieghYeghfhO  Z     aaaXaaa000     UUUUUUUUUUU  0LLLLLLLL0 UUUUUUUUUUUUUUUUUU  UUUU   UUUU  RS  OU  UU   0 0UU     0LLLLLLLLLL0 0",
    "0    N  N AAUUUUUddddHdMFddddddcWVcVWZddddZdeghegYegegUUUULLLLLiiNNNfhAegegegA         aaZaa NNN     U            0000000000NNNNNU               U   UN U          UNNN    0 0NN     000000000000 0",
    "0  UUUUUUUUUUNNNUddBEIJddddddddddWXVdXddddXegheghegegUNNNULLULLiiNNNklYfhfhfheglbb       X  0NNN000000   00000UUUUU      UUUUUUU U    OOOOOOOOOOOUNNNUU U  UUUUUUUUUNNNNUUU0 0UUUUU  0NPQNNNNNNNN 0",
    "0         NNNNNNUUUUDdddddddddddddXdddddYbbfhYfhYfhfhUNNNLLLLLLiiNNNiiYhYYfhifhibYbb        0NNN0NNNN             NNNNNN                     NNNNUNNNN            ULLLLLUNNN   NN    0NRSNNNNNNNNN0",
    "0000000000000000000iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiUUUU000000iiiiiiiiiiiiiiiii0000000000000000000000000000000000000000000000000000000000000000000000000000000000UUUUUUU00000000000000000000000000",
};
 
 
using namespace sf;
 
///////////////////////////////////Общий класс-родитель//////////////////////////
 
class Bullet
{
public:
    Sprite shape;
    
 
    Bullet(Texture *texture, Vector2f pos)
    {
        this->shape.setTexture(*texture);
 
        this->shape.setScale(1.f, 1.f);
 
        this->shape.setPosition(pos);
    }
 
    ~Bullet(){}
};
 
//______________________________________________________________________________________________
 
    class Player
    {
    public:
        Sprite shape;
        Texture *texture;
        float currentFrame;
        float dx, dy;
        FloatRect rect;
        bool onGround;
        bool storonap;
        int money = 0;
        int HP;
        int HPMax;
 
        std::map<std::string, bool > key;
    
 
 
        std::vector<Bullet> bullets;
 
        Player(Texture *texture)
        {
            this->HPMax = 10;
            this->HP = this->HPMax;
 
            this->texture = texture;
            this->shape.setTexture(*texture);
            this->rect = FloatRect(50, 50, 50, 50);
 
            dx = dy = 0.1;
            currentFrame = 0;
 
        }
 
 
        void update(float time)
        {
 
            rect.left += dx * time;
            Collision(0);
 
            if (!onGround) dy = dy + 0.0005*time;
            rect.top += dy*time;
            onGround = false;
            Collision(1);
 
 
            currentFrame += 0.008*time;
            if (currentFrame > 6) currentFrame -= 6;
 
            if (dx<0) shape.setTextureRect(IntRect(50 * int(currentFrame) + 50, 0, -50, 50));
            if (dx<0) storonap = true;
 
            if (dx>0) shape.setTextureRect(IntRect(50 * int(currentFrame), 0, 50, 50));
            if (dx>0) storonap = false;
            shape.setPosition(rect.left - offsetX, rect.top - offsetY);
 
            dx = 0;
 
            //if (stay == true){ sprite.setTextureRect(IntRect(50 * int(currentFrame), 100, 50, 50)); }
        }
 
 
 
 
 
          ~Player() {}
 
          void Collision(int dir)   // ПРОВЕРКА СТОЛКНОВЕНИЙ
          {
 
 
 
              for (int i = rect.top / 50; i<(rect.top + rect.height) / 50; i++)
              for (int j = rect.left / 50; j<(rect.left + rect.width) / 50; j++)
              {
                  if (TileMap[i][j] == '0' || TileMap[i][j] == 'O' || TileMap[i][j] == 'U' ||
                      TileMap[i][j] == 'X' || TileMap[i][j] == 'Z' || TileMap[i][j] == 'B' || TileMap[i][j] == 'E' ||
                      TileMap[i][j] == 'I' || TileMap[i][j] == 'M' || TileMap[i][j] == 'F' ||
                      TileMap[i][j] == 'i' || TileMap[i][j] == 'k' || TileMap[i][j] == 'l')
                  {
                      if ((dx>0) && (dir == 0)) rect.left = j * 50 - rect.width;
                      if ((dx<0) && (dir == 0)) rect.left = j * 50 + 50;
                      if ((dy>0) && (dir == 1))  { rect.top = i * 50 - rect.height;  dy = 0;   onGround = true; }
                      if ((dy<0) && (dir == 1))  { rect.top = i * 50 + 50;   dy = 0; }
                  }
 
                  if (TileMap[i][j] == 'N')//Если берем МОНЕТКУ
                  {
                      money += +1;
                      TileMap[i][j] = ' ';
 
                      textos = true;
                  }
 
              }
 
          }
    };
    //_______________________________________________________________________________________________________________________
 
    //______________________________________________________________________________________________________________
 
 
 
int main()
{
    srand(time(NULL));
 
    sf::RenderWindow window;
    sf::VideoMode vidMode;
 
    vidMode.width = 1200;
    vidMode.height = 600;
 
 
 
    window.create(vidMode, "------------------START GAME -----------");//___________________
 
    window.setFramerateLimit(70);
 
    //Init text
    Font font;
    font.loadFromFile("DATA/Deneon.ttf");
 
    //Init textures
    Texture playerTex;
    playerTex.loadFromFile("DATA/IMG/MAN001.PNG");
 
    Texture enemyTex;
    enemyTex.loadFromFile("DATA/IMG/PUTEN.JPG");
 
    Texture bulletTex;
    bulletTex.loadFromFile("DATA/IMG/BULLET.png");
 
    //map init
    Image map_image;
    map_image.loadFromFile("DATA/IMG/Nall000.png");
    Texture map;
    map.loadFromImage(map_image);
    Sprite s_map;
    s_map.setTexture(map);
    
    
    
    //UI init
    Text scoreText;
    scoreText.setFont(font);
    scoreText.setCharacterSize(20);
    scoreText.setFillColor(Color::White);
    scoreText.setPosition(10.f, 10.f);
 
 
 
    //Player init
    int score = 0;
    Player player(&playerTex);
    int shootTimer = 20;
    Text hpText;
    hpText.setFont(font);
    hpText.setCharacterSize(12);
    hpText.setFillColor(Color::White);
 
    Clock clock;
 
    int stor;
 
    RectangleShape rectangle(Vector2f(50, 50));
 
    while (window.isOpen())
 
 
    {
        float time = clock.getElapsedTime().asMicroseconds();
        clock.restart();
 
        time = time / 700;
 
        if (time > 20) time = 20;
 
        Event event;
        while (window.pollEvent(event))
        {
            if (event.type == Event::Closed)
                window.close();
        }
 
        if (player.HP > 0)
        {
            //Player
            if (Keyboard::isKeyPressed(Keyboard::Up))
 
            if (player.onGround) { player.dy = -0.35; player.onGround = false; }
            //stay = false;
            if (Keyboard::isKeyPressed(Keyboard::Left))
 
                player.dx = -0.1;
            //stay = false;
            if (Keyboard::isKeyPressed(Keyboard::Down))
                player.shape.move(0.f, 10.f);
            if (Keyboard::isKeyPressed(Keyboard::Right))
                player.dx = 0.1;
            //  stay = false;
 
 
 
            player.update(time);
            //Update Controls
            if (shootTimer < 15)
                shootTimer++;
 
            if (Keyboard::isKeyPressed(Keyboard::Space) && shootTimer >= 15) //Shooting
            {
                player.bullets.push_back(Bullet(&bulletTex, player.shape.getPosition()));
                shootTimer = 0; //reset timer
                                
            
            }
 
    
        //...._____
            //Bullets ERASE
            for (size_t i = 0; i < player.bullets.size(); i++)
            {
                //Move
                if (player.storonap == false)   stor = 1;  // тут можно задать скорость и угол полёта пули
 
                if (player.storonap == true)    stor=-1; // тут можно задать скорость и угол полёта пули
                //Out of window bounds Выход пули за окно
                if ((player.bullets[i].shape.getPosition().x > window.getSize().x + 10) || (player.bullets[i].shape.getPosition().x <0))
                {
                    player.bullets.erase(player.bullets.begin() + i);
                    break;
                }
 
            }
 
            //...._____
 
            //Out of window bounds Выход пули за окно
 
        //Bullets
 
 
        //Out of window bounds Выход пули за окно
 
 
            //________________
 
            //__________________________Отрисовка карты _____________________________________________________
            for (int i = 0; i<H; i++)
            for (int j = 0; j < W; j++)
            {
 
 
                if (TileMap[i][j] == ' ')  s_map.setTextureRect(IntRect(50, 0, 50, 50));
 
                if (TileMap[i][j] == '0') s_map.setTextureRect(IntRect(300, 0, 350, 50));//КАМЕНЬ
                //rectangle.setFillColor(Color::Green);
                if (TileMap[i][j] == 'N') s_map.setTextureRect(IntRect(600, 0, 650, 50));//монетка
                if (TileMap[i][j] == 'O') s_map.setTextureRect(IntRect(100, 0, 150, 50));//Полуподног
                if (TileMap[i][j] == 'P') s_map.setTextureRect(IntRect(350, 0, 400, 50));//ВИТРАЖНОЕ ОКНО
                if (TileMap[i][j] == 'Q') s_map.setTextureRect(IntRect(400, 0, 450, 50));//ВИТРАЖНОЕ ОКНО
                if (TileMap[i][j] == 'R') s_map.setTextureRect(IntRect(450, 0, 500, 50));//ВИТРАЖНОЕ ОКНО
                if (TileMap[i][j] == 'S') s_map.setTextureRect(IntRect(500, 0, 550, 50));//ВИТРАЖНОЕ ОКНО
                if (TileMap[i][j] == 'T') s_map.setTextureRect(IntRect(550, 0, 600, 50));//н е б о
                if (TileMap[i][j] == 'U') s_map.setTextureRect(IntRect(0, 0, 50, 50));//РЫЖИЙ КИРПИЧ
                if (TileMap[i][j] == 'V') s_map.setTextureRect(IntRect(0, 50, 50, 100));//ЛЕВАЯ ЛИСТВА ДЕРЕВА
                if (TileMap[i][j] == 'W') s_map.setTextureRect(IntRect(50, 50, 100, 100));//ПРА ЛИСТВА ДЕРЕВА
                if (TileMap[i][j] == 'Y') s_map.setTextureRect(IntRect(100, 50, 150, 100));//КУСТ
                if (TileMap[i][j] == 'X') s_map.setTextureRect(IntRect(150, 50, 200, 100));//СТВОЛ1
                if (TileMap[i][j] == 'Z') s_map.setTextureRect(IntRect(200, 50, 250, 100));//СТВОЛ2
                if (TileMap[i][j] == 'a') s_map.setTextureRect(IntRect(250, 50, 300, 100));//ЛИСТВА БОЛЬШОГО ДЕРЕВА
 
                if (TileMap[i][j] == 'b') s_map.setTextureRect(IntRect(300, 50, 350, 100));//т р а в а
                if (TileMap[i][j] == 'A') s_map.setTextureRect(IntRect(0, 100, 50, 150));//т р а в а от делянки
 
                if (TileMap[i][j] == 'c') s_map.setTextureRect(IntRect(350, 50, 400, 100));//ЛИСТВА  ДЕРЕВА в тени
                if (TileMap[i][j] == 'd') s_map.setTextureRect(IntRect(400, 50, 450, 100));//в о д а
                if (TileMap[i][j] == 'e') s_map.setTextureRect(IntRect(450, 50, 500, 100));//делянка 1
                if (TileMap[i][j] == 'f') s_map.setTextureRect(IntRect(500, 50, 550, 100));//делянка 2
                if (TileMap[i][j] == 'g') s_map.setTextureRect(IntRect(550, 50, 600, 100));//делянка 3
                if (TileMap[i][j] == 'h') s_map.setTextureRect(IntRect(600, 50, 650, 100));//делянка 4
 
                //МОСТ
 
                if (TileMap[i][j] == 'B') s_map.setTextureRect(IntRect(50, 100, 100, 150));//МОСТ
                if (TileMap[i][j] == 'C') s_map.setTextureRect(IntRect(100, 100, 150, 150));//МОСТ
                if (TileMap[i][j] == 'D') s_map.setTextureRect(IntRect(150, 100, 200, 150));//МОСТ
                if (TileMap[i][j] == 'E') s_map.setTextureRect(IntRect(200, 100, 250, 150));//МОСТ
                if (TileMap[i][j] == 'G') s_map.setTextureRect(IntRect(250, 100, 300, 150));//МОСТ
                if (TileMap[i][j] == 'H') s_map.setTextureRect(IntRect(300, 100, 350, 150));//МОСТ
                if (TileMap[i][j] == 'I') s_map.setTextureRect(IntRect(350, 100, 400, 150));//МОСТ
                if (TileMap[i][j] == 'J') s_map.setTextureRect(IntRect(400, 100, 448, 148));//МОСТ
                if (TileMap[i][j] == 'K') s_map.setTextureRect(IntRect(450, 100, 500, 150));//о б л а к а
                if (TileMap[i][j] == 'L') s_map.setTextureRect(IntRect(500, 100, 550, 150));//В О Д А морская
                if (TileMap[i][j] == 'M') s_map.setTextureRect(IntRect(550, 100, 600, 150));//МОСТ
                if (TileMap[i][j] == 'F') s_map.setTextureRect(IntRect(600, 100, 650, 148));//МОСТ
 
 
                if (TileMap[i][j] == 'i') s_map.setTextureRect(IntRect(150, 0, 200, 50));//белая скала 1
                if (TileMap[i][j] == 'k') s_map.setTextureRect(IntRect(200, 0, 250, 50));//белая скала 2
                if (TileMap[i][j] == 'l') s_map.setTextureRect(IntRect(250, 0, 300, 50));//белая скала 3
 
 
                s_map.setPosition(j * 50 - offsetX, i * 50 - offsetY);//позиция перса относительно окна
                //rectangle.setPosition(j * 32 - offsetX, i * 32 - offsetY);
 
 
 
                //Отрисовка показателей
 
 
                window.draw(s_map);
 
                //________________________
 
        
 
        
 
 
 
            
 
 
 
        }
 
 
            
        }
 
        //Draw ===================================================================== DRAW
    
 
        //Bullets    ////////////////////  draw  shot /////////////////////
        for (size_t i = 0; i < player.bullets.size(); i++)
        {
            //Move
             player.bullets[i].shape.move(stor*10.f, 0.f); // тут можно задать скорость и угол полёта пули
        
            //Out of window bounds Выход пули за окно
            if (player.bullets[i].shape.getPosition().x > window.getSize().x)
            {
                player.bullets.erase(player.bullets.begin() + i);
                break;
            }
 
 
        }
        ////////////////////  draw  shot /////////////////////
    
 
        window.draw(player.shape);
 
        //Bullets
        for (size_t i = 0; i < player.bullets.size(); i++)
        {
            window.draw(player.bullets[i].shape);
        }
 
 
        
    
        window.draw(rectangle);
        window.display();
        window.clear();
    }
 
    return 0;
}
Добавлено через 26 минут
Я думаю чтоб такого не было надо как то отвязать сторону в которую
повернут игрок от стороны пули, но проблема в том
что это нельзя прописать в классе пули так как пуля зависит от класса игрока
Создавать новую отдельную функцию ? Какие варианты ?
Или как то дать условие что если пуля летит - то изменять ее направление нельзя

Добавлено через 41 минуту
Ну неужели было трудно сказать что я не в тот цикл запехал
Все решил сам проблему
0
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
05.07.2018, 16:28 10
Цитата Сообщение от mrden777 Посмотреть сообщение
Короче сделал код почище
почище ? распихай код на функции, классы, классы по файлам
это прочти полезно ведь
https://code-live.ru/post/sepa... ation-cpp/
http://cppstudio.com/post/396/
0
14 / 20 / 14
Регистрация: 20.03.2018
Сообщений: 485
05.07.2018, 17:05  [ТС] 11
Из вариантов на русском только у кучки был рабочий пример стрельбы
Ни на этом форуме ни где то еще в русскоязычных ресурсах
простейшего построения этого алгоритма не делалось !

У кучки разбито все по классам и функциям, незнаю мне показалось что он там намудрил с переменными
переименовывает их по 10 раз добавляя гемморой

Плюс еще этот тайл мап глючный и xml
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
05.07.2018, 18:24 12
mrden777, то есть вот эта хрень
C++
1
2
3
                if (TileMap[i][j] == 'i') s_map.setTextureRect(IntRect(150, 0, 200, 50));//белая скала 1
                if (TileMap[i][j] == 'k') s_map.setTextureRect(IntRect(200, 0, 250, 50));//белая скала 2
                if (TileMap[i][j] == 'l') s_map.setTextureRect(IntRect(250, 0, 300, 50));//белая скала 3
это не геморрой и нормально? Это жопа, причем большая и обгаженная.
0
14 / 20 / 14
Регистрация: 20.03.2018
Сообщений: 485
05.07.2018, 20:39  [ТС] 13
Это первая моя игра в данном стиле, мне надо максимально просто это сделать
- нет это пока что не напрягает
Короче не получается массив i тых пуль в заданные стороны пускать
Ладно, попробую через обьект сделать.
Но кстати, если рассматривать стрельбу в пределах 180 град
то что я пытался сделать это лучшее решение
0
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
05.07.2018, 21:19 14
Цитата Сообщение от mrden777 Посмотреть сообщение
то что я пытался сделать это лучшее решение
читай развивайся, тебе потом в твоем супер коде нужно будет искать ошибки, ты сломаешь голову только от первых трех строк, это не верно, если пишешь игру, разбрасывай по файлам, давай внятные названия переменным и объектам, иначе даже отладчик не поможет, делай качественно, не стыдись читать книги статьи и прочее на любую тему
0
14 / 20 / 14
Регистрация: 20.03.2018
Сообщений: 485
05.07.2018, 21:33  [ТС] 15
Ну ты ссылки уж совсем для нубов дал
Я как бы не первый день этим задротством занимаюсь
Можно и карту засунуть в библиотеку, можно и виды камеры - дело не в оформлении !
Надо решить задачу стрельбы максимально простым способом а не постигать хитрости тайл мапа, 2Д бокса
и другого вспомогательного софта.
Конечно при готовом проекте я все в DLL запехаю
0
14 / 20 / 14
Регистрация: 20.03.2018
Сообщений: 485
09.07.2018, 12:04  [ТС] 16
Croessmah, так как сделать на 1 пулю этот цикл ?


C++
1
2
3
4
5
    //Bullets
        for (size_t i = 0; i < player.bullets.size(); i++)
        {
            window.draw(player.bullets[i].shape);
        }
есть примеры только как для обьектов
C++
1
player.bullets.push_back(Bullet(&bulletTex, player.shape.getPosition())); // это для i тых текстур
Можно же не вводить и дополнительного класса для обработок ? Просто как то в функциях сделать апдейд

С обьектами мне не понравилось,
там FPS надо на кадрах ловить чтобы отображалось адекватно
и на разных компах такое глючить будет по разному

Добавлено через 12 часов 37 минут
Если делать без обьектов, пока нашел решение только на запрет стрельбы в другую сторону пока массив пуль полностью не уничтожится Получается болеменее цивильно но с небольшим лагом
0
09.07.2018, 12:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.07.2018, 12:04
Помогаю со студенческими работами здесь

Работа с очередью через пользовательское меню. Исправить код
помогите исправить код ,чтобы перемещаться по меню можно было только с помощью стрелок. program...

Программа вылетает после запроса числа, как исправить?
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;time.h&gt; #include &lt;iostream&gt; #include &lt;conio.h&gt;...

Вылетает BSOD. У самого исправить не получается
Доброго времени суток! Периодически вылетает синий экран в процессе игры в warcraft 3, и только в...

не могу исправить ошибку в коде. в паскале вылетает ошибка.
program Project1; {$APPTYPE CONSOLE} uses SysUtils; type tptz=^tstack; tstack=record


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru