Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.65/40: Рейтинг темы: голосов - 40, средняя оценка - 4.65
 Аватар для nnnikotinnn995
7 / 7 / 4
Регистрация: 07.07.2011
Сообщений: 583

Mortal Kombat - первые шаги

09.08.2011, 21:18. Показов 9126. Ответов 52
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. вот решил попробовать написать игру типа Mortal Kombat
и заодно выяснить, можно ли с помощью стандартной библиотеки сделать что то стоящее (хотя бы такого качества http://flash-online-games.ru/s... /6-1-0-263) или лучше использовать какую ни будь другую библиотеку (или вообще использовать какой ни будь движок). На скорую руку набросал в максе пнг , потому претензии по графики не принимаю, сначала надо качественное управление сделать, а потом рисовать.
У меня в проекте 2 имиджа три таймера. Прежде всего мне не понятно почему движения (особенно прыжки – функция int y=-155*sin(t/2)+115) такие дерганные? Посоветуйте пожалуйста, как сделать их более плавными?
В 10 МВ мне не удалось все впихнуть все файлы, поэтому перенесите пожалуйста содержимое папки Debug2 в папку Debug (Projects\ Debug).
Вложения
Тип файла: 7z Projects.7z (6.56 Мб, 88 просмотров)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.08.2011, 21:18
Ответы с готовыми решениями:

Первые шаги...
Скачал себе Borland C++ builder В учебники первая задача создать файл first.cpp Записать в нем следующее: #include...

Первые шаги при получении source code
Здравствуйте уважаемые форумчане, Какие первые шаги разработчика (инженера) программного обеспечения при получении прогрманого кода? ...

Mortal Kombat
Предлагаю обсудить всем известную вселенную МК, а точнее фильм который выйдет в 2013 году...и сериал который уже снимается и потихоньку...

52
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
16.08.2011, 12:40
Студворк — интернет-сервис помощи студентам
Для задержки между "кадрами"
0
 Аватар для nnnikotinnn995
7 / 7 / 4
Регистрация: 07.07.2011
Сообщений: 583
16.08.2011, 13:42  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Ну повидимумо поэтому стоит не двигать отдельный компонент а прорисовывать все в одном Image
Как сказал товарищ NiTan "Канва формы, как бы, лучше предназначена для частой перерисовки, чего нельзя сказать о TImage."( Transparent Animate ). Потому я решил по его прототипу нарисовать все на форме (но без прыжков) (testanim.rar). Там изображение было не прозрачным и не перерисовывалось. Мерцания стало больше чем было в самом первом моем коде (в начале поста) , при чем оно происходит даже при одном персонаже, может потому что Repaint(); требует больше времени? Вот код
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
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
Graphics::TBitmap *Dude;
int x=455,y=85;  // Координаты нашего обьекта
Graphics::TBitmap *bb;
int b=5,c=85;
int Where=0;  // Направление (1 - влево; 3- вправо; 5 - вверх; 2 - вниз ) Почему такое - смотрим на дополнительную клавиатуру справа :-D
int AnimStep=1; //Кадр анимации
String Anim="n";  //Сама анимация (движение влево/вправо)
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  if( Where !=0 )     //Если задано направление
  {
AnimStep++;         //Переходим на следующий кадр
if(AnimStep>13)AnimStep=1;     //Если номер кадра больше, чем задумано, возвращаемся на первый кадр
 
  if( Where==3)             //Если задано движение вправо
  {
  Anim="n";        // Устанавливаем соответствующие имя  анимации
  x+=15;
  Repaint();                    //Увеличиваем положение по x-координата не 5
  }
    if( Where==1){
    Anim="n";
  x-=15;
  Repaint();}
  }
  if (x<b+65) {
  x = b + 65;
  b-=5;
  }
    if( Where==5)           //Вверх
  {
  y-=5;
  Repaint();
  }
    if( Where==2)           //Вниз
  {
  y+=5;
  Repaint();
  }
 
  Dude->LoadFromFile(Anim+String(AnimStep)+".bmp");    //Заргужаем текстуру обьекта из файла, имя которго это "Название текущей анимации"+"Номер кадра"+"Расширение файл"
 
 
          Canvas->Draw(x,y,Dude);
           Canvas->Draw(b,c,bb);                    //Выводим на форму
 }
 
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
//Думаю, понятно
   Dude=new Graphics::TBitmap;
   Dude->LoadFromFile("n1.bmp");
   Dude->Transparent=true;
  bb=new Graphics::TBitmap;
   bb->LoadFromFile("nn10.bmp");
   bb->Transparent=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
//Изменяем направление, в зависимости от нажатой клавиши (все очень просто - разберетесь)
if( Key == VK_RIGHT) Where=3;
if( Key == VK_LEFT) Where=1;
if( Key == VK_UP) Where=5;
if( Key == VK_DOWN) Where=2;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormKeyUp(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
 Where=0;                     //Если отпущена клавиша, то останавливаем обьект
 Dude->LoadFromFile(Anim+"1.bmp");      //Загружаем кадр "простоя" обьекта
}
//---------------------------------------------------------------------------
 //Конец ;-D
И еще OpenGL - присутствует в C++ Builder или надо как то подгружать?
Вложения
Тип файла: 7z testanim.7z (5.03 Мб, 17 просмотров)
0
Покинул форум
3189 / 1368 / 109
Регистрация: 29.01.2010
Сообщений: 2,887
16.08.2011, 14:51
nnnikotinnn995, наиболее оптимальный вариант - построение всей картинки в памяти, а затем вывод конечного результата на Канву, допустим, формы. Вот, чтобы Вы заметили разницу, слегка изменил Ваш код:
GPaint.rar
0
Покинул форум
3189 / 1368 / 109
Регистрация: 29.01.2010
Сообщений: 2,887
16.08.2011, 14:53
nnnikotinnn995, теперь сравните старый вариант и исправленный - а дописать нужно-то было всего 3 строчки.

Цитата Сообщение от nnnikotinnn995 Посмотреть сообщение
И еще OpenGL - присутствует в C++ Builder или надо как то подгружать?
OpenGL присутствует и его надо подгружать. https://www.cyberforum.ru/cpp-... 56925.html
1
 Аватар для nnnikotinnn995
7 / 7 / 4
Регистрация: 07.07.2011
Сообщений: 583
16.08.2011, 16:02  [ТС]
Цитата Сообщение от NiTan Посмотреть сообщение
nnnikotinnn995, наиболее оптимальный вариант - построение всей картинки в памяти, а затем вывод конечного результата на Канву, допустим, формы. Вот, чтобы Вы заметили разницу, слегка изменил Ваш код:
У меня exe не запускается, ругается на отсутствие vcl60.bpl. Может вы случайно флажки забыли снять (Use dynamic RTL и Build with runtime packages). И что это за 3 строчки, скиньте пожалуйста вместе с проектом (или код покажите).
0
Покинул форум
3189 / 1368 / 109
Регистрация: 29.01.2010
Сообщений: 2,887
16.08.2011, 16:14
nnnikotinnn995, просто могут возникнуть проблемы с совместимостью, потому что у меня версия Билдера старее, чем Ваша. Откомпилированный exe-шник присутствует, если что:
testanim.rar
2
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
16.08.2011, 18:33
В Builder-е нет glut - надстройки над Open GL, У меня так и не получилось ее подключить и не только в Buildere но и VC, wxDev-C++.
В старом 6 Буилдере были даже примеры работы с GL.

https://www.cyberforum.ru/grap... 90242.html
0
 Аватар для nnnikotinnn995
7 / 7 / 4
Регистрация: 07.07.2011
Сообщений: 583
16.08.2011, 20:48  [ТС]
Цитата Сообщение от NiTan Посмотреть сообщение
наиболее оптимальный вариант - построение всей картинки в памяти, а затем вывод конечного результата на Канву, допустим, формы. Вот, чтобы Вы заметили разницу, слегка изменил Ваш код:
Спасибо, теперь не мигает, но перемещение все равно прерывистое даже без анимации (как в имидже так и в форме ). Можно ли еще как ни будь обойтись без Open GL или более плавным перемещение уже не сделаешь?
0
 Аватар для nnnikotinnn995
7 / 7 / 4
Регистрация: 07.07.2011
Сообщений: 583
19.08.2011, 17:38  [ТС]
Цитата Сообщение от NiTan Посмотреть сообщение
OpenGL присутствует и его надо подгружать.
Спасибо, только я не понял как Open GL может помочь плавности перемещения загружаемых спрайтов, судя по прочитанному"В этой статье я не буду использовать glaux.h...основные задачи glaux (как, в прочем, и аналогичной, но более качественной, библиотеки GLUT) - это создание окон, таймеров, обработка клавиатуры и мыши, всё это есть в ИСР (Интегральная Среда Разработки) Delphi или С++Builder." и видимо стандартный таймер этого автора устраивает, может для баннера он и подойдет, но здесь очевидна прерывистость перемещения ( даже без анимации)- в такую игру ни кто играть не будет. Как вы думаете, если все же поставить GLUT (а потом еще создать таймер) - качественнее ли будет обработка перемещения (которое впрочем и без таймера дискретно), или все же есть путь покороче?
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
19.08.2011, 18:00
таймеров, обработка клавиатуры и мыши, всё это есть в ИСР
Ну вот примерчик
Вложения
Тип файла: rar Project GL 1.rar (32.9 Кб, 20 просмотров)
0
Покинул форум
3189 / 1368 / 109
Регистрация: 29.01.2010
Сообщений: 2,887
19.08.2011, 18:24
Цитата Сообщение от nnnikotinnn995 Посмотреть сообщение
или более плавным перемещение уже не сделаешь?
Сделаешь. Просто Вам нужна более качественная анимация и немного поработать с интервалом между кадрами.
0
 Аватар для nnnikotinnn995
7 / 7 / 4
Регистрация: 07.07.2011
Сообщений: 583
19.08.2011, 21:13  [ТС]
Цитата Сообщение от NiTan Посмотреть сообщение
Сделаешь. Просто Вам нужна более качественная анимация и немного поработать с интервалом между кадрами.
А при чем тут анимация, вот тот же код без анимации и не зависимо от интервала таймера заметно мигание в перемещение.
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
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
Graphics::TBitmap *Dude;
int x=455,y=85;  // Координаты нашего обьекта
Graphics::TBitmap *bb;
int b=5,c=85;
int Where=0;  // Направление (1 - влево; 3- вправо; 5 - вверх; 2 - вниз ) Почему такое - смотрим на дополнительную клавиатуру справа :-D
int AnimStep=1; //Кадр анимации
String Anim="n";  //Сама анимация (движение влево/вправо)
Graphics::TBitmap* dump=new Graphics::TBitmap;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  if( Where !=0 )     //Если задано направление
  {
 
  if( Where==3)             //Если задано движение вправо
  {     // Устанавливаем соответствующие имя  анимации
  x+=5;                   //Увеличиваем положение по x-координата не 5
  }
    if( Where==1){
  x-=5;
  }
 
  if (x<b+65) {
  x = b + 65;
  b-=5;
  }
    if( Where==5)           //Вверх
  {
  y-=5;
  }
    if( Where==2)           //Вниз
  {
  y+=5;
  }
 
    Dude->LoadFromFile("n1.bmp");    //Заргужаем текстуру обьекта из файла, имя которго это "Название текущей анимации"+"Номер кадра"+"Расширение файл"
 
 
 
  }
       dump->Canvas->FillRect(Rect(0,0,dump->Width,dump->Height));
              dump->Canvas->Draw(x,y,Dude);
          dump->Canvas->Draw(b,c,bb);              //Выводим на форму
                  Canvas->Draw(0,0,dump);
 }
 
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
//Думаю, понятно
   Dude=new Graphics::TBitmap;
   Dude->LoadFromFile("n1.bmp");
   Dude->Transparent=true;
  bb=new Graphics::TBitmap;
   bb->LoadFromFile("nn10.bmp");
   bb->Transparent=true;
 
   dump->Width=Width;
   dump->Height=Height;
   dump->Canvas->FillRect(Rect(0,0,dump->Width,dump->Height));
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
//Изменяем направление, в зависимости от нажатой клавиши (все очень просто - разберетесь)
if( Key == VK_RIGHT) Where=3;
if( Key == VK_LEFT) Where=1;
if( Key == VK_UP) Where=5;
if( Key == VK_DOWN) Where=2;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormKeyUp(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
 Where=0;                     //Если отпущена клавиша, то останавливаем обьект
      //Загружаем кадр "простоя" обьекта
}
//---------------------------------------------------------------------------
 //Конец ;-D
,конечно можно перемещаться с помощью анимации в одном кадре ( во все игровое пространство) и тогда мерцания может и не быть, но это уже конец.
Вложения
Тип файла: 7z testanim no anim.7z (5.03 Мб, 8 просмотров)
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
19.08.2011, 21:30
Ну а почему не убрали :
C++
1
Dude->LoadFromFile("n1.bmp");
???
0
 Аватар для nnnikotinnn995
7 / 7 / 4
Регистрация: 07.07.2011
Сообщений: 583
19.08.2011, 21:43  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Ну а почему не убрали :
C++
1
Dude->LoadFromFile("n1.bmp");
???
откуда?, если из таймера, то это не чего не меняет, кстати я попробовал таймер из опенгл и впихнул весь код туда (как дрова), если не чего не менять то перемещение плавно - правда там при таком вторжение кодов все мигает вместе с шаром, может поэтому не заметно дискретности, но если убрать из таймера Draw(); то мерцание в перемещение возвращается.
//---------------------------------------------------------------------------

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
#include <vcl.h>
#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
 
  HGLRC ghRC;
  HDC   ghDC;
  void Draw();
 Graphics::TBitmap *Dude;
int x=455,y=85;  // Координаты нашего обьекта
Graphics::TBitmap *bb;
int b=5,c=85;
int Where=0;  // Направление (1 - влево; 3- вправо; 5 - вверх; 2 - вниз ) Почему такое - смотрим на дополнительную клавиатуру справа :-D
int AnimStep=1; //Кадр анимации
String Anim="n";  //Сама анимация (движение влево/вправо)
Graphics::TBitmap* dump=new Graphics::TBitmap;
 
 BOOL bSetupPixelFormat(HDC hdc)
      {
 PIXELFORMATDESCRIPTOR pfd, *ppfd; 
    int pixelformat; 
 
    ppfd = &pfd; 
 
    ppfd->nSize = sizeof(PIXELFORMATDESCRIPTOR); 
    ppfd->nVersion = 1; 
    ppfd->dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
    ppfd->dwLayerMask = PFD_MAIN_PLANE; 
    ppfd->iPixelType = PFD_TYPE_RGBA;//формат указания цвета. Может принимать значения 
    // PFD_TYPE_RGBA (цвет указывается четырьмя параметрами 
    //RGBA - красный, зленный, синий и альфа) и PFD_TYPE_COLORINDEX (цвет указывается 
    // индексом в палитре).
    ppfd->cColorBits = 16;//глубина цвета 
    ppfd->cDepthBits = 16;//размер буфера глубины (Z-Buffer) 
 
    ppfd->cAccumBits = 0; 
    ppfd->cStencilBits = 0;//размер буфера трафарета (мы его пока не используем)
 
    //ЧузПикселФормат подбирает формат пикселей, максимально удовлетворяющий нашим требованиям, 
    //и возвращает его дескриптор, а SetPixelFormat() устанавливает его в контексте устройства 
    // (dc). 
    if ((pixelformat = ChoosePixelFormat(hdc, ppfd)) == 0)
    { 
        MessageBox(NULL, "ChoosePixelFormat failed", "Error", MB_OK); 
        return FALSE; 
    } 
    if (SetPixelFormat(hdc, pixelformat, ppfd) == FALSE)
    { 
        MessageBox(NULL, "SetPixelFormat failed", "Error", MB_OK); 
        return FALSE; 
    } 
    return TRUE;
      }
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
 
void __fastcall TForm1::FormResize(TObject *Sender)
{
  glViewport( 0, 0, Width, Height );
  //glViewport(0,0,300,300); 
  glMatrixMode( GL_PROJECTION ); 
  glLoadIdentity();
  glOrtho(-5,5, -5,5, 2,12); 
  gluLookAt(0,0,5, 0,0,0, 0,1,0); 
  glMatrixMode( GL_MODELVIEW );
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    Dude=new Graphics::TBitmap;
   Dude->LoadFromFile("n1.bmp");
   Dude->Transparent=true;
  bb=new Graphics::TBitmap;
   bb->LoadFromFile("nn10.bmp");
   bb->Transparent=true;
 
   dump->Width=Width;
   dump->Height=Height;
   dump->Canvas->FillRect(Rect(0,0,dump->Width,dump->Height));
      {
  ghDC = GetDC(Handle);//?? 
  if (!bSetupPixelFormat(ghDC))
      Close(); 
  //После того как в контексте устройства установлен формат пикселей, нужно создать 
  // контекст воспроизведения (Rendering Context) для этого в OpenGL определены 
  //следующие функции: 
  //HGLRC wglCreateContext(HDC hdc);
  //BOOL wglMakeCurrent(HDC hdc, HGLRC hglrc);
 
  ghRC = wglCreateContext(ghDC); 
  wglMakeCurrent(ghDC, ghRC); 
 
  glClearColor(0.0, 0.0, 0.0, 0.0); 
 
  FormResize(Sender);//?? 
 
  glEnable(GL_COLOR_MATERIAL);
  glEnable(GL_DEPTH_TEST); 
 
  glEnable(GL_LIGHTING); 
  glEnable(GL_LIGHT0); 
    float p[4]={3,3,3,1},
          d[3]={-1,-1,-3}; 
  glLightfv(GL_LIGHT0,GL_POSITION,p); 
  glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,d);
      }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
if(ghRC)
     {
          wglMakeCurrent(ghDC,0);
          wglDeleteContext(ghRC);
     }
          if(ghDC)
          ReleaseDC(Handle, ghDC);
}
 
//-----------------------------function-------------------------------------------
void Draw()
      {
  glClear(GL_DEPTH_BUFFER_BIT|GL_COLOR_BUFFER_BIT);
 
  GLUquadricObj *quadObj; 
  quadObj=gluNewQuadric(); 
 
  gluQuadricDrawStyle(quadObj, GLU_FILL); 
  glColor3f(1,0,0); 
  gluSphere(quadObj, 2,10,10); 
    glRotatef(3, 0,1,0); 
  gluDeleteQuadric(quadObj);
 
  SwapBuffers(ghDC);
      }
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
Draw();
 if( Where !=0 )     //Если задано направление
  {
 
  if( Where==3)             //Если задано движение вправо
  {     // Устанавливаем соответствующие имя  анимации
  x+=15;                   //Увеличиваем положение по x-координата не 5
  }
    if( Where==1){
  x-=15;
  }
 
  if (x<b+65) {
  x = b + 65;
  b-=5;
  }
    if( Where==5)           //Вверх
  {
  y-=5;
  }
    if( Where==2)           //Вниз
  {
  y+=5;
  }
 
 
 
 
 
  }
       dump->Canvas->FillRect(Rect(0,0,dump->Width,dump->Height));
              dump->Canvas->Draw(x,y,Dude);
          dump->Canvas->Draw(b,c,bb);              //Выводим на форму
                  Canvas->Draw(0,0,dump);
 
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
 
{
if( Key == VK_RIGHT) Where=3;
if( Key == VK_LEFT) Where=1;
if( Key == VK_UP) Where=5;
if( Key == VK_DOWN) Where=2;
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::FormKeyUp(TObject *Sender, WORD &Key, TShiftState Shift)
{
 Where=0;
}
0
 Аватар для nnnikotinnn995
7 / 7 / 4
Регистрация: 07.07.2011
Сообщений: 583
19.08.2011, 22:04  [ТС]
Вот этот странный пример с плавным миганием (Project1no anim)
Вложения
Тип файла: 7z Project GL 1 no anim.7z (3.54 Мб, 16 просмотров)
1
 Аватар для nnnikotinnn995
7 / 7 / 4
Регистрация: 07.07.2011
Сообщений: 583
22.08.2011, 13:38  [ТС]
. Можно попробовать загружать кадры из ресурса (может это и есть оперативная память), в C++ Builder 6 это было просто, как пишет Культин в книге Самоучитель C++ Builder «Файл ресурсов можно создать при помощи утилиты Image Editor», «Запустить Image Editor можно из
C++ Builder, выбрав в меню Tools команду Image Editor, или из Windows,
выбрав команду Пуск | Программы | Borland C++Builder | Image Editor.» . Но у меня в C++ Builder 2010 Image Editor почему то отсутствует (или я его не смог найти), вместо этого есть Project-> Resources и там можно загружать изображения, но если подключена директива #pragma resource "no anim_resources.rc" то выдает ошибку и отсылает в классы (сн. 1,2) - raise EResNotFound.CreateFmt(SResNotFound, [S]);. Подскажите пожалуйста, как исправить эту проблему в C++ Builder 2010 ?
вот код
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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
 #pragma resource "no anim.res"
TForm1 *Form1;
Graphics::TBitmap *Dude;
int x=455,y=85;  // Координаты нашего обьекта
Graphics::TBitmap *bb;
int b=5,c=85;
int Where=0;  // Направление (1 - влево; 3- вправо; 5 - вверх; 2 - вниз ) Почему такое - смотрим на дополнительную клавиатуру справа :-D
int AnimStep=1; //Кадр анимации
String Anim="n";  //Сама анимация (движение влево/вправо)
Graphics::TBitmap* dump=new Graphics::TBitmap;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  if( Where !=0 )     //Если задано направление
  {
 
  if( Where==3)             //Если задано движение вправо
  {     // Устанавливаем соответствующие имя  анимации
  x+=5;                   //Увеличиваем положение по x-координата не 5
  }
    if( Where==1){
  x-=5;
  }
 
  if (x<b+65) {
  x = b + 65;
  b-=5;
  }
    if( Where==5)           //Вверх
  {
  y-=5;
  }
    if( Where==2)           //Вниз
  {
  y+=5;
  }
 
    Dude->LoadFromResourceName((int)HInstance,"n1.bmp");    //Заргужаем текстуру обьекта из файла, имя которго это "Название текущей анимации"+"Номер кадра"+"Расширение файл"
 
 
 
  }
       dump->Canvas->FillRect(Rect(0,0,dump->Width,dump->Height));
              dump->Canvas->Draw(x,y,Dude);
          dump->Canvas->Draw(b,c,bb);              //Выводим на форму
                  Canvas->Draw(0,0,dump);
 }
 
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
//Думаю, понятно
   Dude=new Graphics::TBitmap;
  Dude->LoadFromResourceName((int)HInstance,"n1.bmp");
   Dude->Transparent=true;
  bb=new Graphics::TBitmap;
   bb->LoadFromResourceName((int)HInstance,"nn10.bmp");
   bb->Transparent=true;
 
   dump->Width=Width;
   dump->Height=Height;
   dump->Canvas->FillRect(Rect(0,0,dump->Width,dump->Height));
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
//Изменяем направление, в зависимости от нажатой клавиши (все очень просто - разберетесь)
if( Key == VK_RIGHT) Where=3;
if( Key == VK_LEFT) Where=1;
if( Key == VK_UP) Where=5;
if( Key == VK_DOWN) Where=2;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormKeyUp(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
 Where=0;                     //Если отпущена клавиша, то останавливаем обьект
Dude->LoadFromResourceName((int)HInstance,"n1.bmp");      //Загружаем кадр "простоя" обьекта
}
Миниатюры
Mortal Kombat - первые шаги   Mortal Kombat - первые шаги  
Вложения
Тип файла: 7z testanimno animn.7z (4.79 Мб, 6 просмотров)
0
 Аватар для nnnikotinnn995
7 / 7 / 4
Регистрация: 07.07.2011
Сообщений: 583
22.08.2011, 13:58  [ТС]
Можно конечно поставить C++ Builder 6 и посмотреть как это скажется на плавности перемещения, но это столько возни, да и встанет ли он под виндоуз 7 -непонятно. Хотя мне кажется что не чего не изменится ,так как с анимацией особых проблем нет,да и таймер тут особо не причем, скорее операторы (типа x-=5; или Image1->Left = Image1->Left - 5; ) не могут работать быстрее 15 кадров в секунду в C++ Builder (даже если не чего не стирать), ну это только предположение, может в винапи они работают лучше.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
22.08.2011, 16:05
Попробуйте уменьшить шаг до 1
0
 Аватар для nnnikotinnn995
7 / 7 / 4
Регистрация: 07.07.2011
Сообщений: 583
22.08.2011, 17:20  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Попробуйте уменьшить шаг до 1
Но тогда придется таймер ставить меньше 54, а как пишет Grey на первой странице поста "Таймер при значении меньше 54 некорректно работает." Я не эксперт в C++ Builder, но перемещение в примерах игр данного форума (например Arkanoid https://www.cyberforum.ru/grap... 93716.html ) не вызывает восхищения, да , при таком маленьком изображение биты и 10 мс таймера
перемещение кажется плавным, но стоит вам это изображение биты заменить на более большое (с 40:10 - на пусть даже 640:480 - просто в фотошопе) и вы увидите, какое оно дерганное, при чем оно дергается примерно 3 раза в секунду. Может C++ Builder на более плавное перемещение не способен, покажите пожалуйста пример игры, где достаточно большое изображение перемещается достаточно плавно на ваш взгляд.
0
Покинул форум
3189 / 1368 / 109
Регистрация: 29.01.2010
Сообщений: 2,887
22.08.2011, 18:19
nnnikotinnn995, а зачем перемещать достаточно большое изображение? Маленькие не нравятся? Так можно растягивать...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.08.2011, 18:19

Запустить Mortal Kombat X в Linux
Снес ущербную Win10 поставил Ubuntu, в игрушки играл только в Mortal kombat X (и 9). Можно здесь как-то сыграть? Спасибо

Как замедлить игру Mortal Kombat 4?
Как замедлить Mortal Kombat 4? (Выпущена в 1997 году, не под DOS, поэтом под DosBOX'ом не запускается). Что юзать? Заранее спасибо! ...

Не работает Mortal Kombat 9 (Komplete edition)
Скачал репак Mortal Kombat 9 (Komplete edition) от механиков на ноутбук (характеристики прилагаются). Выдает такие ошибки (во вложениях)....

Можно ли написать игру, подобную Mortal Kombat
Здравствуйте! Возможно ли написать на Delphi игру подобную Mortal Kombat?

Может ли один человек написать на С++ игру типа mortal kombat 3
Народ здравствуйте хотелось бы у вас узнать может ли один человек хорошо знаюший c++ (я еше правда тока учу его) написать игру типа mortal...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru