More progress on audio and rendering
This commit is contained in:
180
items/item.c
180
items/item.c
@@ -16,103 +16,103 @@ uint16_t itemRegistryIndex = 0;
|
||||
|
||||
double speed = 1.0f / TILE_SIZE; // fraction of tile per tick
|
||||
|
||||
const int dirDx[8] = {-1, -1, -1, 0, 1, 1, 1, 0};
|
||||
const int dirDy[8] = {1, 0, -1, -1, -1, 0, 1, 1};
|
||||
|
||||
const float epsilon = 0.999f; // if we can't move, back it off just below 1
|
||||
void updateItems() {
|
||||
const int dirDx[8] = {-1, -1, -1, 0, 1, 1, 1, 0};
|
||||
const int dirDy[8] = {1, 0, -1, -1, -1, 0, 1, 1};
|
||||
|
||||
const float epsilon = 0.999f; // if we can't move, back it off just below 1
|
||||
for (int i = 0; i < neededUpdates.activeCount; i++) {
|
||||
int x = neededUpdates.tiles[i].x;
|
||||
int y = neededUpdates.tiles[i].y;
|
||||
Tile *t = &tileMap[y][x];
|
||||
if (t->type == TYPE_AIR) continue;
|
||||
TileTypeReg tt = TileRegistry[t->type];
|
||||
int dir = t->direction;
|
||||
|
||||
for (int y = 0; y < MAP_HEIGHT; y++) {
|
||||
for (int x = 0; x < MAP_WIDTH; x++) {
|
||||
Tile *t = &tileMap[y][x];
|
||||
TileTypeReg tt = TileRegistry[t->type];
|
||||
if (t->type == TYPE_AIR) continue;
|
||||
int dir = t->direction;
|
||||
bool horz = (dir == ORIENT_LEFT || dir == ORIENT_RIGHT);
|
||||
bool vert = (dir == ORIENT_UP || dir == ORIENT_DOWN);
|
||||
|
||||
bool horz = (dir == ORIENT_LEFT || dir == ORIENT_RIGHT);
|
||||
bool vert = (dir == ORIENT_UP || dir == ORIENT_DOWN);
|
||||
for (uint8_t lane = 0; lane < ItemSlotCount; lane++) {
|
||||
if (!tt.outputLane[lane]) continue;
|
||||
ItemOnBelt *itm = &t->items[lane];
|
||||
if (itm->type == 0) continue;
|
||||
if (tt.itemMoves) {
|
||||
itm->offset += speed;
|
||||
// 1) Advance
|
||||
}
|
||||
|
||||
for (uint8_t lane = 0; lane < ItemSlotCount; lane++) {
|
||||
if (!tt.outputLane[lane]) continue;
|
||||
ItemOnBelt *itm = &t->items[lane];
|
||||
if (itm->type == 0) continue;
|
||||
// 2) Time to hop?
|
||||
if (itm->offset >= 0.5f || !tt.itemMoves) {
|
||||
if (tt.itemMoves) {
|
||||
itm->offset += speed;
|
||||
// 1) Advance
|
||||
itm->offset -= 1.0f;
|
||||
}
|
||||
|
||||
// 2) Time to hop?
|
||||
if (itm->offset >= 0.5f || !tt.itemMoves) {
|
||||
// target coords
|
||||
int nx = x + dirDx[dir];
|
||||
int ny = y + dirDy[dir];
|
||||
|
||||
// bounds & belt?
|
||||
if (nx < 0 || nx >= MAP_WIDTH || ny < 0 || ny >= MAP_HEIGHT) {
|
||||
if (tt.itemMoves) {
|
||||
itm->offset -= 1.0f;
|
||||
itm->offset += 1.0f - speed;
|
||||
}
|
||||
|
||||
// target coords
|
||||
int nx = x + dirDx[dir];
|
||||
int ny = y + dirDy[dir];
|
||||
|
||||
// bounds & belt?
|
||||
if (nx < 0 || nx >= MAP_WIDTH || ny < 0 || ny >= MAP_HEIGHT) {
|
||||
if (tt.itemMoves) {
|
||||
itm->offset += 1.0f - speed;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
Tile *next = &tileMap[ny][nx];
|
||||
TileTypeReg ntt = TileRegistry[next->type];
|
||||
int newLane = lane;
|
||||
switch (next->type) {
|
||||
case TYPE_BELT:
|
||||
int newDir = next->direction;
|
||||
bool nH = (newDir == ORIENT_LEFT || newDir == ORIENT_RIGHT);
|
||||
bool nV = (newDir == ORIENT_UP || newDir == ORIENT_DOWN);
|
||||
|
||||
if ((horz && nH) || (vert && nV)) {
|
||||
// same axis → keep lane
|
||||
} else if (horz && nV) {
|
||||
// came off a horizontal: lane0=top→vertical.left, lane1=bottom→vertical.right
|
||||
newLane = (dir == ORIENT_RIGHT ^ newDir == ORIENT_UP ? 0 : 1);
|
||||
itm->offset = 0.0f;
|
||||
} else if (vert && nH) {
|
||||
// came off vertical: lane0=left→horizontal.top, lane1=right→horizontal.bottom
|
||||
newLane = (dir == ORIENT_UP ^ newDir == ORIENT_RIGHT ? 1 : 0);
|
||||
itm->offset = 0.0f;
|
||||
}
|
||||
// (diagonals fall back to same-lane)
|
||||
|
||||
// Find a free slot in
|
||||
break;
|
||||
|
||||
default:
|
||||
itm->offset += 1.0f - speed;
|
||||
}
|
||||
|
||||
|
||||
if (next->items[newLane].type == 0 && ntt.allowedInItems[newLane][itm->type]) {
|
||||
// MOVE it
|
||||
ItemOnBelt moved = *itm;
|
||||
moved.tileX = nx;
|
||||
moved.tileY = ny;
|
||||
if (!ntt.itemMoves) {
|
||||
moved.offset = 0.5f;
|
||||
}
|
||||
next->items[newLane] = moved;
|
||||
|
||||
// clear this one
|
||||
itm->type = 0;
|
||||
} else {
|
||||
// both slots full → wait at end
|
||||
itm->offset = epsilon;
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
continue;
|
||||
}
|
||||
Tile *next = &tileMap[ny][nx];
|
||||
TileTypeReg ntt = TileRegistry[next->type];
|
||||
int newLane = lane;
|
||||
switch (next->type) {
|
||||
case TYPE_BELT:
|
||||
int newDir = next->direction;
|
||||
bool nH = (newDir == ORIENT_LEFT || newDir == ORIENT_RIGHT);
|
||||
bool nV = (newDir == ORIENT_UP || newDir == ORIENT_DOWN);
|
||||
|
||||
if ((horz && nH) || (vert && nV)) {
|
||||
// same axis → keep lane
|
||||
} else if (horz && nV) {
|
||||
// came off a horizontal: lane0=top→vertical.left, lane1=bottom→vertical.right
|
||||
newLane = (dir == ORIENT_RIGHT ^ newDir == ORIENT_UP ? 0 : 1);
|
||||
itm->offset = 0.0f;
|
||||
} else if (vert && nH) {
|
||||
// came off vertical: lane0=left→horizontal.top, lane1=right→horizontal.bottom
|
||||
newLane = (dir == ORIENT_UP ^ newDir == ORIENT_RIGHT ? 1 : 0);
|
||||
itm->offset = 0.0f;
|
||||
}
|
||||
// (diagonals fall back to same-lane)
|
||||
|
||||
// Find a free slot in
|
||||
break;
|
||||
|
||||
default:
|
||||
itm->offset += 1.0f - speed;
|
||||
}
|
||||
|
||||
|
||||
if (next->items[newLane].type == 0 && ntt.allowedInItems[newLane][itm->type]) {
|
||||
// MOVE it
|
||||
ItemOnBelt moved = *itm;
|
||||
moved.tileX = nx;
|
||||
moved.tileY = ny;
|
||||
if (!ntt.itemMoves) {
|
||||
moved.offset = 0.5f;
|
||||
}
|
||||
next->items[newLane] = moved;
|
||||
|
||||
// clear this one
|
||||
itm->type = 0;
|
||||
} else {
|
||||
// both slots full → wait at end
|
||||
itm->offset = epsilon;
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
}
|
||||
const UpdateTileCallback cb = ItemTileCallbacks[t->type];
|
||||
if (cb) {
|
||||
cb(t);
|
||||
}
|
||||
}
|
||||
const UpdateTileCallback cb = ItemTileCallbacks[t->type];
|
||||
if (cb) {
|
||||
cb(t);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -129,8 +129,10 @@ void registerItem(char name[20], SDL_Renderer *renderer) {
|
||||
ItemRegistry[itemRegistryIndex].texture[ORIENT_LEFT],
|
||||
TILE_SIZE / 2, TILE_SIZE / 2);
|
||||
SDL_SetTextureBlendMode(ItemRegistry[itemRegistryIndex].textureOnBelt[ORIENT_LEFT], SDL_BLENDMODE_BLEND);
|
||||
ItemRegistry[itemRegistryIndex].atlasRects[ORIENT_LEFT] = allocate_32x32(ItemRegistry[itemRegistryIndex].texture[ORIENT_LEFT], renderer);
|
||||
ItemRegistry[itemRegistryIndex].atlasRectsOnBelt[ORIENT_LEFT] = allocate_16x16(ItemRegistry[itemRegistryIndex].textureOnBelt[ORIENT_LEFT], renderer);
|
||||
ItemRegistry[itemRegistryIndex].atlasRects[ORIENT_LEFT] = allocate_32x32(
|
||||
ItemRegistry[itemRegistryIndex].texture[ORIENT_LEFT], renderer);
|
||||
ItemRegistry[itemRegistryIndex].atlasRectsOnBelt[ORIENT_LEFT] = allocate_16x16(
|
||||
ItemRegistry[itemRegistryIndex].textureOnBelt[ORIENT_LEFT], renderer);
|
||||
ItemRegistry[itemRegistryIndex].type = itemRegistryIndex;
|
||||
ItemRegistry[itemRegistryIndex].isTile = false;
|
||||
ItemRegistry[itemRegistryIndex].miscVal = 60;
|
||||
@@ -294,7 +296,9 @@ void renderItem(ItemOnBelt item, SDL_Renderer *renderer, int lane, SDL_Rect play
|
||||
adjustRect(&rectA, playerRect);
|
||||
SDL_RenderFillRect(renderer, &rectA);
|
||||
}
|
||||
SDL_RenderCopy(renderer, ItemRegistry[item.type].textureOnBelt[ORIENT_LEFT], NULL, &rect);
|
||||
//SDL_RenderCopyx(renderer, ItemRegistry[item.type].textureOnBelt[ORIENT_LEFT], NULL, &rect);
|
||||
SDL_RenderCopy(renderer, atlasTexture, &ItemRegistry[item.type].atlasRectsOnBelt[ORIENT_LEFT], &rect);
|
||||
|
||||
if (debugMode) {
|
||||
renderText(renderer, fonts[3], tempStr, rectA.x, rectA.y);
|
||||
}
|
||||
|
Reference in New Issue
Block a user