Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 635f00f

Browse files
committedMar 29, 2015
Animated ship and ship destruction
1 parent 26f4edf commit 635f00f

File tree

4 files changed

+79
-8
lines changed

4 files changed

+79
-8
lines changed
 

‎src/ledgames/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ breakout.srcs += bricks.cc gpio_pin.cc controls.cc screen.cc sprite.cc ball_spri
1414
black.srcs += black.c
1515
white.srcs += white.c
1616
pong.srcs += pong.cc gpio_pin.cc controls.cc screen.cc sprite.cc ball_sprite.cc
17-
invaders.srcs += invaders.cc gpio_pin.cc controls.cc screen.cc sprite.cc invader_sprite.cc png.cc
17+
invaders.srcs += invaders.cc gpio_pin.cc controls.cc screen.cc sprite.cc invader_sprite.cc ship_sprite.cc png.cc
1818

1919
include ../../Makefile.common
2020

‎src/ledgames/invaders.cc

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "screen.hh"
2323
#include "sprite.hh"
2424
#include "invader_sprite.hh"
25+
#include "ship_sprite.hh"
2526
#include "png.hh"
2627

2728
static controls_t *player_controls[3];
@@ -30,7 +31,7 @@ static int player_lives[2];
3031
static int number_players;
3132
static int current_player;
3233

33-
static sprite_t ship_sprite;
34+
static ship_sprite_t ship_sprite;
3435
static sprite_t ship_missile_sprite;
3536
static std::vector<invader_sprite_t> invader_sprites[2];
3637
static sprite_t invader_missile_sprite;
@@ -60,6 +61,7 @@ static uint32_t frames_till_shot;
6061

6162
static std::default_random_engine generator;
6263
static std::uniform_int_distribution<unsigned int> invader_distribution(0,5);
64+
static std::uniform_int_distribution<unsigned int> shot_distribution(45,75);
6365

6466
static void reset_invaders(int for_player) {
6567
invader_sprites[for_player].clear();
@@ -109,7 +111,10 @@ static bool reset_round(void) {
109111
static void reset_game(int with_number_players) {
110112
ship_sprite.set_active(true);
111113
ship_sprite.set_position(28, 55);
112-
ship_sprite.set_image(168,0,7,7,&sprite_sheet);
114+
ship_sprite.set_image(168,0,7,7,&sprite_sheet, 0);
115+
ship_sprite.set_image(168+7,0,7,7,&sprite_sheet, 1);
116+
ship_sprite.set_image(168+14,0,7,7,&sprite_sheet, 2);
117+
ship_sprite.set_image(168+28,0,7,7,&sprite_sheet, 3);
113118

114119
reset_invaders(0);
115120
reset_invaders(1);
@@ -203,8 +208,8 @@ void render_game(Screen *screen) {
203208
sprite_t invader_sprite = invader_sprites[current_player][invader_column];
204209
invader_missile_sprite.set_position(invader_sprite.get_x_position(), invader_sprite.get_y_position());
205210
invader_missile_sprite.set_image(196,0,7,7,&sprite_sheet);
206-
invader_missile_sprite.set_speed(0.0f, 2.0f);
207-
frames_till_shot=30;
211+
invader_missile_sprite.set_speed(0.0f, 1.0f);
212+
frames_till_shot=shot_distribution(generator);
208213
}
209214

210215
if (game_state == game_state_t::Attract) {
@@ -288,7 +293,7 @@ void render_game(Screen *screen) {
288293

289294
if (ship_sprite.test_collision(invader_missile_sprite)) {
290295
game_state = game_state_t::NewShip;
291-
ship_sprite.set_active(false);
296+
ship_sprite.destroy_sprite();
292297
player_lives[current_player]--;
293298
frames_in_state = 0;
294299
}
@@ -338,7 +343,7 @@ static void init_sdl(void) {
338343
exit(1);
339344
}
340345

341-
startup_bong = Mix_LoadWAV("/root/startup.wav");
346+
startup_bong = Mix_LoadWAV("bin/startup.wav");
342347
if (startup_bong == NULL) {
343348
fprintf(stderr, "Unable to load startup.wav: %s\n", Mix_GetError());
344349
exit(1);
@@ -372,7 +377,7 @@ const char ** argv
372377

373378
ledscape_t * const leds = ledscape_init(config, 0);
374379

375-
sprite_sheet.read_file("/root/Invaders.png");
380+
sprite_sheet.read_file("bin/Invaders.png");
376381

377382
player_controls[0] = new controls_t(1);
378383
player_controls[1] = new controls_t(2);

‎src/ledgames/ship_sprite.cc

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#include "ship_sprite.hh"
2+
3+
ship_sprite_t::ship_sprite_t() :
4+
sprite_t(),
5+
frames_in_anim(0)
6+
{
7+
}
8+
9+
void ship_sprite_t::draw_onto(Screen *screen) {
10+
if (frame_ == 0) {
11+
frames_in_anim++;
12+
if (frames_in_anim > 3) {
13+
frames_in_anim = 0;
14+
frame_ = 1;
15+
}
16+
} else if (frame_ == 1) {
17+
frames_in_anim++;
18+
if (frames_in_anim > 3) {
19+
frames_in_anim = 0;
20+
frame_ = 0;
21+
}
22+
} else if (frame_ == 2) {
23+
frames_in_anim++;
24+
if (frames_in_anim > 3) {
25+
frames_in_anim = 0;
26+
frame_ = 3;
27+
}
28+
} else if (frame_ == 3) {
29+
frames_in_anim++;
30+
if (frames_in_anim > 3) {
31+
frames_in_anim = 0;
32+
explode_anims++;
33+
if (explode_anims > 10) {
34+
set_active(false);
35+
frame_ = 0;
36+
} else {
37+
frame_ = 2;
38+
}
39+
}
40+
}
41+
sprite_t::draw_onto(screen);
42+
}
43+
44+
void ship_sprite_t::destroy_sprite(void) {
45+
frame_ = 2;
46+
frames_in_anim = 0;
47+
explode_anims = 0;
48+
}

‎src/ledgames/ship_sprite.hh

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#pragma once
2+
3+
#include <iostream>
4+
#include <cstdint>
5+
6+
#include "sprite.hh"
7+
8+
class ship_sprite_t : public sprite_t {
9+
public:
10+
ship_sprite_t();
11+
12+
virtual void draw_onto(Screen *screen) override;
13+
virtual void destroy_sprite(void);
14+
15+
private:
16+
uint32_t frames_in_anim;
17+
uint32_t explode_anims;
18+
};

0 commit comments

Comments
 (0)
Please sign in to comment.