and 30 FPS on HTC Evo (it could run faster but they limited max FPS in GL renderer). See file SdlForwardCompat.h to have an idea how to make your SDL 1.2 app HW accelerated with SDL 1.3 - it's a compilation of hacks but whatever.
132 lines
3.8 KiB
C++
132 lines
3.8 KiB
C++
/***************************************************************************
|
|
alienBlaster
|
|
Copyright (C) 2004
|
|
Paul Grathwohl, Arne Hormann, Daniel Kuehn, Soenke Schwardt
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2, or (at your option)
|
|
any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
***************************************************************************/
|
|
#include "item.h"
|
|
#include "items.h"
|
|
#include "surfaceDB.h"
|
|
#include "geometry.h"
|
|
#include "global.h"
|
|
#include "racers.h"
|
|
|
|
Items::Items() {
|
|
timeNextItemAppear =
|
|
ITEM_APPEAR_DELAY +
|
|
(rand() % ITEM_APPEAR_RAND_DELAY);
|
|
}
|
|
|
|
Items::~Items() {
|
|
vector<Item *>::iterator i;
|
|
for (i = items.begin(); i != items.end(); ++i) {
|
|
delete *i;
|
|
}
|
|
}
|
|
|
|
void Items::addItem(Item *item) {
|
|
if (item) {
|
|
items.push_back(item);
|
|
}
|
|
}
|
|
|
|
void Items::expireItems() {
|
|
unsigned int i = 0;
|
|
while ( i < items.size() ) {
|
|
if ( items[i]->isExpired() ) {
|
|
delete items[i];
|
|
items.erase(items.begin() + i);
|
|
} else {
|
|
i++;
|
|
}
|
|
}
|
|
}
|
|
|
|
void Items::update( int dT ) {
|
|
vector<Item *>::iterator i;
|
|
for (i = items.begin(); i != items.end(); ++i) {
|
|
(*i)->update( dT );
|
|
}
|
|
}
|
|
|
|
void Items::draw(SdlCompat_AcceleratedSurface *screen) {
|
|
vector<Item *>::iterator i;
|
|
for (i = items.begin(); i != items.end(); ++i) {
|
|
(*i)->draw(screen);
|
|
}
|
|
}
|
|
|
|
Item *Items::getItem(unsigned int idx) {
|
|
return items[idx];
|
|
}
|
|
|
|
|
|
void Items::generateItemNow( Vector2D pos, Vector2D vel ) {
|
|
if ( pos.getX() < 10 ) pos.setX( 10 );
|
|
if ( pos.getX() > SCREEN_WIDTH-10 ) pos.setX( SCREEN_WIDTH-10 );
|
|
if ( pos.getY() < 100 && vel.getY() < 5 ) vel.setY( 5 );
|
|
|
|
int itemType;
|
|
// 10 tries for a correct item
|
|
for ( int i = 0; i < 10; i++ ) {
|
|
itemType = getRandValue( ITEM_APPEAR_CHANCES, NR_ITEM_TYPES );
|
|
if ( ( racers->isShipTypeActive( LIGHT_FIGHTER ) &&
|
|
racers->isShipTypeActive( HEAVY_FIGHTER ) ) ||
|
|
( racers->isShipTypeActive( LIGHT_FIGHTER ) &&
|
|
( itemType == ITEM_PRIMARY_UPGRADE ||
|
|
itemType == ITEM_DUMBFIRE_DOUBLE ||
|
|
itemType == ITEM_KICK_ASS_ROCKET ||
|
|
itemType == ITEM_HELLFIRE ||
|
|
itemType == ITEM_MACHINE_GUN ||
|
|
itemType == ITEM_HEALTH ||
|
|
itemType == ITEM_HEATSEEKER ||
|
|
itemType == ITEM_NUKE ||
|
|
itemType == ITEM_ENERGY_BEAM ) ) ||
|
|
( racers->isShipTypeActive( HEAVY_FIGHTER ) &&
|
|
( itemType == ITEM_PRIMARY_UPGRADE ||
|
|
itemType == ITEM_DUMBFIRE_DOUBLE ||
|
|
itemType == ITEM_KICK_ASS_ROCKET ||
|
|
itemType == ITEM_HEALTH ||
|
|
itemType == ITEM_HEATSEEKER ||
|
|
itemType == ITEM_NUKE ||
|
|
itemType == ITEM_DEFLECTOR ||
|
|
itemType == ITEM_LASER ) ) ) {
|
|
Item *item = new Item( pos, vel, (ItemTypes)itemType );
|
|
addItem( item );
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void Items::generate( int dT ) {
|
|
timeNextItemAppear -= dT;
|
|
|
|
if ( timeNextItemAppear < 0 ) {
|
|
timeNextItemAppear = ITEM_APPEAR_DELAY + (rand() % ITEM_APPEAR_RAND_DELAY);
|
|
generateItemNow( Vector2D( 150 + (rand() % 340), -20 ),
|
|
Vector2D( (rand() % lroundf(SCROLL_SPEED)) - SCROLL_SPEED / 2,
|
|
SCROLL_SPEED + (rand() % lroundf(SCROLL_SPEED)) ) );
|
|
}
|
|
}
|
|
|
|
void Items::deleteAllItems() {
|
|
vector<Item *>::iterator i;
|
|
for (i = items.begin(); i != items.end(); ++i) {
|
|
(*i)->deleteItem();
|
|
}
|
|
expireItems();
|
|
}
|