Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "chip8.h"
- #include <SFML\Graphics.hpp>
- void drawDisplay(const Chip8 &emu, sf::RenderWindow &window);
- void updateKeyState(Chip8 &emu, sf::Keyboard::Key key, unsigned char value);
- int main(int argc, char **argv) {
- if(argc < 2)
- {
- std::cerr << "Usage: myChip8.exe \"file\"\n\n" << std::endl;
- return -1;
- }
- // initialize the Chip8 system and load the game into the memory
- Chip8 emu;
- emu.initialize();
- if(!emu.loadGame("tetris.c8")) {
- std::cerr << "Error: Could open the game file " << argv[1] << std::endl;
- return -1;
- }
- // set up render system and register input callbacks
- sf::RenderWindow window(sf::VideoMode(832, 416), "rChip-8", sf::Style::Titlebar | sf::Style::Close);
- //sf::RenderWindow window(sf::VideoMode(1664, 832), "rChip-8", sf::Style::Titlebar | sf::Style::Close);
- //window.setVerticalSyncEnabled(true);
- //window.setFramerateLimit(60);
- sf::Clock clock;
- sf::Time elapsedTime = sf::Time::Zero;
- const sf::Time updateFrequency = sf::seconds(1.0f / 60.0f);
- // start the game loop
- sf::Event event;
- while(window.isOpen()) {
- //if(emu.extendedScreenEnabled())
- // emu.drawFlag = true;
- //if(emu.forceExitEnabled())
- // window.close();
- // variant 1
- while(window.pollEvent(event)) {
- switch(event.type) {
- case sf::Event::Closed:
- window.close();
- break;
- case sf::Event::KeyPressed:
- if(event.key.code == sf::Keyboard::Escape)
- window.close();
- updateKeyState(emu, event.key.code, 1);
- break;
- case sf::Event::KeyReleased:
- updateKeyState(emu, event.key.code, 0);
- break;
- }
- }
- elapsedTime += clock.restart();
- while(elapsedTime >= updateFrequency) {
- emu.emulateCycle();
- emu.updateTimers();
- elapsedTime -= updateFrequency;
- }
- if(emu.drawFlag) {
- window.clear();
- drawDisplay(emu, window);
- window.display();
- emu.drawFlag = false;
- }
- // variant 2
- /*while(window.pollEvent(event)) {
- switch(event.type) {
- case sf::Event::Closed:
- window.close();
- break;
- case sf::Event::KeyPressed:
- if(event.key.code == sf::Keyboard::Escape)
- window.close();
- updateKeyState(emu, event.key.code, 1);
- break;
- case sf::Event::KeyReleased:
- updateKeyState(emu, event.key.code, 0);
- break;
- }
- }
- if(clock.getElapsedTime() > updateFrequency) {
- emu.emulateCycle();
- emu.updateTimers();
- clock.restart();
- }
- if(emu.drawFlag) {
- window.clear();
- drawDisplay(emu, window);
- window.display();
- emu.drawFlag = false;
- }*/
- // variant 3
- /*while(window.pollEvent(event)) {
- switch(event.type) {
- case sf::Event::Closed:
- window.close();
- break;
- case sf::Event::KeyPressed:
- if(event.key.code == sf::Keyboard::Escape)
- window.close();
- updateKeyState(emu, event.key.code, 1);
- break;
- case sf::Event::KeyReleased:
- updateKeyState(emu, event.key.code, 0);
- break;
- }
- }
- elapsedTime += clock.restart();
- while(elapsedTime >= updateFrequency) {
- emu.emulateCycle();
- emu.updateTimers();
- elapsedTime -= updateFrequency;
- }
- if(emu.drawFlag) {
- window.clear();
- drawDisplay(emu, window);
- window.display();
- emu.drawFlag = false;
- }*/
- };
- return 0;
- }
- void drawDisplay(const Chip8 &emu, sf::RenderWindow &window) {
- //define pixel size. since resolution is constant, variables won't be used
- sf::RectangleShape rectangle(sf::Vector2f(13, 13));
- for(int y = 0; y < 32; ++y) {
- for(int x = 0; x < 64; ++x) {
- unsigned char gfx = emu.gfxValueAt(x + (64 * y));
- if(gfx > 0) {
- rectangle.setPosition((float)(x * 13), (float)(y * 13));
- window.draw(rectangle);
- }
- }
- }
- }
- void updateKeyState(Chip8 &emu, sf::Keyboard::Key key, unsigned char value) {
- /*emu.mapKey(0x1, sf::Keyboard::isKeyPressed(sf::Keyboard::Key::Num1));
- emu.mapKey(0x2, sf::Keyboard::isKeyPressed(sf::Keyboard::Key::Num2));
- emu.mapKey(0x3, sf::Keyboard::isKeyPressed(sf::Keyboard::Key::Num3));
- emu.mapKey(0xC, sf::Keyboard::isKeyPressed(sf::Keyboard::Key::Num4));
- emu.mapKey(0x4, sf::Keyboard::isKeyPressed(sf::Keyboard::Key::Q));
- emu.mapKey(0x5, sf::Keyboard::isKeyPressed(sf::Keyboard::Key::W));
- emu.mapKey(0x6, sf::Keyboard::isKeyPressed(sf::Keyboard::Key::E));
- emu.mapKey(0xD, sf::Keyboard::isKeyPressed(sf::Keyboard::Key::R));
- emu.mapKey(0x7, sf::Keyboard::isKeyPressed(sf::Keyboard::Key::A));
- emu.mapKey(0x8, sf::Keyboard::isKeyPressed(sf::Keyboard::Key::S));
- emu.mapKey(0x9, sf::Keyboard::isKeyPressed(sf::Keyboard::Key::D));
- emu.mapKey(0xE, sf::Keyboard::isKeyPressed(sf::Keyboard::Key::F));
- emu.mapKey(0xA, sf::Keyboard::isKeyPressed(sf::Keyboard::Key::Z));
- emu.mapKey(0x0, sf::Keyboard::isKeyPressed(sf::Keyboard::Key::X));
- emu.mapKey(0xB, sf::Keyboard::isKeyPressed(sf::Keyboard::Key::C));
- emu.mapKey(0xF, sf::Keyboard::isKeyPressed(sf::Keyboard::Key::V));*/
- int index = -1;
- switch(key) {
- case sf::Keyboard::Key::Num1: index = 0x1; break;
- case sf::Keyboard::Key::Num2: index = 0x2; break;
- case sf::Keyboard::Key::Num3: index = 0x3; break;
- case sf::Keyboard::Key::Num4: index = 0xC; break;
- case sf::Keyboard::Key::Q: index = 0x4; break;
- case sf::Keyboard::Key::W: index = 0x5; break;
- case sf::Keyboard::Key::E: index = 0x6; break;
- case sf::Keyboard::Key::R: index = 0xD; break;
- case sf::Keyboard::Key::A: index = 0x7; break;
- case sf::Keyboard::Key::S: index = 0x8; break;
- case sf::Keyboard::Key::D: index = 0x9; break;
- case sf::Keyboard::Key::F: index = 0xE; break;
- case sf::Keyboard::Key::Y: index = 0xA; break;
- case sf::Keyboard::Key::X: index = 0x0; break;
- case sf::Keyboard::Key::C: index = 0xB; break;
- case sf::Keyboard::Key::V: index = 0xF; break;
- }
- if(index >= 0)
- emu.mapKey(index, value);
- }
Add Comment
Please, Sign In to add comment