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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.71
amik
0 / 0 / 0
Регистрация: 09.04.2010
Сообщений: 19
#1

Анимация. - C++

18.06.2011, 17:09. Просмотров 3807. Ответов 21
Метки нет (Все метки)

Я сделала анимацию барашка, он движется ,но, когда он двигается дальше, предыдущие не стираются. Пробовала txClear(), но не работает, а точнее стирается все и становится белым. И как вообще мою овцу остановить?
Вот код:



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
#include "C:\Users\user\Desktop\Dev-Cpp\TX\TXLib.h"
   
   
void AppearSun (int x, int y, double zoom, 
                 COLORREF from, COLORREF to, int time);                         
 
void DrawSun (int x, int y, double zoom, 
                 COLORREF color, int beams);
                 
void ShiningSun (int x, int y, double zoom, 
                 COLORREF color, int beams);
                 
void MoveSheep (int x, int y,
                int near_legs, int distant_legs, int ears, double smile, int time, int steps);
                                  
void DrawSheep (int x, int y, 
                int near_legs, int distant_legs, int ears, double smile);
                
void SmileSheep (int x, int y,
                int near_legs, int distant_legs, int ears, double smile);                
 
void EatSheep (int x, int y,
                int near_legs, int distant_legs, int ears, double smile);
                
void DrawBird (int x, int y, 
              int wings, int tail);
 
void DrawFlower (int x, int y);
 
void DrawCloud (int x, int y, double zoom);
 
void DrawAirplane (int x, int y);
 
void MoveAirplane (int fromX, int toX, y); 
 
 
int main()
{
int t = 0;
while ( t <=10000)
{          
txCreateWindow (1000, 800);                                  
 
txSetColor (TX_GREEN);
txSetFillColor (TX_GREEN);
txRectangle (0, 700, 1000, 800);
txSetFillColor (RGB (0, 200, 240));
txFloodFill (0, 0);
 
MoveAirplane (1200, 0, 100);
DrawSheep (900, 570, 0, 0, 0, 0);
DrawSun (900, 100, 1, TX_YELLOW, 0);
DrawBird (700, 200, 0, 0);
DrawFlower (200, 600);
DrawCloud (300, 200, 5);
DrawAirplane (1200, 100);
MoveSheep (900-t%4, 570, 0+t%5, 0+t%5, 0+t%5, 0, 1000, 10);
}
return 0;
}
 
 
void DrawSun(int x, int y, double zoom, COLORREF color, int beams)
{
txSetFillColor (TX_YELLOW);
txSetColor (TX_YELLOW);
txCircle (x, y, 50);
txLine (x, y+50, x, y+150);
txLine (x-50, y+45, x-100, y+95);
txLine (x-50, y, x-200, y);
txLine (x+30, y+25, x+70, y+95);
txLine (x+40, y+20, x+90, y+30);
txLine (x+40, y-10, x+80, y-20);
txLine (x-20, y-50, x-50, y-100);
txLine (x+20, y-50, x+50, y-100);
}
 
void DrawSheep(int x, int y, int near_legs, int distant_legs, int ears, double smile)
{
txSetColor (TX_BLACK);
txSetFillColor (TX_BLACK);
txRectangle (x-70, y+45, x-60, y+130);
txRectangle (x-40, y+50, x-30, y+130);
txRectangle (x, y+50, x+10, y+130);
txRectangle (x+40, y+50, x+50, y+130);
txSetFillColor (TX_WHITE);
txEllipse (x-100, y-15, x+80, y+75);
txSetFillColor (TX_BLACK);
txEllipse (x-125, y-30, x-75, y+45);
txSetFillColor (TX_WHITE);
txCircle (x-105, y+5, 7);
txCircle (x-118, y+5, 7);
txSetFillColor (TX_BLACK);
txCircle (x-107,y+6, 3); 
txCircle (x-120, y+6, 3);
txSetFillColor (TX_WHITE);
txSetColor (TX_WHITE);
txCircle (x+75, y+10, 8);
txCircle (x+80, y+20, 10);
txCircle (x+75, y+30, 8);
txCircle (x-60, y+30, 20);
txCircle (x-60, y+50, 20);
txCircle (x-60, y+10, 20);
txCircle (x-40, y-5, 20);
txCircle (x-20, y-10, 20);
txCircle (x, y-10, 20);
txCircle (x+20, y-5, 20); 
txCircle (x+40, y+5, 20);
txCircle (x+50, y+10, 20);
txCircle (x+50, y+20, 20);
txCircle (x-60, y+45, 20);
txCircle (x-40, y+55, 20);
txCircle (x-20, y+55, 20);
txCircle (x, y+60, 20);
txCircle (x+20, y+55, 20);
txCircle (x+40, y+45, 20);
txCircle (x-70, y+45, 20);
txCircle (x+50, y+45, 20);
txCircle (x+60, y+35, 20);
txSetColor (TX_BLACK);
txLine (x-118, y-17, x-138, y-7);
txLine (x-138, y-7, x-118, y-9);
txLine (x-88, y-17, x-68, y-7);
txLine (x-68, y-7, x-88, y-9);
txSetColor (TX_WHITE);
txCircle (x-100, y-30, 10);
txCircle (x-88, y-23, 8);
txCircle (x-115, y-25, 5);
txCircle (x-105, y-28, 8);
txCircle (x-81, y-20, 5);
txCircle (x-118, y-20, 5);
txCircle (x-102, y-26, 5);
txEllipse (x-114, y+15, x-116, y+18);
txEllipse (x-108, y+15, x-110, y+18);
txLine (x-112, y+25, x-106, y+25);
txLine (x-112, y+25, x-114, y+28);
txLine (x-106, y+25, x-104, y+28);
}
 
void DrawBird(int x, int y, int wings, int tail)
{
txSetColor (TX_RED);
txSetFillColor (TX_RED);
txCircle (x, y, 20);
txCircle (x-30, y, 10);
txLine (x-40, y-5, x-45, y-5);
txLine (x-45, y-5, x-40, y);
txLine (x+10, y, x+40, y-5);
txLine (x+40, y-5, x+40, y);
txLine (x+40, y, x+10, y);
txLine (x, y-20, x+5, y-40);
txLine (x, y+20, x+5, y+40);
txLine (x+5, y-40, x-10, y-15);
txLine (x+5, y+40, x-10, y+15);
txSetColor (TX_BLACK);
txSetFillColor (TX_WHITE);
txCircle (x-32, y-2, 3);
}
 
void DrawFlower(int x, int y)
{
txSetColor (TX_GREEN);
txLine (x, y+100, x, y);
txLine (x, y+50, x-20, y+40);
txLine (x-20, y+40, x, y+60);
txLine (x, y+40, x+20, y+30);
txLine (x+20, y+30, x, y+50);
txSetColor (TX_WHITE);
txSetFillColor (TX_PINK);
txCircle (x, y, 5);
txCircle (x+5, y-10, 10);
txCircle (x-5, y-10, 10);
txCircle (x, y+10, 10);
txCircle (x-10, y, 10);
txCircle (x+10, y, 10);
}
 
void DrawCloud(int x, int y, double zoom)
{
txSetColor (TX_DARKGRAY);
txSetFillColor (TX_DARKGRAY);
txCircle (x, y, 50);
txCircle (x+50, y-10, 50);
txCircle (x+50, y+10, 50);
txCircle (x+100, y, 40);
txCircle (x-50, y, 30);
txCircle (x+135, y, 25);
}
 
void DrawAirplane(int x, int y)
{
txSetColor (TX_BLACK);
txLine (x, y, x+30, y-20);
txLine (x+30, y-20, x+250, y-20);
txLine (x+250, y-20, x+255, y-35);
txLine (x+255, y-35, x+260, y-35);
txLine (x+260, y-35, x+252, y);
txLine (x+252, y, x, y);
txLine (x+140, y, x+252, y);
txLine (x+252, y, x+140, y-5);
txLine (x+252, y, x+190, y-7);
txCircle (x+40, y-10, 5);
txCircle (x+55, y-10, 5);
txCircle (x+70, y-10, 5);
txCircle (x+85, y-10, 5);
txCircle (x+100, y-10, 5);
txCircle (x+115, y-10, 5);
txCircle (x+130, y-10, 5);
txCircle (x+145, y-10, 5);
txCircle (x+160, y-10, 5);
txCircle (x+175, y-10, 5);
txCircle (x+190, y-10, 5);
txCircle (x+205, y-10, 5);
txCircle (x+220, y-10, 5);
txCircle (x+235, y-10, 5);
txLine (x+25, y-15, x+30, y-15);
txLine (x+30, y-15, x+30, y-7);
txLine (x+30, y-7, x+9, y-7);
}
 
void MoveSheep (int x, int y,
                int near_legs, int distant_legs, int ears, double smile, int time, int steps)
{
                  
     int i = 0;
    while (i <= steps)
        {
             
        int x = 900 + (400 - 900) * i/steps,
            y = 570;
        
        DrawSheep (x-i%5, y, i%3*2, i%3*-1, i%3, 0);
 
        txSleep (time / steps);
 
        DrawSheep (x-i%5, y, i%3*2, i%3*-1, i%3, 0);
        
        i+=5;
        }           
        
    DrawSheep (x, y, 0, 0, 0, 0);
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.06.2011, 17:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Анимация. (C++):

Анимация - C++
Как мне нарисовать ромб, так чтобы он менял свою форму, относительно своих углов?

Анимация в С++ - C++
Уважаемые, программисты! кто может сделать анимацию в программе С++, рисунок можно самый простой лижбо он был в движение. Зарание огромное...

анимация в С++ - C++
как заставить шарик вращаться?

Анимация - C++
Всем привет. Меня интересует такой вопрос. Есть файл *.FBX насколько сложно сделать программу для работы с этим типом. В конкретном случае...

Анимация - C++
Ребята помогите написать анимацию(на ваш выбор). Анимация должна быть не очень сложной) Пожалуйста))

Анимация в игре - C++
Всем привет! Вот делаем с друзьями 2D платформер. Я использую SDL библиотеку. У меня получилось сделать движения влево и вправо и...

21
Nursik77
273 / 233 / 21
Регистрация: 05.04.2011
Сообщений: 645
18.06.2011, 17:36 #2
Есть такая функция в си : clearviewport() тебе в помощь.
0
dihlofos
Бродяга
303 / 257 / 17
Регистрация: 27.08.2010
Сообщений: 553
18.06.2011, 17:39 #3
amik, я бы сделал что-нибудь типа:

C++
1
2
3
4
5
6
for(int x = start; x > finish; x -= step) // start - начальная точка, end - конечная, step - шаг
{
   txClear(); // стираем прежнее
   DrawSheep (x, y, 0, 0, 0, 0); // рисуем новое
   txSleep (100); // делаем задержку
}
0
Nursik77
273 / 233 / 21
Регистрация: 05.04.2011
Сообщений: 645
18.06.2011, 17:50 #4
Вот к примеру мое "творение", (я над ней пол дня карпел) как я уже сказал , используя функцию clearviewport():
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
#include <conio.h>
#include <stdlib.h>
#include <graphics.h>
#include<dos.h>
main ()
{
int gd=DETECT,gm,r;
int i,n,k;
initgraph(&gd, &gm,"C:\\TC\\BGI");
setbkcolor(BLUE);
for(n=20;n<600;n++)
 {pieslice(639,0,0,360,150);
  pieslice(25,50,0,360,1);
  pieslice(125,75,0,360,1);
  pieslice(200,150,0,360,1);
  pieslice(225,75,0,360,1);
  pieslice(125,150,0,360,1);
  pieslice(250,65,0,360,1);
  pieslice(295,180,0,360,1);
  pieslice(5,15,0,360,1);
  pieslice(50,100,0,360,1);
  pieslice(25,5,0,360,1);
  pieslice(200,42,0,360,1);
  pieslice(254,35,0,360,1);
  pieslice(25,250,0,360,1);
  pieslice(35,195,0,360,1);
  pieslice(400,75,0,360,1);
  pieslice(365,50,0,360,1);
  pieslice(340,85,0,360,1);
  pieslice(370,203,0,360,1);
  pieslice(400,205,0,360,1);
  pieslice(425,215,0,360,1);
  pieslice(450,230,0,360,1);
  pieslice(434,266,0,360,1);
  pieslice(460,282,0,360,1);
  pieslice(484,260,0,360,1);
 
 setcolor(YELLOW);
 line(n,350,n,325);
 line(n,325,n+25,300);
 line(n+25,300,n+50,295);
 line(n+50,295,n+75,300);
 line(n+75,300,n+100,315);
 line(n+100,315,n+125,325);
 line(n+125,325,n+150,330);
 line(n+150,330,n+150,350);
 line(n+150,350,n+145,350);
//-----fari----------//
 line(n+153,332,n+150,332);
 line(n+153,332,n+153,343);
 line(n+153,343,n+150,343);
 
 line(n+155,332,n+177,325);
 line(n+155,335,n+177,332);
 line(n+155,337,n+178,342);
 line(n+155,341,n+178,348);
 
 line(n,330,n-4,330);
 line(n-4,330,n-4,340);
 line(n-4,340,n,340);
 //---------------------//
 line(n+55,303,n+72,303);
 line(n+72,303,n+92,315);
 line(n+92,315,n+55,315);
 line(n+55,315,n+55,303);
 line(n+52,303,n+52,315);
 line(n+52,303,n+28,303);
 line(n+28,303,n+16,315);
 line(n+16,315,n+52,315);
 arc(n+28,346,0,95,15);
 line(n+43,346,n+53,346);
 line(n+53,346,n+53,320);
 line(n+53,320,n+25,320);
 line(n+25,320,n+25,330);
 line(n+36,324,n+31,324);
 line(n+57,320,n+95,320);
 line(n+57,320,n+57,346);
 line(n+95,320,n+95,346);
 line(n+95,346,n+57,346);
 line(n+62,324,n+68,324);
 line(n-500,363,n+539,363);
//----kolesa------//
 arc(n+130,350,0,180,15);
 circle(n+130,350,10);
 circle(n+130,350,8);
 circle(n+130,350,1);
 line(n+115,350,n+40,350);
 arc(n+25,350,0,180,15);
 circle(n+25,350,10);
 circle(n+25,350,8);
 circle(n+25,350,1);
 line(n,350,n+10,350);
 delay(5);
 clearviewport();
 }
getch();
}
0
amik
0 / 0 / 0
Регистрация: 09.04.2010
Сообщений: 19
18.06.2011, 19:35  [ТС] #5
Nursik77 , у нас немного разные библиотеки.В моей тупо-примитивной нет такой функции.
dihlofos, я не проходила циклы с for.Я вообще мало чего проходила.
0
ValeryS
Модератор
6652 / 5061 / 470
Регистрация: 14.02.2011
Сообщений: 16,923
18.06.2011, 19:52 #6
Цитата Сообщение от Nursik77 Посмотреть сообщение
clearviewport()
честно???
и в стандарте можете указать???
если пользуешься каким-то конкретным диалектом и библиотекой не надо заявлять

Цитата Сообщение от Nursik77 Посмотреть сообщение
Есть такая функция в си
для анимации и графики написано куча книг!
и если пользоваться очисткой экрана то получишь моргание !
для анимации используется двойной буфер или(во времена DOS) операция XOR
из вопроса я не понял на чем пишем (DOS, Windows, XXunix,Mac)и посему советовать что-либо не могу
(ну не поддерживает стандарт С графику)
единственное что приходит на ум
1 создаешь буфер
2 в нем рисуешь картинку
3 заменяешь картинку на экране тем что создано в буфере
4 идешь к 2
конкретная реализация зависит от операционки и компилятора

Добавлено через 5 минут
посмотри мою птичку http://www.cyberforum.ru/csharp-begi...220-page2.html
ничего не моргает
(правда писана по винду и под шарп)
но идея с двойным буфером может и понятнее будет
0
amik
0 / 0 / 0
Регистрация: 09.04.2010
Сообщений: 19
18.06.2011, 20:58  [ТС] #7
я Вас не понимаю.я же говорю, я совсем новичок.мне бы чего-нибудь совсем простого...
0
grizlik78
Эксперт С++
1956 / 1449 / 115
Регистрация: 29.05.2011
Сообщений: 3,007
18.06.2011, 21:11 #8
Совсем простое, это нарисовать на месте старой овечки закрашенный прямоугольник (который овечку сотрёт), а потом нарисовать овечку в новом месте. Но тут два недостатка. Во-первых будет стираться фон если он есть (поэтому выводить надо бы не просто прямоугольник, а кусок фона), а во-вторых изображение будет мерцать. И от мерцания при таком способе никуда не деться.
0
ValeryS
Модератор
6652 / 5061 / 470
Регистрация: 14.02.2011
Сообщений: 16,923
18.06.2011, 21:37 #9
Цитата Сообщение от grizlik78 Посмотреть сообщение
И от мерцания при таком способе никуда не деться.
еще раз
Цитата Сообщение от ValeryS Посмотреть сообщение
1 создаешь буфер
2 в нем рисуешь картинку
3 заменяешь картинку на экране тем что создано в буфере
4 идешь к 2
и вообще эта задача решена не один раз
куча литературы
0
grizlik78
Эксперт С++
1956 / 1449 / 115
Регистрация: 29.05.2011
Сообщений: 3,007
18.06.2011, 21:43 #10
Хотелось бы увидеть, как это реализовать в TXLib, ага.
0
ValeryS
Модератор
6652 / 5061 / 470
Регистрация: 14.02.2011
Сообщений: 16,923
18.06.2011, 21:53 #11
Цитата Сообщение от amik Посмотреть сообщение
я Вас не понимаю.я же говорю, я совсем новичок.мне бы чего-нибудь совсем простого...
посмотри
http://www.firststeps.ru/mfc/directx/r.php?38

Добавлено через 7 минут
Цитата Сообщение от grizlik78 Посмотреть сообщение
Хотелось бы увидеть, как это реализовать в TXLib, ага.
что сие за зверь???
не зависимо от платформы

Цитата Сообщение от ValeryS Посмотреть сообщение
1 создаешь буфер
что трудно выделить память (в куче, на стеке)??
Цитата Сообщение от ValeryS Посмотреть сообщение
2 в нем рисуешь картинку
не умеешь работать с выделенной памятью?

Цитата Сообщение от ValeryS Посмотреть сообщение
3 заменяешь картинку на экране тем что создано в буфере
тяжело скопировать???
вот это и называется двойная буферизация
и никаких морганий
0
grizlik78
Эксперт С++
1956 / 1449 / 115
Регистрация: 29.05.2011
Сообщений: 3,007
18.06.2011, 21:59 #12
ValeryS, если это всё мне, то напрасный труд. Я делал анимацию и в DirectX, и в OpenGL, и даже в убогом VGA-режиме своими силами. Но за попытку спасибо Если это для ТС, то труд тем более напрасный. Тут бы хотябы основами языка овлядеть. Уверен, что программа не задумывалась как популярный шуттер
0
ValeryS
Модератор
6652 / 5061 / 470
Регистрация: 14.02.2011
Сообщений: 16,923
18.06.2011, 22:22 #13
Цитата Сообщение от grizlik78 Посмотреть сообщение
если это всё мне, то напрасный труд
звиняте дядьку
меня смутило
Цитата Сообщение от grizlik78 Посмотреть сообщение
Совсем простое, это нарисовать на месте старой овечки закрашенный прямоугольник
не самое лучшее решение
уж тогда проще XOR
а с прямоугольниками было такое решение
1 там где будет рисоватся картинка запомнить фон
2 когда ее нужно стереть рисуем запомненый фон
проблемы возникали если объект двигаля на меньшее расстояние чем размер объекта

Добавлено через 6 минут
grizlik78,
не знаешь случайно такую библиотеку
Virtual Panels
есть старая прога написаная на BC 3.0 а может 3.1
исходников нет
надо дизасемблировать
и вот уткнулся в эту библиотеку
гугла ничего толкового не дал
0
grizlik78
18.06.2011, 22:28
  #14

Не по теме:

Цитата Сообщение от ValeryS Посмотреть сообщение
не знаешь случайно такую библиотеку
Virtual Panels
Нет, о такой не приходилось слышать

0
amik
0 / 0 / 0
Регистрация: 09.04.2010
Сообщений: 19
18.06.2011, 23:20  [ТС] #15
http://sourceforge.net/apps/trac/txlib/wiki/TXLib
Вот.Можете скачать, если хотите.Эту библиотеку написал наш учитель.
Вот его сайт:
http://ded32.net.ru/
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.06.2011, 23:20
Привет! Вот еще темы с ответами:

Анимация в GDI - C++
Подскажите, пожалуйста, как анимировать фигуру в GDI, чтобы она при нажатии на пробел, поднималась на пару пикселей Заранее спасибо

Управляемая анимация в C++ - C++
Нарисовать схему электрической цепи, чтобы ключи при нажатии на соответствующие цифры открывались и закрывались, при включеном ключе ток...

Анимация символов - C++
превед )) решил побаловаться в с++. Нарисовал простенький рисунок( \ / # $ .), а потом решил его &quot;оживить&quot; т.е. добавить анимацию.Делать...

Анимация в консоли - C++
Как вы делаете анимацию в консоли? Я просто очищал екран вызывал метод который выводил все на екран но оно начиет мигать и как-то не...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
18.06.2011, 23:20
Ответ Создать тему
Опции темы

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