Subversion Repositories AndroidProjects

Rev

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.