-
[оффтоп]@!!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;
|