From 2ef01a14d90b1759f75a4a4031261cf44efd3a80 Mon Sep 17 00:00:00 2001 From: Raimon Zamora Date: Thu, 9 Mar 2023 18:58:25 +0100 Subject: [PATCH] - Comencem a treballar en les habitacions --- data/test.gif | Bin 1553 -> 2942 bytes source/actor.cpp | 44 ++++++++++++++++++++++---------------------- source/actor.h | 6 +----- source/main.cpp | 11 ++++------- source/misc.h | 11 +++++++++++ source/room.cpp | 46 ++++++++++++++++++++++++++++++++++++++++++++++ source/room.h | 12 ++++++++++++ 7 files changed, 96 insertions(+), 34 deletions(-) create mode 100644 source/misc.h create mode 100644 source/room.cpp create mode 100644 source/room.h diff --git a/data/test.gif b/data/test.gif index a6a0fe4d3de997bbba70995ebfb1088818d1b04a..0a3bb92cc45e3da66db4d952c62c8c881a3cca5c 100644 GIT binary patch delta 2908 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 = s; act->bmp_rect = r; act->bmp_offset = o; + act->anim_cycle = 0; act->below = act->above = nullptr; act->prev = act->next = nullptr; return act; @@ -100,32 +102,23 @@ namespace actor if (act1->pos.x >= act2->pos.x+act2->size.x) { return true; } else if (act2->pos.x >= act1->pos.x+act1->size.x) { return false; } - - if (act1->pos.y >= act2->pos.y+act2->size.y) { return true; } + else if (act1->pos.y >= act2->pos.y+act2->size.y) { return true; } else if (act2->pos.y >= act1->pos.y+act1->size.y) { return false; } - - if (act1->pos.z >= act2->pos.z+act2->size.z) { return true; } + else if (act1->pos.z >= act2->pos.z+act2->size.z) { return true; } else if (act2->pos.z >= act1->pos.z+act1->size.z) { return false; } + else { return false; } } void reorder() { anim_frame=(anim_frame+1)%4; - //dirty=first; - //first=nullptr; while (dirty) { - //const int z_index = dirty->pos.x + dirty->pos.y + dirty->pos.z; if (first) { actor_t *current = first; while (true) { - //const int z_index2 = current->pos.x + current->pos.y + current->pos.z; - //if ((dirty->pos.z < current->pos.z+current->size.z) && (current->pos.x+current->size.x+current->pos.y > dirty->pos.x+dirty->size.x+dirty->pos.y)) - - //if (current->pos.x+current->pos.y>dirty->pos.y+dirty->pos.x || current->pos.z+current->size.z>dirty->pos.z) - //if (current->pos.x>dirty->pos.x+dirty->size.x || current->pos.y>dirty->pos.y+dirty->size.y || current->pos.z>dirty->pos.z+dirty->size.z) if (isInFront(current, dirty)) { dirty->prev = current->prev; @@ -164,11 +157,14 @@ namespace actor void updateUserInput(actor_t *act) { + vec3_t min = room::getMin(); + vec3_t max = room::getMax(); + bool moving = false; - if (input::keyDown(SDL_SCANCODE_LEFT) && act->pos.x>0) { act->push |= PUSH_XN; act->orient=PUSH_XN; moving = true; } - if (input::keyDown(SDL_SCANCODE_RIGHT) && act->pos.x<56) { act->push |= PUSH_XP; act->orient=PUSH_XP; moving = true; } - if (input::keyDown(SDL_SCANCODE_UP) && act->pos.y>0) { act->push |= PUSH_YN; act->orient=PUSH_YN; moving = true; } - if (input::keyDown(SDL_SCANCODE_DOWN) && act->pos.y<56) { act->push |= PUSH_YP; act->orient=PUSH_YP; moving = true; } + if (input::keyDown(SDL_SCANCODE_LEFT) && act->pos.x>min.x) { act->push |= PUSH_XN; act->orient=PUSH_XN; moving = true; } + if (input::keyDown(SDL_SCANCODE_RIGHT) && act->pos.xpush |= PUSH_XP; act->orient=PUSH_XP; moving = true; } + if (input::keyDown(SDL_SCANCODE_UP) && act->pos.y>min.y) { act->push |= PUSH_YN; act->orient=PUSH_YN; moving = true; } + if (input::keyDown(SDL_SCANCODE_DOWN) && act->pos.ypush |= PUSH_YP; act->orient=PUSH_YP; moving = true; } if (input::keyDown(SDL_SCANCODE_SPACE) && act->react_mask==0 && (act->pos.z==0 || act->below)) { act->react_mask=1; act->react_push=0; @@ -179,7 +175,7 @@ namespace actor } } if (input::keyDown(SDL_SCANCODE_Z) && act->pos.z>0) { act->push |= PUSH_ZN; moving = true; } - if (input::keyDown(SDL_SCANCODE_A) && act->pos.z<56) { act->push |= PUSH_ZP; moving = true; } + if (input::keyDown(SDL_SCANCODE_A) && act->pos.zpush |= PUSH_ZP; moving = true; } if (act->react_mask) { @@ -259,8 +255,11 @@ namespace actor void updatePushable(actor_t *act) { + vec3_t min = room::getMin(); + vec3_t max = room::getMax(); + if (act->push & PUSH_ZP) { - if (act->pos.z>=56) + if (act->pos.z>=max.z) { if (act->flags & FLAG_MOVING) changeMoving(act); } @@ -281,7 +280,7 @@ namespace actor if (act->push & PUSH_XN) { act->pos.x--; actor::actor_t *other = actor::get_collision(act); - if (act->pos.x<0 || other) + if (act->pos.xflags & FLAG_PUSHABLE) other->push |= PUSH_XN; act->pos.x++; @@ -306,7 +305,7 @@ namespace actor if (act->push & PUSH_XP) { act->pos.x++; actor::actor_t *other = actor::get_collision(act); - if (act->pos.x>56 || other) + if (act->pos.x>max.x || other) { if (other && other->flags & FLAG_PUSHABLE) other->push |= PUSH_XP; act->pos.x--; @@ -331,7 +330,7 @@ namespace actor if (act->push & PUSH_YN) { act->pos.y--; actor::actor_t *other = actor::get_collision(act); - if (act->pos.y<0 || other) + if (act->pos.yflags & FLAG_PUSHABLE) other->push |= PUSH_YN; act->pos.y++; @@ -356,7 +355,7 @@ namespace actor if (act->push & PUSH_YP) { act->pos.y++; actor::actor_t *other = actor::get_collision(act); - if (act->pos.y>56 ||other) + if (act->pos.y>max.y ||other) { if (other && other->flags & FLAG_PUSHABLE) other->push |= PUSH_YP; act->pos.y--; @@ -477,6 +476,7 @@ namespace actor //print(x+5,y,act->pos.x); //print(x+5,y+6,act->pos.y); //print(x+5,y+12,order); + print(x+5,y,act->flags); if (draw_all && act->next) draw(act->next); } diff --git a/source/actor.h b/source/actor.h index de766f5..3746541 100644 --- a/source/actor.h +++ b/source/actor.h @@ -1,5 +1,6 @@ #pragma once #include +#include "misc.h" #define FLAG_NONE 0 #define FLAG_HERO 1 @@ -30,11 +31,6 @@ namespace actor { - struct vec3_t - { - int x, y, z; - }; - struct actor_t { SDL_Rect bmp_rect; diff --git a/source/main.cpp b/source/main.cpp index d0fe3ac..eb58b6b 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -3,6 +3,7 @@ #include "jinput.h" #include #include "actor.h" +#include "room.h" draw::surface *surf; actor::actor_t *box; @@ -15,6 +16,8 @@ void game::init() draw::loadPalette("test.gif"); game::setUpdateTicks(64); + room::load(0,3); + box = actor::create({16,16,0}, {8,8,4}, {64,0,32,24}, {0,24}); box->flags = FLAG_MOVING; box->movement = MOV_Z; @@ -43,13 +46,7 @@ bool game::loop() actor::reorder(); draw::cls(8); - for (int y=0;y<8;++y) - { - for (int x=0;x<8;++x) - { - draw::draw(148+x*16-y*16,76+x*8+y*8,32,15,0,1); - } - } + room::draw(); actor::draw(actor::getFirst()); //draw::draw(148+sx*2-sy*2, 67+sx+sy,24,24,24,0); draw::render(); diff --git a/source/misc.h b/source/misc.h new file mode 100644 index 0000000..32033cf --- /dev/null +++ b/source/misc.h @@ -0,0 +1,11 @@ +#pragma once + +struct vec2_t +{ + int x, y; +}; + +struct vec3_t +{ + int x, y, z; +}; diff --git a/source/room.cpp b/source/room.cpp new file mode 100644 index 0000000..973807b --- /dev/null +++ b/source/room.cpp @@ -0,0 +1,46 @@ +#include "room.h" +#include "jdraw.h" + +namespace room +{ + static vec3_t size = {8,8,8}; + static vec3_t tmin = {0,0,0}; + static vec3_t tmax = {7,7,7}; + static vec3_t min = {0,0,0}; + static vec3_t max = {56,56,56}; + + void load(int x, int y) + { + size = {(x+1)*2,(y+1)*2,3}; + tmin = {3-x,3-y,0}; + tmax = {4+x,4+y,3}; + min = {tmin.x*8,tmin.y*8,0}; + max = {tmax.x*8,tmax.y*8,24}; + } + + void draw() + { + for (int y=tmin.y;y<=tmax.y;++y) + { + for (int x=tmin.x;x<=tmax.x;++x) + { + draw::draw(148+x*16-y*16,76+x*8+y*8,32,15,0,1); + } + } + } + + vec3_t getSize() + { + return size; + } + + vec3_t getMin() + { + return min; + } + + vec3_t getMax() + { + return max; + } +} diff --git a/source/room.h b/source/room.h new file mode 100644 index 0000000..beef806 --- /dev/null +++ b/source/room.h @@ -0,0 +1,12 @@ +#pragma once +#include "misc.h" + +namespace room +{ + void load(int x, int y); + void draw(); + + vec3_t getSize(); + vec3_t getMin(); + vec3_t getMax(); +}