Blame |
Last modification |
View Log
| RSS feed
unit app_entity_main;
interface
uses sux_constant, sux_object, app_constant, resource_texture;
type
TSettings=record
typus:SXState;
pos:SXVertex2D;
rot:SXFloat;
texture:SRTexture;
size:SXFloat;
fliphorizontal,flipvertical:SXBool;
blendingmode:SXState;
density:SXFloat;
solid: SXBool;
end;
SAEntity=class(SUXObject)
settings:TSettings;
procedure onRender; virtual;
procedure setSolid(const solid: SXBool);
procedure setupAppearance(texture:SRTexture;size:SXFloat);
procedure setBlending(blendingmode:SXState;density:SXFloat);
procedure setPosition(pos:SXVertex2D);
procedure setRotation(rot:SXFloat);
procedure setFlipHorizontal(flip:SXBool);
procedure setFlipVertical(flip:SXBool);
function getPos:SXVertex2D;
function getRot:SXFloat;
function getTexture:SRTexture;
function getSize:SXFloat;
function isOutOfBoard: SXBool;
function getBoundingCircleSize: SXFloat; virtual;
function intersectWithAnyBoundingCircles: SXBool;
function doBoundingCirclesIntersect(const other: SAEntity): SXBool;
function getVectorFromAngle(angle:SXFloat):SXVertex2D;
procedure onTimer; virtual;
procedure delete;
procedure initialize; virtual;
constructor Create(parent:TObject);
destructor Destroy; override;
end;
implementation
uses main, gl_main, OpenGL;
// --- SAEntity
procedure SAEntity.onRender;
begin
// Default rendering method
glPushMatrix;
gl.material.resetMaterial;
gl.material.setMaterial2D;
gl.material.setMaterialTexture(settings.texture);
gl.material.setMaterialBlending(settings.blendingmode,sx.convert.ColorRGBOf(1,1,1),settings.density);
gl.material.renderMaterial;
glTranslatef(settings.pos.x,settings.pos.y,0);
glRotatef(settings.rot,0,0,1);
glScalef(settings.size,settings.size,1);
if (settings.fliphorizontal) then glScalef(-1,1,1);
if (settings.flipvertical) then glScalef(1,-1,1);
glBegin(GL_QUADS);
glTexCoord2f(0,0); glVertex2f(-1,-1);
glTexCoord2f(1,0); glVertex2f( 1,-1);
glTexCoord2f(1,1); glVertex2f( 1, 1);
glTexCoord2f(0,1); glVertex2f(-1, 1);
glEnd();
glPopMatrix;
end;
procedure SAEntity.setSolid(const solid: SXBool);
begin
settings.solid := solid;
end;
procedure SAEntity.setupAppearance(texture:SRTexture;size:SXFloat);
begin
settings.texture:=texture;
settings.size:=size;
end;
procedure SAEntity.setBlending(blendingmode:SXState;density:SXFloat);
begin
settings.blendingmode:=blendingmode;
settings.density:=density;
end;
procedure SAEntity.setPosition(pos:SXVertex2D);
begin
settings.pos:=pos;
end;
procedure SAEntity.setRotation(rot:SXFloat);
begin
settings.rot:=rot;
end;
procedure SAEntity.setFlipHorizontal(flip:SXBool);
begin
settings.fliphorizontal:=flip;
end;
procedure SAEntity.setFlipVertical(flip:SXBool);
begin
settings.flipvertical:=flip;
end;
function SAEntity.getPos:SXVertex2D;
begin
result:=settings.pos;
end;
function SAEntity.getRot:SXFloat;
begin
result:=settings.rot;
end;
function SAEntity.getTexture:SRTexture;
begin
result:=settings.texture;
end;
function SAEntity.getSize:SXFloat;
begin
result:=settings.size;
end;
function SAEntity.isOutOfBoard: SXBool;
begin
result := (settings.pos.x<-210) or (settings.pos.x>210)
or (settings.pos.y<-185) or (settings.pos.y>185);
end;
function SAEntity.getBoundingCircleSize: SXFloat;
begin
result := settings.size;
end;
function SAEntity.intersectWithAnyBoundingCircles: SXBool;
var e: SXInt;
other: SAEntity;
begin
for e := 0 to app.game.entities.getMax do
begin
other := SAEntity(app.game.entities.getObject(e));
if (self <> other) and (other.settings.solid) then
if (doBoundingCirclesIntersect(other)) then
begin
result := true;
exit;
end;
end;
result := false;
end;
function SAEntity.doBoundingCirclesIntersect(const other: SAEntity): SXBool;
var distance: SXVertex2D;
begin
distance.x := settings.pos.x - other.settings.pos.x;
distance.y := settings.pos.y - other.settings.pos.y;
result := ((sqr(distance.x) + sqr(distance.y)) < sqr(getBoundingCircleSize + other.getBoundingCircleSize));
end;
function SAEntity.getVectorFromAngle(angle:SXFloat):SXVertex2D;
var vector: SXVertex2D;
begin
vector.x := sx.math._sin(angle);
vector.y := sx.math._cos(angle);
result := sx.math.normalizeVector(vector);
end;
procedure SAEntity.onTimer;
begin
end;
procedure SAEntity.delete;
begin
app.game.deleteEntity(self);
end;
procedure SAEntity.initialize;
begin
end;
constructor SAEntity.Create(parent:TObject);
begin
inherited Create(parent,'Entity');
setSolid(false);
setupAppearance(nil,1);
setBlending(SX_GL_BLEND_AVERAGE,1);
setPosition(sx.convert.Vertex2DOf(0,0));
setRotation(0);
setFlipHorizontal(false);
setFlipVertical(false);
end;
destructor SAEntity.Destroy;
begin
inherited;
end;
end.