new motor and improvement
4
Makefile
|
@ -16,11 +16,11 @@ $(OBJDIR):
|
|||
|
||||
## Compile sprites
|
||||
$(OBJDIR)/%.bmp.o: $(IMGDIR)/%.bmp
|
||||
fxconv $< -o $@ -n $(basename $(notdir $<))
|
||||
fxconv -image $< -o $@ -n $(basename $(notdir $<))
|
||||
|
||||
## Compile fonts
|
||||
$(OBJDIR)/%.bmp.o: $(FONTDIR)/%.bmp
|
||||
fxconv $< -o $@ -n $(basename $(notdir $<)) --font
|
||||
fxconv -font $< -o $@ -n $(basename $(notdir $<))
|
||||
|
||||
## Make an object file out of an ASM source file
|
||||
$(OBJDIR)/%.s.o: $(SRCDIR)/%.s
|
||||
|
|
|
@ -25,7 +25,7 @@ CC = sh3eb-elf-gcc
|
|||
CFLAGS = -m3 -mb -Os -nostdlib -Wall -Wextra -Wno-main -pedantic -std=c11 -I $(INCDIR) `fxsdk --cflags`
|
||||
## Linker
|
||||
LD = sh3eb-elf-gcc
|
||||
LFLAGS = `fxsdk --cflags` `fxsdk --libs`
|
||||
LFLAGS = `fxsdk --cflags --libs`
|
||||
## Object copier
|
||||
OBJCPY = sh3eb-elf-objcopy
|
||||
## Object dump
|
||||
|
|
Before Width: | Height: | Size: 822 B After Width: | Height: | Size: 822 B |
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
After Width: | Height: | Size: 1.7 KiB |
BIN
img/missiles.bmp
Before Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 6.1 KiB After Width: | Height: | Size: 6.8 KiB |
|
@ -3,12 +3,19 @@
|
|||
|
||||
#define MAX_MISSILES 4
|
||||
|
||||
// direction management
|
||||
typedef struct Direction
|
||||
{
|
||||
char dx;
|
||||
char dy;
|
||||
} Direction;
|
||||
|
||||
// missiles management
|
||||
typedef struct Missile
|
||||
{
|
||||
short x;
|
||||
short y;
|
||||
unsigned char dir;
|
||||
Direction dir;
|
||||
// short distance; // distance between the plane and the missile
|
||||
unsigned char type;
|
||||
} Missile;
|
||||
|
@ -18,16 +25,17 @@ typedef struct Plane
|
|||
{
|
||||
short x;
|
||||
short y;
|
||||
unsigned char dir;
|
||||
|
||||
Direction dir;
|
||||
// (dx, dy)
|
||||
/* plane direction management
|
||||
3 2 1
|
||||
4 plane 0
|
||||
5 6 7
|
||||
(1, 1) (0, 1) (-1, 1)
|
||||
(1, 0) plane (-1, 0)
|
||||
(1,-1) (0,-1) (-1,-1)
|
||||
*/
|
||||
|
||||
unsigned char life;
|
||||
unsigned char reload;
|
||||
unsigned char bullets;
|
||||
|
||||
Missile missiles[MAX_MISSILES];
|
||||
// align
|
||||
|
@ -39,16 +47,9 @@ typedef struct Cloud
|
|||
short y;
|
||||
} Cloud;
|
||||
|
||||
typedef enum Type
|
||||
{
|
||||
dX = 0,
|
||||
dY = 2,
|
||||
} Type;
|
||||
|
||||
int menu(void);
|
||||
void init(void);
|
||||
char get_decal(unsigned char dir, Type type);
|
||||
void *update_frame(void);
|
||||
void *update_frame(Direction *direction);
|
||||
int game(void);
|
||||
|
||||
#endif
|
||||
|
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.8 KiB |
|
@ -1,10 +1,9 @@
|
|||
#include "wings.h"
|
||||
//#include "maths.h"
|
||||
|
||||
#include "display.h" // bopti.h => images // tales.h => fonts
|
||||
#include "keyboard.h"
|
||||
#include "timer.h"
|
||||
#include "gray.h"
|
||||
#include "events.h"
|
||||
|
||||
#include "stdio.h"
|
||||
#include "stdlib.h"
|
||||
|
@ -13,7 +12,7 @@
|
|||
#define MAP_SIZE_Y 256
|
||||
|
||||
#define MAX_PLANES 2
|
||||
#define MAX_CLOUDS 2
|
||||
#define MAX_CLOUDS 15
|
||||
|
||||
Plane planes[MAX_PLANES]; // number of planes in the map (with us)
|
||||
//others planes are controlled by the AI
|
||||
|
@ -24,7 +23,7 @@ Cloud clouds[MAX_CLOUDS]; //number of clouds in this beautifull sky
|
|||
extern image_t plane;
|
||||
extern image_t img_menu;
|
||||
extern image_t cloud;
|
||||
extern image_t missiles;
|
||||
extern image_t missile;
|
||||
|
||||
int main()
|
||||
{
|
||||
|
@ -40,14 +39,13 @@ void init()
|
|||
{
|
||||
planes[i].x = 56 + 16 * i;
|
||||
planes[i].y = 24 + i;
|
||||
planes[i].dir = i;
|
||||
planes[i].life = 100;
|
||||
planes[i].reload = 6;
|
||||
planes[i].bullets = 6;
|
||||
planes[i].dir.dx = i;
|
||||
planes[i].dir.dy = i;
|
||||
|
||||
for(j = 0; j < MAX_MISSILES; j++)
|
||||
{
|
||||
|
||||
//planes[i].missiles[j].distance = 0;
|
||||
planes[i].missiles[j].dir = planes[i].dir;
|
||||
planes[i].missiles[j].type = 0;
|
||||
}
|
||||
|
@ -60,30 +58,9 @@ void init()
|
|||
}
|
||||
}
|
||||
|
||||
// void infos()
|
||||
// {
|
||||
// unsigned int key = 0;
|
||||
//
|
||||
// while(key != KEY_SHIFT)
|
||||
// {
|
||||
// dclear();
|
||||
//
|
||||
// dtext(1, 1, "All informations");
|
||||
// dprint(1, 10, "life : %d", planes[0].life);
|
||||
// dprint(1, 20, "shoot : %d", planes[0].reload);
|
||||
// dtext(1,54,"F1 to leave");
|
||||
// dupdate();
|
||||
//
|
||||
// key = getkey();
|
||||
// }
|
||||
// }
|
||||
|
||||
int menu()
|
||||
{
|
||||
unsigned char menu = 0;
|
||||
unsigned int key = 0;
|
||||
|
||||
//extern image_t img_menu;
|
||||
|
||||
while(1)
|
||||
{
|
||||
|
@ -94,128 +71,118 @@ int menu()
|
|||
|
||||
dupdate();
|
||||
|
||||
key = getkey();
|
||||
|
||||
switch (key)
|
||||
switch(getkey())
|
||||
{
|
||||
case KEY_UP : case KEY_DOWN : menu = !menu; break;
|
||||
case KEY_EXE :
|
||||
{
|
||||
if (!menu)
|
||||
{
|
||||
if (!menu)
|
||||
{
|
||||
game(); break;
|
||||
}
|
||||
else return 1;
|
||||
game(); break;
|
||||
}
|
||||
else return 1;
|
||||
}
|
||||
case KEY_EXIT : return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
char get_decal(unsigned char dir, Type type)
|
||||
{
|
||||
char dx[4] = {-1, -1 , 0, 1};
|
||||
char n = 1;
|
||||
|
||||
dir += type;
|
||||
|
||||
while(dir >=4)
|
||||
{
|
||||
dir-=4;
|
||||
n = -n;
|
||||
}
|
||||
return n*dx[dir];
|
||||
}
|
||||
|
||||
void *update_frame()
|
||||
void *update_frame(Direction *map_dir)
|
||||
{
|
||||
static unsigned char i,j;
|
||||
|
||||
dclear();
|
||||
|
||||
dprint(1, 1, "s:%d l:%d", planes[0].reload, planes[0].life);
|
||||
//dprint(1, 20, "(%d,%d)", get_decal(planes[0].dir, dX), get_decal(planes[0].dir, dY));
|
||||
dprint(1, 1, "s:%d l:%d", planes[0].bullets, planes[0].life);
|
||||
dprint(1, 10, "(%d,%d)", map_dir->dx, map_dir->dy);
|
||||
//dprint(1,10, "(x,y)(%d,%d)", planes[1].x + decalx, planes[1].y + decaly);
|
||||
|
||||
for(i = 0; i < MAX_CLOUDS; i++)
|
||||
{
|
||||
clouds[i].x += map_dir->dx;
|
||||
clouds[i].y += map_dir->dy;
|
||||
dimage(clouds[i].x, clouds[i].y, &cloud);
|
||||
clouds[i].x += get_decal(planes[0].dir, dX);
|
||||
clouds[i].y += get_decal(planes[0].dir, dY);
|
||||
}
|
||||
|
||||
for (i = 0; i < MAX_PLANES; i++)
|
||||
{
|
||||
if(i > 0)
|
||||
{
|
||||
planes[i].x += get_decal(planes[0].dir, dX);
|
||||
planes[i].y += get_decal(planes[0].dir, dY);
|
||||
planes[i].x += map_dir->dx + planes[i].dir.dx;
|
||||
planes[i].y += map_dir->dy + planes[i].dir.dy;
|
||||
}
|
||||
|
||||
dimage_part(planes[i].x, planes[i].y, &plane, 16*planes[i].dir, 0, 16, 16);
|
||||
|
||||
dimage_part(planes[i].x, planes[i].y, &plane, 16*(1 - planes[i].dir.dx), 16 * (1 - planes[i].dir.dy), 16, 16);
|
||||
|
||||
for(j = 0; j < MAX_MISSILES; j++)
|
||||
{
|
||||
planes[i].missiles[j].x -= get_decal(planes[i].missiles[j].dir, dX);
|
||||
planes[i].missiles[j].y -= get_decal(planes[i].missiles[j].dir, dY);
|
||||
planes[i].missiles[j].x += map_dir->dx - 2 * planes[i].missiles[j].dir.dx;
|
||||
planes[i].missiles[j].y += map_dir->dy - 2 * planes[i].missiles[j].dir.dy;
|
||||
|
||||
dimage_part(planes[i].missiles[j].x, planes[i].missiles[j].y ,&missiles, 8 * planes[i].missiles[j].dir, 0, 8, 8);
|
||||
dimage_part(planes[i].missiles[j].x, planes[i].missiles[j].y ,&missile, 8 * (1 - planes[i].missiles[j].dir.dx), 8 * (1 - planes[i].missiles[j].dir.dy), 8, 8);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
dupdate();
|
||||
}
|
||||
|
||||
#define MAX_KEYS 4
|
||||
|
||||
int game()
|
||||
{
|
||||
unsigned char fire = 0; // fire disable
|
||||
unsigned char sum = 0;
|
||||
unsigned char fire = 0, j = 0; // fire disable
|
||||
|
||||
unsigned int sum_keys[8] = { KEY_RIGHT, KEY_RIGHT + KEY_UP, KEY_UP, KEY_LEFT + KEY_UP, KEY_LEFT, KEY_LEFT + KEY_DOWN, KEY_DOWN, KEY_RIGHT + KEY_DOWN };
|
||||
//direction for the map
|
||||
Direction map_dir, dir_requested;
|
||||
|
||||
int keys[MAX_KEYS];
|
||||
|
||||
unsigned char i;
|
||||
unsigned char j;
|
||||
|
||||
j = 0;
|
||||
|
||||
init(); // initialisation
|
||||
init();
|
||||
|
||||
timer_t *timer = NULL;
|
||||
|
||||
timer = timer_create(40, 0);
|
||||
timer_attach(timer, update_frame, NULL);
|
||||
timer_attach(timer, update_frame, &map_dir);
|
||||
timer_start(timer);
|
||||
|
||||
event_t events;
|
||||
|
||||
map_dir.dx = dir_requested.dx = 0;
|
||||
map_dir.dy = dir_requested.dy = 0;
|
||||
|
||||
while(1)
|
||||
{
|
||||
multigetkey(keys, MAX_KEYS, 0);
|
||||
events = waitevent();
|
||||
|
||||
sum = 0;
|
||||
|
||||
|
||||
for(i = 0; i < MAX_KEYS; i++)
|
||||
if(events.type >= event_key_press && events.type <= event_key_release)
|
||||
{
|
||||
switch(keys[i])
|
||||
switch(events.key.code)
|
||||
{
|
||||
case KEY_UP : case KEY_DOWN : case KEY_LEFT : case KEY_RIGHT :
|
||||
case KEY_UP :
|
||||
{
|
||||
sum += keys[i];
|
||||
dir_requested.dy += 3 - events.type;
|
||||
break;
|
||||
}
|
||||
case KEY_DOWN :
|
||||
{
|
||||
dir_requested.dy -= 3 - events.type;
|
||||
break;
|
||||
}
|
||||
case KEY_LEFT :
|
||||
{
|
||||
dir_requested.dx += 3 - events.type;
|
||||
break;
|
||||
}
|
||||
case KEY_RIGHT :
|
||||
{
|
||||
dir_requested.dx -= 3 - events.type;
|
||||
break;
|
||||
}
|
||||
|
||||
case KEY_SHIFT :
|
||||
{
|
||||
if(planes[0].reload > 0)
|
||||
|
||||
fire = 1;
|
||||
/*if(planes[0].bullets > 0)
|
||||
{
|
||||
planes[0].bullets = planes[0].bullets - 1;
|
||||
fire = 1;
|
||||
//planes[0].reload = planes[0].reload - 1;
|
||||
}
|
||||
break; // fire enable
|
||||
}*/
|
||||
break; // fire enable
|
||||
}
|
||||
|
||||
case KEY_EXIT :
|
||||
|
@ -223,47 +190,23 @@ int game()
|
|||
timer_destroy(timer); //destroy the virtual timer
|
||||
return 1; // good bye, see you soon
|
||||
}
|
||||
|
||||
// case KEY_OPTN :
|
||||
// {
|
||||
// timer_stop(timer); // virtual timer stopped
|
||||
//
|
||||
// infos();
|
||||
//
|
||||
// //timer = timer_create(40, 0);
|
||||
// //timer_attach(timer, &update_frame, NULL);
|
||||
// timer_start(timer);
|
||||
// break;
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
// we determine the direction of the plane
|
||||
|
||||
for(i = 0; i < 8; i++)
|
||||
if(dir_requested.dx != 0 || dir_requested.dy != 0)
|
||||
{
|
||||
if(sum == sum_keys[i])
|
||||
{
|
||||
planes[0].dir = i;
|
||||
break;
|
||||
}
|
||||
map_dir = dir_requested;
|
||||
planes[0].dir = dir_requested;
|
||||
}
|
||||
|
||||
|
||||
if(fire == 1) // put the screen on fire !
|
||||
if(fire)
|
||||
{
|
||||
planes[0].missiles[j].x = planes[0].x;
|
||||
planes[0].missiles[j].y = planes[0].y;
|
||||
planes[0].missiles[j].dir = planes[0].dir; // the missile take the direction of the plane
|
||||
planes[0].missiles[0].dir = planes[0].dir;
|
||||
|
||||
j = j + 1;
|
||||
planes[0].missiles[0].x = 60 - 6 * planes[0].missiles[0].dir.dx;
|
||||
planes[0].missiles[0].y = 28 - 6 * planes[0].missiles[0].dir.dy;
|
||||
|
||||
if(j >= MAX_MISSILES)
|
||||
{
|
||||
j = 0;
|
||||
}
|
||||
|
||||
fire = 0; // fire disable, shoot one by one // this code line will depend if we shoot in continue
|
||||
fire = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|