Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.53/55: Рейтинг темы: голосов - 55, средняя оценка - 4.53
 Аватар для Luntegg
8 / 8 / 1
Регистрация: 06.02.2010
Сообщений: 87

Разработка "игры" для зачета

08.02.2010, 17:14. Показов 12011. Ответов 77
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Идея такова: есть автобус, он ездит и собирает людей по остановкам, по дороге самособой. Кругом ездят другие машины. Когда автобус доезжает до края экрана появляется новая локация и т.д. Пока все что успел: более менее настроить управление. Вот полный код:
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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#include "myclasses.cpp"
#pragma hdrstop
 
#include "mmsystem.h"
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
//DWORD fdwSound = SND_ASYNC | SND_FILENAME;
//HWND cur;
TForm1 *Form1;
 
Graphics::TBitmap*back;//Задний буффер
Graphics::TBitmap*bus;//Задний буффер
float X,Y,start=0,angle,speed=0,RotSpeed=2;
const float M_RAD_CONV=M_PI/180.0;//Для преобразований градусов и радианов
bool flag[4];
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
//PlaySound("con_attack3.wav",NULL, fdwSound);
 
/*cur=LoadImage(0,"arrow.cur",IMAGE_CURSOR,0,0,LR_LOADFROMFILE);
if (cur==0)
    ShowMessage("Ошибка загрузки курсора!");
else
{
  Screen->Cursors[1]=cur;
  Form1->Cursor=1;
} */
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
back=new Graphics::TBitmap();
back->Width=Form1->Width;
back->Height=Form1->Height;
bus=new Graphics::TBitmap();
bus->LoadFromFile("bus.bmp");
X=100;
Y=100;
angle=10;
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
back->Canvas->FillRect(Rect(0,0,back->Width,back->Height));//Очищаем задний буффер
RotateDC(back->Canvas->Handle,angle);
SetViewportOrgEx(back->Canvas->Handle,X,Y,NULL);//Смещаем нашу точку
back->Canvas->Draw(-33,-31,bus);
 
SetViewportOrgEx(back->Canvas->Handle,0,0,NULL);//Смещаем нашу точку назад
RotateDC(back->Canvas->Handle,0);
Form1->Canvas->Draw(0,0,back);//И рисуем все на экран - "обновление экрана"
 
X+=cos(M_RAD_CONV*angle)*speed;
Y+=sin(M_RAD_CONV*angle)*speed;
if(X<-50)X=Form1->Width+50;
if(Y<-50)Y=Form1->Height+50;
if(X>Form1->Width+50)X=-50;
if(Y>Form1->Height+50)Y=-50;
 
if (flag[1]==1 && start<10){
    start=start+0.1;
}
if (flag[1]==0 && start>0){
    start=start-0.05;
    if (start<0){
    start=0;
    }
}
if (flag[3]==0 && start<0){
    start=start+0.05;
    if (start>0){
    start=0;
    }
}
if (flag[3]==1 && start>-3){
    start=start-0.1;
}
if (flag[1]==1 || flag[1]==0){
    speed=start;
}
if (flag[3]==1 && flag[0]==0 && flag[2]==0){
    speed=start;
}
if (flag[0]==1 && flag[3]==0 && flag[2]==0 && start!=0){
    angle-=RotSpeed;
}
if (flag[2]==1 && flag[0]==0 && flag[3]==0 && start!=0){
    angle+=RotSpeed;
}
if (flag[3]==1 && flag[0]==1){
    speed=start;
    angle+=RotSpeed;
}
if (flag[3]==1 && flag[2]==1){
    speed=start;
    angle-=RotSpeed;
}
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
if (Key==37){
    flag[0]=1;
}
if (Key==38){
    flag[1]=1;
}
if (Key==39){
    flag[2]=1;
}
if (Key==40){
    flag[3]=1;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormKeyUp(TObject *Sender, WORD &Key, TShiftState Shift)
{
if (Key==37){
    flag[0]=0;
}
if (Key==38){
    flag[1]=0;
}
if (Key==39){
    flag[2]=0;
}
if (Key==40){
    flag[3]=0;
}
}
//---------------------------------------------------------------------------
Все постепенно будет делаться. Вот только возник вопрос: как создать машины другие (канвасом или имейджем), которые будут ездить по своему заданному маршруту, и как их ПЕРЕМЕЩАТЬ. Желательно пример. Если есть другие полезные готовые функции, подходящие сюда, буду рад
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.02.2010, 17:14
Ответы с готовыми решениями:

задачка для зачета
Движение закрашенного круга по синусоиде из левого нижнего угла экрана в правый верхний угол.

Решите для зачета,очень срочно.!!!!!!
Дано целое число,больше 999.Используя одну операцию деления нацело и одну операцию взятия остатка от деления,найти цифру,соответствующую...

Строки, надо для зачета срочно
Помогите написать код срочно надо для зачета. Часто встречающаяся ошибка начинающих наборщиков – дважды записанное слово. Обнаружить и...

77
Покинул форум
3189 / 1368 / 109
Регистрация: 29.01.2010
Сообщений: 2,887
10.02.2010, 13:33
Студворк — интернет-сервис помощи студентам
Поясняю:
1.На форме Image1(TImage), pnt(TValueListEditor), bus_t(TTimer)
Размер Image1 20*20;
Положение 0,0;
pnt - это обьект куда заносится вся информация о карте: Положение дорого и остановки.
________________________________________ ________________________________________ _
2.
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
int ost_x=0;
int ost_y=0; //Это положение остановки по x & y;
Image1->Canvas->Rectangle(0,0,20,20); //На Image1 рисуем квадрат - это у нас автобус
int r,t;
int y=0;//Переменные
//Дальше идет создание дороги. Она создается странным способом: Сначала по горизонтали потом по 
//вертикали.
 for(int y=0;y<13;y+=4){
   for(int i=0;i<21;i++){
         if(pnt->Values[IntToStr(i)+"/"+IntToStr(y)]!="1" || pnt->Values[IntToStr(i)+"/"+IntToStr(y)]!="2"){
        Form1->Canvas->Brush->Color=clGray;
        Form1->Canvas->Rectangle(i*20,y*20,i*20+20,y*20+20);
        pnt->Values[IntToStr(i)+"/"+IntToStr(y)]="1";}
        }
   }
int x=0;
 for(int x=0;x<21;x+=4){
  for(int i1=0;i1<13;i1++){
  if( pnt->Values[IntToStr(i1)+"/"+(y)]!="1" || pnt->Values[IntToStr(i1)+"/"+(y)]!="2"){
   Form1->Canvas->Brush->Color=clGray;
   Form1->Canvas->Rectangle(x*20,i1*20,x*20+20,i1*20+20);
   pnt->Values[IntToStr(x)+"/"+(i1)]="1";}
             }
 }
//Теперь случайным образом ставим на карте остановку
            Randomize();
         r=RandomRange(1,21); //Вычисляем положение по x
         t=RandomRange(0,5);//по y
         t*=4;
         Form1->Canvas->Brush->Color=clRed;
         Form1->Canvas->Rectangle(r*20,t*20,r*20+20,t*20+20); //Рисуем красный квадрат покоординатам
         ost_x=r*20;
         ost_y=t*20;
________________________________________ ________________________________________ ____________
Теперь на таймер вешаем код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 if(Image1->Left!=ost_x || Image1->Top!=ost_y){
 
 
      if(Image1->Left<ost_x || Image1->Left>ost_x){
        if(Image1->Left<ost_x){
          if(pnt->Values[IntToStr(Image1->Left/20+1)+"/"+IntToStr(Image1->Top/20)]!=""){
           Image1->Left+=20;}}
 
 
           if(Image1->Left>ost_x){
          if(pnt->Values[IntToStr(Image1->Left/20-1)+"/"+IntToStr(Image1->Top/20)]!=""){
           Image1->Left-=20;}}
 
      }
 
      else {
      if(Image1->Top<ost_y){  Image1->Top+=20; }
      if(Image1->Top>ost_y){  Image1->Top-=20; }
      }
 
 }
Здесь обьяснить трудно, одним словом перемещаем автобус к остановки, при этом автобус двигается только по созданной нами дороге. Автобус - это Image1
0
 Аватар для Luntegg
8 / 8 / 1
Регистрация: 06.02.2010
Сообщений: 87
10.02.2010, 17:13  [ТС]
Спасибо. Но уже Otaka помог. Плюс сегодня преподователь объяснила как там все сделать, дорассказала неточности...
0
Покинул форум
3189 / 1368 / 109
Регистрация: 29.01.2010
Сообщений: 2,887
10.02.2010, 17:27
Да, не за что, Luntegg.
0
 Аватар для Luntegg
8 / 8 / 1
Регистрация: 06.02.2010
Сообщений: 87
10.02.2010, 18:29  [ТС]
C++
1
2
3
4
5
struct NumMans{
    float XM,YM;
    Graphics::TBitmap* bmapMan;
    NumMans(int x, int y, Graphics::TBitmap* bM){XM=x;YM=y;bmapMan=bM;}
};
C++
1
2
3
listPeople=new TList;
listPeople->Add(new NumMans(0,0,man));
listPeople->Add(new NumMans(0,0,man));
C++
1
2
3
4
5
6
if(listPeople->Count){
back->Canvas->Draw(2000+DX,0+DY,static_cast<NumMans*>(listPeople->Items[0])->bmapMan);
back->Canvas->Draw(2010+DX,0+DY,static_cast<NumMans*>(listPeople->Items[1])->bmapMan);
}
if(listPeople->Count && DX>-1400){listPeople->Delete(0);}
if(listPeople->Count && DX>-1450){listPeople->Delete(1);}

ошибка list index out of bounds (1)
как быть, что не так?
0
Покинул форум
3189 / 1368 / 109
Регистрация: 29.01.2010
Сообщений: 2,887
10.02.2010, 18:40
C++
1
2
if(listPeople->Count && DX>-1400){listPeople->Delete(0);}
if(listPeople->Count && DX>-1450){listPeople->Delete(1);}
А ты поробую поменять их местами:
C++
1
2
if(listPeople->Count && DX>-1450){listPeople->Delete(1);}
if(listPeople->Count && DX>-1400){listPeople->Delete(0);}
0
 Аватар для Luntegg
8 / 8 / 1
Регистрация: 06.02.2010
Сообщений: 87
10.02.2010, 18:43  [ТС]
тоже самое
0
Покинул форум
3189 / 1368 / 109
Регистрация: 29.01.2010
Сообщений: 2,887
10.02.2010, 18:46
А у меня нормально работает, если местами поменять...
0
 Аватар для Luntegg
8 / 8 / 1
Регистрация: 06.02.2010
Сообщений: 87
10.02.2010, 18:48  [ТС]
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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#include "myclasses.cpp"
#pragma hdrstop
 
#include "mmsystem.h"
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
//DWORD fdwSound = SND_ASYNC | SND_FILENAME;
TForm1 *Form1;
TList *List;
 
Graphics::TBitmap*map;//Задний буффер
Graphics::TBitmap*back;//Задний буффер
Graphics::TBitmap*bus;//Задний буффер
Graphics::TBitmap*car;//Задний буффер
Graphics::TBitmap*man;//Задний буффер
int dver=0;
float X,Y,DX=-1500,DY=0,start=0,angle,speed=0,RotSpeed=2,k=0,l=5;
const float M_RAD_CONV=M_PI/180.0;//Для преобразований градусов и радианов
bool flag[5];
//---------------------------------------------------------------------------
struct NumMans{
    float XM,YM;
    Graphics::TBitmap* bmapMan;
    NumMans(int x, int y, Graphics::TBitmap* bM){XM=x;YM=y;bmapMan=bM;}
};
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
//PlaySound("con_attack3.wav",NULL, fdwSound);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
back=new Graphics::TBitmap();
back->Width=Form1->Width;
back->Height=Form1->Height;
map=new Graphics::TBitmap();
map->LoadFromFile("map/map.bmp");
bus=new Graphics::TBitmap();
bus->LoadFromFile("car/bus.bmp");
bus->Transparent=true;
car=new Graphics::TBitmap();
car->LoadFromFile("car/car.bmp");
car->Transparent=true;
man=new Graphics::TBitmap();
man->LoadFromFile("car/man.bmp");
man->Transparent=true;
X=530;
Y=230;
//angle=10;
listPeople=new TList;
listPeople->Add(new NumMans(0,0,man));
listPeople->Add(new NumMans(0,0,man));
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
Label1->Caption=DX;
Label2->Caption=DY;
 
back->Canvas->FillRect(Rect(0,0,back->Width,back->Height));//Очищаем задний буффер
back->Canvas->Draw(DX,DY,map);
//back->Canvas->Draw(k+DX,0+DY,car);
if(listPeople->Count){
back->Canvas->Draw(2000+DX,0+DY,static_cast<NumMans*>(listPeople->Items[0])->bmapMan);
back->Canvas->Draw(2010+DX,0+DY,static_cast<NumMans*>(listPeople->Items[1])->bmapMan);
}
//if(listPeople->Count && DX>-570)listPeople->Delete(0);
if(listPeople->Count && DX>-1450){listPeople->Delete(1);}
if(listPeople->Count && DX>-1400){listPeople->Delete(0);}
//back->Canvas->Draw(-1400,0,car);
//k=X-DX+1;
//k++;
RotateDC(back->Canvas->Handle,angle);
SetViewportOrgEx(back->Canvas->Handle,X,Y,NULL);//Смещаем нашу точку
back->Canvas->Draw(-80,-25,bus);
SetViewportOrgEx(back->Canvas->Handle,0,0,NULL);//Смещаем нашу точку назад
RotateDC(back->Canvas->Handle,0);
Form1->Canvas->Draw(0,0,back);//И рисуем все на экран - "обновление экрана"
DX+=cos(M_RAD_CONV*angle)*speed;
DY+=sin(M_RAD_CONV*angle)*speed;
//if (DX>-1000){
//  X=DX-X;
    //if (X=-570){
    //  X=-570;
    //}
//}
//if (DX>-570){
//  DX=-570;
//}
//if(DY<-50)Y=Form1->Height+50;
//if(DX>Form1->Width+50)X=-50;
//if(DY>Form1->Height+50)Y=-50;
 
if (flag[1]==1 && start<10){
    start=start+0.1;
}
if (flag[1]==0 && start>0){
    start=start-0.05;
    if (start<0){
    start=0;
    }
}
if (flag[3]==0 && start<0){
    start=start+0.05;
    if (start>0){
    start=0;
    }
}
if (flag[3]==1 && start>-3){
    start=start-0.1;
}
if (flag[1]==1 || flag[1]==0){
    speed=start;
}
if (flag[3]==1 && flag[0]==0 && flag[2]==0){
    speed=start;
}
if (flag[0]==1 && flag[3]==0 && flag[2]==0 && start!=0){
    angle-=RotSpeed;
}
if (flag[2]==1 && flag[0]==0 && flag[3]==0 && start!=0){
    angle+=RotSpeed;
}
if (flag[3]==1 && flag[0]==1){
    speed=start;
    angle+=RotSpeed;
}
if (flag[3]==1 && flag[2]==1){
    speed=start;
    angle-=RotSpeed;
}
if (flag[4]==1 && start>0){//ручник
    start=start-0.5;
    if (start<0){
    start=0;
    }
}
if (flag[4]==1 && start<0){//ручник
    start=start+0.5;
    if (start>0){
    start=0;
    }
}
if(dver==1){stat->Panels->Items[0]->Text="Двери открыты.";
 }
  if(dver==0){stat->Panels->Items[0]->Text="Двери закрыты.";
 }
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
if (Key==37){
    flag[0]=1;
}
if (Key==38){
    flag[1]=1;
}
if (Key==39){
    flag[2]=1;
}
if (Key==40){
    flag[3]=1;
}
if (Key==32){
    flag[4]=1;
}
if (Key==13){
    dver=1-dver;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormKeyUp(TObject *Sender, WORD &Key, TShiftState Shift)
{
if (Key==37){
    flag[0]=0;
}
if (Key==38){
    flag[1]=0;
}
if (Key==39){
    flag[2]=0;
}
if (Key==40){
    flag[3]=0;
}
if (Key==32){
    flag[4]=0;
}
}
//---------------------------------------------------------------------------
с 1 челом работает, а с 2 нет
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
10.02.2010, 21:34
Стоят 2 человека:
C++
1
2
back->Canvas->Draw(1500+DX,0+DY,static_cast<NumMans*>(listPeople->Items[0])->bmapMan);
back->Canvas->Draw(1550+DX,0+DY,static_cast<NumMans*>(listPeople->Items[1])->bmapMan);
Как удалить одного из них например?
Так ошибка вылетает:

C++
1
2
if(listPeople->Count && DX>-950){listPeople->Delete(0);}
if(listPeople->Count && DX>-900){listPeople->Delete(1);}
А так сразу всех:

C++
1
2
3
4
5
6
for(int i=0;i<listPeople->Count;i++){
        if(listPeople->Count && DX>-900){
                listPeople->Delete(i);
                i--;
        }
}
Не знаю как быть вообще
C++
1
2
if(listPeople->Count && DX>-950){listPeople->Delete(0);}
if(listPeople->Count && DX>-900){listPeople->Delete(1);}
Вот так вот делать нельзя, так как у тебя 2 человека, ты удалил 1(второй теперь стал первым), а потом уже пытаешься удалить второго(а есть уже только первый), которого нет. Вот и ошибка.

Удалять вообще можно так: list->Clear();

Но тут кроется главная ошибка: Ужасные утечки памяти. Сначала память нужно очистить, а потом уже удалять из списка.
То есть:
C++
1
2
3
4
for(int i=0;i<listPeople->Count;i++){
                delete (NumMans*)listPeople->Items[i];
}
listPeople->Clear();
Почему у тебя там выбивает ошибка я не знаю, но похоже, что глюк в этом вот коде:
C++
1
2
3
4
if(listPeople->Count){
back->Canvas->Draw(2000+DX,0+DY,static_cast<NumMans*>(listPeople->Items[0])->bmapMan);
back->Canvas->Draw(2010+DX,0+DY,static_cast<NumMans*>(listPeople->Items[1])->bmapMan);
}
Заметь, удаляешь ты людей не одновременно:
C++
1
2
if(listPeople->Count && DX>-1450){listPeople->Delete(1);}
if(listPeople->Count && DX>-1400){listPeople->Delete(0);}
,
А рисуешь двоих в случае, если список не равняется 0, то есть двух даже в случае если уже человека нет.
Мне вот интересно, а если тебе нужно будет сделать 100 людей, ты тоже будешь для каждого хардкодить координаты, и удаление?
Разве нельзя было сделать так: Изначальная позиция человека X=cos(random(360 градусов))*random(20)+20+X_остановки. Так же и Y. Тем самым ты можешь равномерно распределить людей возле остановки. Необходимые переменные(у тебя в условиях какие-то странные 2000+DX, 2010+DX итд...) вынести в члены класса, и обрабатывать людей в цикле. Таким образом сможешь организовать сколько угодно людей в скольких угодно местах.
1
 Аватар для Luntegg
8 / 8 / 1
Регистрация: 06.02.2010
Сообщений: 87
10.02.2010, 21:48  [ТС]
Я бы с радостью сделать последнее, только не совсем понимаю, как это сделать, и по этому делаю так
У меня был только такой вариант: люди стоят каждые у своей остановки. Если автобус стоит у одной остановки и двери открыты, то все люди с этой остановки удаляются. И так с каждой остановкой. Как это сделать? Поточнее если можно, а то не совсм понятно, куда там позицию человека писать и т.д.
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
11.02.2010, 09:39
Вот я тут тебе по быстренькому смастерил примерчик, как по экрану ездит автобус, и забирает человечков с остановок.
Там я использовал не TPoint, а FPoint(Смотри в файл myclasses.cpp) для того, чтобы вычислять угол от одной точки к другой, расстояния между ними.
Автобус давит людей просто по дистанции(если автобус едет и расстояние между ним и человеком < чего-то, то человек давится). Как сделать коллизию по прямоугольнику который можно еще и поворачивать, смотри в соответствующий раздел темы "Создание игры 2d".
Вложения
Тип файла: rar Bus.rar (249.5 Кб, 36 просмотров)
2
 Аватар для Luntegg
8 / 8 / 1
Регистрация: 06.02.2010
Сообщений: 87
11.02.2010, 18:02  [ТС]
Ааааааааааа, огромное спасибо!!!!!!
Ты показал как сделать еще больше, чем я хотел
0
 Аватар для Luntegg
8 / 8 / 1
Регистрация: 06.02.2010
Сообщений: 87
11.02.2010, 21:23  [ТС]
Вроде совместил два документа, но не работает
Автобус не по центру экрана и не могу это никак исправить... Уверен что это из-за FPoint...
Прошу устранить ошибку, ибо мне её не найти >_<
Вложения
Тип файла: rar Funny Bus.rar (2.52 Мб, 12 просмотров)
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
11.02.2010, 22:18
Скачал я твой проект, запустил, как он должен работать я если честно так и не понял и автобуса мне не видно вообще. А так как у меня не 2010(или 2007(9)) версия Билдера, а всего лишь старенькая шестая, то запустить я не могу, а переделывать проект сейчас не особо есть время(лениво мне), продебажить я не могу.
Но проглядев код могу сказать следующее:
Ты взяв мой код, не учел того, что у меня двигается автобус, а у тебя фон, поэтому коэффициенты нужно обратить, а автобус рисовать просто по центру.
За FPoint ручаюсь, они работают так как надо.
0
 Аватар для Luntegg
8 / 8 / 1
Регистрация: 06.02.2010
Сообщений: 87
11.02.2010, 23:41  [ТС]
Ну если что, то у меня тоже вроде как 6
Пробовал так, нифига, сейчас опять поменяю опять чего-нибудь...

Добавлено через 11 минут
сделал....
забыл вставить
C++
1
2
SetViewportOrgEx(back->Canvas->Handle,0,0,NULL);
RotateDC(back->Canvas->Handle,0);


Добавлено через 1 час 7 минут
все работает, но люди в автобус не садятся не давятся...
это конечно же из-за координат...
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
//---------------------------------------------------------------------------
 
#include <vcl.h>
//#include "myclasses.cpp"
#pragma hdrstop
 
#include "mmsystem.h"
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
//DWORD fdwSound = SND_ASYNC | SND_FILENAME;
TForm1 *Form1;
 
Graphics::TBitmap*back;//Задний буффер
Graphics::TBitmap*mapPic;
Graphics::TBitmap*busPic[2];
Graphics::TBitmap*carPic;
Graphics::TBitmap*manPic[3];
TTList<CMan*>*mans;
 
CBus bus(20,20);
 
int dver=0,i=0;
float DX=-1000,DY=0,start=0;
//---------------------------------------------------------------------------
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
//PlaySound("con_attack3.wav",NULL, fdwSound);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
//bus.pos.x=Form1->Width/2;
//bus.pos.y=Form1->Height/2;
 
back=new Graphics::TBitmap();
back->Width=Form1->Width;
back->Height=Form1->Height;
 
mans=new TTList<CMan*>();
Graphics::TBitmap*tempPic=new Graphics::TBitmap();
tempPic->LoadFromFile("car/man.bmp");
for(int i=0;i<3;i++){
    manPic[i]=new Graphics::TBitmap();
    manPic[i]->Width=20;
    manPic[i]->Height=20;
    manPic[i]->Canvas->Draw(i*-20,0,tempPic);
    manPic[i]->Transparent=true;
    manPic[i]->TransparentColor=(TColor)RGB(185,122,87);
}
 
tempPic->LoadFromFile("car/bus.bmp");
for(i=0;i<2;i++){
    busPic[i]=new Graphics::TBitmap();
    busPic[i]->Width=121;
    busPic[i]->Height=51;
    busPic[i]->Canvas->Draw(0,i*-51,tempPic);
    busPic[i]->Transparent=true;
}
 
for(i=0;i<random(20);i++){
    CMan*man=new CMan(400+random(100)-50,400+random(100)-50);
    mans->Add(man);
}
for(i=0;i<random(20);i++){
    CMan*man=new CMan(100+random(100)-50,400+random(100)-50);
    mans->Add(man);
}
 
mapPic=new Graphics::TBitmap();
mapPic->LoadFromFile("map/map.bmp");
 
bus.pos.x=Form1->Width/2;
bus.pos.y=Form1->Height/2;
}
//----------------------------------------------------------------------
TForm1::Flip()
{
Form1->Canvas->Draw(0,0,back);
return 0;
}
//----------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
Process();
ProcessMan();
Drawing();
Flip();
 
Label1->Caption=DX;
Label2->Caption=DY;
 
back->Canvas->Draw(DX,DY,mapPic);
//back->Canvas->Draw(1400+DX,0+DY,car);
 
//if (DX>-570){
//  DX=-570;
//}
}
//---------------------------------------------------------------------------
TForm1::Drawing()
{
//Рисуем человеков
for(int i=0;i<mans->Count;i++){
    CMan*man=mans->Get(i);
    int type=0;
    if(man->IsHappy)type=1;
    if(man->live==false)type=2;
    back->Canvas->Draw(man->pos.x+DX,man->pos.y+DY,manPic[type]);
}
 
int bustype=0;
if(dver==1)bustype=1;
SetViewportOrgEx(back->Canvas->Handle,bus.pos.x,bus.pos.y,NULL);//Смещаем нашу точку
RotateDC(back->Canvas->Handle,bus.angle/M_RAD_CONV);
back->Canvas->Draw(-90,-25,busPic[bustype]);
SetViewportOrgEx(back->Canvas->Handle,0,0,NULL);
RotateDC(back->Canvas->Handle,0);
return 0;
}
//---------------------------------------------------------------------------
void TForm1::ProcessMan()
{
for(int i=0;i<mans->Count;i++){
    CMan*man=mans->Get(i);
    if(man->live==false)continue;
    float distance=man->pos.Distance(&bus.pos);
    if(bus.speed>0){
        man->IsHappy=false;
        if(bus.speed>1){
            if(distance<20){
                man->live=false;
            }
        }
    }
    else{
        if(distance<100){
            man->IsHappy=true;
            float direction=man->pos.Polar(&bus.pos);//Человек взял азимут на автобус
            man->pos.x+=cos(direction)*0.5;
            man->pos.y+=sin(direction)*0.5;
            if(distance<1){
                delete man;
                mans->Delete(i);
                i--;
            }
        }
        else{
            man->IsHappy=false;
        }
    }
}
}
//---------------------------------------------------------------------------
void TForm1::Process()
{
if(ButtonUp==True && bus.speed<10){
    bus.speed+=0.1;
}
if(ButtonUp==False && bus.speed>0){
    bus.speed-=0.05;
    if(bus.speed<0){
        bus.speed=0;
    }
}
if(ButtonDown==False && bus.speed<0){
    bus.speed+=0.05;
    if(bus.speed>0){
        bus.speed=0;
    }
}
if(ButtonDown==True && bus.speed>-3){
    bus.speed-=0.1;
}
if(ButtonLeft==True && ButtonDown==False && ButtonRight==False && bus.speed!=0){
    bus.angle-=2*M_RAD_CONV;
}
if(ButtonRight==True && ButtonDown==False && ButtonLeft==False && bus.speed!=0){
    bus.angle+=2*M_RAD_CONV;
}
if(ButtonDown==True && ButtonLeft==True){
    bus.angle+=2*M_RAD_CONV;
}
if(ButtonDown==True && ButtonRight==True){
    bus.angle-=2*M_RAD_CONV;
}
if(ButtonSpace==True && bus.speed>0){
    bus.speed-=0.05;
    if(bus.speed<0){
        bus.speed=0;
    }
}
if(ButtonSpace==True && bus.speed<0){
    bus.speed+=0.05;
    if(bus.speed>0){
        bus.speed=0;
    }
}
if(dver==1){
    stat->Panels->Items[0]->Text="Двери открыты.";
}
if(dver==0){
    stat->Panels->Items[0]->Text="Двери закрыты.";
}
 
DX+=cos(bus.angle)*bus.speed;
DY+=sin(bus.angle)*bus.speed;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
if (Key==VK_UP){
    ButtonUp=true;
}
if (Key==VK_DOWN){
    ButtonDown=true;
}
if (Key==VK_LEFT){
    ButtonLeft=true;
}
if (Key==VK_RIGHT){
    ButtonRight=true;
}
if (Key==VK_SPACE){
    ButtonSpace=true;
}
if (Key==VK_RETURN){
    dver=1-dver;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormKeyUp(TObject *Sender, WORD &Key, TShiftState Shift)
{
if (Key==VK_UP){
    ButtonUp=false;
}
if (Key==VK_DOWN){
    ButtonDown=false;
}
if (Key==VK_LEFT){
    ButtonLeft=false;
}
if (Key==VK_RIGHT){
    ButtonRight=false;
}
if (Key==VK_SPACE){
    ButtonSpace=false;
}
}
//---------------------------------------------------------------------------

C++
1
&bus.pos
что вместо этого написать? как-то заменить на DX и DY....
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
12.02.2010, 09:33
Я просто в примере взял не так систему координат, и это тебя запутало. Это происходит из-за того, что координаты автобуса у тебя не bus.pos, а центр экрана. Ты можешь написать
C++
1
2
3
FPoint p;
p.x=Центр экрана_X
p.y=Центр экрана_Y
1
 Аватар для Luntegg
8 / 8 / 1
Регистрация: 06.02.2010
Сообщений: 87
12.02.2010, 13:33  [ТС]
И куда вставить?
Пробовал, ничего не меняется.....
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
12.02.2010, 14:13
Ладно, как прийду домой, переделаю пример так, чтобы двигался не автобус, а карта.
1
 Аватар для Luntegg
8 / 8 / 1
Регистрация: 06.02.2010
Сообщений: 87
12.02.2010, 14:23  [ТС]
Спасибо.
Ща двигается карта, а автобус и пешеходы на месте стоят...
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
13.02.2010, 20:57
Тарам!!!
А вот и исправленный вариант.
На твоей совести сделать, чтобы автобус был не жестко привязан к центру, и чтобы он мог ездить только по дорогам.
!Внимательный читатель заметит, что внесено было очень мало изменений по сравнению с предыдущей версией.
Вложения
Тип файла: rar Bus.rar (532.5 Кб, 26 просмотров)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.02.2010, 20:57
Помогаю со студенческими работами здесь

С++ Создать понятную программу с объяснениями ( для зачета)
На зачете по Основам объектно-ориентированного программирования получил незачет. Препод требует написать СОЛИДНУЮ,а также СЕРЬЕЗНУЮ...

Последние задание для зачета люди спасите ч.1
А15.1 Элемент ai арифметической прогрессии вычисляется по формуле: ai+1 = ai + d , i = 0,1,2, … Поле first – вещес- твенное число,...

Разработка 2д игры
Я знаю с++ и си.Хотела бы создать свою игру но не в виде консольного приложение.можете подсказать хорошие платформы для разработки 2д игры...

Разработка игры для Android
Всем доброго времени суток! Недавно (придумал) 2D игру , но реализовать её не могу т.к нооб :). Нужен какой-нибуть бесплатный движок для...

Разработка игры для Дипломной Работы
Здравствуйте, форумчане. Учусь на математическом факультете в КемГУ, на прикладной математике (3 курс). Пару месяцев назад загорелся...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru