void AttackPaddle::shootBullet() { sf::Vector2f bulletSize = {10,14}; std::pair<int,std::shared_ptr<Bullet>> newElem; try { // Spacebar 를 한번 누르면 insert 가 다수 되기 때문에 // 시간을 계산해서 일정시간 내에 많이 눌렸어도 한번으로 // 계산하도록 해야 한다. if(sf::Keyboard::isKeyPressed(sf::Keyboard::Key::Space)) { sf::Time t = clock.getElapsedTime(); if( t.asMilliseconds() > 100 ) { std::shared_ptr<Bullet> newBullet(new Bullet(bulletSize,Center())); newElem = std::make_pair(++bulletKey,newBullet); bullets.insert(newElem); clock.restart(); } } } catch(std::bad_alloc& e) { std::cerr << "bullet mem alloc fail." << std::endl; } }
void EnemyList::updateAllEnemies(double playerX, double playerY, double deltaT) { explosionList.removeExplosions(); enemyBullets.remove(playerX, playerY); this->playerShipX = playerX; this->playerShipY = playerY; if (enemyBullets.getSize() > 0) { enemyBullets.updataAllBullets(deltaT); } for (unsigned int i = 0; i < enemyList.size(); i++) { enemyList[i].updateCompShip(playerX, playerY, deltaT); if (enemyList[i].enemyType == 1 && enemyList[i].readyToSpawn()) { double tAngle = atan2(enemyList[i].dy, enemyList[i].dx); std::cout << tAngle << std::endl; CompShip compShip1(0, (enemyList[i].compX + cos(tAngle)), enemyList[i].compY + sin(tAngle), enemyTextureID); enemyList.push_back(compShip1); } if (enemyList[i].enemyType == 0 && enemyList[i].readyToFire()) { Bullet newBullet(enemyList[i].getCompX(), enemyList[i].getCompY(), playerX, playerY, 0, enemyBulletTextureID); enemyBullets.add(newBullet); Bullet newBullet1(enemyList[i].getCompX(), enemyList[i].getCompY(), playerX, playerY, 1, enemyBulletTextureID); enemyBullets.add(newBullet1); } else if (enemyList[i].enemyType == 1 && enemyList[i].readyToFire()) { Bullet newBullet(enemyList[i].getCompX(), enemyList[i].getCompY(), playerX, playerY, 0, enemyBulletTextureID); enemyBullets.add(newBullet); Bullet newBullet1(enemyList[i].getCompX(), enemyList[i].getCompY(), playerX, playerY, 1, enemyBulletTextureID); enemyBullets.add(newBullet1); } } explosionList.updateAllExplosions(deltaT); }
void addBullet(Ship* ship) { int i = newBullet(); if (i <0) { puts("No bullets left!"); return; } bullets[i].xPos=ship->xPos; bullets[i].yPos=ship->yPos; bullets[i].yVel=ship->yVel-sin(getRadians(ship->angle))*6; bullets[i].xVel=ship->xVel-cos(getRadians(ship->angle))*6; bullets[i].active = true; }
int tickAttackTower(gnode* grid,tower* t){ tower_type *type; if (t->type==BASE) return 0; type=typesTowerGet(t->type); if (type==0){ t->health=-1; return 0; } if (t->target==0){ //find near npc int x=idtox(t->position); int y=idtoy(t->position); int i,j,k; int yid,xid; npc* tmp; for (i=0;i<type->distanse;i++) for(j=0;j<config.area_size[i];j++) if (((xid=x+config.area_array[i][j].x)>=0 && x+config.area_array[i][j].x<config.gridsize) && ((yid=y+config.area_array[i][j].y)>=0 && y+config.area_array[i][j].y<config.gridsize)) for (k=0;k<MAX_GROUPS;k++) if (k!=config.players[t->owner].group) for(tmp=grid[to2d(xid,yid)].npcs[k]; tmp!=0;tmp=tmp->next) if (canSee(grid,&(vec){x+0.5,y+0.5},&tmp->position)>0) if(sqr(x+0.5-(tmp->position.x))+sqr(y+0.5-(tmp->position.y))<=sqr(type->distanse)){ t->target=tmp; setMask(t,TOWER_TARGET); if (rand()%100<60) return 0; } }else{ if (t->target->id==0) return 0; if(rand()%100<8){ t->target=0; return 0; } if (sqr(t->target->position.x-getGridx(t->position))+ sqr(t->target->position.y-getGridy(t->position))> sqr(type->distanse)){ t->target=0; return 0; } // printDebug("\t|%d %d\n",t->attack_count,type->attack_speed); if (t->attack_count>=type->attack_speed){ t->attack_count=0; bullet* b;//set params of bullet if ((b=newBullet())==0){ perror("newBullet tickAttackBullet"); return -1; } vec position={getGridx(t->position),getGridy(t->position)}; // getTargetPos(vec *pos, vec *dir, float v, vec * $pos, float $v){ // vec* target=getTargetPos(&t->target->position, // &t->target->direction, // config.npc_types[t->target->type].move_speed, // &position, // config.bullet_types[type->bullet_type].speed // ); memcpy(&b->position,&position,sizeof(vec)); memcpy(&b->source,&position,sizeof(vec)); //memcpy(&b->destination,target,sizeof(vec)); // printDebug("aaaa = %g|%g {%g|%g}\n",target->x,target->y,t->target->position.x,t->target->position.y); b->ntarget=t->target; b->destination.x=t->target->position.x; b->destination.y=t->target->position.y; b->max_dist=type->distanse; b->type=type->bullet_type; b->damage=type->damage; b->support=type->support; b->group=config.players[t->owner].group; b->owner=t->owner; setMask(b,BULLET_CREATE); // b->target=NPC; getDir(&b->position,&b->destination,&b->direction); // memcpy(&b->effects,&config.npc_types[n->type].effects,sizeof(effects)); } } /**/ return 0; }