Форум программистов, компьютерный форум, киберфорум
Программирование игр
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Заблокирован

Игра "SUPER MARIO" или "SOLDIR OF MARIO"

28.01.2025, 13:58. Показов 11967. Ответов 90
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, дорогие мои братья и сёстры!

Игра "SUPER MARIO" или "SOLDIR OF MARIO"

Да да!

Добавлено через 19 минут
Господь сподобил меня Своей милостью, я, когда-то, писал вот эту игру - она была написана, когда я окончил школу и поступил в ВУЗ, летом.

Видео процесс игры и работа в редакторах кирпичиков, ролик сети 'You Tube', длительность ролика около 9 минут.
Кликните здесь для просмотра всего текста


И, что хочу вот сказать: перед тем, как Господь поднял меня, это было рано, в пятницу 13 февраля 1998 года, я являлся в то время лаборантом на кафедре вычислительных машин. К.г.(*), я написал игру под названием "SOLDIR OF MARIO" - "Солдат Марио", как смесь игры Super Mario (c TV приставки "Dendy") и игры Soldier of Fortune ("Солдат Фортуны") с небольшого ZX-Spectrum компьютера (памяти у него было всего 64 килобайт) в 96-97 годах, летом, почти в то время не спал и не ел, потому что меня накрыла настолько сильная волна поддержки, у меня было постоянно состояние эйфории, пока я, практически не отрываясь от экрана монитора занимался программированием "Soldir of Mario"

И, вот, разработка этой игры очень здорово помогает понять и как устроен и задуман наш мир.

https://github.com/wiz3267/mario

Добавлено через 4 часа 52 минуты
Программистам, которые занимались разработкой игр, лучше, как мне кажется, легче понять, что мир, в котором мы живём, очень интересно устроен. Никаких случайностей, тут, конечно нет. Прежде, чем реализовать проект, Господь размышлял - а какой это будет мир, ад или рай. Если рай, тут одна цветовая гамма, все цветы радуги, небо было необходимо создать голубоватого цвета, траву - зеленого, облака - белыми, хлеб - белый. Но этого мало. Нужно ещё разработать все живые организмы - какова будет взаимосвязь всех животных и существ экосистемы. Нужно создать некоторые вещества, без которых невозможна жизнь любого организма - вода H2O и кислород - просто О2. Также, кроме всего прочего, это вещество должно будет обладать рядом важных для жизни свойств - при 0 градусов оно должно начинать закристаллизироваться и становится жестким, твёрдым веществом, однако свойства у него будут таковы, что оно не будет тонуть в воде. Почему так - в таком случае зимой водоёмы с водой будут покрываться корочкой льда, и можно в таком случае ходить по воде (всем людям). Ну и так далее. Один организм должен будет питаться другим. Главный герой или персонаж этого мира - человек. Человек должен состоять не только из костей и мяса, но как венцу творения у Человека будет бессмертная душа, "Я", сознание и память. Человек будет способен своим сознанием быть в высших сферах подсознания и общаться с Бесконечным Богом.

Каковы должны быть размеры этого мира, продолжительность дня и ночи, продолжительность года, как и вокруг какой оси должен вращаться этот мир, скорость движения вокруг Солнца (основной светильник), какое должно быть расстояние от Солнца до Земли, мощность Солнца, чтобы была возможность жить на планете людям и другим живым существам - короче говоря, чтобы мы, жители планеты Земля, не поджарились летом на Солнце и не замерзли зимой.....и т.д. и пр. и пр., будет ли вокруг этого земного мира вращаться ещё один - планета Луна - если да, то какова должна она быть, радиус планеты Луна, скорость вращения вокруг Земли, скорость вращения вокруг оси и наклон оси, рельеф местности.

Ну и, самое главное, а каков будет сам-то Человек, Венец Творения? Как он должен выглядеть? Потом, по истории строительства нами Вавилонской башни, когда древние люди решили построить башню до неба - Господь расстроил их планы, произвёл разделение языков у строителей Вавилонской башни. До селе, они говорили на одном самом первом древнем первоязыке, а тут они заговорили, вдруг, внезапно, на самых разных языках и наречиях, они перестали понимать друг друга, остановили на время строить башню, заморозили строительство, как бы сказали сейчас, спустились с неё и разбрелись по лицу всей Земли. Всё это написано в книге "История нашей Вселенной - от создания до падения", где самым подробным образом описана история Землян, что случилось с Землянами: почему они, начав за "здравие", окончили уже за "упокой", переубивали друг друга, разрушили сами себя, превратили свою планету в самый настоящий ад. Увы. Чтобы люди на будущее знали, как не следует поступать и жить, смотря на эту трагическую гибель нашего с вами Земного мира - планеты Земля Солнечной Системы Галактики Млечный Путь.
3
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.01.2025, 13:58
Ответы с готовыми решениями:

Super Mario
Привет Ребята! Помогите, пожалуйста, найти ошибку! #include <SFML/Graphics.hpp> using namespace sf; int ground = 400; ...

Super Mario на C++ и OpenGL
Всем привет. Решил написать марио на opengl. Пока это все без текстур. Проблема в том, что уже который день не получается написать...

Персонаж super mario не видит коллизию
помогите пожалуйста с кодом,уже всю голову сломал, персонаж не видит коллизию,проваливается сквозь блоки,прикладываю класс игрока package...

90
Заблокирован
29.01.2025, 11:54  [ТС]
Я бы мог рассказать немного предыстории. В силу технических причин, первый язык, на котором я программировал, был MSX-Basic, потом ZX-Spectrum-Basic, а потом, внимание, ассемблер чипа Z-80, на котором я программировал, где программу требовалось всякий раз записывать (и загружать) на ленту бытового магнитофона. Но когда мне папа купил и подарил первую IBM-PC машину с микропроцессором i486, я ещё не догадывался, что есть язык программирования С и С++. Для IBM-PC я написал полностью на асм. для i486 программу с названием "Редактор игр", и мне присудили первое место в городском конкурсе программистов (ОС там ещё была в то время DOS) и подарили калькулятор, и сделали в качестве подарка публикацию в местной городской газете. А я ведь тогда и не думал, что кроме ассемблера есть ещё и С, и компилируется он очень круто, не медленней, чем если писать на ассемблере. Я тогда начал изучать потихоньку С, потом у меня появилась небольшая брошюра, что такое С++. Это меня очень сильно воодушевило и я начал разрабатывать классы и начал писать последовательно ряд игр, основанных на простых классах С++: это питон, потом тетрис, потом бэтти, и только потом уже Марио. У меня было прекрасное, праздничное настроение, я писал код игры Марио. Это было летом, на улицу я редко выходил тогда, занимаясь программой. А год это был, я думаю, 1997.
2
Заблокирован
01.02.2025, 09:19  [ТС]
Из каких же частей состоит игра? Игра состоит из нескольких частей, распределенных в классах и функциях. Вот, к примеру, эта часть кода считается начальной, вступительной:

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
//Mario.cpp
//примечание:
//в проекте перед файлом mario.cpp должен быть включены файлы KEYBOARD, TIMER
//чтобы создались предопределенные объекты
 
#include "stdafx.h"
//=================хедеры стандартных библиотек=================
#include <fcntl.H>
 
//======================мои хедеры==================
#include "Sound.h"
#include "IDSound.h"
#include "Keyboard.h"
#include "Timer.h"
#include "Mario.h"
#include "IDSprite.h"
#include "Mouse.h"
#include "SpriteEditor.h"
#include "Total.h"
//==================================================================
#include <fstream.h>
 
CString _S="";
 
/*******************************************
/**         Глобальные переменные       /**/
/******************************************/
/**/    SOUND   Sound;                  /**/    //цифровой звук
/**/    SPRITE  Sprite(&scr,110);       /**/    //обычные спрайты
/**/    SPRITE  LvSpr(&scr,112);        /**/    //чем строится картинка
/**/    SPRITE  BigFont(&scr,28);       /**/    //большие буквы
/**/    LEVEL   Level(100,50,&LvSpr);   /**/    //уровень
/**/    SUPERMARIO Supermario;          /**/    //все об игре
/**/    MOUSE   Mouse;                  /**/    //мышка
/******************************************/
 
int random(int n)
{
    return rand()%n;
}
 
int SUPERMARIO::InitForStartGame(int param)
{
//LevelNumber=0;
 
    //это randomize - инициализация генератора случайных чисел
    srand(GetTickCount());
 
    char str[7]="SOLDIR";
 
    /*int 
            LevelNumber,    //уровень, на который следует переместиться
            x,              //код кубика, который нужно искать на уровне
            Status;         //флаги
    */
    //создаем таблицу перемещений
    SHUFFLE ShuffleTable[]=
    {
            {0,0,   SHUFFLE::ALWAYS},   //0
            {0,17,  SHUFFLE::CHGLEVEL}, //1
            {0,5,   SHUFFLE::ALWAYS},   //2
            {0,15,  SHUFFLE::ALWAYS},   //3
            {0,3,   SHUFFLE::ALWAYS},   //4
            {0,2,   SHUFFLE::ALLMAP},   //5
            {0,16,  SHUFFLE::ALWAYS},   //6
            {0,6,   SHUFFLE::ALWAYS},   //7
            {10,15, SHUFFLE::CHGLEVEL}, //8
            {10,15, SHUFFLE::BOSSLIVE | SHUFFLE::CHGLEVEL},//9
            {0,0,  SHUFFLE::ALWAYS}, //10
            {0,0,  SHUFFLE::ALWAYS}, //11
            {0,0,  SHUFFLE::ALWAYS}, //12
            {0,0,  SHUFFLE::ALWAYS}, //13
            {0,0,  SHUFFLE::ALWAYS}, //14
            {0,0,  SHUFFLE::ALWAYS}, //15
            {0,0,  SHUFFLE::ALWAYS}, //16
            {0,0,  SHUFFLE::ALWAYS}, //17
            {0,0,  SHUFFLE::ALWAYS}, //18
            {0,0,  SHUFFLE::NEXTLEVEL} //19
    };
 
    //2 -> 5
    //3 -> 15
    //4 -> 3
    //5 -> 2
    //6 -> 16
    //7 -> 6
    //8 -> 15 (с изменением уровня на 10)
    //9 -> 15 (с изменением уровня на 10 и флаг "BOSSLIVE")
    //10 -> 0
    //11 -> 0
 
    //как можно сделать
    // (1) <-> (2)
    // (3) -> (4)
    // (4) -> нельзя
 
 
    for(int i=0; i<SHUFFLE_COUNT; i++)
      Shuffle[i]=ShuffleTable[i];
 
    ManymoneyCounter=0; //счечик для многих монеток
 
    //устанавливаем атрибуты вывода текста
    {
        scr.setbkcolor(0);
        scr.setcolor(15);
    }
 
    //инициализируем классовые переменные
    {
        OldMarioX=0, OldMarioY=0;   //старые координаты марио
                    //(используется при рестарте уровня)
 
        DoorOpenCounter=0,
        GAMECYCLE=TRUE;     //если GAME=FALSE, игра прекращается
 
        LevelStatus=LEVEL_UNDERWATER;
        BossLive=TRUE;      //босс пока жив
        MapCounter=0;       //число собранных карт
        Arms=ARROW;         //оружие - кегли
        ArrowPower=1;       //сила стрелы - 1
        DaggerPower=2;      //сила ножичка - 2
        AxePower=3;         //сила топорика - 3
        SalivaPower=20;     //сила сопел
        ArmsPower=ArrowPower;//сила оружия - как у стрелы
        ProtectedCounter=0; //счетчик, используем для организации защиты
        Lives=20;           //начальное число жизней
        Score=0;            //число набранных очков
        MoneyCounter=0;     //число собранных монеток (кристаллов)
        Time=Level.Time;    //текущее время
        GameMode=GAMEMODE_RESTARTLEVEL | GAMEMODE_LOADLEVEL;
        GAMEEXIT=FALSE;
 
        Timer1=0,
        Timer2=0;
 
        ShowExit=0;     //не показывать ексит
    }
 
    // идея - объединить все супервизоры в цепочку
    //создаем объекты-супервизоры чужих
    //{
        Rick.MakeSupervisor(&Sprite);       //марио
        Bullet.MakeSupervisor(&Sprite);     //оружие
        HeadSaliva.MakeSupervisor(&Sprite); //кегли, которые пускает башка
        Toothflower.MakeSupervisor(&Sprite);//цветки
        Lift.MakeSupervisor(&Sprite);       //лифты
        Door.MakeSupervisor(&Sprite);       //двери
        Door1.MakeSupervisor(&Sprite);      //дверь перед Марио
        Different.MakeSupervisor(&Sprite);  //разное, никак не обрабатываемое
        Cleverobj.MakeSupervisor(&Sprite);  //дескриптор клевых объектов
        CleverAlien.MakeSupervisor(&Sprite);//умные чужие
        Boss.MakeSupervisor(&Sprite);       //босс (голова)
        Skeleton.MakeSupervisor(&Sprite);   //скелеты
        Movetxt.MakeSupervisor(&Sprite);
        Answer.MakeSupervisor(&LvSpr);
        SCORES.MakeSupervisor(&Sprite);
        Brick.MakeSupervisor(&Sprite);
        Money.MakeSupervisor(&Sprite);
        Prize.MakeSupervisor(&Sprite);
        Alien.MakeSupervisor(&Sprite);
        FireLine.MakeSupervisor(&Sprite);
 
    //}
    //создаем Mario
    {
        //уничтожаем рика
        Rick.DelAll();
 
        MARIO  ob;
//      PERSON  ob;
 
        ob.FrameFirst=SPRITE_RICKSTART;
        ob.FrameLast=SPRITE_RICKEND;
 
        ob.FrameSpeed=0.4;
        ob.SpriteIndex=SPRITE_RICKSTART;
        ob.RenewFrame();
        ob.x=Level.MarioX;
        ob.y=Level.MarioY;
        ob.Hot.Set(3,0,21,23);
        ob.Movement=PERSON::RIGHT;
 
        //создаем марио
        for(UINT TT=0;TT<PlayerCounter;TT++)
        {
            Rick += ob;
            ob.x+=20;
        }
    }
 
    //запускаем таймер
    {
        //Timer.Restart(50);
    }
 
    return 0;
}
 
void SUPERMARIO::prPuziri()
{
    //Марио пускают пузыри если флаг уровня - подводный
    if (LevelStatus & LEVEL_UNDERWATER)
    for(int i=0; i<Rick.Counter; i++)
    {
        ANIM &mr=Rick[i];
        if (mr.Status & MARIO_DEATH) continue;
        if ( random(30+int(abs(mr.Speedx)*2) ) > 28 )
        {
            MINDOBJ ob;
            MINDOBJ::GOING go[]=
            {
                {1,0,5+random(5)},
                {-1,0,5+random(5)}
            };
 
            MINDOBJ::FRAMING fr[]=
            {
                {SPRITE_BUBBLE1+random(3), 4},
                {SPRITE_BUBBLE1+random(3), 4},
                {SPRITE_BUBBLE1+random(3), 4}
            };
 
            ob.x=mr.x+5+random(10);
            ob.y=mr.y+7;
            ob.SpriteIndex=SPRITE_BUBBLE1+random(3);
            ob.Speedy=-1;
            ob.Acceleraty=-0.01-0.01*random(5);
            ob.AlwaysAnimate=TRUE;
            ob.TimeLive=200;
            CleverAlien.Add(ob, 2, go, 3, fr);
        }
    }
}
 
void SUPERMARIO::BirdsOtSten()
{
for(int i=0; i<CleverAlien.Counter; i++)
{
    MINDOBJ &br=CleverAlien[i];
    if  (br.SpriteIndex != SPRITE_BIRD1) continue;
    int c=0;    //была ли коллизия
    if (!chk_left(br,0)) br.Speedx=2+0.1*random(10),c=1;
    else if (!chk_right(br,0)) br.Speedx=-2-0.1*random(10),c=1;
 
    int x=int(br.x+12);
    int y1=int(br.y+br.Hot.Top-3);
    int y2=int(br.y+br.Hot.Bottom+3);
    if (Level.ReadXY(x,y1)) br.Speedy=0.7+0.1*random(10),c=1;
    else if (Level.ReadXY(x,y2)) br.Speedy=-0.7-0.1*random(10) ,c=1;
 
    if (br.x<0) br.Speedx=3.4,c=1;
    if (br.y<0) br.Speedy=1.7,c=1;
    if (br.x>Level.MaxX+320) br.Speedx=-3.4,c=1;
    if (br.y>Level.MaxY+200) br.Speedy=-1.7;
 
    //если была коллизия
    //if (c)
    //{
    //  if ( !random(6) ) br.Acceleraty=0.2;
    //else
 
    br.Acceleraty=0;
    //}
 
    if (br.Speedy>0)
    {
        br.SpriteIndex=SPRITE_BIRD1;
        br.FrameSpeed=0;
        //br.frame_num=0;
        br.Frame=br.framing[br.frame_num];
    }
    else
    {
        br.FrameSpeed=0;
    }
}
}
 
void SUPERMARIO::prMarioDeathOnShipah()
{
    for(int i=0; i<Rick.Counter; i++)
    {
        ANIM &rk=Rick[i];
        if (rk.Status & MARIO_DEATH) continue;
        if (chk_down(rk, PRICKLES))
        {
            //гасим марио
            rk.Speedx=0;
            rk.Speedy=-5;
            rk.Acceleratx=0;
            rk.Acceleraty=0.2;
            rk.FrameSpeed=0;
            rk.Status|=MARIO_DEATH;
            Sound.play(SND_EXORCISM);
            //Sound.play(SND_LAUGHT);
        }
    }
}
Добавлено через 5 минут
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
//============= 'game' это, собственно, сама игра ==================
void SUPERMARIO::Game()
{
    InitForStartGame(0);
    //music(NORMAL_MUSIC);
    while (GAMECYCLE)   //цикл игры
    {
    //I. построение изображения 
    MOVEOBJ::TotalAnimatedObject=0;
    prMonetsChangePhase();
    prPuziri();
    prBuildGamePicture();
    prShowDebugInfo();
    //II. логика игры
    BirdsOtSten();          //птички отталкиваются от стен
    SkeletonCollect();      //собираем скелетов
    prCleverobjRefresh();   //обновляем все у умных объектов
    prMarioDeathOnShipah(); //марио гасится на шипах
    prForMarioProtected();  //чтобы марио был защищенным
    prPrizeCatch(Rick, Prize);//призы не проходят сквозь стенки и марио ловит призы
    prBricksNudgePrize();   //кирпичи могут подталкивать призы
    prBricksRestore();      //восстанавливаем кирпичи
    prTurtleCikAlien();     //черепаха сбивает других чужих
    prMonetsTimeEndTimeLiveAndScoreCreate();//надо создать очки когда монетка пропадает
    prIfGameOver();         //если конец игры 
    prBossSalivaDeathMario();// кегли башки гасят марио и не пролетают через стены
    prBossSendSaliveAndKeepAtMario();//башка пускает "кегли" и находится вблизи от марио
    ArmsKillAlien();        // оружие убивает чужих
    prLiftUpDown();         //меняем направление лифта и обновляем его координаты
    prMarioDeathOnFlower();//марио гасится на зубастых цветках
    prFlowersUpDown();      //поднимаем и опускаем зубастые цветки
    MindobjFunctions(Rick, Cleverobj);//различные функции
    MindobjFunctions(Rick, CleverAlien);//предусмотренные для Mindobj
    prMarioFlyDownCleverobj();  //марио слетает с клевых объектов
    prMarioPositionerOnCleverobject();//позиционируем Mario  на клевый объект
    prMarioRenewXY();//обновляем координаты Mario
    //если ноги марио близко к лифту, марио падает
    prMarioClammyToLift();  //на лифт и его ускорение приравнять к нулю
    prMarioDownsBrickDestroy();//обрушиваем кирпичи под ногами у марио
    prArmsCollisionWithWall();//оружие сталкивается со стенами *
    prRememberOldMarioCoordinates();//запоминаем старые координаты Mario
    prKeyboardProcess();        //обработка НАЖАТИЙ клавиш 
    GameModesTreat();       //обрабатываем ситуацию загрузки и рестарта уровня режимы игры
    if (DoorOpenCounter) DoorOpenCounter--; //чтобы дверь успела открыться
    prScrollBricks();       //двигается фон (спрайты воды и огня)
    prChangeEffect();       //эффект перехода на другой экран
    prShowFPS();            //показать FPS
    prSynhronization();     //синхронизируемся (ждем когда таймер станет равным 1)
    
    ShowLevelNumberTimeCounter++;
 
    if (ShowLevelNumberTimeCounter<100)
    {
        
        Msg("  УРОВЕНЬ    ", 9, MSG_NOUPDATE);
        
 
        /*if (LevelNumber<40)
        {
            scr.putNumb(LevelNumber/4+1,1);
            scr<< '-';
            scr.putNumb(LevelNumber%4+1,1);
        }
        else
        {
            scr.putNumb(LevelNumber);
        }*/
        scr.putNumb(LevelNumber);
 
    }
    
    static int ShowLog=0;
    //выводим изображение на экран из DoubleBuffer
    if (Keyb[KEY_L] && Keyb[KEY_LEFTCTRL]) 
    {
        Keyb^KEY_L;
        ShowLog^=1;
    }
    
    if (ShowLog) 
    {
        //сжимаем картинку
        for(int i=0; i<100; i++)
        {
            memcpy(scr.DoubleBuffer+i*320, scr.DoubleBuffer+i*2*320,320);
        }
        
        scr.rectangle(0,100,320,100,0);
        Log.Show();
    }
    scr.update();           
    } //конец цикла while
}//конец функции game
1
Just Do It!
 Аватар для XLAT
4206 / 2663 / 655
Регистрация: 23.09.2014
Сообщений: 9,061
Записей в блоге: 3
02.02.2025, 08:57
zorxor,
это у вас что?

1. эпилог - подводите итоги для перехода в загробный мир.
2. пролог - к началу к чему-то убер-новому.

выберите один вариант в качестве ответа.
1
Заблокирован
03.02.2025, 08:03  [ТС]
XLAT, добрый день!

Цитата Сообщение от XLAT Посмотреть сообщение
zorxor,
это у вас что?
1. эпилог - подводите итоги для перехода в загробный мир.
2. пролог - к началу к чему-то убер-новому.
выберите один вариант в качестве ответа.
Не готов я пока переходить в загробный мир! Мне хочется пока что жить здесь, на планете Земля. Поэтому, выбираю вариант номер два. Я слишком сильно привязался к Земле, к этому миру, к этим всем земным образам и наслаждениям. Хотя я и умом-то понимаю, что этот мир - временный, нестабильный, он постоянно изменяется и к нему особо-то и не за что привязаться - все люди рождаются, растут, распускаются, как прекрасные цветы, и, к сожалению, начинают медленно увядать (простите - умирать) - с годами любой человек стареет, и какой он был раньше, в молодые и юные свои годы, он таким уже не будет никогда. Сейчас мне 45 лет и 4 месяца, время летит слишком быстро.

________________________________________ ___________________________________

По теме - по поводу игры. Вообще, у меня возникала идея написать типа небольшой книжечки (наверное, прямо в этой теме) для самых молодых, только что ещё начинающих программистов, как устроена игра. Ведь программистами не рождаются, а становятся. Не знаю. Но определенные дары (таланты) должны быть от Бога уже заложены в человека. Нельзя же заставить женщину рожать маляров и штукатуров, а, тем паче, программистов.
1
Заблокирован
04.02.2025, 12:23  [ТС]
Чтобы, дорогие друзья, я ещё хотел бы сказать? Чтобы не повторяли моих ошибок. Потому что, пока мы ещё молоды, у нас могут быть прямо таки наполеоновские планы, написать то, написать это, полететь на Марс и прочее. Лично я слишком много времени посвящал машине в детстве и подростковом возрасте, чем это, я думаю, следовало бы делать.

Не должна машина превращаться в идола, который затмевает собой всё остальное, включая домашних, близких и друзей.

В моем случае это произошло, что привело, в итоге, к разным тяжелым и неприятным последствиям. Экраном монитора я отгородился от окружающего мира. Почти всё своё время я посвящал машине - ложился спать, думая о машине, вставал с утра, едва глаза открыл, сразу же бросался к машине и продолжал программировать. Снова и снова. В школе я сидел за последней партой, и на уроках литературы продолжал думать, с листочком и ручкой, а как же реализовать то, а как же это, какой должен быть спрайт там и так далее. Разумеется, книжек я не читал никаких. Можно ли как-то ускорить программу, что-то переписать на ассемблере, самые критические части кода, отвечающие за графические функции. К слову сказать, когда я писал игру, никакой операционной системы, по сути, тогда не было - MS-DOS.

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
//вывод прямоугольника
void SCREEN::rectangle(int x,int y,int len,int hei, int color)
{
    int x1=x+len-1, y1=y+hei-1;
    if (x1<0 || y1<0 || x>319 || y>199) return;
 
    if (y<0 || x<0 || x1>319 || y1>199)
    {
        MYRECT rt1(0,0,319,199),
        rt2(x,y,x+len-1,y+hei-1),
        rt3;
 
        if (DetermineSystem(rt1,rt2,rt3))
        rectangle(rt3,color);
        //Debug("SCREEN::rectangle - parametrs erorr!");
        return;
    }
 
    unsigned char far * vb=DoubleBuffer;
    unsigned addr=320*y+x;
    _asm {
        cld
        mov edi,vb
        add edi,addr
        mov al,byte ptr color
        mov ah,al
        mov bx,ax
        shl eax,16  //shl eax,16
        mov ax,bx
 
        mov ebx,len
        and ebx,3
 
        mov edx,len
        shr edx,1
        shr edx,1
        cld
    }
    m:
    _asm{ 
        mov ecx,edx
        rep stosd
        mov ecx,ebx
        rep stosb
        add edi,320
        sub edi,len
        dec hei
        jnz m
    }
}
Машина работает в реальном режиме, всё железо машины представляло собой открытые порты, программировать можно было просто, напрямую, через порты ввода и вывода машины. От DOS мне, собственно, требовалось обеспечить лишь поддержку файловой системы (загрузить шрифты, спрайты и звуки). От BIOS мне требовалось перевести машину в палитровый (выбрать было необходимо 256 цветов из нескольких миллионов) графический режим: 320x200. Один байт - одна точка. Доступ к видеопамяти был совершенно открыт, по физическому адресу 0xA0000.

In 320x200 256-color mode, the screen is an array of 64000 contiguous bytes, arranged as 200 rows of 320 bytes, with one byte per pixel, located in memory at absolute address $A000:$0000.
Не менее удивительно было и то, что частота кадров была в таком режиме - 70 Гц, синхронизировался я тогда при помощи так называемого "обратного хода луча" - то есть, как только весь код игры сформировал очередной кадр во внутреннем буфере, я дожидался при помощи непрерывного обращения к видеокарте, когда она просигнализирует, что картинка на экране монитора полностью нарисована и луч отключался и переводился обратно к началу экрана. Вот в этот момент я перекидывал внутренний буфер в видеобуфер. И, таким образом, если код написан достаточно оптимизировано, можно было вполне успевать и 70 кадров в секунду делать, это было очень и очень хорошо. Но, хотелось бы вновь отметить - это были 1996-1997 годы от рождества Господа и Спасителя нашего Иисуса Христа.

Машина была полностью в моём распоряжении, исполнялся только мой код и никакой иной (разве что для вывода звука и миди был использован внешний софт, а обращение к файловой системе и перевод машины в графический режим работы осуществлялся лишь один раз, на первоначальном этапе загрузки и инициализации), одна задача. Все порты ввода-вывода и память у машины были раскрыты. Процессор у меня был тогда просто замечательный, Intel i486, частота работы не помню, около 100 миллионов Герц, отличная молотилка, ни разу сам процессор не завис внезапно без причины, оперативной памяти немного, 32 или 64 миллионов байт. Впрочем, для игры в реальном режиме работы микропроцессора был доступен только 1 миллион (на самом деле, как всем программистам прекрасно известно, что число это немного больше, чем я написал, однако, здесь и далее я буду приводить округленные данные, для большей наглядности) байт, не больше, прерывания можно было запретить. Хотя микропроцессор i486 уже обладал полноценным защищенным режимом работы, с доступом к остальной памяти, я этим в то время не заморачивался..

Итак, каков итог: игра работала на машине одна, кроме звука я не обращался к BIOS или DOS прерываниям. Поэтому, если в игре возникал "косяк", ошибка, кроме самого себя обвинять было некого. Хотя я и встречал в своей жизни ошибки работы компилятора. Весь код - твой. Это очень удобно.

Добавлено через 3 часа 10 минут
Я раньше работал в одной организации, связанной с газом. Мне поручили разработать элемент верхнего уровня взаимодействия диспетчера с ядерной станцией. Но, поскольку на "верху" они пытались использовать Delphy или Builder, а это полностью проприетарные технологии, всё закрыто, Бог знает, что там внутри, не ли закладок, гарантии ноль. Так получилось, что начальник во мне разочаровался, и меня перебросили в другой отдел и в другую комнату, где я должен бы заниматься нижнем уровнем, у них был не Linux, а, кажется, "Куиникс", что-то такое. Но эта Linux-подобная система мне очень не нравится, и до сих пор не нравится, я избегаю пользоваться такого рода системами. Поэтому, я продолжал на работе, кроме самой работы, заниматься развитием этой игры - Soldir of Mario - Солдат Марио. Можно ли это назвать саботажем работы и вредительством для той организации? Не знаю. Но я просто задумался - а вдруг? а вдруг я допущу ошибку в коде и ядерная станция в результате этого выйдет из строя, подобно Чернобыльской катастрофе в городе Припять в 1986 году? Ведь в таком случае водоём, находящийся на территории станции станет не пригодным для жизни из-за радиоактивного загрязнения. Поэтому я и подумал - да ну нафиг. Мне-то зачем это?
0
Just Do It!
 Аватар для XLAT
4206 / 2663 / 655
Регистрация: 23.09.2014
Сообщений: 9,061
Записей в блоге: 3
05.02.2025, 03:55
Лучший ответ Сообщение было отмечено zorxor как решение

Решение

Цитата Сообщение от zorxor Посмотреть сообщение
_asm {
завязывайте с этим - на дворе 2025 год.
+ вы же не собираетесь жить живым человеком вечно?! - по простому: у вас не хватит времени на всю эту машинную хрень...

тренды на "птичьем дворе":
- > 50 лет уже стукнуло структурной парадигме(«Go To Statement Considered Harmful» (1968 год) – Эдсгер Дейкстра)
- кросс - ваш асм сдохнет на любом телефоне...
- быстрая разработка - подразумевается юзанье минимум "шаракодных" фреймворков, например, sfml и тп..
- "лёгкость" разработки за счет использования шараварного кода(см выше)
- к черту оптимизацию - в самый конец - когда у вас уже есть 100 человек,
которые купили вашу программу и хотя бы один из них пожаловался на то, что на дедушкином компе она не работает...

- ...

...
Цитата Сообщение от XLAT Посмотреть сообщение
Цитата Сообщение от zorxor Посмотреть сообщение
_asm {
завязывайте с этим - на дворе 2025 год.
если шо, то мой ник это асм мнемоник...

так что слушайтесь меня - что я вам говорю)


Цитата Сообщение от zorxor Посмотреть сообщение
Машина работает в реальном режиме
это всё здорово, но начать всё же лучше с ТЗ. Разве нет?

введение в исторические летописи про деревянное колесо и кремневый топор - очень полезны для сна - но не более...
2
Заблокирован
05.02.2025, 09:56  [ТС]
Добрый день, XLAT! С большим удовольствием принимаю от Вас сообщение, знаю, что Вы что-то обязательно важное сообщите мне. Да, меня никто ведь не учил программированию, в основном я программировал при помощи высшего "Я" (Который и вкладывал мне в пустую голову нужные мысли). По поводу парадигмы - да, действительно, все мои проекты почему и загнулись - код превращался, не скажу, что в лапшу, goto я не использовал в коде, но баги я уже не мог отыскивать, поэтому проект приходилось бросать. Я высказываю Вам благодарность.

Добавлено через 5 минут
Цитата Сообщение от XLAT Посмотреть сообщение
_asm {
завязывайте с этим - на дворе 2025 год.
Ну да, я с этим не могу поспорить. (На момент разработки графической библиотеки год был 1996-1997). Однако, возникает некий парадокс - время идёт, машины сами по-себе, как железо, становятся все быстрее и быстрее, у современных машин огромное быстродействие, однако и кода перелопачивать приходится намного больше, все эти фреймвёрки и пр. и пр. и пр. и прочее и пр. памяти у машин становится все больше и больше, однако системы разрабатываются так, что уже только один браузер может подвешивать всю систему, когда операционная система, например windows, перестаёт реагировать на действия пользователя. Я не могу понять, когда у меня машина становится даже не способной перерисовывать элементарный курсор мыши с необходимой скоростью. Как так? Почему? Что происходит, 2025 год на дворе.И, это, как раз в том числе и из-за быстрой разработки. Тормоза - они могут очень сильно раздражать неискушенного пользователя или программиста. К.г.: не смотря на все усилия железячников - разработчиков железа машин, компьютеры работают (я имею ввиду даже такой самый простой вариант - когда операционная система даже без запущенных приложений, даже без браузера работает с крайне низкой скоростью) с такой скоростью, которой раньше опережала даже Windows XP. Это не есть гуд.

Добавлено через 20 минут
XLAT, может быть это и есть современное "горе от ума"? Ведь на корпорацию Microsoft, например, ведь очень много работает и индусов и негров. Я, конечно, прекрасно понимаю, что тем самым контора экономит деньги. Негру ведь можно платить совсем не много, чтобы он только мог едва сводить свои концы с концами. [...], .... А как я один, простой смертный человек, могу освоить то, что писали тысячи программистов? Достаточно даже просто зайти на этот замечательный ресурс и будет видно - на сколько сильно сейчас расширен горизонт событий, сколько разных языков уже придумано и разработано. Может ли один человек всё это выдержать?

И, ещё, вопрос на засыпку, для знающих (я не отношусь к таким) - почему корпорации Microsoft так и не удалось за огромное число лет, начиная с того, когда Билл Гейтс запрограммировал язык MSX-Basic, сделать так, чтобы ни мыш, ни интерфейс не тормозил не смотря на нагрузку операционной системы......Ты хоть помри, но не должен зависать мышиный курсор. Хоть об стенку можно разбиться - машина сейчас работает с огромным быстродействием.
0
Just Do It!
 Аватар для XLAT
4206 / 2663 / 655
Регистрация: 23.09.2014
Сообщений: 9,061
Записей в блоге: 3
05.02.2025, 11:19
Лучший ответ Сообщение было отмечено zorxor как решение

Решение

Цитата Сообщение от zorxor Посмотреть сообщение
меня никто ведь не учил программированию
меня проучили 5 лет на ФАВТ'е и программированию там меня учили: фортран и ассемблер.

причем ассемблер я выучил за один вечер + одно утро,
когда препод взглянул одним глазом на исписанные с двух сторон мной два тетрадных листка
и сказал только одно слово "переделай".

а я уже тогда допер, что 4 раза писать одну и ту же функциональность по несколько раз это не айскул,
поэтому я тут же переписал эти 4 страницы в одну страницу и получил зачёт.

так что могу хвастануть - я переизобрёл процедурную парадигму - хотя она по факту встроена(CALL) в железо,
в отличии от той же структурной ...

лаба была такая:
- имелась железка КР 580 ВМ (букву А уже не помню с какой стороны прилепить)
- вход ТОК измеренный АЦП.
- выход НАПРЯЖЕНИЕ через ЦАП.
- прога должна реализовать ВАХ зымысловатой формы.

этой лабы хватило мне чтобы почувствовать себя
богом программирования - ведь теперь я мог закодить систему любой сложности,
так тогда я думал.

а в реале нас учили строить вычислительные системы на аналоговых ОУ и эта была полная ПОПА,
потому что проверить их работу можно только ручками с большим паяльником)) ...


Цитата Сообщение от zorxor Посмотреть сообщение
некий парадокс
нет тут парадокса: теперь дворник с метлой может вам построить сервис с калькулятором за один вечер...

в целом, нужно правильно выстроить систему приоритетов:
1. Дорога ложка к обеду.
2. Стоимость.
...
99. то что вы сэкономить 2 такта ЦПУ на ожидании ввода НИКОГО НЕ ВОЛНУЕТ.

конешно, я утрирую.

Цитата Сообщение от zorxor Посмотреть сообщение
Тормоза - они могут очень сильно раздражать неискушенного пользователя или программиста.
фокус нужно сместить на более оптимальные(быстрые в текущем контексте) алгоритмы.

к слову, тупая замена компилятора ускорило прохождение моего перфоманс-теста в 5 раз!

я видел много раз жалобы - прога работает очень медленно - авторы просто позабыли о существовании релиз-сборки...

Оптимизации в С++:
- достаточно тупо следить за тем, чтобы у вас было минимум операций копирования.
- например, используйте же std::string_view везде где только можно ... и тп...
- когда те же питонщики(которые проженные) начинают тоже следить за этим, то код у них тоже получается не такой уж и простенький...
...

Цитата Сообщение от zorxor Посмотреть сообщение
Ты хоть помри, но не должен зависать мышиный курсор
вас взломали. ваш ком превращен в единицу бото-фермы - ивропейцы на вашем "горбе" крипту считают...

у мя 1-герцовый ноут - ничо не тормозит и даже мышь.

когда у мя комп начал тормозить я начал это терпеить, но до поры,
пока не прошелся спайвеем - что только он у меня не нашёл - там даже цру за мной шпионил... )

zorxor,
ну, а теперь можно Техническое Задание посмотреть?

про лечение компа можно сделать отдельную тему в разделе жестянщиков.
1
Заблокирован
05.02.2025, 13:13  [ТС]
Цитата Сообщение от XLAT Посмотреть сообщение
ну, а теперь можно Техническое Задание посмотреть?
Можно теперь. Необходимо спроектировать и после создать Вселенную, особое внимание следует уделить только одной планете, которая будет находиться в созданной Вселенной в Галактике "Млечный Путь", с центром - звездой по имени "Солнце". Необходимо ограничить максимально возможную скорость электромагнитного взаимодействия порядка 300 тысяч километров за одну секунду. Назвать планету будет необходимо "Земля", а проживающих жителей на планете "Земля" - Землянами. Сама планета "Земля" должна представлять собой очень большой шар, если её будет наблюдать наблюдатель с большего расстояния, но если смотреть со стороны наблюдателя на поверхности планеты, по ощущениям необходимо, чтобы она казалась полностью плоской. Так же необходимо разработать и вторую планету - имя у ней будет - "Луна". Луна должна вращаться вокруг Земли с заданной скоростью, также массу Луны нужно подобрать такую, чтобы она могла своей гравитационной силой "таскать" воду на Земле, вызывая приливы и отливы, что важно будет для экосистемы разрабатываемого мира (не следует задавать массу Луны слишком большой, во избежании вызова потопов на планете "Земля") Также, необходимо это особо отметить, все расстояния и размеры небесных тел, скорость движения и орбиты их, мощность и размер звезды по имени "Солнце", планет "Луна" и "Земля" должны быть таковы, чтобы при наблюдении за Луной с Земли, планета Луна меняла бы свой вид за 28 дней, таким образом она будет иметь различный вид - от полной луны до месяца. Такая необходимость нужна для жителей Земли, чтоб они могли как-то ориентироваться во времени, смотря на цикл Луны. Также, кроме сказанного, скорости движения, размеры и расстояния между небесными телами системы "Солнце-Земля-Луна" должны быть таковы, чтобы в определенные моменты времени Луна могла бы перекрывать Солнце, для обеспечения солнечных затмений. Луна должна быть обращена к Земле всегда только одной стороной, необходимо это обеспечить с очень большой точностью, чтобы за время существования создаваемого Земного мира не произошла разсинхронизация, чтобы Луна никак не повернулась бы ещё, относительно наблюдателя с Земли.

Небо у Земли должны быть голубоватого цвета днем, трава зеленого цвета, облака белого, снег - белый, кровь красного, ночью небо должно представлять собой черную ткань, на которой имеются небольшие с виду шарики.

По поводу быстродействия при создании планет - торопиться тут некуда. Хоть можно все сделать и за бесконечно малое время, в связи с бесконечным быстродействием Господа (Бога), спешить тут не следует. Важно постепенность создания.
2
Just Do It!
 Аватар для XLAT
4206 / 2663 / 655
Регистрация: 23.09.2014
Сообщений: 9,061
Записей в блоге: 3
06.02.2025, 06:56
Цитата Сообщение от zorxor Посмотреть сообщение
Небо у Земли должны быть голубоватого цвета днем
слишком резкий у вас переход от ассемблера к вотчине художников-рисовальщикам.
чо кодерам то делать надо?

я поясню:

для кодера цвет неба:
C++
1
2
3
4
5
6
7
8
9
struct Color
{   byte r, g, b, a=0;
};
 
struct ConfigWorld
{  ... 
    Color sky{0,0,200};
    ...
};
далее цвет будет устанавливать ответственный дизайнер-художник...

это не дело кодера думать про то какой цвет нужен для неба...
1
Заблокирован
07.02.2025, 09:17  [ТС]
XLAT, добрый день! Я пока не знаю, что Вам сказать. Просто, я хотел сказать, что изначально всё было просто. Чёрное называлось "чёрным", а белое - "белым". Можете ли Вы Себе представить, что небо будет зелёного цвета, а трава - голубого? Наверное, нет? Добро называлось "добром", а зло называлось "злом".

Кстати говоря (к.г.), я вот, размышлял и о внешнем виде человека. Какой он должен быть. Вот Вы, XLAT, представьте Себя на месте Создателя, пока ещё ничего не было создано. Вот, человек. Какой он должен быть? Как он должен выглядеть? Ведь есть у человека определенная Создателем форма тела и его пропорции. На конечностях у нас по 5 пальцев, а не четыре или шесть. Также и всё остальное. В человеке уже изначально заложено ощущение, внесено в "ПЗУ", какой формы должен быть человек. Некоторая идеальная схема. Ну и некоторые + - (плюс минус), когда ещё ощущения не говорят, что что-то тут уже не то.

+ потом, возраст человека. Ведь человек постоянно растёт и развивается, начиная с внутриутробного зачатия. Первое время, несколько месяцев, новый созданный человек живет во чреве своей матери. Затем рождается на свет полностью не приспособленный к жизни, требует постоянного ухода длительное время.

Добавлено через 42 минуты
И, потом. Что такое пол человека? Это мужчина (одна половина человека) и женщина (другая половина человека). Когда М+Ж сходятся, зачинают и растят детей, вот тогда и появляется человек: мужчина+женщина, как полноценный человек, единый с женой организм (одна плоть, а не две).
0
07.02.2025, 11:24
 Комментарий модератора 
Прекращаем оффтоп, все что не касается программирования (игр в частности, так как раздел про них) не является обсуждением по теме. Будет продолжение начну чистить тему и применять санкции. И так тема скатилась в довольно спорную.
0
Заблокирован
07.02.2025, 18:01  [ТС]
alecss131, ок, прошу прощения.

Добавлено через 45 минут
Я, просто, хотел об этих временах поговорить, когда создавалась игра. Ты бог программирования, т.к. машина очень послушная, выполняет очень точно инструкции. Ты, по-сути, в то время, работал в реальном режиме микропроцессора Intel i486, тебе всё доступно (это как ring0 кольца защиты микропроцессора, почти) Одна машина, вся целиком, только для одной твоей программы. Все порты ввода и/или вывода и вся память (до 1 мегабайта) находятся в раскрытом и доступном состоянии не только на ввод, но и на вывод информации, не только на чтение, но и на запись ячеек оперативной памяти машины.. Там и клавиатуру можно потестить и прочее, например, когда ждать обратного хода луча машины? Ну короче говоря (далее к.г.), ты как автор пусть не Вселенной, но как минимум операционной системы точно, ты даже можешь и вообще перевести машину в защищённый режим работы, и тогда абсолютно вся память машины тебе будет доступна на чтение и запись информации.

Добавлено через 14 минут
Я просто не знаю сейчас реалии, как сейчас учат студентов программированию. Ибо, судя по всему, не особо-то учат. Сейчас, например, возникают очень много багов в лифтах и пр. программы сбоят, работают не правильно, неверно указывается этаж, музыка не играет, время не правильно показывать может. Лифт это просто потому, что я часто пользуюсь такими машинами (хотя и был случай, когда я подошел к лифту в поликлинике, я искал маму, Царство ей Небесное, когда я подошел к лифту, двери машины сами собой открылись, я зашёл в лифт, и, не нажимая ни на какие клавиши клавиатуры машины, двери машины затворились и кабина машины сама собой пришла в движение, потом она сама остановилась, где нужно, и раскрыла свои двери, я вышел и сразу же увидел знакомую беременную женщину). А сколько за последнее время упало воздушных машин, не смогли дотянуть до полосы, сколько погибло людей при всех этих небесных катастрофах - когда машина с огромной высоты, там, например с 10 километров, падает с неба на землю и, разумеется, расшибается со всеми пассажирами. Стоит ли такой техпрогресс потерь стольких людей? А в последнее время часто подводила автоматика, ошибки в софте, в программном обеспечении воздушных машин, что они там, никак долететь до полосы были не в состоянии, выйти на глиссаду - машина очень плохо управлялась джойстиком, очень плохо слушалась командира машины (это, наверное, как в программисткой поговорке - лучшее - враг хорошего)

Я просто про себя говорю - в 10 лет (19861989 год), я по воле Бога оказался в компьютерном кружке, где впервые в жизни увидел настоящий крутой MSX-компьютер, на первом занятии учитель рассказал про машину, как печатать на клавиатуре, потом включил игру "питончик" ("Snaket...") и мы были поражены, впервые в жизни видя и играя на компьютере, дома в то время не было ни у кого компьютеров. А затем учитель, Царство ему Небесное, несколько занятий посвятил, почему-то, алгоритмическому языку, а потом сам MSX-Basic стал объяснять, как нарисовать линию, окружность, нам задал на дом задание нарисовать домик на миллиметровке, и потом записать первую программу в жизни, которая рисует домик (с помощью команды бейсика line). Вот и всё. А сейчас, к большому несчастью, человек может закончить ВУЗ, а программированию так и не научиться. А мы, 10 летние дети СССР, почему-то очень легко и не принужденно программировали. Правда, это зацепило из всей группы 15 человек только меня одного. Мне захотелось разобраться, а как же написать хоть самую простую игру. Важно было также и то, что компьютерные занятия были только раз в неделю один час (минут 30 занятий, оставшееся время, минут (15-25-30..) игры), в праздники, учитель ставил сразу игры, каждому свою, кто что просил поставить с учительской машины (по сети)

ЗЫ кстати, я больше, чем уверен, что если бы в то время у меня был интернет, хоть даже с микроскопической скоростью, никакие Марио и др. игры написаны бы не были - всю энергию и силы сжирал бы интернет. Это было очень и очень здорово тогда. Тогда не было и мобильных телефонов, я сидел у себя спокойно дома, не высоко, на третьем этаже, меня никто не беспокоил, все свои силы я посвящал исключительно машине и разрабатываемому в тот момент времени программному обеспечению машины.

Добавлено через 4 часа 20 минут
Итак, дорогие друзья, хотел бы начать рассказывать про саму игру. Как на этом ролике, происходит демонстрация работы двух редакторов: редактор уровня и редактор кирпичей - это пиксельный редактор.



Добавлено через 50 минут
Вот так представлен хедер редактора уровней:

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
//Level.h
#ifndef __WIZLEVEL_H
#define __WIZLEVEL_H
 
#include "sprite.h"
#include "rects.h"
 
//класс LEVEL предназначен для описания уровня
class LEVEL
{
// !!! ВНИМАНИЕ !!! При добавлении новых данных их можно дописывать
// ТОЛЬКО в конец текущего описания. В противном случае
// чтение прежних файлов level???.dat станет невозможным
// не меняйте порядок следования и тип данных, если хотите читать старые файлы уровней
//************************ ЗАГОЛОВОК ФАЙЛА УРОВНЯ *********************
private:
    unsigned long SIGNATURE;//сигнатура структуры
    WORD sizeofLevel;   //размер структуры в байтах
    SPRITE *spr;        //указатель на используемый класс спрайтов
public:
    WORD x,y;           //координаты окна показа уровня
    WORD MaxX,MaxY;     //максимальные координаты показа уровня
    WORD Len;           //ширина уровня в кубиках
    WORD Hei;           //высота уровня в кубиках
    WORD BoxLen;        //ширина кубика в пикселях
    WORD BoxHei;        //высота кубика в пикселях
private:
    WORD *Data;         //указатель на данные
public:
    WORD MarioX,MarioY; //координаты марио
    WORD BackgroundColor;//цвет заднего плана в данном уровне и флаги
    WORD Time;           //время, за которое надо пройти этот уровень
//************************ КОНЕЦ ЗАГОЛОВКА ФАЙЛА УРОВНЯ ***************
 
//************************** МЕТОДЫ ****************************
public:
    void ConvertNumber(int num, char width, char far * dest);
    int  Editor(int n);         //редактор уровня n
    LEVEL(int len, int hei,SPRITE *spr); //конструктор создание уровня
    ~LEVEL();                   //деструктор
    int  Load(int n);           //загрузка уровня n
    void New(int len,int hei);  //создание нового уровня
    int  Read(int x,int y);     //считать один кубик из уровня
    int  ReadXY(int x,int y)    //считать из уровня кубик (точность до пикселя)
    {
        return Read(x/BoxLen,y/BoxHei);
    }
    int  Save(int n);           //запись уровня  n
    void Show();                //нарисовать уровень
    void Show(int x,int y,char=SHOW_BACKGROUND|SHOW_FOREGROUND);    //нарисовать уровень с заданной позиции
    void Write(int x,int y,int what);//записать в уровень
    
    //записать в уровень кубик
    //x,y - пиксельные координаты
    //what - код кубика вместе с атрибутами
    void WriteXY(int x,int y,int what)
    {
        Write(x/BoxLen, y/BoxHei,what);
    };
 
public:
    enum {
        MASK=0x1ff
    };
 
    //свойства кубика
    enum box_logic{
        BACKGROUND  =0x8000,    //кирпич есть задний  фон(для всех объектов
                            //он равнозначен пустоте)
        ALIEN       =0x4000,//это не кубик, а код кубика задает номер чужого
        FOREGROUND  =0x2000,//этот кирпич будет поверх всех объектов
        logTRANSP   =BACKGROUND,    //"логически прозрачный"
        TRANSPARENTPIXELS=0x1000,   //кирпич имеет прозрачные пикселы(иначе неимет)
        DESTROYED   =0x0800,    //кирпичик может разрушаться
        COLLAPSE    =0x0400,    //кирпичик обваливается под ногами
        PULL=DESTROYED | FOREGROUND, //кирпичик, когда разрушается, тащит все за собой
        //действительно только для чужих
        //AGAIN=FOREGROUND  //чужой должен появиться снова, если его загасят
    };
 
    //как показывать уровень
    enum {
        SHOW_DEBUG      =0x01//показывать отладку
        SHOW_BACKGROUND =0x02//показать задний план
        SHOW_FOREGROUND =0x04   //показать передний план
    };
 
    enum {
        FLAG_UNDERWATER=0x8000   //этот уровень - подводный
    };
}; //class LEVEL
 
#endif
1
Заблокирован
08.02.2025, 12:28  [ТС]
Так выглядит заголовочный файл класса SCREEN, отвечающий за вывод на экран:

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
//Screen.h
#ifndef __SCREEN_H
#define __SCREEN_H
 
#include "rects.h"
 
/*
    Класс SCREEN предназначен для вывода информации во внутренний буфер,
копию экранного буфера. Когда кадр сформирован, вызывается функция update(),
и изображения из внутреннего буфера копируется в видеопамять (на экран)
    Примечание: такие понятия, как 'вывод на экран', 'очистка экрана'
относятся не к физической VRAM, а к теневому экрану (DoubleBuffer, дублирующиц буфер)
    Чтобы информация появилась на экране необходимо вызвать функцию update() 
    Настоящая реализация поддерживает размер экрана 320x200
*/
class SCREEN {
 
// ********************** ДАННЫЕ-ЧЛЕНЫ ******************************
public:
 
    BYTE    DoubleBuffer[320*200];  //теневой экран
 
public:
 
    char    bkcolor;        //цвет заднего фона (при выводе текста)
    char    color;          //цвет рисования
    int     x,y;            //координаты курсора
 
    //хранит копию экрана 
    BYTE    SavedDoubleBuffer[320*200]; 
 
// ********************** ФУНКЦИИ-ЧЛЕНЫ *************************
public:
    void ConvertDoubleBufferToTrueColor(COLORREF * TrueColorBuffer);
    
    //значение State для bitblt
    enum {
        FLIP_HORZ=0x01, //перевернуть спрайт по горизонтали
        FLIP_VERT=0x02, //перевернуть спрайт по вертикали
        TRANSP=0x04 //есть прозрачные пикселы
    };
 
    enum {
        ONLY_DIGIT=0x01 //фунция InputString будет вводить только цифры
    };
 
    void bitblt(int X,int Y,int Len,int Hei, char far* Data, char State);
    void bitblt_part(int x,int y,int x_in, int y_in,int Len, int Hei,
                    int FactLen,int FactHei, char far* Data, char State);
    void border(int x,int y,int len,int hei, int color);    
    void center(int y, char far*);  
    void clear(int=0);              
    void CreatePalette();           
    void DecrementPalette();        
    void IncrementPalette();        
 
    void LoadPaletteFromFile(char *fname);  //восстанавливает палитру из файла
    void SavePaletteToFile(char *fname);    //записывает текущую палитру в файл
 
    //получить массив цветовых регистров
    //void GetColorRegisters(int startReg, int count, RGB * values);
    
    //установить массив цветовых регистров
    //void SetColorRegisters(int startReg, int count, RGB * values);
 
    //получение одного цветового регистра
    void GetColorRegister(unsigned char nReg,char&r,char&g,char&b);
 
    //установка одного цветового регистра
    void SetColorRegister(unsigned char nReg,char r,char g,char b);
 
    
    unsigned long InputNumber(unsigned int DigitCounter);   
    void InputString(int len, char far * str,int flag=0);
    void locate(int x,int y);   
    void locateXY(int x,int y); 
    void line(int x1,int y1,int x2,int y2, char color); 
    void lineright(int x,int y,int len, char color);    
    void linedown(int x,int y,int hei, char color);     
 
    SCREEN& operator << (char*);
    SCREEN& operator << (DWORD);
    SCREEN& operator << (unsigned);
    SCREEN& operator << (int);
    SCREEN& operator << (char);
    SCREEN& operator<< (SCREEN& (*_f)(SCREEN&))
    {
        return (*_f)(*this);
    }
 
    void pause(int n);
    void putpixel(int x,int y,int color); 
    void putpixel();                     
 
    void putSymbol(BYTE s);             
    void putSymbol(int x,int y, unsigned char s);   
    void putText(char far *);       
    void putNumb(unsigned long num);    
    void putNumb(unsigned long num,char width); 
    void rectangle(int x,int y,int len,int hei,int color);
    void rectangle(MYRECT &rt,int color);
    void setbkcolor(char c){bkcolor=c;};    //установка цвета вывода
    void setcolor(char c){color=c;};    //установка цвета вывода
    
    void Set320x240Mode();          //установить режим 320*240, 256 цветов
    void update(void);          //обновление экрана
    void update(RECT);          //обновление экрана
//  void wait(void);            //ждет обратного хода луча
    void SaveScreen();          //сохраняет экран во внутреннем буфере
 
    SCREEN(void);               
    ~SCREEN(void);              
 
};
//================== end of class 'SCREEN' ==============================
 
inline        SCREEN& endl(SCREEN& ob) { return ob; }
 
class MANIPMY {
public:
    SCREEN& (*fun) (SCREEN& , int);
    int ag;
 
public:
    MANIPMY ( SCREEN& (*_f)(SCREEN&, int) , int _a)
    {
        fun=_f;
        ag=_a;
    }
 
        friend SCREEN& operator<< (SCREEN& obj, MANIPMY& _f)
        {
            (_f.fun) (obj, _f.ag);
            return obj;
        }
};
 
MANIPMY& setcolor(int);
MANIPMY& cur(int,int);
 
 
//extern SCREEN scr;
 
 
/*
class FONT
{
    //возможные перечеслиния размеров фонта
    enum {
        FONT8x8,
        FONT8x14,
        FONT8x16
    };
 
    char * FontAddres;      //адрес фонта
    char SymHigh;           //высота одного символа
 
public:
    FONT(int size=FONT8x8); //конструктор size - размер фонта
    ~FONT();    //деструктор
 
    //показать на экране символ с дополнительным цветом color
void    Show(int x,int y, int symbol, char color);
};
 
  */
 
 
#endif
Добавлено через 30 минут
Для Тех, кто только ещё в самом начале пути, кто едва только осилил вывод "hello world", не стоит расстраиваться, если код кажется слишком большим. Ведь я тоже, также, как и Вы, когда-то, не знал программирования. Тут нужна очень большая выдержка и терпение. Опыт (скилл). Когда я летом 1997 года от рождества Иисуса Христа разрабатывал эту игру, мне было ещё не так много лет, как сейчас - намного меньше лет. Были, конечно, и силы в то время, умственные и интеллектуальные способности - у меня тогда не было никаких вредных привычек, я сдал экзамены в ВУЗе, и после лета пошел во второй класс ВУЗа. Количество информации, которой пытались напихать в голову всем подряд студентам слишком зашкаливало, как будто в ВУЗ пришли какие-то сверх-дети вундеркинды. На мне это всё сказалось самым плохим образом - едва наступил 1998 год, февраль, пятница 13-ая, рано - около 8 утра, я собирался в институт, мне открылся Господь Бог и уже очень скоро, 11 марта, родители вынуждены меня были сдать в психлечебницу - как человека, потерявшего рассудок. Обидно. Мозги мне промывали галоперидолом, литрами вливали в вену при помощи капельницы.

Добавлено через 4 минуты
К примеру, сможете ли Вы заниматься программированием не только днём, но и ночью. Почти не спать и не есть 24 часа, а лишь только все свои силы посвящать программированию машины? А 48 часов подряд у экрана монитора машины?
1
Заблокирован
09.02.2025, 10:05  [ТС]
Из чего же состоит игра? Я сразу скажу, что не я автор подобного подхода, потому что те игры в то время, это были игры с приставки Dendy (в основном). Марио написана на использовании классов, без всяких сложных и запутанных примочек. Каждый класс должен был отвечать за что-то одно: класс SPRITE за спрайты, MUSIC за midi-музыку, SOUND за звук, SCREEN за экран, и так далее.

Производительность машины позволяла достигать 70 кадров изображения за одну секунду. Но ведь в самом деле, код там не замысловатый. Вся картинка состоит из блоков, "кубиков". Много процессорного времени на отрисовку не используется.

Примечательно так же и то, что играть можно не только одновременно вдвоём, но даже одновременно втроём. Можно и четвером и больше, т.к. в коде нет ограничения на число игроков.
0
Заблокирован
11.02.2025, 11:54  [ТС]
Теперь, я хотел бы, дорогие друзья, на примере одной функции - члена класса SUPERMARIO, показать, как игра управляет движением объектов на экране:

Так выглядит заголовочный файл с именем "Moveobj.h":
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
//Moveobj.h
#ifndef __MOVEOBJ_H
#define __MOVEOBJ_H
 
#include "rects.h"
#include "debug.h"
 
 
class SPRITE;       //предварительное объявление класса
 
class MOVEOBJ 
{
 
    void NullAllData();
    //YES - значит супервизор, NO - значит объект
public: enum { YES=1, NO=-1 };  //значение переменной Supervisor
 
//*********************** ЧЛЕНЫ-ДАННЫЕ ************************
protected:
static  int SupervisorCounter;//число созданных объектов-супервизоров
    SPRITE* Sprite;     //указатель на объект типа SPRITE
    int Supervisor; //флаг супервизора
    MOVEOBJ* First;     //указатель на первый обьект cписка
    MOVEOBJ* Last;      //указатель на последний объект списка
public:
static  int TotalAnimatedObject;
    double  Acceleratx; //ускорение по осям
    double  Acceleraty;
    int Counter;    //число созданных объектов в списке
    MYRECT  Hot;        //определяет горячее пятно спрайта
       MOVEOBJ* Next;       //указатель на следующий обьект. Если это последний обект Next=NULL
       MOVEOBJ* Prev;       //указатель на предыдущий обект.Если это первый обьект Prev=NULL
    int Link;       //привязка объекта
static  MYRECT  Lim;        //границы, выйдя за которые объекты удаляются
    MYRECT  Rect;       //определяет объект на экране
    double  Speedx;     //проекции скорости на оси
    double  Speedy;
    int SpriteIndex;    //индекс спрайта
    double  Speed;      //модуль вектора скорости
    int Status;     //состояние обьекта
static  double  SPEED_UNIT; //единица скорости
static  int WindowX;    //координата X окна вывода
static  int WindowY;    //координата Y окна вывода
    double  x,y;        //текущие координаты обьекта
    int ShootCounter;   //число выстрелов, после чего объект
    int AlwaysAnimate;  //всегда ли надо анимировать объекты ?
                //убивается
//********************** ФУНКЦИИ-ЧЛЕНЫ ***************************
//(пометка YES - значит функция предназначена только для супервизора
// NO - функция не предназначена для супервизора, то есть предназначена
// только для объекта)
public:
    void Animate();             //YES анимация обектов
virtual void Del (MOVEOBJ *Obj);        //YES удаление обьекта из списка по его адресу,
    void Del (int n) { Del(&operator[](n));}//YES удаление объекта с номером n
    void DelAll();              //YES удаление всех объектов
virtual void Destroy(int who) {}        //вызывается когда объект кто-то убивает
    void MakeSupervisor(SPRITE*spr)     //делает объект супервизором
    {
        Supervisor=YES;
        Sprite=spr;
    }
         MOVEOBJ(SPRITE *Sprite);       //YES конструктор супервизора
         MOVEOBJ();             //NO конструктор move-объекта
        ~MOVEOBJ();                         //YES, NO деструктор
    int  New( MOVEOBJ *Obj, int size);  //YES создание нового объекта
    MOVEOBJ& operator[] (int i);        //YES получить ссылку на объект i
    void operator+= (MOVEOBJ &);        //YES добавить объект в список
virtual void RenewFrame() {}
    void RenewRect();           //NO  обновить структуру Rect
virtual int RenewTimeLive() {return 1;}
virtual void RenewXY();             //NO  обновить координаты X,Y
    void Set(double x=0,double y=0,double sx=0,double sy=0,double acx=0,double acy=0);    //NO установить наиболее важные переменные
virtual void Show();                //NO показываем объект
    void ShowAll();             //YES показать все объекты
};
 
 
//****************************************************
//************* class ANIM - анимация объектов *******
//****************************************************
//класс надстривает MOVEOBJ таким образом, что новый объекты
//могут самоуничтожаться (переменная TimeLive) и изменять
//последовательно c нужной скоростью номера спрайтов (в определенном
//отрезке значений)
 
class ANIM: public MOVEOBJ
{
public:
    int FrameFirst, FrameLast;
    double FrameSpeed, FrameCurrent;
    int TimeLive;
 
public:
    ANIM ();
    ANIM(SPRITE *s) : MOVEOBJ(s) {;}
    //перегружаем [] для правильного преобразования типа
    ANIM & operator[] (int i) {return (ANIM&) MOVEOBJ::operator[](i); }
    //заметьте, MOVEOBJ & operator+= также остается !
    void operator+= (ANIM& ob) { New(&ob, sizeof(ob)); };
    void Animate(void);
virtual void RenewFrame();
    int RenewTimeLive()
    {
            if (TimeLive>3)
        {
            TimeLive--;
                    return 1;
                }
                else if (!TimeLive) return 1;
                else return 0;
    }
 
};
 
 
//************************************************************
//************* class MINDOBJ - умные, разумные объекты *******
//************************************************************
//класс ANIM позволяет создавать простейшую анимацию. Если вас не устраивают
//возможности класса ANIM, используйте класс MINDOBJ
 
//0,-1,10, 0,1,10, 0    мостик вверх, вниз
//
 
class MINDOBJ : public ANIM
{
public:
        //структура "хотьба" (кому? - ясно,что не мне)
        struct GOING
    {
        double Speed_x,Speed_y; //перемещение по осям за один шаг
//                  Accelerat_x,Accelerat_y;
        int  Time;      //время этого передвижения(число шагов)
                       //если Time==0, значит этот шаг последний
        };
        //как должны меняться фазы
        struct FRAMING
        {
            int Fase,   //какая фаза
                Time;   //сколько времение она будет держаться
                            //аналогично GOING, если Time==0 - на начало
    };
 
    GOING  * going;     //указатель на способ движения
    FRAMING * framing;        //указатель на способ смены фазов
 
        int go_num, frame_num;  //текущие элементы
        int go_max, frame_max;  //число элементов
 
public:
    GOING  Go;      //текущие элементы
    FRAMING Frame;
 
 
    //команды
    enum {
        SET_SPEED       = -1,   //установить скорость
        SET_ACCELERAT   = -2,   //установить ускорение
        SET_INDEX       = -3    //перепрыгнуть на другой элемент
    };
 
        enum {
             PERSON=0x01,      //объект всегда смотрит в сторону перемещения
                               //(иначе отображается так, как нарисован)
             DANGER=0x02,   //объект опасный
                    //(иначе неопасный)
             SOLID=0x04,    //объект твердый(нельзя пройти через него)
                        //(иначе прозрачный)
             LIFT=0x08,     //объект может переносить на себе(мостик,
                        //тележка, лифт)
                            //(иначе не может)
        };
 
        unsigned State;     //состояние элемента
 
        void Add(MINDOBJ&, int NumGo,GOING *go_ptr, int NumFrame,
    FRAMING *frame_ptr,int StartGo=0, int StartFrame=0);
 
 
    void Del (MOVEOBJ *Obj);    //удаление объекта из списка
    MINDOBJ(SPRITE *s) : ANIM(s) {;}
        MINDOBJ();
        ~MINDOBJ();         //деструктор
    void operator+=(MINDOBJ&);
        MINDOBJ& operator[](int i) { return (MINDOBJ&) MOVEOBJ::operator[](i); }
        void RenewFrame();
        void RenewXY();
        void Show();
 
};
 
 
 
//перемещающийся текст
class MOVETXT : public ANIM
{
public:
    char* Message;      //сообщение
    char Color;         //цвет сообщения
    MOVETXT (SPRITE* spr) : ANIM(spr), Message(0) {}
    MOVETXT () : Message(0), Color(15) {;}
    void Animate();
    void operator+= (MOVETXT& ob) { New(&ob, sizeof(ob)); };
    void Show();
};
 
#endif
Птички отталкиваются от стен:
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
void SUPERMARIO::BirdsOtSten()
{
for(int i=0; i<CleverAlien.Counter; i++)
{
    MINDOBJ &br=CleverAlien[i];
    if  (br.SpriteIndex != SPRITE_BIRD1) continue;
    int c=0;    //была ли коллизия
    if (!chk_left(br,0)) br.Speedx=2+0.1*random(10),c=1;
    else if (!chk_right(br,0)) br.Speedx=-2-0.1*random(10),c=1;
 
    int x=int(br.x+12);
    int y1=int(br.y+br.Hot.Top-3);
    int y2=int(br.y+br.Hot.Bottom+3);
    if (Level.ReadXY(x,y1)) br.Speedy=0.7+0.1*random(10),c=1;
    else if (Level.ReadXY(x,y2)) br.Speedy=-0.7-0.1*random(10) ,c=1;
 
    if (br.x<0) br.Speedx=3.4,c=1;
    if (br.y<0) br.Speedy=1.7,c=1;
    if (br.x>Level.MaxX+320) br.Speedx=-3.4,c=1;
    if (br.y>Level.MaxY+200) br.Speedy=-1.7;
 
    //если была коллизия
    //if (c)
    //{
    //  if ( !random(6) ) br.Acceleraty=0.2;
    //else
 
    br.Acceleraty=0;
    //}
 
    if (br.Speedy>0)
    {
        br.SpriteIndex=SPRITE_BIRD1;
        br.FrameSpeed=0;
        //br.frame_num=0;
        br.Frame=br.framing[br.frame_num];
    }
    else
    {
        br.FrameSpeed=0;
    }
}
}
0
Заблокирован
12.02.2025, 10:25  [ТС]
Добрый день, XLAT!

Цитата Сообщение от XLAT Посмотреть сообщение
лаба была такая:
- имелась железка КР 580 ВМ (букву А уже не помню с какой стороны прилепить)
- вход ТОК измеренный АЦП.
- выход НАПРЯЖЕНИЕ через ЦАП.
- прога должна реализовать ВАХ зымысловатой формы
Железка КР 580 ВМ не была ли аналогом чипа Zilog Z-80? Вроде как да, только с несколько урезанным функционалом. Не помню точно. + Чую, что тут без магии преобразования Фурье не обошлось...

Я, XLAT, просто хотел бы Вам ещё сказать, что игра ведь была первоначально написана в программе Borland C++ 3.1 версии DOS. А этот исходник, что я цитирую и который на гитхабе, он уже был адаптирован к системе по имени "виндоус". Отличная система. Я не скажу, что было очень сложно адаптировать исходник, но, достаточно сложно всё равно.

Цитата Сообщение от XLAT Посмотреть сообщение
zorxor,
ну, а теперь можно Техническое Задание посмотреть?
Техническое Задание - ок, google, смотрите XLAT - у меня была некоторая цель, некоторая идея, а как же, всё-таки, устроена игра? MSX-Basic (кстати, говорят, что его писал Билл Гейтс в своим молодые годы, когда голова ещё хорошо соображала для ассемблера Z-80, не знаю, хотя, может он писал и на Си. Но, вот, такие вещи, как компиляторы, как Basic написать, как сделать графику 3d, как сделать приложение или переделать марио для смартфона, там, для ОС андроид, что такое ИИ, нейросети, распознавание образов и пр., как это всё функционирует и пр. и пр. например - это уже выше, простите, моей крыши).

Просто, если до 1998 года, я был одним человеком, то после помещения меня в клинику, я стал совсем другим человеком - меня перестало вообще что-либо интересовать (к большому счастью, это оказалось не навсегда, но на несколько месяцев, что достаточно долго) Я много лежал в кровати у себя дома и ничего не делал (у меня даже были мысли, что если это навсегда и я превращён в лежачий "овощь", нафиг, думаю, пойду, вон, на 14-этажку на балкон, она рядом совсем от меня, выйду через балкон. Но, слава Богу, всё это прошло) Мне не приносило какого-то удовольствия или радости, да я и не мог заниматься программированием, после курса аминазина (это нейротоксический яд, производное фенотиазина) и галоперидола (это нейротоксический яд, производное бутирофенона). К большому счастью, оказалось, что если "колёса" (таблетки) бросить, мозг постепенно, хотя и очень медленно, начинает "приходить в себя", я вновь и вновь бросал таблетки, чтобы чувствовать себя человеком, чтобы программирование, музыка и фильмы приносили какую-то радость и прочее, да и вообще, я же не увольнялся из ВУЗа - год учился, год "лечился" после дурдома, брал академ отпуска, но продолжал учиться. В итоге, ВУЗ я закончил не за 5 лет, как тогда было принято, а за 10 лет - в 1996 поступил, в 2006 году дали красный диплом по программированию.

Много раз я подвергался в психбольнице процедуре деградации и уменьшения мозга - мне промывали мозги, буквально, литрами галоперидола, капельницы. И я, после каждой капельнице чувствовал, что жизнь из меня постепенно уходит...я не жалуюсь, так тогда было.

Но! Тут есть очень большое но! Я не знал раньше, что огромное число психической энергии копится, пока тебя кормят нейролептиками и прочей психиатрической дрянью. И когда ты бросаешь таблетки, не сразу, но наступает момент, когда вся эта заглушенная энергия начинает из тебя выходить. Раньше я не смог справляться с ней, и меня опять, вновь и вновь отправляли в лечебницу "на вязки" - меня привязывали к кровати и делали уколы. Потом, если ты откажешься выполнять инструкции медперсонала, например, отказываешься от психотропных ядов горстями, они сразу же начинают шантажировать - не хочешь таблетки пить, щас привяжем будем колоть тогда всю эту дрянь. И длилось всё это достаточно долго -

Понимаете, XLAT, уже тогда, это был 1989 год от рождества Господа и Спасителя нашего Иисуса Христа, будучи ещё совсем ребёнком - выкидышем из СССР, 10 лет мне было всего - я подумал, да а как же мне ну хоть совсем простенькую игру написать? А язык MSX-Basic предоставлял такие возможности - сам компьютер MSX представлял собой корпус-клавиатуру со всем железом внутри. Подсоединялся он к монитору с динамиком, сзади там был регулятор уровня звука . Эта машина содержала внутри себя не только микросхему видеоплаты, аппаратно поддерживающую спрайты и различные графические режимы с разным разрешением, но и микросхему трехканального звука + шумовые эффекты, благодаря чему игру могла сопровождать неплохая музыка без нагрузки на центральный микропроцессор Z-80, Программируй, пожалуйста, сколько хочешь на MSX-Basic. Он позволял всё это делать. И аппаратные спрайты и музыку.

Ну и, простите, вот, попалась мне тогда в те далекие годы Dendy и ZX-Spectrum'ов первый раз в мои руки книжечка по ассемблеру Z-80, и там был приведен очень хороший образ, что Basic - это как автобус, который не сильно спеша двигается, останавливается на всех остановках, а ассемблер - как гоночный автомобиль.
0
Just Do It!
 Аватар для XLAT
4206 / 2663 / 655
Регистрация: 23.09.2014
Сообщений: 9,061
Записей в блоге: 3
12.02.2025, 22:22
Цитата Сообщение от zorxor Посмотреть сообщение
Сама планета "Земля" должна представлять собой очень большой шар
математику можете предоставить - позиционирование перса на поверхности шара?
тип float для какого максимального разрешения его хватит?
0
Заблокирован
13.02.2025, 08:01  [ТС]
Добрый день, XLAT!

Цитата Сообщение от XLAT Посмотреть сообщение
Сама планета "Земля" должна представлять собой очень большой шар
тип float для какого максимального разрешения его хватит
Но мы всегда можем использовать свою математику, для удобства работы в С++ можно ведь сделать специальные классы-типы данных, с перегрузкой всех операций, если встроенной в процессор не хватает. Не знаю, возможно есть секретные разработки специальных военных микропроцессоров с аппаратной поддержкой больших типов данных, превышающих double.

По поводу игры - скажите пожалуйста, XLAT, спрашиваю Вас, поскольку Вы читали исходные тексты этой игры. Сложно ли будет переписывать (точнее, адаптировать) эту игру для OS Android?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.02.2025, 08:01
Помогаю со студенческими работами здесь

Nintendo отмечает 20-летие игры Super Mario Kart
Японский издатель компьютерных игр и разработчик игровых консолей Nintendo отмечает 20-летие с момента выхода первой из серии игр Super...

Игра в стиле Mario (SFML)
Решил попробовать написать игру в стиле марио. Это моя первая игра на с++ если что. Писал в VS 2013, для написания игры решил...

Поиск пути в массиве для фигуры 2х1(или попытка в ИИ для игры Dr.Mario)
Давно в 1990-х была такая игра на приставку Dendy. Вот задумал написать реализацию на делфи,а чтобы было не скучно,сделать режим...

Mario
Всем привет! Я студент первого курса, и в данный момент выполняю курсовую работу в виде игры &quot;Марио&quot;. Большая часть работы...

Mario c++
Здравствуйте, преподаватель задал написать всеми известную игру &quot;Марио&quot; на чистом с++, без использования каких-либо библиотек. Видел в...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru