How do I find the actual types of the elements in a list of classes?

Jack Stouffer via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Thu Aug 13 17:52:05 PDT 2015


On Friday, 14 August 2015 at 00:06:33 UTC, Adam D. Ruppe wrote:
> On Thursday, 13 August 2015 at 23:48:08 UTC, Jack Stouffer 
> wrote:
>> In my code, the list can have 20-30 different types of classes 
>> in it all inheriting from the same interface, and it doesn't 
>> make sense for all of those classes to implement a method that 
>> is very specific to one of the classes.
>
>
> I don't want to get too far into this since I haven't seen your 
> code, but the function that uses this list might itself be a 
> candidate for addition to the interface, or a second interface 
> with that method that all the classes also inherit from 
> (remember you can only inherit from one class in D, but you can 
> implement as many interfaces as you want).

The code in question is a collision resolver in a 2D game that I 
am making. The list is a list of all of the drawable objects that 
the object could be colliding with. After collision is checked on 
each of the possible collisions, the object is placed at the last 
position where it was not colliding. I am using the cast in the 
enemy resolver where each collision is then checked to see if the 
collision was with the player, and if it was, the player is then 
given damage.

---------------------------------
class Blob : Enemy {
     ...

     final override void resolveCollisions() {
         import player : Player;

         //check for collision
         Entity[] possible_collisions = 
this.state_object.getPossibleCollisions(this);
         Entity[] collisions = [];

         foreach (ref entity; possible_collisions) {
             // discount any Rect that is equal to the player's, 
as it's probably
             // the players bounding box
             if (this.boundingBox != entity.boundingBox &&
                 this.boundingBox.intersects(entity.boundingBox)) {
                 collisions ~= entity;
             }
         }

         if (collisions.length > 0) {
             // If we collided with something, then put position 
back to its
             // original spot
             this.position = this.previous_position;

             // If we collided with the player, give the player 
damage
             foreach (collision; collisions) {
                 // Check to see if the object collided was a 
player by testing the
                 // result of the cast, which will return null if 
unsuccessful
                 if (auto player = cast(Player) collision) {
                     player.damagePlayer(5, this.position, 
this.mass);
                 }
             }
         }
     }
}


More information about the Digitalmars-d-learn mailing list