Skip to content

Commit

Permalink
Remove reliance on SFML from emulator classes
Browse files Browse the repository at this point in the history
  • Loading branch information
JustDoom committed Mar 31, 2024
1 parent d9e9e4a commit bda53f9
Show file tree
Hide file tree
Showing 20 changed files with 147 additions and 113 deletions.
9 changes: 7 additions & 2 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
add_executable(8ChocChip)
add_executable(8ChocChip
sfml/SfmlSpeaker.h
sfml/SfmlRenderer.cpp
sfml/SfmlRenderer.h
sfml/SfmlKeyboard.cpp
sfml/SfmlKeyboard.h)

add_subdirectory(ui)
add_subdirectory(sfml)
add_subdirectory(util)
add_subdirectory(emulator)

Expand Down
2 changes: 1 addition & 1 deletion src/emulator/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,5 @@ target_sources(8ChocChip PRIVATE Cpu.cpp
Keyboard.h
Renderer.cpp
Renderer.h
Speaker.cpp
../sfml/SfmlSpeaker.cpp
Speaker.h)
2 changes: 1 addition & 1 deletion src/emulator/Cpu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

#include "Cpu.h"

Cpu::Cpu(Renderer* renderer, Keyboard* keyboard, Speaker* speaker) {
Cpu::Cpu(Renderer* renderer, Keyboard* keyboard, Speaker * speaker) {
this->memory.resize(4096);
this->registers.resize(16);
this->address = 0;
Expand Down
12 changes: 6 additions & 6 deletions src/emulator/Cpu.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,18 @@
#ifndef CPU_H
#define CPU_H

#include <vector>
#include <random>
#include <cstdint>
#include <fstream>
#include <iostream>
#include <random>
#include <vector>
#include "Keyboard.h"
#include "Speaker.h"
#include "Renderer.h"
#include <cstdint>
#include "Speaker.h"

class Cpu {
public:
Cpu(Renderer* renderer, Keyboard* keyboard, Speaker* speaker);
Cpu(Renderer* renderer, Keyboard* keyboard, Speaker * speaker);

void loadSpritesIntoMemory();
void loadProgramIntoMemory(std::ifstream* file);
Expand All @@ -38,7 +38,7 @@ class Cpu {

Renderer* renderer;
Keyboard* keyboard;
Speaker* speaker;
Speaker * speaker;
};

#endif //CPU_H
24 changes: 0 additions & 24 deletions src/emulator/Keyboard.cpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
//
// Created by doom on 19/03/24.
//

#include "Keyboard.h"

#include <utility>
Expand All @@ -10,26 +6,6 @@ void Keyboard::setOnNextKeyPress(std::function<void(unsigned char)> callback) {
this->onNextKeyPress = std::move(callback);
}

void Keyboard::handleEvent(sf::Event event) {
if (event.type == sf::Event::KeyPressed || event.type == sf::Event::KeyReleased) {
int keyCode = event.key.code;
auto keyMapIter = this->KEYMAP.find(keyCode);
if (keyMapIter != this->KEYMAP.end()) {
uint8_t key = keyMapIter->second;
if (event.type == sf::Event::KeyPressed) {
this->keysPressed[key] = true;
if (this->onNextKeyPress) {
this->onNextKeyPress(key);
this->onNextKeyPress = nullptr;
}
} else {
this->keysPressed[key] = false;
}
}
}
}


bool Keyboard::isKeyPressed(int keyCode) {
return keysPressed[keyCode];
}
10 changes: 3 additions & 7 deletions src/emulator/Keyboard.h
Original file line number Diff line number Diff line change
@@ -1,21 +1,16 @@
//
// Created by doom on 19/03/24.
//

#ifndef KEYBOARD_H
#define KEYBOARD_H

#include <unordered_map>
#include <vector>
#include <functional>
#include <SFML/Graphics.hpp>
#include <cstdint>

class Keyboard {
public:
std::unordered_map<uint8_t, bool> keysPressed;
std::function<void(unsigned char)> onNextKeyPress;
std::unordered_map<int, unsigned char> KEYMAP = {
std::unordered_map<uint8_t, unsigned char> KEYMAP = {
{27, 0x1}, // 1
{28, 0x2}, // 2
{29, 0x3}, // 3
Expand All @@ -35,7 +30,8 @@ class Keyboard {
};

void setOnNextKeyPress(std::function<void(unsigned char)> callback);
void handleEvent(sf::Event event);
virtual void handleKeyDown(uint8_t keyCode) = 0;
virtual void handleKeyUp(uint8_t keyCode) = 0;
bool isKeyPressed(int keyCode);
};

Expand Down
22 changes: 3 additions & 19 deletions src/emulator/Renderer.cpp
Original file line number Diff line number Diff line change
@@ -1,20 +1,15 @@
//
// Created by doom on 19/03/24.
//

#include "Renderer.h"

Renderer::Renderer() {
this->scale = 15; // Scale up because 64 x 32 would be tiny on our screens now
this->display.resize(this->columns * this->rows);
}

void Renderer::render(sf::RenderWindow* window) {
void Renderer::render() {
// Render the display
for (uint16_t y = 0; y < this->rows; ++y) {
for (uint16_t x = 0; x < this->columns; ++x) {
if (this->display[y * this->columns + x]) {
drawRectangle(*window, x * this->scale, y * this->scale, this->scale, this->scale);
drawPixel(x, y);
}
}
}
Expand All @@ -41,21 +36,10 @@ void Renderer::clear() {
}
}

void Renderer::drawRectangle(sf::RenderWindow &window, int x, int y, int width, int height) {
sf::RectangleShape rectangle(sf::Vector2f(width, height));
rectangle.setPosition(x, y);
rectangle.setFillColor(sf::Color::White);
window.draw(rectangle);
}

uint16_t Renderer::getColumns() const {
return this->columns;
}

uint16_t Renderer::getRows() const {
return this->rows;
}

uint8_t Renderer::getScale() const {
return this->scale;
}
}
18 changes: 6 additions & 12 deletions src/emulator/Renderer.h
Original file line number Diff line number Diff line change
@@ -1,11 +1,6 @@
//
// Created by doom on 19/03/24.
//

#ifndef RENDERER_H
#define RENDERER_H

#include <SFML/Graphics.hpp>
#include <vector>
#include <cstdint>

Expand All @@ -17,18 +12,17 @@ class Renderer {

void clear();

void render(sf::RenderWindow* window);
void render();

uint16_t getColumns() const;
uint16_t getRows() const;
uint8_t getScale() const;

virtual void drawPixel(uint16_t x, uint16_t y) = 0;
private:
std::vector<bool> display;
uint8_t scale;
uint16_t columns = 64;
uint16_t rows = 32;
const uint16_t columns = 64;
const uint16_t rows = 32;

void drawRectangle(sf::RenderWindow& window, int x, int y, int width, int height);
std::vector<bool> display;
};

#endif //RENDERER_H
17 changes: 2 additions & 15 deletions src/emulator/Speaker.h
Original file line number Diff line number Diff line change
@@ -1,23 +1,10 @@
//
// Created by doom on 19/03/24.
//

#ifndef SPEAKER_H
#define SPEAKER_H

#include <SFML/Audio.hpp>

class Speaker {
public:
Speaker();

void play();
void stop();
private:
sf::SoundBuffer soundBuffer;
sf::Sound sound;
virtual void play() = 0;
virtual void stop() = 0;
};



#endif //SPEAKER_H
38 changes: 20 additions & 18 deletions src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@
#include <iostream>

#include "emulator/Cpu.h"
#include "emulator/Keyboard.h"
#include "emulator/Renderer.h"
#include "emulator/Speaker.h"
#include "sfml/SfmlKeyboard.h"
#include "sfml/SfmlRenderer.h"
#include "sfml/SfmlSpeaker.h"
#include "fstream"

#include "ui/TextButton.h"
#include "sfml/ui/TextButton.h"
#include "util/MiscUtil.h"

#include "nfd.h"
Expand All @@ -23,28 +23,26 @@ int launch(const std::string& rom, const std::string& executable) {
}

std::ifstream file(rom, std::ios::binary | std::ios::ate);
if (file.good()) {
std::cout << rom << std::endl;
} else {
if (!file.good()) {
std::cerr << "Can not find file " << rom << std::endl;
return 1;
}

Renderer renderer;
Speaker speaker;
Keyboard keyboard;
sf::RenderWindow window(sf::VideoMode(64 * 15, 32 * 15), "8ChocChip - CHIP-8 Emulator", sf::Style::Titlebar | sf::Style::Close);
sf::Image icon;
icon.loadFromFile("../assets/icon.png");
window.setIcon(64, 64, icon.getPixelsPtr());

SfmlRenderer renderer(&window);

SfmlSpeaker speaker;
SfmlKeyboard keyboard;
Cpu cpu(&renderer, &keyboard, &speaker);

cpu.loadSpritesIntoMemory();

cpu.loadProgramIntoMemory(&file);

sf::RenderWindow window(sf::VideoMode(renderer.getColumns() * renderer.getScale(), renderer.getRows() *
renderer.getScale()), "8ChocChip - CHIP-8 Emulator", sf::Style::Titlebar | sf::Style::Close);
sf::Image icon;
icon.loadFromFile("../assets/icon.png");
window.setIcon(64, 64, icon.getPixelsPtr());

sf::Clock clock;

while (window.isOpen()) {
Expand All @@ -55,7 +53,11 @@ int launch(const std::string& rom, const std::string& executable) {
}

// Handle keyboard inputs
keyboard.handleEvent(event);
if (event.type == sf::Event::KeyPressed) {
keyboard.handleKeyDown(event.key.code);
} else if (event.type == sf::Event::KeyReleased) {
keyboard.handleKeyUp(event.key.code);
}
}

// Run a cycle of the emulator
Expand All @@ -65,7 +67,7 @@ int launch(const std::string& rom, const std::string& executable) {
window.clear(sf::Color::Black);

// Render the window
renderer.render(&window);
renderer.render();
window.display();

// Keep it at 60fps
Expand Down
4 changes: 4 additions & 0 deletions src/sfml/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
target_sources(8ChocChip PRIVATE SfmlSpeaker.cpp
SfmlSpeaker.h)

add_subdirectory(ui)
21 changes: 21 additions & 0 deletions src/sfml/SfmlKeyboard.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
#include "SfmlKeyboard.h"

void SfmlKeyboard::handleKeyDown(uint8_t keyCode) {
auto keyMapIter = this->KEYMAP.find(keyCode);
if (keyMapIter != this->KEYMAP.end()) {
uint8_t key = keyMapIter->second;
this->keysPressed[key] = true;
if (this->onNextKeyPress) {
this->onNextKeyPress(key);
this->onNextKeyPress = nullptr;
}
}
}

void SfmlKeyboard::handleKeyUp(uint8_t keyCode) {
auto keyMapIter = this->KEYMAP.find(keyCode);
if (keyMapIter != this->KEYMAP.end()) {
uint8_t key = keyMapIter->second;
this->keysPressed[key] = false;
}
}
12 changes: 12 additions & 0 deletions src/sfml/SfmlKeyboard.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#ifndef INC_8CHOCCHIP_SFMLKEYBOARD_H
#define INC_8CHOCCHIP_SFMLKEYBOARD_H

#include "../emulator/Keyboard.h"

class SfmlKeyboard : public Keyboard {
public:
void handleKeyDown(uint8_t keyCode) override;
void handleKeyUp(uint8_t keyCode) override;
};

#endif // INC_8CHOCCHIP_SFMLKEYBOARD_H
19 changes: 19 additions & 0 deletions src/sfml/SfmlRenderer.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#include "SfmlRenderer.h"

SfmlRenderer::SfmlRenderer(sf::RenderWindow* window) {
this->window = window;

this->scale = 15; // Scale up because 64 x 32 would be tiny on our screens now
}

void SfmlRenderer::drawPixel(uint16_t x, uint16_t y) {
sf::RectangleShape rectangle(sf::Vector2f(getScale(), getScale()));
rectangle.setPosition(x * getScale(), y * getScale());
rectangle.setFillColor(sf::Color::White);

this->window->draw(rectangle);
}

uint8_t SfmlRenderer::getScale() const {
return this->scale;
}
Loading

0 comments on commit bda53f9

Please sign in to comment.