-
Подскажите как правильно сделать.
Хочу сделать игру по книге. Пока есть идея квест с головоломками. И всё как можно ближе к сюжету.
Я незнаю как делать игру правильно. Разрабатывать движок массового применения а потом писать игру, или больше заточеным под игру(пару нужных модулей) и потом саму игру.
-
Больше затачивать надо в сторону сюжета и геймплея. Потом в сторону графики. Потом звука. Ну а потом движок только для себя, потому что коммунизма не бывает.
ps что за книга?)
--- ... we are walking on a thin line and you better avoid the risk ...
-
Первым делом нужно решить, что ты хочешь больше, написать игру или написать движок. Дело в том, что тут форум больше программистов, и все в первую очередь будут говорить, что своя игра начинается со своего движка. И как правило разработка игры на этом в большинстве случаев и заканчивается.
Если ты не хардкорный программист, то мой тебе совет не связывайся с разработкой своего движка, посмотри уже готовые движки, выбери тот, что тебе по душе. Попробуй сделать на нем простую аркадку или стрелялку чтобы понять как он устроен и как с ним вообще работать. А потом можно уже взяться за что-то более серьезное.
-
А какие движки для делфи есть. На котором можно написать красивый эдвенчур. Я просто не видел подходящих движков. Поэтому думаю писать както свой Может я неправ?
-
Имхо прав - писать надо свой. Только не отделять "движок" от самой игры.
А насчет красивости - хороший художник во много раз важнее чем все высокие технологии (квест вообще имхо должен быть самым нетребовательным к железу). отличные примеры - Broken Sword, Syberia, Silent Hill
--- ... we are walking on a thin line and you better avoid the risk ...
-
> Имхо прав - писать надо свой.
Имхо стоит ли писать свой движок, зависит от существующего профессионализма. Если руки прямые то можно и любой сторонний двиг заточить под свои нужды, а если кривые, то и свой движок не поможет.
Первый проект не стоит начинать с разработки своего движка. Это я как человек, съевший на этом собаку говорю...
-
Немного под итожу: если ты не можешь написать игру на чужом движке, зачем тогда писать свой? :)
-
А очередной раз выскажу свое мнение... Надо писать свой двиг. ИМХо цель любого любительского проекта - научиться делать проекты и заиметь что-то, что можно показать работодателю. Используя чужой двиг, ни первое, ни второе не получится.
-
А можно вообще писать игру используя материалы книги и фотки из фильма переделанные в ФОТОШОПЕ?
Может кто нибудь из вас писал игры по фильму или по книге. Поделитесь опытом.
-
Думаю нет, нельзя. По крайней мере продать не получится - надо спросить разрешение =)
--- ... we are walking on a thin line and you better avoid the risk ...
-
> А очередной раз выскажу свое мнение...
Не соглашусь с этим мнением по некоторым причинам: Если разрабатывать свой двиг с целью поиска работы в конторе занимающейся middleware, то цель вполне оправдана. Но если хочется просто получить какой либо опыт в разработке игр, то писать свой двиг совсем не обязательно. Дело в том что сейчас, как наверное все знают, есть разработчики именно middleware, а есть разработчики игр. Первые разрабатывают для вторых инструменты для создания игр. Есть, конторы, которые имеют отдел по разработке и поддержке собственного движка, но там совершенно разные люди работают над программированием самой игры и движка. Тут важно определить для себя цель разработки и к кому вы себя больше относите.
По моим наблюдениям, у кого получаются хорошие и качественные движки, совершенно не получаются интересные игры. И на оборот, у кого интересные игры, они не занимаются разработкой своего движка. Конечно, существуют исключения из моих наблюдений, но мне хватит нескольких пальцев, чтобы их все пересчитать. :)
Все зависит от преследуемой цели.
> Может кто нибудь из вас писал игры по фильму или по книге.
Чтобы писать коммерческий проект по фильму или книге, нужно лицензию. А тебе её никто не даст и даже не продаст...
-
> По моим наблюдениям, у кого получаются хорошие и качественные > движки, совершенно не получаются интересные игры.
Ну это вы вообще загнули чушь полнейшую!!! Плохо наблюдали!!!!
-
> [10] Домик (24.05.07 17:54)
"А ты не путай кислый с длинным!" (С) Гоблин Есть геймдизайнеры, а есть программисты. Все зависит от того, кем хочет стать автор.
-
Есть игровые программисты, есть игровые дизайнеры - совершенно разные люди занимающиеся совершеннос разными вещами.
-
Итого - пиши игру на своих разработках себе в удовольствие - хороший движок (если и есть для квестов на дэлфи) стоит денег. плохой движок нафиг не нужен - пиши себе в удовольствие - и если не на продажу - бери книгу и фильм =)
> ps что за книга?)
все же?)
ps сам давно соблазняюсь квестами) посмотрим что будет)
--- ... we are walking on a thin line and you better avoid the risk ...
-
> Ну это вы вообще загнули чушь полнейшую!!! Плохо наблюдали!!!!
Я сразу сказал, что есть исключения. Но этих исключений и 10 не будет. И в большинстве своем даже эти успешные исключения пользуются популярностью в очеень узких кругах. Зато в большинстве своем люди, которые разрабатывают очень продаваемые игры, не занимаются разбрасыванием денег на ветер и изобретением своих велосипедов. Если вы приведете мне более 10 успешных игр разработанных 1-2 человеками на своем движке, буду рад признать что я не прав.
> XProger © (24.05.07 22:23) [13] и > @!!ex © (24.05.07 20:20) [12]
Совершенно верно. И главное решить для себя к кому относишься сам и далее уже решать, что тебе ближе: разработка движка или разработка игры. Ведь все знают, для того чтобы разработать более менее нормальный работоспособный движок нужно вложить в него сил, почти столько же сколько в нормальную игру. А если нет опыта...?
ЗЫ: Я лишь маленький противовес в этом форуме, хардкорным программистам, для того чтобы "сырым" новичкам решившим написать игру, было о чем подумать и что-то выбрать, а не тупо следовать советам и сразу начинать работу с разработки своего движка.
-
Добавлю свои 5 копеек. Думаю, сразу начинать писать движок неразумно, ибо в начале просто еще не знаешь, что в этот двиг выносить, что нужно в нем предусматривать... Это придет, само, только после написания, путь не сложных, но нескольких игр...
-
Я сегодня начал писать игру (движок графический а потом игровой) Сделал так Создал консольное приложение игры! И делаю модуль графического движка. Пока всё нормально. Проблема для меня будут текстуры и вообще картинки. Может подскажите где можно найти. Как писать загрузку текстур(изображений). :)
-
-
> [17] MERLIN:) (25.05.07 01:13)
В инете есть примеры от Яна Хорна. Я на них обучался основам 3Д. Там и текстурный модуль есть, я его сейчас использую(правда сильно измененный)
> Если вы приведете мне более 10 успешных игр разработанных > 1-2 человеками на своем движке, буду рад признать что я > не прав.
Я могу привести целый сайт с играми собственной разработки, с успешными проектами... У пендосов.... Меня эти проекты вообще не втыкают, такая лажа... ИМХО.
P.S. А от меня требуют геймплей для одного из таких проектов... Пипец. Хардкорного геймера и программиста, поставили на разработку геймплея для казуальной игры для дебилов...
-
[оффтоп]@!!ex, в такой же ситуации :(
-
Надо написать модуль загрeзки картинок (Спрайтовый движок). Не знаю как правильно делать. Скачал с сайта sulaco.zo.za модуль загрузки текстур. И попытался с помощью него написать модуль который будет рисовать разные картинки (кнопки, курсоры и тд.) Чего то не получилось. Выскочила ошибка : Exception EAccessViolation in module BTT.exe at 0002E409 посмотрите на код, что я делаю не так. .dpr
program game;
uses
Windows,
Messages,
OpenGL,
ENGINE in 'ENGINE.PAS',
UTILITS in 'UTILITS.pas',
DRAW2D in 'DRAW2D.pas',
INPUT in 'INPUT.pas',
LOG in 'LOG.pas',
SPRITE in 'SPRITE.pas';
const
GAME_NAME = 'NAME here';
GAME_WIDTH = 1024;
GAME_HEIGHT = 768;
var
x: GlFloat;
frst: TSprite;
procedure Init;
begin
frst := TSprite.Create;
if not frst.Load( 'smiles.tga',60,60 ) then exit;
end;
procedure Render;
begin
draw2d.RENDERING_BEGIN;
draw2d.BEGIN_2D;
glColor3ub(100,10,100);
glBegin(GL_LINES);
glVertex2f(0+x,0);
glVertex2f(500+x,600);
glEnd;
frst.Draw(10,10,60,60);
draw2d.WRITE(100,100,'ENGINE');
draw2d.WRITE(100,120,PChar('FPS' + IntToStr(engine.FPS)));
draw2d.END_2D;
draw2d.RENDERING_END;
end;
procedure Update;
begin
if Input.Keys[KEY_ESCAPE] then engine.Quit;
x:= x+0.01
end;
begin
InitEngine;
engine.CreateAPP(GAME_NAME,GAME_WIDTH,GAME_HEIGHT,true);
log.AddtoLog('[APPLICATION] Application Started');
log.AddtoLog('[APPLICATION] Application Width = '+inttostr(GAME_WIDTH));
log.AddtoLog('[APPLICATION] Application Height = '+inttostr(GAME_HEIGHT));
engine.SetProc(PROC_RENDER, @RENDER);
engine.SetProc(PROC_UPDATE, @UPDATE);
engine.Loop(1000);
end.
.pas
unit SPRITE;
interface
uses
Windows, OpenGL, Graphics, Classes, JPEG, UTILITS, TEXTURES;
type
TSprite = class
constructor Create;
public
TexID : uint;
TexWidth: Integer;
TexHeight: Integer;
public
function Load(path: string; w,h: integer): Boolean;
procedure Draw(x,y,w,h: integer);
end;
function gluBuild2DMipmaps(Target: GLenum; Components, Width, Height: GLint; Format, atype: GLenum; Data: Pointer): GLint; stdcall; external glu32;
procedure glGenTextures(n: GLsizei; var textures: GLuint); stdcall; external opengl32;
procedure glBindTexture(target: GLenum; texture: GLuint); stdcall; external opengl32;
implementation
constructor TSprite.Create;
begin
end;
function TSprite.Load(path: string; w: Integer; h: Integer): Boolean;
begin
TexWidth := w;
TexHeight:= h;
Result := LoadTexture(path, TexID, false);
end;
procedure TSprite.Draw(x,y: Integer; w,h: integer);
begin
glTranslatef( 0.0, 0.0, 0.0001 );
glBindTexture( GL_TEXTURE_2D, TexID );
glColor3f( 1, 1, 1 );
glEnable( GL_TEXTURE_2D );
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
glEnable( GL_BLEND );
glBegin( GL_QUADS );
glTexCoord2f( 0, 0 );
glVertex2f( X, Y );
glTexCoord2f( 1, 0 );
glVertex2f( X+W, Y );
glTexCoord2f( 1, 1 );
glVertex2f( X+W, Y+H );
glTexCoord2f( 0, 1 );
glVertex2f( X, Y+H );
glEnd();
glDisable( GL_BLEND );
glDisable( GL_TEXTURE_2D );
end;
-
думаю, что квест надо начинать с логической текстовой основы :o) т.е. текстовый гейм-движок. в конце этого этапа появится текстовый квест, динамичный, завершенный как в литературном так и просто в смысловом виде. а потом уже графегу прикручивать, да там и несложно будет...
-
Вот я говорил, что начинающему не стоит заниматься сразу своим движком, а взять какой-то уже готовый за основу. Неет же, все сказали надо писать свой и вот полюбуйтесь :))) Человек даже понять не может где у него ошибка и что он делает не так...
-
> Я могу привести целый сайт с играми собственной разработки, с успешными проектами... У пендосов....
Приведи... Где?
> Меня эти проекты вообще не втыкают, такая лажа... ИМХО.
Значит успешность проекта зависит от личного предпочтения к нему?
-
> [16] Rial © (25.05.07 00:21) > Добавлю свои 5 копеек. > Думаю, сразу начинать писать движок неразумно, ибо > в начале просто еще не знаешь, что в этот двиг выносить, > что нужно в нем предусматривать... Это придет, само, только > после написания, путь не сложных, но нескольких игр...
Сам так-же хотел написать пока ветку читал с начала. +1
-
> grisme © (31.05.07 16:54) [22] Я с тобой соглашусь :)
Текстовая основа (сценарий готов)
Игру Я хочу начать писать с меню и с интерфейса. Для этого мне надо картинки. Графическое меню хочу сделать. :)
Может есть где материал по загрузке изображений, спрайтам и тд.
> Домик (31.05.07 21:50) [23]
В Движке сделал на данный момент такие модули: Модуль Опроса клавиатуры и мыши. Модуль Рендеринга(GL) Модуль Инициализации окна и движка со всеми переменными.
Я просто не понимаю темы изображения, текстуры, спрайты. По этому поводу прошу помощи. :)
-
Может всё таки взять уже готовый 2D графичекий дфижок? Поробуй http://isada.mirgames.ru/ там удобный двиг, хорошие статьи, справка в которой всё подробно расписанно загрузка текстур происходит за 1 действие.... glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); прикаждом выводе не нажо указывать токо при Init.
-
Как сделать спрайт (картинка с прозрачными областями).
Текстуры получилось надевать на полигон и заливать фон и тп. :) Сейчас нужны кнопки, курсоры спрайтовые. Как сделать спрайт ?
-
Хм когда текстуру грузиш ставиш в gluBuild2DMipmaps ставиш формат GL_RGBA + в сам массив точек что-ли делаеш из 4 элементов RGB + A откуда грузить A решай сам. Потом ставиш glEnable( GL_BLEND ); перед отрисовкой и собсно рисуеш =)
-
Я изменял альфу. Получается прозрачный весь объект . А если курсор и надо что был только сам курсор без фона. Как это сделать.
-
Спасибо за помощь всё заработало :)
Весь день писал. Уже готова заставка, экран загрузки.
Я понял так что картинку (например курсор нужно обводить безье в редакторе).
К вечеру у меня возникла проблема. А как поступить с буквами. Что каждую букву надо обводить. подскажите пожалуйста.? :)
-
ХМ какими ещё безье??? Ты не то сделал, первое поищи модуль для TGA он с альфой поэтому в фотопопе например где альфу сделаеш, сохраниш, загрузиш там альфа и будет... Для текста делается всё просто где чёрный цвет там при загрузкеп альфа = 0 где белый 255 и всё...
-
Jkot © (03.06.07 06:42) [32] С курсором вроде всё нормально я его обвел (вырезать или безье). В редакторе и сохранил. Так работет нормаль но,а если не выделю то картинка то с белым фоном получается или искажённая.
А по поводу текста ты новориш что можно просто буквы сохранить на белом или чёрном фоне и всё будет работать? :)
-
Нет нужно приложить капельку мозгов и всё будет оки =) Я же тебе разжовывал выше, короче давай код которым ты текстуры грузиш...
-
Jkot © (03.06.07 06:42) [32] ХМ какими ещё безье??? Ты не то сделал, первое поищи модуль для TGA он с альфой поэтому в фотопопе например где альфу сделаеш, сохраниш, загрузиш там альфа и будет... Для текста делается всё просто где чёрный цвет там при загрузкеп альфа = 0 где белый 255 и всё...
Я не работал с Фотошопом. Как эту альфу рисовать. Я смотрел исходники конкурсных игр. Когда загружал файл font.tga в графический редактор Unlead Photo Impact, то буквы выделены какимита линиями (пунктирными). Как эти линии сделать???
-
Вот код. который рисует текстурный текст
procedure TSprite.text(x,y,w,h: Integer; R,G,B,A: Single; TexID: Cardinal; strText: string);
var I, intAsciiCode : integer;
imgcharWidth : GLfloat;
imgcharPosX : GLfloat;
begin
glPushMatrix;
glColor4f(R,G,B,A);
glTranslatef(x,y,0);
glBindTexture(GL_TEXTURE_2D, texID); glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
glEnable( GL_BLEND );
imgcharWidth := 1.0/66;
strText := UpperCase(strText);
for I := 1 to length(strText) do
begin
if ord(strText[I]) > 31 then begin
intAsciiCode := ord(strText[I]) - 96;
imgcharPosX := length(strText)/2*25-length(strText)*25 + (i-1) * 25; glBegin(GL_QUADS);
glTexCoord2f(imgcharWidth*intAsciiCode, 0.0);
glVertex3f(-10.4+imgcharPosX, -10.4, 0.0);
glTexCoord2f(imgcharWidth*intAsciiCode+imgcharWidth, 0.0);
glVertex3f( 10.4+imgcharPosX, -10.4, 0.0);
glTexCoord2f(imgcharWidth*intAsciiCode+imgcharWidth, 1.0);
glVertex3f( 10.4+imgcharPosX, 10.4, 0.0);
glTexCoord2f(imgcharWidth*intAsciiCode, 1.0);
glVertex3f(-10.4+imgcharPosX, 10.4, 0.0);
glEnd;
end;
end;
glPopmatrix;
end;
-
> MERLIN:) (03.06.07 17:50) [36] > > Вот код. который рисует текстурный текст
В GLScene горазды проще.
-
MERLIN:) (03.06.07 16:51) [35] >Когда загружал файл font.tga в графический редактор Unlead Photo Impact, >то буквы выделены какимита линиями (пунктирными). >Как эти линии сделать???
Эти линии и есть альфа он этими линиями отгораживает где прозрачные участки, где нет.
MERLIN:) (03.06.07 17:50) [36] >Вот код. который рисует текстурный текст Jkot © (03.06.07 16:09) [34] >короче давай код которым ты текстуры грузиш...
Я просил код где ты текстуру грузиш, любую хоть с текстом, хоть без...
Кукареку (04.06.07 03:40) [37] >В GLScene горазды проще
Ктож спорит, но кто-то настоятельно рекомендовал сделать свой двигл, а шас молчит!
-
function CreateTexture(Width, Height, Format : Word; pData : Pointer) : Integer; var Texture : GLuint; begin glGenTextures(1, Texture); glBindTexture(GL_TEXTURE_2D, Texture); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); {Texture blends with object background} // glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); {Texture does NOT blend with object background}
{ Select a filtering type. BiLinear filtering produces very good results with little performance impact GL_NEAREST - Basic texture (grainy looking texture) GL_LINEAR - BiLinear filtering GL_LINEAR_MIPMAP_NEAREST - Basic mipmapped texture GL_LINEAR_MIPMAP_LINEAR - BiLinear Mipmapped texture }
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); { only first two can be used } glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); { all of the above can be used }
if Format = GL_RGBA then gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, pData) else gluBuild2DMipmaps(GL_TEXTURE_2D, 3, Width, Height, GL_RGB, GL_UNSIGNED_BYTE, pData); // glTexImage2D(GL_TEXTURE_2D, 0, 3, Width, Height, 0, GL_RGB, GL_UNSIGNED_BYTE, pData); // Use when not wanting mipmaps to be built by openGL
result :=Texture; end;
function LoadTexture(Filename: String; var Texture : GLuint; LoadFromRes : Boolean) : Boolean; begin if copy(Uppercase(filename), length(filename)-3, 4) = '.BMP' then LoadBMPTexture(Filename, Texture, LoadFromRes); if copy(Uppercase(filename), length(filename)-3, 4) = '.JPG' then LoadJPGTexture(Filename, Texture, LoadFromRes); if copy(Uppercase(filename), length(filename)-3, 4) = '.TGA' then LoadTGATexture(Filename, Texture, LoadFromRes); end;
-
function LoadTGATexture(Filename: String; var Texture: GLuint; LoadFromResource : Boolean): Boolean;
var
TGAHeader : packed record FileType : Byte;
ColorMapType : Byte;
ImageType : Byte;
ColorMapSpec : Array[0..4] of Byte;
OrigX : Array [0..1] of Byte;
OrigY : Array [0..1] of Byte;
Width : Array [0..1] of Byte;
Height : Array [0..1] of Byte;
BPP : Byte;
ImageInfo : Byte;
end;
TGAFile : File;
bytesRead : Integer;
image : Pointer;
CompImage : Pointer;
Width, Height : Integer;
ColorDepth : Integer;
ImageSize : Integer;
BufferIndex : Integer;
currentByte : Integer;
CurrentPixel : Integer;
I : Integer;
Front: ^Byte;
Back: ^Byte;
Temp: Byte;
ResStream : TResourceStream;
procedure CopySwapPixel(const Source, Destination : Pointer);
asm
push ebx
mov bl,[eax+0]
mov bh,[eax+1]
mov [edx+2],bl
mov [edx+1],bh
mov bl,[eax+2]
mov bh,[eax+3]
mov [edx+0],bl
mov [edx+3],bh
pop ebx
end;
begin
result :=FALSE;
GetMem(Image, 0);
if LoadFromResource then begin
try
ResStream := TResourceStream.Create(hInstance, PChar(copy(Filename, 1, Pos('.', Filename)-1)), 'TGA');
ResStream.ReadBuffer(TGAHeader, SizeOf(TGAHeader)); result :=TRUE;
except on
EResNotFound do
begin
MessageBox(0, PChar('File not found in resource - ' + Filename), PChar('TGA Texture'), MB_OK);
Exit;
end
else
begin
MessageBox(0, PChar('Unable to read from resource - ' + Filename), PChar('BMP Unit'), MB_OK);
Exit;
end;
end;
end
else
begin
AssignFile(TGAFile, Filename);
Reset(TGAFile, 1);
BlockRead(TGAFile, TGAHeader, SizeOf(TGAHeader));
result :=TRUE;
end;
-
if Result = TRUE then
begin
Result :=FALSE;
if (TGAHeader.ImageType <> 2) AND
(TGAHeader.ImageType <> 10) then
begin
Result := False;
CloseFile(tgaFile);
MessageBox(0, PChar('Couldn''t load \"'+ Filename +'\". Only 24 and 32bit TGA supported.'), PChar('TGA File Error'), MB_OK);
Exit;
end;
if TGAHeader.ColorMapType <> 0 then
begin
Result := False;
CloseFile(TGAFile);
MessageBox(0, PChar('Couldn''t load "'+ Filename +'". Colormapped TGA files not supported.'), PChar('TGA File Error'), MB_OK);
Exit;
end;
// Get the width, height, and color depth
Width := TGAHeader.Width[0] + TGAHeader.Width[1] * 256;
Height := TGAHeader.Height[0] + TGAHeader.Height[1] * 256;
ColorDepth := TGAHeader.BPP;
ImageSize := Width*Height*(ColorDepth div 8);
if ColorDepth < 24 then
begin
Result := False;
CloseFile(TGAFile);
MessageBox(0, PChar('Couldn''t load "'+ Filename +'". Only 24 and 32 bit TGA files supported.'), PChar('TGA File Error'), MB_OK);
Exit;
end;
GetMem(Image, ImageSize);
if TGAHeader.ImageType = 2 then // Standard 24, 32 bit TGA file
begin
if LoadFromResource then // Load from resource
begin
try
ResStream.ReadBuffer(Image^, ImageSize);
ResStream.Free;
except
MessageBox(0, PChar('Unable to read from resource - ' + Filename), PChar('BMP Unit'), MB_OK);
Exit;
end;
end
else // Read in the image from file
begin
BlockRead(TGAFile, image^, ImageSize, bytesRead);
if bytesRead <> ImageSize then
begin
Result := False;
CloseFile(TGAFile);
MessageBox(0, PChar('Couldn''t read file "'+ Filename +'".'), PChar('TGA File Error'), MB_OK);
Exit;
end
end;
// TGAs are stored BGR and not RGB, so swap the R and B bytes.
// 32 bit TGA files have alpha channel and gets loaded differently
if TGAHeader.BPP = 24 then
begin
for I :=0 to Width * Height - 1 do
begin
Front := Pointer(Integer(Image) + I*3);
Back := Pointer(Integer(Image) + I*3 + 2);
Temp := Front^;
Front^ := Back^;
Back^ := Temp;
end;
Texture :=CreateTexture(Width, Height, GL_RGB, Image);
end
else
begin
for I :=0 to Width * Height - 1 do
begin
Front := Pointer(Integer(Image) + I*4);
Back := Pointer(Integer(Image) + I*4 + 2);
Temp := Front^;
Front^ := Back^;
Back^ := Temp;
end;
Texture :=CreateTexture(Width, Height, GL_RGBA, Image);
end;
end;
// Compressed 24, 32 bit TGA files
if TGAHeader.ImageType = 10 then
begin
ColorDepth :=ColorDepth DIV 8;
CurrentByte :=0;
CurrentPixel :=0;
BufferIndex :=0;
if LoadFromResource then // Load from resource
begin
try
GetMem(CompImage, ResStream.Size-sizeOf(TGAHeader));
ResStream.ReadBuffer(CompImage^, ResStream.Size-sizeOf(TGAHeader)); // load compressed date into memory
ResStream.Free;
except
MessageBox(0, PChar('Unable to read from resource - ' + Filename), PChar('BMP Unit'), MB_OK);
Exit;
end;
end
else
begin
GetMem(CompImage, FileSize(TGAFile)-sizeOf(TGAHeader));
BlockRead(TGAFile, CompImage^, FileSize(TGAFile)-sizeOf(TGAHeader), BytesRead); // load compressed data into memory
if bytesRead <> FileSize(TGAFile)-sizeOf(TGAHeader) then
begin
Result := False;
CloseFile(TGAFile);
MessageBox(0, PChar('Couldn''t read file "'+ Filename +'".'), PChar('TGA File Error'), MB_OK);
Exit;
end
end;
repeat
Front := Pointer(Integer(CompImage) + BufferIndex);
Inc(BufferIndex);
if Front^ < 128 then
begin
For I := 0 to Front^ do
begin
CopySwapPixel(Pointer(Integer(CompImage)+BufferIndex+I*ColorDepth), Pointer(Integer(image)+CurrentByte));
CurrentByte := CurrentByte + ColorDepth;
inc(CurrentPixel);
end;
BufferIndex :=BufferIndex + (Front^+1)*ColorDepth
end
else
begin
For I := 0 to Front^ -128 do
begin
CopySwapPixel(Pointer(Integer(CompImage)+BufferIndex), Pointer(Integer(image)+CurrentByte));
CurrentByte := CurrentByte + ColorDepth;
inc(CurrentPixel);
end;
BufferIndex :=BufferIndex + ColorDepth
end;
until CurrentPixel >= Width*Height;
if ColorDepth = 3 then
Texture :=CreateTexture(Width, Height, GL_RGB, Image)
else
Texture :=CreateTexture(Width, Height, GL_RGBA, Image);
end;
Result :=TRUE;
FreeMem(Image);
end;
end;
-
ХМ TGA уже поддерживает альфу просто тебе нужен нормальный редактор для графики, ИМХО лудше всего с альфой работает GIMP... А тот способ который я предлагал в TGA не всунеш =) Дай лудше ICQ....
-
Jkot © (05.06.07 04:15) [42]
Где его можно скачать
-
Скачал и установил GIMP 2. Как правильно сделать хотя бы простой шрифт для игры?
-
Хм впринципе можно сделать так: Береш генератор для шрифтов, я те в другой теме дал, потом грузиш шрифт, потом на слое жмёш "Добавить маску слоя" выбираеш "копия слоя в оттенках серого" , жмеш там же применить маску слоя, дальше сохраняеш в TGA, всё точно будет альфа... Дальше пробуй выводить там тот генератор ещё создаёт доп файл, если что я скажу как этим файлом пользоватся....
-
Почему этот код работает неправильно
procedure Begin_Intro;
begin
draw2d.RENDERING_BEGIN;
draw2d.BEGIN_2D;
sprite.Fill(0,0,1024,768,1,1,1,1, company);
draw2d.WRITE(100,200,'Stroka1');
draw2d.WRITE(100,300,'Stroka2');
draw2d.WRITE(200,400,PChar('FPS: ' + inttostr(engine.FPS)));
draw2d.WRITE(100,300,'Stroka3');
sprite.mouse(input.X,input.Y,30,30,1,1,1,1, m);
draw2d.END_2D;
draw2d.RENDERING_END;
end;
Такой же код в модуле меню работает правильно. :(((((( Не пойму почему Stroka1, Stroka2 выводится цветом который установлен в процедуре
procedure TDraw2D.WRITE(X, Y: GLUint; text : PChar);
var
TexID: Cardinal;
begin
glColor3ub(0,0,250);
glPopMatrix;
glBindTexture(GL_TEXTURE_2D, texID); glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
glEnable( GL_BLEND );
Y := eH-Y;
glRasterPos2i(X, Y);
glPushAttrib(GL_LIST_BIT);
glListBase(baseFont);
glCallLists(length(text), GL_UNSIGNED_BYTE, text);
glPopAttrib();
glPopMatrix;
end;
А строка PChar('FPS: ' + inttostr(engine.FPS)) выводится чёрным и на фоновой картинке не видно Почему чёрный цвет в этой и следующих строках? И почему весь текст становится чёрного цвета если убрать следующие строки.
glBindTexture(GL_TEXTURE_2D, texID); glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
glEnable( GL_BLEND );
ps. С текстурным шрифтом покачто ничего неполучается наверно неправильный код рисование этих текстурных шрифтов :(((( Что делать ? :(
-
Ломал голову весь день. Потом решил удалить везде в модулях рисования спрайтов и шрифтов команду установки цвета. glColor3ub(250,250,250); И всё заработало . :) Теперь цвет ришил устанавливать в самой программе.
У меня такой вопрос. Как привильно использовать команды glPushMatrix; glPopMatrix; Где и зачем их использовать. Я знаю только то что первія помещяет в матрицу а вторая типа вітаскивет чтото. Объясните пожалуйста. Зарание благодарю :)
-
Дык ты 1 раз устанавливаеш цвет и он действует на все обьекты пока ты не смениш го ещё разок....
glPushMatrix; glPopMatrix;
Push сохраняет матрицу а Pop загружает.... хм например нужно расположить 2 обьекта один в [40;100] а другой в [90;200] можно сделать так:
move[40;100] draw1; move[50;100] draw2;
т.е движение складывается между собой + есть такая особенность что когды ты обьект покрутил то следуешее движение будет происходить уже относительно угла поворота, и все последующие обьекты буду рисоватся с тем же поворотом....
Поэтому шоб немучицца с этим всем делай так:
glPushMatrix; move[40;100] draw1; glPopMatrix;
glPushMatrix; move[90;200] draw2; glPopMatrix;
И ттогды все обьекты будут в координатах относительно [0;0]
-
Jkot © (10.06.07 03:58) [48]
Спасибо за совет
-
Удалено модератором
-
Кстати, в модуле загрузки текстуры выше приведенном я вижу GetMem и ни одного FreeMem. Так и задумано?
Ну и таки для того что бы пользоваца готовыми графическими движками надо знать хоть примерно как они работают. Для этого надо хотя бы попытаца написать свой. Аффтар на верном пути. Аффтар, почитай книгу М. Краснова. Графика OpenGL в проектах дельфи. Стоит она недорого благо. Если совсем с деньгами напряг то в инете лежит. Например можешь порыть, где та была на D3Dengine.narod.ru . И настоятельно рекомендую порыть сорсы Jan Horn. Толково написано.
-
Удалено модератором
-
Удалено модератором
-
Удалено модератором
-
Удалено модератором
-
Удалено модератором
|