From 0a0f2de6a140d0b35d1cd31a0e9659c465d8d65d Mon Sep 17 00:00:00 2001 From: davidovski Date: Sat, 17 Jul 2021 23:46:56 +0100 Subject: [PATCH] Pong --- CMakeLists.txt | 41 ++++++++++++ README.md | 27 ++++++++ assets-fx/example.png | Bin 0 -> 3569 bytes assets-fx/fxconv-metadata.txt | 3 + assets-fx/icon.png | Bin 0 -> 8291 bytes src/main.c | 118 ++++++++++++++++++++++++++++++++++ 6 files changed, 189 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 README.md create mode 100644 assets-fx/example.png create mode 100644 assets-fx/fxconv-metadata.txt create mode 100644 assets-fx/icon.png create mode 100644 src/main.c diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..a4ab8df --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,41 @@ +# Configure with [fxsdk build-fx] or [fxsdk build-cg], which provide the +# toolchain file and module path of the fxSDK + +cmake_minimum_required(VERSION 3.15) +project(pong) + +include(GenerateG1A) +include(GenerateG3A) +include(Fxconv) +find_package(Gint 2.1 REQUIRED) + +set(SOURCES + src/main.c + # ... +) +# Shared assets, fx-9860G-only assets and fx-CG-50-only assets +set(ASSETS + # ... +) +set(ASSETS_fx + assets-fx/example.png + # ... +) +set(ASSETS_cg + assets-cg/example.png + # ... +) + +fxconv_declare_assets(${ASSETS} ${ASSETS_fx} ${ASSETS_cg} WITH_METADATA) + +add_executable(breakout ${SOURCES} ${ASSETS} ${ASSETS_${FXSDK_PLATFORM}}) +target_compile_options(breakout PRIVATE -Wall -Wextra -Os) +target_link_libraries(breakout Gint::Gint) + +if("${FXSDK_PLATFORM_LONG}" STREQUAL fx9860G) + generate_g1a(TARGET breakout OUTPUT "pong.g1a" + NAME "pong" ICON assets-fx/icon.png) +elseif("${FXSDK_PLATFORM_LONG}" STREQUAL fxCG50) + generate_g3a(TARGET breakout OUTPUT "pong.g3a" + NAME "pong" ICONS assets-cg/icon-uns.png assets-cg/icon-sel.png) +endif() diff --git a/README.md b/README.md new file mode 100644 index 0000000..307c784 --- /dev/null +++ b/README.md @@ -0,0 +1,27 @@ +# Pong + +This is my first attempt with [gint](https://gitea.planet-casio.com/Lephenixnoir/gint) creating an add-in for fx series casio calculators. + +## Controls + +Since this is a very simple game, controls are not included within the add-in. The controls are as following: + +### player 1 +4 - move up +1 - move down +5 - serve the ball +### player 2 +รท - move up +- - move down +x - serve the ball + +No score system has been added, yet the game will be played indefinitely. + +## Building + +I would recommend using [fxsdk](https://gitea.planet-casio.com/Lephenixnoir/fxsdk) to build this with the following: + +`fxsdk build-fx` +to build for fx series calculators. This should create the pong.g1a file, which you can then copy to your calculator. + + diff --git a/assets-fx/example.png b/assets-fx/example.png new file mode 100644 index 0000000000000000000000000000000000000000..b26ba9ac37f37f0bbc06db263613c33184d47a12 GIT binary patch literal 3569 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 literal 0 HcmV?d00001 diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..d1e7ede --- /dev/null +++ b/src/main.c @@ -0,0 +1,118 @@ +// Pong add-in by davidovski +// Copyright (C) 2021 davidovski +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#include +#include +#include +#include +#include + + +int s1 = 0; +int s2 = 0; + +float bx = 64; +float by = 32; +int bs = 2; + +float vx = 0; +float vy = 0; + +float s = 1; + +int p1 = 24; +int p2 = 24; +int h = 16; +int w = 2; +int main(void) +{ + int tick = 1; + bool game = true; + while (game) { + dclear(C_WHITE); + + drect(1, p1, 1 + w, p1 + h, C_BLACK); + drect(125, p2, 125 + w, p2 + h, C_BLACK); + + drect(bx-1, by-1, bx+1, by+1, C_BLACK); + + dupdate(); + + + pollevent(); + + if (keydown(KEY_EXIT)) + game = false; + + if (keydown(KEY_1) && p1 + h < 64) + p1 += 1; + if (keydown(KEY_4) && p1 > 0) + p1 -= 1; + if (keydown(KEY_5) && bs == 1) { + bs = 0; + vy = 0; + vx = s; + } + + if (keydown(KEY_SUB) && p2 + h < 64) + p2 += 1; + if (keydown(KEY_DIV) && p2 > 0) + p2 -= 1; + if (keydown(KEY_MUL) && bs == 2) { + bs = 0; + vy = 0; + vx = -s; + } + + if (bs == 1) { //player 1 serve + bx = 5; + by = p1 + (h/2); + } else if (bs == 2) { // player 2 serve + bx = 123; + by = p2 + (h/2); + } else { + + if (by < 1) vy *= -1; + if (by > 63) vy *= -1; + + if (bx < 0) bs = 2; + if (bx > 128) bs = 1; + + + // collided with player 1 + if (by > p1 && by < p1+h+2 && bx <= 5) { + int dy = p1+(h/2) - by; + vx = fabs(vx); + vy += dy * 0.1; + + } + if (by > p2 && by < p2+h+2 && bx >= 123) { + + int dy = p2+(h/2) - by; + vx = -fabs(vx); + vy += dy * -0.1; + } + + bx += vx; + by += vy; + } + + tick++; + sleep_us(20*1000); + } + game = true; + return 0; +}