commit stuff
This commit is contained in:
parent
5dd033eeb9
commit
5ce88d42cf
118
game.c
118
game.c
|
@ -1,4 +1,6 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <conio.h>
|
||||||
|
|
||||||
#include "vga.h"
|
#include "vga.h"
|
||||||
#include "keyboard.h"
|
#include "keyboard.h"
|
||||||
|
@ -10,7 +12,7 @@ struct BMPImage spritesheetImage;
|
||||||
struct VGAColor vgaColors[256];
|
struct VGAColor vgaColors[256];
|
||||||
|
|
||||||
struct SpriteRender arenaWallTop, arenaWallSide, arenaFloor;
|
struct SpriteRender arenaWallTop, arenaWallSide, arenaFloor;
|
||||||
struct SpriteRender rabbit;
|
struct SpriteRender rabbit, mouse;
|
||||||
|
|
||||||
void setupWallSprites() {
|
void setupWallSprites() {
|
||||||
buildSpriteFromSpritesheet(
|
buildSpriteFromSpritesheet(
|
||||||
|
@ -38,6 +40,18 @@ void setupRabbitSprites() {
|
||||||
&rabbit,
|
&rabbit,
|
||||||
0, 20, 16, 16
|
0, 20, 16, 16
|
||||||
);
|
);
|
||||||
|
|
||||||
|
rabbit.offsetX = 8;
|
||||||
|
rabbit.offsetY = 15;
|
||||||
|
|
||||||
|
buildSpriteFromSpritesheet(
|
||||||
|
&spritesheetImage,
|
||||||
|
&mouse,
|
||||||
|
16, 20, 8, 8
|
||||||
|
);
|
||||||
|
|
||||||
|
mouse.offsetX = 4;
|
||||||
|
mouse.offsetY = 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
char arenaLayout[10][10] = {
|
char arenaLayout[10][10] = {
|
||||||
|
@ -99,10 +113,25 @@ int rabbitLimits[2][2] = {
|
||||||
|
|
||||||
signed char rabbitVelocity[2] = { 0, 0 };
|
signed char rabbitVelocity[2] = { 0, 0 };
|
||||||
|
|
||||||
void renderRabbit() {
|
struct SpriteBounds bounds;
|
||||||
|
struct MouseStatus mouseStatus;
|
||||||
|
char mousePosition[2] = { 0, 0 };
|
||||||
|
|
||||||
|
void setupRabbitDrawing() {
|
||||||
rabbit.x = rabbitPosition[0];
|
rabbit.x = rabbitPosition[0];
|
||||||
rabbit.y = rabbitPosition[1];
|
rabbit.y = rabbitPosition[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
void setupMouseDrawing() {
|
||||||
|
mouse.x = mousePosition[0];
|
||||||
|
mouse.y = mousePosition[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
void renderMouse() {
|
||||||
|
drawSprite(&mouse);
|
||||||
|
}
|
||||||
|
|
||||||
|
void renderRabbit() {
|
||||||
drawSprite(&rabbit);
|
drawSprite(&rabbit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -155,34 +184,75 @@ void handleRabbitMovement() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void drawOnlyArena() {
|
||||||
|
int leftTileX, rightTileX,
|
||||||
|
topTileY, bottomTileY;
|
||||||
|
|
||||||
|
leftTileX = bounds.left / 20;
|
||||||
|
rightTileX = bounds.right / 20;
|
||||||
|
topTileY = bounds.top / 20;
|
||||||
|
bottomTileY = bounds.bottom / 20;
|
||||||
|
|
||||||
|
renderArenaTile(leftTileX, topTileY);
|
||||||
|
if (leftTileX != rightTileX) {
|
||||||
|
renderArenaTile(rightTileX, topTileY);
|
||||||
|
if (topTileY != bottomTileY) {
|
||||||
|
renderArenaTile(rightTileX, bottomTileY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (topTileY != bottomTileY) {
|
||||||
|
renderArenaTile(leftTileX, bottomTileY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void drawOnlyMouseArena() {
|
||||||
|
getSpriteBounds(&mouse, &bounds);
|
||||||
|
|
||||||
|
drawOnlyArena();
|
||||||
|
}
|
||||||
|
|
||||||
void drawOnlyRabbitArena() {
|
void drawOnlyRabbitArena() {
|
||||||
int rabbitLeftTileX, rabbitRightTileX,
|
getSpriteBounds(&rabbit, &bounds);
|
||||||
rabbitTopTileY, rabbitBottomTileY;
|
|
||||||
|
|
||||||
rabbitLeftTileX = rabbitPosition[0] / 20;
|
drawOnlyArena();
|
||||||
rabbitRightTileX = (rabbitPosition[0] + 16) / 20;
|
}
|
||||||
rabbitTopTileY = rabbitPosition[1] / 20;
|
|
||||||
rabbitBottomTileY = (rabbitPosition[1] + 16) / 20;
|
|
||||||
|
|
||||||
renderArenaTile(rabbitLeftTileX, rabbitTopTileY);
|
#define RAD2DEG (180/3.14159)
|
||||||
if (rabbitLeftTileX != rabbitRightTileX) {
|
#define DEG2RAD (3.14159/180)
|
||||||
renderArenaTile(rabbitRightTileX, rabbitTopTileY);
|
#define MOUSE_DISTANCE (32)
|
||||||
if (rabbitTopTileY != rabbitBottomTileY) {
|
|
||||||
renderArenaTile(rabbitRightTileX, rabbitBottomTileY);
|
void calculateMouseAngle() {
|
||||||
}
|
float distanceX, distanceY;
|
||||||
}
|
float angle;
|
||||||
if (rabbitTopTileY != rabbitBottomTileY) {
|
|
||||||
renderArenaTile(rabbitLeftTileX, rabbitBottomTileY);
|
char buffer[20];
|
||||||
}
|
|
||||||
|
distanceX = mouseStatus.xPosition - rabbitPosition[0];
|
||||||
|
distanceY = mouseStatus.yPosition - rabbitPosition[1];
|
||||||
|
|
||||||
|
angle = atan2(distanceY, distanceX) * 180 / 3.14159;
|
||||||
|
|
||||||
|
sprintf(buffer, "%f", angle);
|
||||||
|
writeString(buffer, 0, 2);
|
||||||
|
|
||||||
|
sprintf(buffer, "%f", distanceX);
|
||||||
|
writeString(buffer, 0, 3);
|
||||||
|
|
||||||
|
sprintf(buffer, "%d", mouseStatus.xPosition);
|
||||||
|
writeString(buffer, 0, 4);
|
||||||
|
|
||||||
|
distanceX = cos(angle * DEG2RAD) * MOUSE_DISTANCE;
|
||||||
|
distanceY = sin(angle * DEG2RAD) * MOUSE_DISTANCE;
|
||||||
|
|
||||||
|
mousePosition[0] = rabbitPosition[0] + distanceX;
|
||||||
|
mousePosition[1] = rabbitPosition[1] + distanceY;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(void) {
|
int main(void) {
|
||||||
FILE *fh;
|
FILE *fh;
|
||||||
int keepRunning = 1;
|
int keepRunning = 1;
|
||||||
struct MouseStatus mouseStatus;
|
|
||||||
|
|
||||||
installKeyboardHandler();
|
installKeyboardHandler();
|
||||||
activateMouse(&mouseStatus);
|
|
||||||
initializeDrawBuffer();
|
initializeDrawBuffer();
|
||||||
|
|
||||||
fh = fopen("sprtsht.bmp", "rb");
|
fh = fopen("sprtsht.bmp", "rb");
|
||||||
|
@ -198,18 +268,26 @@ int main(void) {
|
||||||
bmp256ColorPaletteToVGAColorPalette(&spritesheetImage, vgaColors);
|
bmp256ColorPaletteToVGAColorPalette(&spritesheetImage, vgaColors);
|
||||||
setVGAColors(vgaColors, 256);
|
setVGAColors(vgaColors, 256);
|
||||||
|
|
||||||
|
activateMouse(&mouseStatus);
|
||||||
|
|
||||||
buildArena();
|
buildArena();
|
||||||
|
|
||||||
while (keepRunning) {
|
while (keepRunning) {
|
||||||
readMouse(&mouseStatus);
|
readMouse(&mouseStatus);
|
||||||
populateKeyboardKeydownState();
|
populateKeyboardKeydownState();
|
||||||
handleRabbitMovement();
|
handleRabbitMovement();
|
||||||
|
calculateMouseAngle();
|
||||||
|
|
||||||
waitStartVbl();
|
waitStartVbl();
|
||||||
|
|
||||||
|
setupRabbitDrawing();
|
||||||
|
setupMouseDrawing();
|
||||||
drawOnlyRabbitArena();
|
drawOnlyRabbitArena();
|
||||||
|
drawOnlyMouseArena();
|
||||||
renderRabbit();
|
renderRabbit();
|
||||||
|
renderMouse();
|
||||||
copyDrawBufferToDisplay();
|
copyDrawBufferToDisplay();
|
||||||
|
calculateMouseAngle();
|
||||||
|
|
||||||
waitEndVbl();
|
waitEndVbl();
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,9 @@
|
||||||
|
|
||||||
struct MouseStatus *_status;
|
struct MouseStatus *_status;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ensure this is called after setting the desired video mode.
|
||||||
|
*/
|
||||||
int activateMouse(struct MouseStatus *status) {
|
int activateMouse(struct MouseStatus *status) {
|
||||||
union REGS regs;
|
union REGS regs;
|
||||||
int mouseActivated;
|
int mouseActivated;
|
||||||
|
|
29
pc_stuff.c
29
pc_stuff.c
|
@ -21,3 +21,32 @@ void waitStartVbl() {
|
||||||
void waitEndVbl() {
|
void waitEndVbl() {
|
||||||
while (!(inp(INPUT_STATUS) & VBLANK));
|
while (!(inp(INPUT_STATUS) & VBLANK));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define FAILSAFE (80)
|
||||||
|
|
||||||
|
void writeString(char *buffer, int x, int y) {
|
||||||
|
union REGS regs;
|
||||||
|
|
||||||
|
int i, currentX = x;
|
||||||
|
char c;
|
||||||
|
|
||||||
|
for (i = 0; i < FAILSAFE; ++i) {
|
||||||
|
c = buffer[i];
|
||||||
|
if (c == 0) break;
|
||||||
|
|
||||||
|
regs.h.ah = 0x02;
|
||||||
|
regs.h.bh = 0x00;
|
||||||
|
regs.h.dh = y;
|
||||||
|
regs.h.dl = currentX;
|
||||||
|
int386(BIOS_VIDEO_INTERRUPT, ®s, ®s);
|
||||||
|
|
||||||
|
regs.h.ah = 0x09;
|
||||||
|
regs.h.al = c;
|
||||||
|
regs.h.bh = 0x00;
|
||||||
|
regs.h.bl = 1;
|
||||||
|
regs.w.cx = 1;
|
||||||
|
int386(BIOS_VIDEO_INTERRUPT, ®s, ®s);
|
||||||
|
|
||||||
|
currentX++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -23,3 +23,4 @@ extern byte *VGA;
|
||||||
void setVideoMode(byte);
|
void setVideoMode(byte);
|
||||||
void waitStartVbl();
|
void waitStartVbl();
|
||||||
void waitEndVbl();
|
void waitEndVbl();
|
||||||
|
void writeString(char *, int x, int y);
|
||||||
|
|
1
setup.sh
1
setup.sh
|
@ -1,3 +1,4 @@
|
||||||
export WATCOM=~/Applications/open-watcom-v2/rel
|
export WATCOM=~/Applications/open-watcom-v2/rel
|
||||||
export INCLUDE=$WATCOM/h
|
export INCLUDE=$WATCOM/h
|
||||||
|
export LIB=$WATCOM/lib286/dos:$WATCOM/lib286
|
||||||
export PATH=$WATCOM/binl64:$WATCOM/binl:$PATH
|
export PATH=$WATCOM/binl64:$WATCOM/binl:$PATH
|
||||||
|
|
BIN
spritesheet.xcf
BIN
spritesheet.xcf
Binary file not shown.
BIN
sprtsht.bmp
BIN
sprtsht.bmp
Binary file not shown.
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 39 KiB |
16
vga.c
16
vga.c
|
@ -55,7 +55,13 @@ void drawSprite(struct SpriteRender* sprite) {
|
||||||
byte pixel;
|
byte pixel;
|
||||||
|
|
||||||
byte* spriteData = sprite->data;
|
byte* spriteData = sprite->data;
|
||||||
byte* drawBufferPos = drawBuffer + sprite->x + (sprite->y * VGA_DISPLAY_WIDTH);
|
byte* drawBufferPos =
|
||||||
|
drawBuffer +
|
||||||
|
sprite->x -
|
||||||
|
sprite->offsetX +
|
||||||
|
(
|
||||||
|
(sprite->y - sprite->offsetY) * VGA_DISPLAY_WIDTH
|
||||||
|
);
|
||||||
|
|
||||||
for (y = 0; y < sprite->height; ++y) {
|
for (y = 0; y < sprite->height; ++y) {
|
||||||
for (x = 0; x < sprite->width; ++x) {
|
for (x = 0; x < sprite->width; ++x) {
|
||||||
|
@ -72,6 +78,14 @@ void drawSprite(struct SpriteRender* sprite) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void getSpriteBounds(struct SpriteRender *sprite, struct SpriteBounds *bounds) {
|
||||||
|
bounds->top = sprite->y - sprite->offsetY;
|
||||||
|
bounds->bottom = bounds->top + sprite->height;
|
||||||
|
|
||||||
|
bounds->left = sprite->x - sprite->offsetX;
|
||||||
|
bounds->right = bounds->left + sprite->width;
|
||||||
|
}
|
||||||
|
|
||||||
void setVGAColors(struct VGAColor colors[], int totalColors) {
|
void setVGAColors(struct VGAColor colors[], int totalColors) {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
|
11
vga.h
11
vga.h
|
@ -23,10 +23,21 @@ struct SpriteRender {
|
||||||
unsigned int height;
|
unsigned int height;
|
||||||
int transparentColor;
|
int transparentColor;
|
||||||
unsigned int modulo;
|
unsigned int modulo;
|
||||||
|
|
||||||
|
int offsetX;
|
||||||
|
int offsetY;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SpriteBounds {
|
||||||
|
int top;
|
||||||
|
int right;
|
||||||
|
int bottom;
|
||||||
|
int left;
|
||||||
};
|
};
|
||||||
|
|
||||||
void drawSprite(struct SpriteRender *sprite);
|
void drawSprite(struct SpriteRender *sprite);
|
||||||
void buildSpriteFromSpritesheet(struct BMPImage*, struct SpriteRender*, int, int, int, int);
|
void buildSpriteFromSpritesheet(struct BMPImage*, struct SpriteRender*, int, int, int, int);
|
||||||
|
void getSpriteBounds(struct SpriteRender *sprite, struct SpriteBounds *bounds);
|
||||||
|
|
||||||
byte *initializeDrawBuffer();
|
byte *initializeDrawBuffer();
|
||||||
byte *getDrawBuffer();
|
byte *getDrawBuffer();
|
||||||
|
|
Loading…
Reference in New Issue