Cómo permitir múltiples viñetas en la pantalla a la vez

Usando mi API de universidades, estoy haciendo un juego 2D básico donde Pacman puede disparar fantasmas

Tengo una class de bala, pero en este momento, solo tengo una instancia de la bala

podría alguien ayudar a editar este código / darme pistas para que cada vez que hago clic agregue una nueva viñeta a la pantalla y después de un cierto período de time se elimine

void Bullet::update(int elapsedTime, Input::MouseState* mouseState, Player* pacman) { if (mouseState->LeftButton == Input::ButtonState::PRESSED && !shooting) { setX(mouseState); setY(mouseState); shooting = true; } if (shooting) { float xDistance = mouseX - position->X; float yDistance = mouseY - position->Y; float hypotenuse = sqrt((xDistance * xDistance) + (yDistance * yDistance)); position->X += elapsedTime * ((xDistance) / hypotenuse) / 2; position->Y += elapsedTime * ((yDistance) / hypotenuse) / 2; currentTime += (float)elapsedTime / 1000; if (currentTime >= maxTime) { setPosition(pacman->getPosition()->X + pacman->getRect()->Width / 2, pacman->getPosition()->Y + pacman->getRect()->Height / 2); currentTime = 0; shooting = false; } } else { setPosition(pacman->getPosition()->X + pacman->getRect()->Width / 2, pacman->getPosition()->Y + pacman->getRect()->Height / 2); } } 

y la bala está cargada aquí

 Texture2D* bulletTex = new Texture2D(); bulletTex->Load("Textures/bullet.png", false); Vector2* bulletPos = new Vector2(pacman->getPosition()->X, pacman->getPosition()->Y); Rect* bulletRect = new Rect(0.0f, 0.0f, 5, 5); bullet = new Bullet(bulletPos, bulletRect, bulletTex); 

Gracias por adelantado

Parece que tu class de bala está haciendo demasiado trabajo.

Tiene razón al cargar la textura de viñeta solo una vez, pero necesita una instancia de Viñeta por viñeta en la pantalla. Es bueno que pases el bulletTex en la viñeta para que todas estas viñetas puedan compartir la textura.

Su bala no debería reactjsr a la input del mouse en absoluto. En la vida real, las balas no se disparan a sí mismas. Una vez que se dispara una bala, simplemente irá en una dirección hasta que golpee algo o, en el caso de tu juego, se apague. En cambio, el código de creación de bala debe estar más arriba en la cadena. Sugiero crear un método shoot () en tu reproductor que se vea así (bulletlist sería un estándar :: vector de todas las viñetas en la pantalla).

 void Player::shoot() { Vector2* bulletPos = new Vector2(this->getPosition()->X, this->getPosition()->Y); Rect* bulletRect = new Rect(0.0f, 0.0f, 5, 5); Bullet * bullet = new Bullet(bulletPos, bulletRect, bulletTex); bulletList.push_back(bullet); } 

Luego, en el ciclo principal de tu juego, puedes verificar si el mouse está presionado y llamar a shoot () si es así. También puede agregar lógica a la function de disparar para agregar un retraso que no le permita al usuario disparar hasta que hayan transcurrido x segundos desde el último disparo para que no solo obtenga un flujo constante de balas.

Una vez que se crea una bala, su position ya no depende de la position del jugador. En cambio, tiene un vector de velocidad que viajará hasta que llegue a algo o se agote. Por lo tanto, en Bullet :: Update () no es necesario que verifique la position del jugador para determinar dónde debería estar la bala.

Por último, "matar" tus balas después de x segundos se hace fácilmente en la llamada de actualización (). Cada frame, se llamará a la actualización y se pasará el time transcurrido. En su class Bullet puede agregar un integer timeTillDeath. Cada llamada de actualización puede restar elapsedTime de timeTillDeath. Una vez que TimeTillDeath <= 0 la viñeta se considera muerta y debe eliminarse de la list de viñetas.

Use el vector para contener múltiples instancias de Bullet. También es fácil y más seguro de usar.

Documentación: http://www.cplusplus.com/reference/vector/vector/