Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2006.09.10;
Скачать: [xml.tar.bz2];

Вниз

А не устраивать ли нам небольшие конкурсы по кодингу? (ч.4)   Найти похожие ветки 

 
Antonn ©   (2005-08-14 12:25) [440]

6)Игра должна быть выполнена без использования каких-либо внешних файлов кроме стандартных. То есть игра должна целиком размещаться в одном EXE файле.
Полная свобода использования посторонних библиотек (с учетом пункта #6).
Т.е. библиотеки зашивать в ЕХЕ? И что значит "стандартных"? Это физику на ODE делать будут?

сжатия его UPX"ом.
совершенно не нравится мне этот пункт...


 
Zak3D[@Tm] ©   (2005-08-14 12:56) [441]

Нет. Имеются ввиду библиотеки выполненые в *.pas"ах.
Стандартные это теже Opengl,DirectX... Длл-ки.
//
сжатия его UPX"ом.
совершенно не нравится мне этот пункт...
\\
Почему?
Можно более чем 128 килов использовать =).


 
Sphinx ©   (2005-08-14 14:22) [442]

То есть исспользование собственных движков, даже с открытым кодом запрещено...жаль...

И еще тут играет огромную роль компилятор...
У меня библиотека движка (который только меши грузить пока умеет и рендерить их) под FPC "весит" в два раза больше чем в D7 :(

Я тут посчитал...если буду учавствовать...баллов 6 штрафа точно огребу %)


 
Zak3D[@Tm] ©   (2005-08-14 14:29) [443]

Почему же?
Собственные движки использовать можно и нужно, но если они не закрыты в Длл.


 
Sphinx ©   (2005-08-14 14:39) [444]

2 Zak3D[@Tm] ©
Как раз в dll я его пихаю (упорно сопротивляется надо сказать :))
Но код библиотеки я скрывать не буду...если допишу хотябы половину чего задумал до ума...
>"То есть игра должна целиком размещаться в одном EXE файле."
У меня будет тогда
1) game.exe
2) engine3d.dll
Хотя, до срока сдачи еще ой как долго...может и перенесу из библиотеки в исполняемый всё...


 
NewWonder ©   (2005-08-14 17:43) [445]

Никаких внешних файлов и exe на 128 Кб? Это интересненько. У меня ничего путного (на фоне других) не получится, но попытка - не пытка. Буду пробовать. Так что записывайте меня в участники :)


 
Кефир87 ©   (2005-08-14 19:49) [446]

program race;

uses
 Windows, OpenGL, Messages;

const
 Class_name = "race_wnd";

var
 msg      : TMsg;
 wnd_main : HWND;
 DC       : HDC;
 RC       : HGLRC;
 do_exit  : Boolean = False;

procedure Render;
begin
 glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

 SwapBuffers(DC);
end;

function WindowProc(hwnd, msg, wparam, lparam: longint): longint; stdcall; //îáðàáîò÷èê ñîîáùåíèé
begin
 Result := DefWindowProc(hwnd, msg, wparam, lparam);
   case Msg of

   WM_DESTROY:begin
                do_exit := True;
                PostQuitMessage(0);
              end;  

 end;
end;

function CreateWnd(w,h:Integer):HWND;
var
 wc:TWndClass;
begin
 with wc do
 begin
   style := 0;
   lpfnWndProc := @WindowProc;
   cbClsExtra := 0;
   cbWndExtra := 0;
   hInstance := 0;
   hIcon := 0;
   hCursor := 0;
   hbrBackground := COLOR_BTNFACE + 1;
   lpszMenuName := Class_name;
   lpszClassName := Class_name;
 end;

 RegisterClass(wc);
 Result := CreateWindow(Class_name,
                        "Race",
                        WS_OVERLAPPEDWINDOW or WS_CLIPSIBLINGS or WS_CLIPCHILDREN,
                        (GetSystemMetrics(SM_CXSCREEN)-w) div 2,
                        (GetSystemMetrics(SM_CYSCREEN)-h) div 2,
                        w,
                        h,
                        0,
                        0,
                        0,
                        nil);

 ShowCursor(False);

 if Result<>0 then
 begin
   ShowWindow(Result, SW_NORMAL);
   UpdateWindow(Result);
 end;

end;

procedure DoOpenGL;
var
 pfd : TPixelFormatDescriptor;
 n   : Integer;
begin
 FillChar(pfd, sizeof(pfd), 0);

 with pfd do
 begin
   nSize := sizeof(pfd);
   nVersion := 1;
   dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
   iPixelType := PFD_TYPE_RGBA;
   cColorBits := 24;
   cDepthBits := 16;
   iLayerType := PFD_MAIN_PLANE;
 end;

 n := ChoosePixelFormat(DC, @pfd);

 SetPixelFormat(DC, n, @pfd);
 DescribePixelFormat(DC, n, sizeof(pfd), pfd);

 RC := wglCreateContext(DC);

 wglMakeCurrent(DC, RC);

end;

procedure NoOpenGL;
begin
 wglMakeCurrent(0, 0);
 wglDeleteContext(RC);
end;

begin
 wnd_main := CreateWnd(640, 480);

 DC := GetDC(wnd_main);

 DoOpenGL;

 while msg.message<>WM_QUIT do
 begin
   if(PeekMessage(msg, 0, 0, 0, PM_NOREMOVE)) then
   begin
     if(GetMessage(msg, 0, 0, 0))then
     begin
       TranslateMessage(msg);
       DispatchMessage(msg);
     end;
   end
   else
     Render();
 end;

 NoOpenGL;

end.


Пол дела сделано... почти 16 кб...


 
grouzd[E]v ©   (2005-08-14 20:17) [447]

[446] Кефир87 ©   (14.08.05 19:49)
> Пол дела сделано... почти 16 кб...
Гм... имхо код еще "немного" вырастет =))

---
... we are walking on a thin line and you better avoid the risk ...


 
XProger ©   (2005-08-14 20:33) [448]

NewWonder, а без попыток "что-либо" сделать ты никогда не научишься это "что-либо" делать...

Antonn, "в размер не впишусь, канвас много тянет" а ты шутник... ;)


 
Zak3D[@Tm] ©   (2005-08-14 21:08) [449]

Кефир87
Это только по началу такой скачёк веса, далее он будет расти не так стремительно =).


 
Darthman ©   (2005-08-14 21:37) [450]

Lakmus: ничего общего с ПМ2. Делал похоже на сценарий WC3. Графику рисовал не сам, возможно, отсюда и впечатление такое.


 
Кефир87 ©   (2005-08-15 00:04) [451]

Каждый лишний килобайт - трагедия


 
Antonn ©   (2005-08-15 08:29) [452]

XProger ©   (14.08.05 20:33) [448]
Antonn, "в размер не впишусь, канвас много тянет" а ты шутник... ;)

Просто доставляет удовольствие чертыхаться с канвасом:)
И мне главное не победа, а участие(хотя второе/третье место очень даже не плохо:))))


 
Sapersky   (2005-08-15 11:12) [453]

в размер не впишусь, канвас много тянет

Уж сколько раз твердили миру:

http://prdownloads.sourceforge.net/skinner/FastLib.zip?download

Гораздо функциональнее (фактически "карманный фотошоп") и даёт минимальный размер exe. Там в комплекте VCL-пример, но есть ещё WinAPI-примеры на DelphiGFX:

http://delphigfx.mastak.ru/samples/samp30.rar, samp32, samp33, samp71

Хотя, предупреждаю сразу, документации никакой нет. Глюки - есть. Общая устойчивость к ним - слабая (например, вылетает при загрузке файла, если этого файла нет). Так что чертыхания будет гарантированно больше, чем с TBitmap.


 
Antonn ©   (2005-08-15 12:24) [454]

Sapersky   (15.08.05 11:12) [453]
а оно мне надо? :)
канвас - средство моего самовыражения:))


 
Sphinx ©   (2005-08-15 12:45) [455]

Самые "тяжелые" библиотеки на мой взгляд (размер примерный)
1) SysUtils (включает в себя Classes) = +75 кб
2) Classes = +45 кб
3) DirectInput = + 85 кб

Придется даже без TList обходится :)


 
Antonn ©   (2005-08-15 12:52) [456]

Sphinx ©   (15.08.05 12:45) [455]
Придется даже без TList обходится :)

я вот вместо него TMemoryStream надумал использовать:)


> 3) DirectInput = + 85 кб

вообще нету


 
Кефир87 ©   (2005-08-15 13:06) [457]

А нахрен все это надо? У меня только Windows, Messages, OpenGL а там в основном объявления функций и типов 8) Нафик ВЦЛ!


 
Sphinx ©   (2005-08-15 13:07) [458]

2 Antonn ©
Программирующим на VCL эти данные не помогут :) все эти модули (кроме DInput) уже включены как говорится...
А DI - это для меня важно, я им пользуюсь обычно...придется отказатсья :(


 
Antonn ©   (2005-08-15 13:59) [459]

Sphinx ©   (15.08.05 13:07) [458]
ну и ладно, не очень то и огорчился:)))


 
XProger ©   (2005-08-16 00:09) [460]

Sphinx, "Придется даже без TList обходится" или придётся узнать что такое списки...


 
Sphinx ©   (2005-08-16 01:02) [461]

2 XProger ©
спивок - массив нетипизированых указателей...не думай что ты самый умный ;)
Ты очень хороший программист, и не порти моё мнение о себе ;)
PPointerList = ^TPointerList;
TPointerList = array [0..MaxListSize] of Pointer
TList = class(TObject)
 private
   FList: PPointerList;
...

Дело не в природе TList а в том, как он реализован, можно и самому переписать всё это - что не трудно, но тут уже готовое есть ;)

Кстати я ошибся там...
не в SisUtils включено Classes
а наоборот в Classes - SysUtils


 
Sphinx ©   (2005-08-16 01:32) [462]

блин...
и редактирования тут нету..

читать так:
"Список - массив...." и далее по тексту...


 
XProger ©   (2005-08-16 03:46) [463]

Sphinx, то что ты привёл списком назвать нельзя, т.к. это обычный массив указателей...

type
PListItem = ^TListItem;
TListItem = record
 data : pointer;
 Next : PListItem;
end;
var
items : PListItem;

items - список


 
Sphinx ©   (2005-08-16 10:57) [464]

2 XProger ©
То что я привел - это исходник класса TList от Борланда *посмеиваясь*
Извени...но в данном случае ты знаешь что ты не прав, но не хочешь это признать ;)

C:\Program Files\Borland\Delphi7\Source\Rtl\Common\Classes.pas
{ Maximum TList size }

 MaxListSize = Maxint div 16;

...
{ TList class }

 PPointerList = ^TPointerList;
 TPointerList = array[0..MaxListSize - 1] of Pointer;
 TListSortCompare = function (Item1, Item2: Pointer): Integer;
 TListNotification = (lnAdded, lnExtracted, lnDeleted);

 // these operators are used in Assign and go beyond simply copying
 //   laCopy = dest becomes a copy of the source
 //   laAnd  = intersection of the two lists
 //   laOr   = union of the two lists
 //   laXor  = only those not in both lists
 // the last two operators can actually be thought of as binary operators but
 // their implementation has been optimized over their binary equivalent.
 //   laSrcUnique  = only those unique to source (same as laAnd followed by laXor)
 //   laDestUnique = only those unique to dest   (same as laOr followed by laXor)
 TListAssignOp = (laCopy, laAnd, laOr, laXor, laSrcUnique, laDestUnique);

 TList = class(TObject)
 private
   FList: PPointerList;
   FCount: Integer;
   FCapacity: Integer;
 protected
   function Get(Index: Integer): Pointer;
   procedure Grow; virtual;
   procedure Put(Index: Integer; Item: Pointer);
   procedure Notify(Ptr: Pointer; Action: TListNotification); virtual;
   procedure SetCapacity(NewCapacity: Integer);
   procedure SetCount(NewCount: Integer);
 public
   destructor Destroy; override;
   function Add(Item: Pointer): Integer;
   procedure Clear; virtual;
   procedure Delete(Index: Integer);
   class procedure Error(const Msg: string; Data: Integer); overload; virtual;
   class procedure Error(Msg: PResStringRec; Data: Integer); overload;
   procedure Exchange(Index1, Index2: Integer);
   function Expand: TList;
   function Extract(Item: Pointer): Pointer;
   function First: Pointer;
   function IndexOf(Item: Pointer): Integer;
   procedure Insert(Index: Integer; Item: Pointer);
   function Last: Pointer;
   procedure Move(CurIndex, NewIndex: Integer);
   function Remove(Item: Pointer): Integer;
   procedure Pack;
   procedure Sort(Compare: TListSortCompare);
   procedure Assign(ListA: TList; AOperator: TListAssignOp = laCopy; ListB: TList = nil);
   property Capacity: Integer read FCapacity write SetCapacity;
   property Count: Integer read FCount write SetCount;
   property Items[Index: Integer]: Pointer read Get write Put; default;
   property List: PPointerList read FList;
 end;


 
Sapersky   (2005-08-16 11:11) [465]

Список и то, и другое. В [463] - связный, у Борланда - линейный (не уверен, что правильно их обозвал, но суть в том, что есть несколько разновидностей).


 
Sphinx ©   (2005-08-16 11:37) [466]

2 Sapersky
Я знаю что XProger привел связаный список...но он же сказал "Sphinx, то что ты привёл списком назвать нельзя, т.к. это обычный массив указателей..." ;)


 
dRake ©   (2005-08-16 14:00) [467]

У борланда вообще не список. А хз что :) В этом XProger прав.
Список это в общем случае совокупность элементов, причем у каждого элемента имеется указатель на предыдущий или следующий элемент (односвязный список) или на оба сразу (двусвязный список), односвязный список который задается указателем на первый элемент (стек) или на последний элемент (очередь). Короче господа учите мат часть :)


 
Sphinx ©   (2005-08-16 14:30) [468]

Ну раз пошла такая пьянка :)
И затронули тему матчасти...

Списком называется упорядоченное множество, состоящее из переменного числа элементов, к которым применимы операции включения, исключения.
http://www.rsdn.ru/article/alg/list.xml#EHA


 
A22 ©   (2005-08-16 14:52) [469]

нормальный list в STL. не массив


 
Zer0 ©   (2005-08-16 15:10) [470]

давайте тогда уже начнем обсуждать особенности поведения мух-дроздофил в период разможения. вобщемто если есть желание потрепаться не по теме помойму надо сразу топать в соотвествующий раздел форума =)


 
NewWonder ©   (2005-08-17 09:55) [471]

>> NewWonder, а без попыток "что-либо" сделать ты никогда не
>> научишься это "что-либо" делать...

Полностью согласен. Поэтому уже начал писать гоночки к конкурсу ;) Конкурс и впрямь интересный :)


 
DR0N ©   (2005-08-17 10:25) [472]

2NewWonder так держать! Конкурс и в прямь очень интересный!


 
Zer0 ©   (2005-08-18 22:29) [473]

хорошо хоть лимит в 128к есть, не будет ODE и прочих левых приблуд.


 
NewWonder ©   (2005-08-18 22:41) [474]


> Zer0 ©

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


 
DR0N ©   (2005-08-19 00:11) [475]

Сделал музыку которая генерируется на лету в миди.. всего 3 килобайта в ЕХЕ прирост и никаких FMOD =)... Теперь ищу хорушую нотную книгу что бы содрать оттуда композицию =0)


 
Кефир87 ©   (2005-08-19 14:26) [476]

Я не стал выяснять с чего ркчь пошла о списках... Но разубежите меня если я не прав: при использовании дин. массивов и стрингов добавляется 1кб к экзе. По этому лично я намериваюсь использовать двусвязные циркулярные списки 8)


 
Darthman ©   (2005-08-19 21:32) [477]

//я намериваюсь использовать двусвязные циркулярные списки
Мощно задвинул!


 
NewWonder ©   (2005-08-19 22:48) [478]

А я вот пробую на API сделать окно. Медленно но верно подхожу к написанию самого главного. exe уменьшился до 17 Кб


 
Кефир87 ©   (2005-08-19 23:19) [479]


> NewWonder ©   (19.08.05 22:48) [478]


> А я вот пробую на API сделать окно.

А что сложного?

function CreateWnd(w,h:Integer):HWND;
var
 wc:TWndClass;
begin
 with wc do
 begin
   style := 0;
   lpfnWndProc := @WindowProc;
   cbClsExtra := 0;
   cbWndExtra := 0;
   hInstance := 0;
   hIcon := 0;
   hCursor := 0;
   hbrBackground := COLOR_BTNFACE + 1;
   lpszMenuName := Class_name;
   lpszClassName := Class_name;
 end;

 RegisterClass(wc);
 Result := CreateWindow(Class_name,
                        WND_TITLE,
                        WS_OVERLAPPEDWINDOW or WS_CLIPSIBLINGS or WS_CLIPCHILDREN,
                        (GetSystemMetrics(SM_CXSCREEN)-w) div 2,
                        (GetSystemMetrics(SM_CYSCREEN)-h) div 2,
                        w,
                        h,
                        0,
                        0,
                        0,
                        nil);

 ShowCursor(False);

 if Result<>0 then
 begin
   ShowWindow(Result, SW_NORMAL);
   UpdateWindow(Result);
 end;

end;


function WindowProc(hwnd, msg, wparam, lparam: longint): longint; stdcall; //обработчик сообщений
begin
 Result := DefWindowProc(hwnd, msg, wparam, lparam);
   case Msg of

   WM_DESTROY:begin
                PostQuitMessage(0);
              end;
   WM_KEYDOWN:;
   WM_KEYUP  :;
   WM_TIMER  :;
 end;
end;


Вот. А главный цикл я так делаю 8)

 while msg.message<>WM_QUIT do
 begin
   if(PeekMessage(msg, 0, 0, 0, PM_NOREMOVE)) then
   begin
     if(GetMessage(msg, 0, 0, 0))then
     begin
       TranslateMessage(msg);
       DispatchMessage(msg);
     end;
   end;
 end;


8) Вот какой я крутой кодер 8)


 
XProger ©   (2005-08-20 00:06) [480]


 if(PeekMessage(msg, 0, 0, 0, PM_NOREMOVE)) then
  begin
    if(GetMessage(msg, 0, 0, 0))then
    begin
      TranslateMessage(msg);
      DispatchMessage(msg);
    end;
  end;

СУПЕР! Но всё же почему не:

if PeekMessage(msg, 0, 0, 0, PM_REMOVE) then
begin
TranslateMessage(msg);
DispatchMessage(msg);
end;



Страницы: 1 2 3 4 5 6 7 8 9 
10 11 12 13 14 15 16 вся ветка

Форум: "Игры";
Текущий архив: 2006.09.10;
Скачать: [xml.tar.bz2];

Наверх





Память: 1.59 MB
Время: 0.283 c
2-1155886701
Chort
2006-08-18 11:38
2006.09.10
EhLib


1-1154337186
Demand
2006-07-31 13:13
2006.09.10
Динамическое создание форм


15-1155810652
imbalacedees
2006-08-17 14:30
2006.09.10
PHP


2-1156278470
abba
2006-08-23 00:27
2006.09.10
Модули


2-1156068282
Neket
2006-08-20 14:04
2006.09.10
Буфер обмена





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский