Войти
ПроектыФорумОцените

мариоподобная 2D-игра, пишу с 1997 года в общей сложности :) (2 стр)

Страницы: 1 2 3 411 Следующая »
#15
10:52, 29 авг. 2011

0iStalker
> Не правда, GPL не запрещает коммерческое использование, - запрет есть на
> закрытие исходных кодов.
Ошибочка :)


#16
16:53, 29 авг. 2011

warchief
> А что в нем не так? нормальный анахронизм времен dos, тогда почти все одиночки
> так писали
что, вот прямо так и писали?:
> prMarioDeathOnShipah(); //марио гасится на шипах
> prPuziri();
> prBirdsOtSten(); //птички отталкиваются от стен

#17
18:48, 29 авг. 2011

Suslik
>что, вот прямо так и писали?
Хаха, это чтобы врагов запутать ))

#18
20:53, 29 авг. 2011

Suslik
> что, вот прямо так и писали?:

И так тоже.
Тырнета нет, в словарь лезть в лом.

#19
23:17, 29 авг. 2011

Suslik
Держись, не одному тебе не спится после увиденного :)

14 лет на игру... однако. Сколько продолжалась непосредственно разработка?

#20
0:56, 30 авг. 2011

музыка жесть

но чувствуеться труда вложено немало

#21
9:02, 30 авг. 2011

игра была написана в 1997 году под DOS целиком практически в том виде как сейчас примерно за три месяца

потом в 2008 году было несколько дней вдохновения

вот лог вдохновения :)

_________________________________________________________

17 may 2008 14:35
В редакторе спрайтов предусмотреть
- очистка рабочего поля
- скроллинг вверх, вниз, влево, вправо

17 may 2008 12:12
- чтобы вместо стрелы была пуля как в игре Wiz
- чужих было больше, чтоб они восстанавливались
- после редактирования спрайтов чтобы они в игре перезагружались
- чтобы на F12 не реагировала программа (сейчас она вылетает и приходится снимать msdev)
- раньше была стрела, когда она сталкивается с чужим там эффект есть. убрать
- стреляет сразу (OK!)

17 may 2008 11:44
- нужно: в редакторе спрайтов F11 и F12 выбор редактируемого файла спрайтов (который 65535 байт)
- музыку заделать транс (15 мая 2008 написал)
- сделать свой прикольный шрифт

03 mar 2008 12:24
сделать ПРИЗЫ как в игре Wiz:
  - ЗАмедленное перемещение
  - можно летать (жмешь кнопку ВВЕРХ и Летит!)
  - внизу в строке отображаются текущие призы (как в игре Wiz!!!)

14 feb 2008 19:16
сделать функцию, отображаюшую произвольное меню
! выбор файла со спрайтами сделать функцию

10 feb 2008 12:00
портится палитра во время игры. нужно отлавливать и загружать палитру

10 feb 2008 06:59
сохранение конфигурации в конфигурационный файл!

10 feb 2008 06:55
сделать движение рыбок более сложное на подводном уровне
чтобы они плавали

10 feb 2008 05:58
день рождения Саши (20 лет юбилей)
сделать мерцание звездочки (код 255 чтобы мерцал)

09 feb 2008 21:21
сделать возможность редактирования спрайтов ЧУЖЫХ
икноку на программу - сам МАРИО

09 feb 2008 21:09
была ошибка программы когда в переключился на другое окно виндоус

09 feb 2008 01:31
лог выводить в отдельном окне уже в функции CopyDoubleBufferToScreen

09 feb 2008 00:50
эффект для текста - плавно меняется цвет по градиенте (гасится)

08 feb 2008 23:21
отображать ID спрайта в редакторе спрайтов (лучше число+текстовый идентификатор)
запись должна обеспечивать запись любого спрайта!

08 feb 2008 23:19
"маша" ходячий гриб если остается на одном кирпиче зацикливается
нужно сделать чтобы она спрыгивала

08 feb 2008 23:16
проигрывание звука через два-три небольших буфера без закрытия устройства
тогда не будет паузы при закрытии открытии девайса

08 feb 2008 15:35
в редакторе уровней переходить к редактирования спрайта на котором курсор
в редакторе спрайтов показывать цвет под курсором в отдельном месте
клавишей делете удалать в ноль (прозрачность)
показывать спрайт ОДИН (чтобы вокруг была пустота)
функция копирования и вставки спрайта

08 feb 2008
если марио очень высоко в облаках, то прыгать сильно нельзя
если нажаты две клавиши влево вправа и вверх - то прыгает высоко (ок сделано)

08 feb 2008 10:05
создание спрайта с экрана (нарисовать надпись а потом сохранить как спрайт)
надпись мир должна плавно уезжать в какую-то сторону

08 feb 2008 09:57
некоторые спрайты отображаются поверх кубиков, которые должны быть всегда СПЕРЕДИ, исправить

08 feb 2008 08:31
сделать конфигурационный файл (*.ini)
куда записывать настройки (текущий уровень, есть или нет музыка и звуки и др.)

07 feb 2008 13:40
нужно увеличить максимальную скорость, чтобы марио мог при разбеге
запрыгивать на более высокие кирпичи (сделано)

07 feb 2008 13:31
замечен баг: при выходе из спящего режима портится палитра
!!!нужно реализовать функции изменения палитры!!! - чтобы
можно было плавно гасить экран 

07 feb 2008 11:51
при старте уровня на фоне игры отображется в рамке сообщение "МИР X-Y"
если номер мира больше чем 9-9 то номер отображается одним числом

07 feb 2008 10:10
сделать очки если стрелой убиваешь злобную голову

07 feb 2008 09:46
добавил вывод рамки для функции Msg()
добавил для клавиш атрибутов сброс клавиатуры, чтобы атрибут
не менялся со слишком большой скоростью - то есть, то нет

06 feb 2008 09:09
добавил 19 перемещение на следующий уровень

04 feb 2008 17:27
потеря памяти в классе звука (если закоментировать waveOutReset в функции play)
при использовании waveOutReset игра тормозит
нужно все таки переходить на DirectSound

04 feb 2008 16:55
подумать: при переходе на другой уровень статус марио сбрасывается
на обычный, если был драконом

04 feb 2008 14:06
!!!ИДЕЯ сделать ОКНО ЛОГА, куда будут выводиться все системные сообщения
на это окно будет переходить по клавише F10!!! в окне можно стрелочками
двигаться вверх-вниз. в логе должно быть время!

сделать проигрывание файла не через sndPlaySound а через низкий уровень

04 feb 2008 14:01
изменил число одновременно летящих снарядов во время стрельбы
ранее было максимум один снаряд, теперь стало четыре

01 feb 2008 17:17
выполнил большую работу по разбиении функции GAME на множество отдельных
блоков. ура! теперь цикл игр состоит из вызова других функциональных блоков.
понять стало что к чему значительно проще, можно заблокировать отдельные
функции, просто закоментировава вызов этой функции.

01 feb 2008 15:03
выполнил
  - меню стало из 7 пунктов, обычным шрифтом, у каждого пункта номер, можно просто
  нажать цифру и меню сработает
  - много изменений в редакторе уровней;
  - выбрать спрайт можно теперь из большого списка, все спрайты видны на экране;
  - в режиме "ИГРА" можно нажать <CTRL+E> попасть в редактор, а по выхожу попасть обратно
  в игру;
  - в редакторе можно редактировать уровень с произвольным номером;
  - много изменений в коде (убрал лишнии начальные пробелы и табуляции)

26 jan 2008 19:41
хотелось бы сделать
  - редактор палитры;
  - редактор спрайтов;

26 jan 2008 11:42
исправлены баги в редакторе уровней
  - при увеличении до максимума номера рисуемого спрайта все зависало;
  - нельзя было создать новый уровень (теперь можно);
  - нельзя было задавать время уровня (теперь можно);
  - при вводе цифр был баг с фоном (исправлено).

26 jan 2008 3:35
идея сделать два режима отображения графики - оконный и полноэкранный
оконный чтобы без конца в мониторе не переключалось реле
боюсь что реле выйдет из строя

26 jan 2008 3:07
идея сделать визуальный эфеект перехода между уровнями
возможные варианты:
  - точками экран постепенно уничтожается
  - как в бетти раздвигается экран
  - сверху вниз медленно закращивается цветом
  - уголком

26 jan 2008 3:08
исходник все-таки нужно привести к нормальному виду

#22
9:56, 30 авг. 2011

Ewgeny_Lapshin
Как по мне, так автор молодец. Понятно, что продукт ориентирован не на современность, но видимо многим не хватает ума этого понять. Посмотрим, что через 10 лет скажут про ваши сегодняшние "творения", да, собственно, у большинства и творений-то нет никаких. Также напомню, что сейчас программировать стало гораздо легче, чем когда-то, например, появилось множество прекрасных инструментов, которые были написаны грамотными людьми, и которые позволяют даже полному кретину добиться каких-то результатов. Так что наезды на автора не совсем понятны.

#23
13:36, 30 авг. 2011

Suslik
> что, вот прямо так и писали?:
я и сейчас так пишу :)

#24
16:44, 30 авг. 2011

а по поводу ООП и кода все-таки код в большей своей части такой во всем проекте
классы, объекты используются, как раз тогда в те годы (1997) я узнал о классах, объектах,
это вдохновило, а еще что вдохновило, ведь тогда был DOS, соответственно программист
мог обращатся к железу непосредственно, минуя различные API, прерывания BIOS и DOS,
мне кажется многие программисты которые не застали те времена и не знают до сих пор
как раньше мы работали например с видео тем же самым.

Видео было тогда либо 320x200 либо 320x240, палитровый режим, 256 цветовых регистров,
один байт на точку, каждый регистр палитры можно было установить в свой цвет. Вобщем-то
сейчас это также справедливо, под DirectX можно установить палитровый режим и т.д.

Но тогда было это все интересно, понимаете, вот мы видели игрушку под DOS, тогда,
и кто программист, смотрел и думал сразу а как вот это реализовано ?

В те годы вобще нужно отметить, PC-компьютеров практически не было. Тогда были
приставки Dendy, все там игры примерно как эта. были ZX-Spectrum

Возникали вопросы - как сделать скроллинг экрана, как вывести спрайт на экран, что-делать
с прозрачностью, и т.д.

И когда ты все это сам пишешь, все функции пишешь сам для работы с видео.
От операционной системы, точнее от биоса например, нужно было вызвать только прерывание 0x10
кажется так:

mov ax,0x13
int 0x10

все, видеокарточка переведена в режим 320x200 256 цветов
по линейному адресу 0xA0000 был доступна видеопамять. байт записываешь - точка загорается.
ну разве это не интересно :) ?

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

//очистка экрана 
//color - цвет заполнения по умолчанию ноль
void SCREEN::clear(int color)
{
  BYTE * d=DoubleBuffer;
  _asm {
    mov edi,d
    cld
    mov eax,color
    mov ecx,320*200/4
    rep stosd
  }
}

потом, вывод текста. и т.д.

и т.д. еще раз повторю это было все тогда очень интересно
и компьютер то кстати был, процессор i486, тактовая частота 120 МГц
была цель добится быстродействия, 60 FPS чтоб было


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

вобщем то что вобщем-то весь код твой, ты знаешь там все,
от ОС нужно было только перевести экран в графику, координаты от мышки,
работа с файловой системой.

ввод с клавиатуры перехватывался в свой обработчик прерываний

а код все таки по большей части такой

//******************************************
//оружие уничтожает чужих
//******************************************
void SUPERMARIO::ArmsKillAlien()
{
 for(int i=0; i<Bullet.Counter; i++)
 {
  //уничтожаем босса
  for(int j=0; j<Boss.Counter; j++)
  {
    MINDOBJ &bl=Bullet[i];
    MINDOBJ &al=Boss[j];
    if ( CheckUnionRects(bl.Rect,al.Rect) )
    {
      al.ShootCounter-=1;

      //если уничтожили босса
      if (al.ShootCounter<=0)
      {
        Boss.Del(&al);

        //даем 32 тыс. очков
        Score+=32000;

        MOVETXT tx;
        tx.Message="БОНУС  32,000  !";
        tx.Color=7;
        tx.x=(320-strlen(tx.Message)*8)/2;
        tx.y=50;
        tx.TimeLive=100;
        Movetxt.DelAll();
        Movetxt+=tx;


        //создаем взрыв
        ANIM exp;
        exp.x=al.x;
        exp.y=al.y;
        exp.FrameFirst=SPRITE_EXPLODESTART;
        exp.FrameLast=SPRITE_EXPLODEEND;
        exp.FrameSpeed=0.3;
        exp.TimeLive=16;
        Different+=exp;

        Sound.play(SND_EXPLODE, SOUND::NOSTOP);

        j--;

        BossLive=FALSE;  //босс погиб
      }

      else
      {
        //башка трясется
        al.go_num=9;
        al.frame_num=7;
        al.Go=al.going[al.go_num];
        al.Frame=al.framing[al.frame_num];
        Sound.play(SND_BELL, SOUND::NOSTOP);
      }

      //прячем пулю
      bl.x=-24;
      bl.y=-24;
      //обязатольно обновляем прямоугольник
      bl.RenewRect();
    }
  }


  //уничтожаем умных чужих
  for(j=0; j<CleverAlien.Counter; j++)
  {
    MINDOBJ &bl=Bullet[i];
    MINDOBJ &al=CleverAlien[j];

    //если попали
    if ( CheckUnionRects(bl.Rect,al.Rect) )
    {
    al.ShootCounter-=ArmsPower;

    //если уничтожили чужого
    if (al.ShootCounter<=0)
    {
      Score+=200;
      //создаем взрыв
      ANIM exp;
      exp.x=al.x;
      exp.y=al.y;

      exp.FrameFirst=SPRITE_ARROWDESTROYEDSTART;
      exp.FrameLast=SPRITE_ARROWDESTROYEDEND;
      exp.FrameSpeed=0.2;
      exp.TimeLive=16;
      Different+=exp;

      CleverAlien.Del(&al);

      //Sound.play(SND_EXPLODE, NOSTOP);
      j--;
    }
    //прячем пулю
    bl.x=-24;
    bl.y=-24;
    //i--;
    //break;
    }
  }


  //уничтожаем зубастые цветки
  for(j=0; j<Toothflower.Counter; j++)
  {
    PERSON &bl=(PERSON&)Bullet[i];
    ANIM &tf=Toothflower[j];
    if ( CheckUnionRects(bl.Rect,tf.Rect) )
    {
      ANIM ob;
      ob.x=tf.x;
      ob.y=tf.y;
      ob.Speedy=-1;
      ob.TimeLive=20+rand()%40;
      CreateScore(200,SCORES,ob);
      Score+=200;
      Toothflower.Del(&tf);
      j--;

      //создаем взрыв
      ANIM exp;
      exp.x=bl.x+bl.Rect.Right-bl.Rect.Left-10;
      exp.y=bl.y+bl.Rect.Bottom-bl.Rect.Top-15;

      exp.FrameFirst=SPRITE_ARROWDESTROYEDSTART;
      exp.FrameLast=SPRITE_ARROWDESTROYEDEND;
      exp.FrameSpeed=0.2;

      exp.TimeLive=16;
      Different+=exp;


      Log.Write("уничтожили цветок");
    }
  }

  //уничтожаем обычных чужих
  for(j=0; j<Alien.Counter; j++)
  {
    MINDOBJ &bl=Bullet[i];
    PERSON &al=Alien[j];

    //если
    if
    (
    //оружие попал в чужого И чужой еще не загашенный
      CheckUnionRects(al.Rect,bl.Rect) && ~al.Status & ALIEN::DEATH)
    {

    //уменьшаем силу чужого
    al.ShootCounter-=ArmsPower;

    //если силы чужого истощились
    if (al.ShootCounter<=0)
    {
      //создаем взрыв
      ANIM exp;
      exp.x=al.x+al.Rect.Right-al.Rect.Left-10;
      exp.y=al.y+al.Rect.Bottom-al.Rect.Top-15;

      exp.FrameFirst=SPRITE_ARROWDESTROYEDSTART;
      exp.FrameLast=SPRITE_ARROWDESTROYEDEND;
      exp.FrameSpeed=0.2;

      exp.TimeLive=16;
      Different+=exp;

      //создаем очки
      ANIM ob;
      ob.x=al.x;
      ob.y=al.y;
      ob.Speedy=-1.4-0.1*(rand()%5);
      ob.TimeLive=30+rand()%30;
      CreateScore(350,SCORES,ob);
      Score+=350;

      Sound.play(SND_XPLODE);//, SOUND::NOSTOP);

      Log.Write(_S+"kill alien ("+itoc(al.FrameFirst)+")");

      Alien.Del(j);
      j--;

    }
    else
    {
      Sound.play(SND_POP);

      //подлетает вверх
      if (!al.Speedy)    al.Speedy=-3;
    }

    //уничтожаем пулю
    Bullet.Del(&bl);

    i--;
    break;
    } //if
  } //for(j=0; j<Alien.Counter; j++)
 
 }// for(int i=0; i<Bullet.Counter; i++)
}

как видно объекты очень даже используются хотя не по всем правилам для строгого ООП

#25
17:10, 30 авг. 2011
//Sprite.h
#ifndef __SPRITE_H
#define __SPRITE_H

//**************************************************************
//***************** описание класса SPRITE *********************
//**************************************************************

// Процедуры вывода спрайтов подразумевают режим экрана 320*200, 256 color

class SCREEN;  //предварительное 'taltentive' объявление класса


//структура описывает заголовок файлов *.SPR
//эта структура находится в самом начале файла, начиная с нулевого смещения
struct FILEHEADER
{
    char Signature[10];  //сигнатура файла (должно быть "SPRITEFORM")
    DWORD Info;      //смещение до структуры SPRITEINFO от начала файла
    DWORD Sprite;    //смещение до спрайта от начала файла
    DWORD FileSize;    //размер файла (для проверки целостности)
};

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

//структура формата образа
struct SPRITEINFO
{
  WORD Len, Hei;  //размеры спрайта
  WORD Attribute;  //атрибуты спрайта
};


// Класс SPRITE предназначен для работы со спрайтами
//он позволяет хранить спрайты в ввиде массива
//у каждого спрайта есть свой уникальный идентификатор ID - произвольное число
//со спрайтами можно работать по его ID или просто по индексу (0,1,2,...)
// Текущая реализация класса SPRITE поддерживает только 256 цветные спрайты
//(один байт на точку).
// При создании спрайта в конструктуру нужно передать указатель на объект 
//SCREEN, в который будет производится вывод спрайтов и максимально число
//спрайтов для создаваемого объекта SPRITE.
// Класс поддерживает прозрачные спрайты - точки с кодом 0 
//могут не отображаться при выводе, если в свойствах спрайта указать атрибут
//SPRITETRANSPARENT
class SPRITE
{
public:

  //============== структура 'IMAGE' - описывает спрайта =================
  struct IMAGE
  {
    IMAGE()
    {
      Len=Hei=0;
      Datacolor=NULL;
      Attribute=0;
      ID=0;
    }
    WORD Len;      //ширина (в пикселях)
    WORD Hei;      //высота (в пикселях)
              //если Datacolor==0,//спрайт считается свободным
    char * Datacolor;  //указатель на данные о цвете точек самого спрайта
    WORD  Attribute;  //свойства спрайта
    int ID;        //идентификатор спрайта
    void Write(int x,int y,unsigned char color); //запись точки в спрайт
    unsigned char Read(int x,int y);       //чтение точки в спрайт
  };

  //максимальное число спрайтов, которое можно создать для одного обьекта
  //класса SPRITE
  int SPRITES_MAX;

  //!!! здесь возникает конфликт из-за константы Windows, она имеет такое же имя!
  //атрибуты спрайта
  enum{
    SPRITETRANSPARENT=0x04 //спрайт имеет прозрачные пиксели (код 0 черный)
  };

private:
static  int  CountObject;  //число SPRITE объектов 

  IMAGE  *Sprites;    //адрес массива структур IMAGE
//  char  *DoubleBuffer;  //адрес теневого экрана
public:
  int  Counter;      //счетчик спрайтов
  SCREEN  *scr;      //указатель на объект SCREEN

  //конструктору необходимо  передать адрес SCREEN объекта
  //в который будет происходить вывод изображения
  SPRITE(SCREEN *, int spMax=100);

  //деструктор - уничтожает все созданные спрайты и сам обьект
  //класса SPRITE
  ~SPRITE(void);

  void DeleteAllSprites();  

  //удалить спрайт с индексом n
  int Delete(int n);

  int find(int ID);  //поиск спрайта по его ID

    int find_free();    //возвращает ID для первого пустого спрайта

  //загрузить спрайт с диска как массив цветных точек
  int Load(char * fname, unsigned long offset, IMAGE );

    //загрузить спрайт с диска(файл имеет определенный формат)
  int LoadSpriteform(char * fname, IMAGE & im);

  //изменяет цвет каждой точки у спрайта Index на величину n
  void ModifyColor(int Index, char n);

    //создается новый спрайт. Содержание спрайта не определено
    int Create(IMAGE&);

//  //установка образа спрайта
//  void SetImage(IMAGE Image, int Index);

  //получения образа спрайта по его ID
  IMAGE far & GetImage(int ID);

//  //установить атрибуты спрайта с индексом Index
//  void SetAttribute(int Attribut, int Index);

  enum {
    SCROLL_UP=0x01,
    SCROLL_DOWN=0x02,
    SCROLL_LEFT=0x03,
    SCROLL_RIGHT=0x04
  };
  
  //сдвиг спрайта Index, в сторону F, на Num точек
  int Scroll(int Index, int F, int Num=1);

  //вывести в SCREEN спрайта по его идентификатору ID
  int Show(int x,int y, int ID,int =0);

  //вывести спрайт по его порядковому номеру Index (0,1,2, ...)
  // x,y - координаты вывода спрайта
  // Index - индекс спрайта
  // Def - атрибуты для функции bitblt
  // Возврат: TRUE - спрайт отображен, FALSE - отобразить спрайт не удалось
    int ShowDirect(int x,int y,int Index,int Def=0);
};

#endif
#26
18:45, 30 авг. 2011

автору респект :)

#27
19:15, 30 авг. 2011

В любом случае автор молодец. Сам понимаете, тогда ещё и компьютеров то тольком ни у кого не было. А интернет  в России был только диал-ап. А он уже вон что ковырял!


Немного оффтопа:
Помню у меня тогда было жалкое подобие компьютера - Дельта С.  Смешно вспомнить: 48 килобайт оперативки, винт напрочь отсутствует, в ПЗУ размером 16 килобайт вшита операционная система на основе языка программирования BASIC. Мышки нет, дисковода нет, CD-ROM нет, DVD нет, Blue-ray нет. Программы грузились с кассетного магнитофона (чаще игрушки:)). И как ни странно нажатие одной кнопки на клавиатуре приводило к выводу на экран целого оператора BASIC, а не одной буквы:) Эх, ностальгия...

#28
19:39, 30 авг. 2011

dxgames

Застал времена эти... был только Spectrum ZX у меня, и первая "игрушка" написанная была как раз на нем, жалкое подобие Галактики, в текстовом виде... жаль потом забросил дело это, сейчас бы наверное достиг бы большего, что имею на сей день в плане программирования. Но воспоминаю греют, эт да. Не так давно натолкнулся в рунете на симулятор спектрума- скачал,пару вечеров на него убил, вспоминая и радуясь :) И как написал автор топика - смотрелись игры, а в уме уже думалось, как такое сотворить бы.

Ewgeny_Lapshin
Игру скачал поиграл, понравилось, молодец. А те кто пользоваться с ПКшника начал не дано понять сей шедевр ;)

#29
21:46, 30 авг. 2011

Ewgeny_Lapshin
Спасибо, очень интересно было почитать как раньше программировались игры. А почему нет желания попробовать новые технологии и сделать что-нибудь новое?

Страницы: 1 2 3 411 Следующая »
ПроектыФорумОцените