aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatt Kohls <mattkohls13@gmail.com>2019-03-05 19:04:46 -0500
committerMatt Kohls <mattkohls13@gmail.com>2019-03-05 19:04:46 -0500
commited43e93464b72c7e1b210ec96a21aa1d2733dee0 (patch)
tree70f59ff367c16f25197330c98ce188b230dbc739
downloadbounce-ed43e93464b72c7e1b210ec96a21aa1d2733dee0.tar.gz
bounce-ed43e93464b72c7e1b210ec96a21aa1d2733dee0.tar.bz2
bounce-ed43e93464b72c7e1b210ec96a21aa1d2733dee0.zip
Adding initial code to draw a window
-rw-r--r--bounce.cpp199
1 files changed, 199 insertions, 0 deletions
diff --git a/bounce.cpp b/bounce.cpp
new file mode 100644
index 0000000..33b1a2e
--- /dev/null
+++ b/bounce.cpp
@@ -0,0 +1,199 @@
+/*
+ * Bounce
+ *
+ * A simple Boing like demo
+ *
+ * Matt Kohls
+ * 2019
+ *
+ *
+ */
+
+// Amiga includes
+#include <proto/intuition.h>
+#include <proto/gadtools.h>
+#include <proto/graphics.h>
+#include <proto/layers.h>
+#include <proto/exec.h>
+#include <proto/dos.h>
+#include <intuition/intuition.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+
+// Constants
+const uint16_t SCREEN_WIDTH = 100;
+const uint16_t SCREEN_HEIGHT = 100;
+const uint16_t POSX = 10;
+const uint16_t POSY = 10;
+
+/**
+ * WindowPos
+ * Keeps track of window position
+ */
+struct WindowPos {
+ uint16_t posx;
+ uint16_t posy;
+};
+
+/**
+ * WindowSize
+ * Keeps track of window size
+ */
+struct WindowSize {
+ uint16_t width;
+ uint16_t height;
+};
+
+/**
+ * BallPos
+ * Keeps track of ball position
+ */
+struct BallPos {
+ uint16_t posx;
+ uint16_t posy;
+};
+
+/**
+ * AmigaWindow
+ * Wrapper class for Amgia functions
+ *
+ */
+class AmigaWindow {
+ private:
+ struct BallPos ballpos;
+ int bounceDirX;
+ int bounceDirY;
+
+ struct WindowPos winposition;
+ struct WindowSize winsize;
+ struct Window *window;
+ struct RastPort *rp;
+ struct IntuiMessage *msg;
+ ULONG msgClass;
+ bool bad;
+
+ /**
+ * Initialize the window
+ * @param winposition Position of window
+ * @param winsize Size of window
+ */
+ void init() {
+ bad = false;
+ window = OpenWindowTags(NULL,
+ WA_Left, winposition.posx, WA_Top, winposition.posy,
+ WA_Width, winsize.width, WA_Height, winsize.height,
+ WA_IDCMP, IDCMP_CLOSEWINDOW | IDCMP_REFRESHWINDOW,
+ WA_Flags, WFLG_SIZEGADGET | WFLG_DRAGBAR | WFLG_DEPTHGADGET |
+ WFLG_CLOSEGADGET | WFLG_ACTIVATE | WFLG_SMART_REFRESH,
+ WA_Title, "Bounce", WA_PubScreenName, "Workbench", TAG_DONE);
+ if(window == nullptr) {
+ bad = true;
+ } else {
+ rp = window->RPort;
+ if(rp == nullptr) {
+ bad = true;
+ }
+ }
+ }
+
+ /**
+ * Draws the bouncing ball no screen
+ */
+ void drawBounce() {
+ BallPos oldPos = ballpos;
+ if(ballpos.posx == 0) {
+ bounceDirX = 1;
+ } else if(ballpos.posx == winsize.width) {
+ bounceDirX = -1;
+ }
+ if(ballpos.posy == 0) {
+ bounceDirY = 1;
+ } else if(ballpos.posy == winsize.height) {
+ bounceDirY = -1;
+ }
+
+ ballpos.posx += bounceDirX;
+ ballpos.posy += bounceDirY;
+
+ SetAPen(rp, (ULONG) 1);
+ WritePixel(rp, oldPos.posx, oldPos.posy);
+
+ SetAPen(rp, (ULONG) 16);
+ WritePixel(rp, ballpos.posx, ballpos.posy);
+
+ }
+
+ public:
+ /**
+ * Creates an empty window of a default size and position
+ */
+ AmigaWindow() {
+ winposition = {POSX, POSY};
+ winsize = {SCREEN_WIDTH, SCREEN_HEIGHT};
+ init();
+ }
+
+ /**
+ * Creates a new window of specific size and position
+ * @param pos Position of window
+ * @param size Size of window
+ */
+ AmigaWindow(const WindowPos& pos, const WindowSize& size) {
+ winposition = pos;
+ winsize = size;
+ init();
+ }
+
+ /**
+ * Cleans up window
+ */
+ ~AmigaWindow() {
+ if(window != nullptr) {
+ CloseWindow(window);
+ window = nullptr;
+ }
+ }
+
+ /**
+ * Window loop for program
+ */
+ void runLoop() {
+ ballpos = {15, 15}; // Temp for now
+ bounceDirX = 1; // Temp for now
+ bounceDirY = -1; // Temp for now
+
+
+
+ bool stop = false;
+ while(!bad && !stop) {
+ Wait(1L << window->UserPort->mp_SigBit);
+ msg = GT_GetIMsg(window->UserPort);
+ msgClass = msg->Class;
+ GT_ReplyIMsg(msg);
+ if(msgClass == IDCMP_CLOSEWINDOW) {
+ CloseWindow(window);
+ stop = true;
+ window = nullptr;
+ } else if(msgClass == IDCMP_REFRESHWINDOW) {
+ RefreshWindowFrame(window);
+ }
+
+ //drawBounce();
+ }
+ }
+
+ /**
+ * Tells us if there is an error with the window
+ * @return True if there is an error, False if not
+ */
+ bool isBad() const { return bad; }
+};
+
+int main(int argc, char** argv) {
+ AmigaWindow amigaWindow;
+ if(amigaWindow.isBad()) { return -1; }
+ amigaWindow.runLoop();
+ if(amigaWindow.isBad()) { return -1; }
+ return 0;
+}