Teleportation fix

This commit is contained in:
Rendo 2026-03-12 21:44:01 +05:00
commit 73eedda429
6 changed files with 41 additions and 24 deletions

View file

@ -1,7 +1,6 @@
#include <raylib.h> #include <raylib.h>
#include <raymath.h> #include <raymath.h>
#include "world.h" #include "world.h"
#include "maploader.h"
const int SCREEN_HEIGHT = 320; const int SCREEN_HEIGHT = 320;
const int SCREEN_WIDTH = 320; const int SCREEN_WIDTH = 320;
@ -15,7 +14,7 @@ int main() {
World& world = get_world(); World& world = get_world();
loadmap(world); load_world(world,"assets/map");
world.setup(); world.setup();

View file

@ -1,22 +1,31 @@
#include "maploader.h"
#include <fstream> #include <fstream>
#include <iostream> #include <iostream>
#include "components.h" #include "components.h"
#include "world.h" #include "world.h"
void loadmap(World& world) { void load_world(World& world,const char* path) {
std::ifstream in; std::ifstream in;
in.open("assets/map"); in.open(path);
int x = 0; int x = 0;
int y = 0; int y = 0;
int max_x = 0;
int max_y = 0;
while(in.eof() == false) while(in.eof() == false)
{ {
char c; char c;
in.get(c); in.get(c);
if (max_x < x)
max_x = x;
if (max_y < y)
max_y = y;
switch (c) { switch (c) {
case '#': case '#':
{ {
Wall* wall = new Wall; Wall* wall = new Wall;
@ -35,6 +44,7 @@ void loadmap(World& world) {
break; break;
case '\n': case '\n':
x = 0; x = 0;
y++; y++;
break; break;
@ -42,6 +52,12 @@ void loadmap(World& world) {
x++; x++;
break; break;
} }
} }
world.height = CELL_SIZE * (max_y-1);
world.width = CELL_SIZE * (max_x-1);
} }

View file

@ -1,8 +0,0 @@
#ifndef MAPLOADER_H
#define MAPLOADER_H
#include "world.h"
void loadmap(World& world);
#endif

View file

@ -1,3 +1,4 @@
#include <iostream>
#include <raylib.h> #include <raylib.h>
#include <raymath.h> #include <raymath.h>
#include "components.h" #include "components.h"
@ -19,6 +20,7 @@ Pacman::Pacman() {
this->facing = 0; this->facing = 0;
this->position = {0.,0.}; this->position = {0.,0.};
this->frame = 0; this->frame = 0;
this->time = 0;
} }
Pacman::Pacman(Vector2 position) { Pacman::Pacman(Vector2 position) {
this->texture = LoadTexture("assets/sprites/pacman.png"); this->texture = LoadTexture("assets/sprites/pacman.png");
@ -40,22 +42,24 @@ void Pacman::tick() {
Vector2 direction = {(float)(cos(angle)),(float)(sin(-angle))}; Vector2 direction = {(float)(cos(angle)),(float)(sin(-angle))};
Vector2 new_position = Vector2Add(this->position,Vector2Scale(direction, (float)speed)); Vector2 new_position = Vector2Add(this->position,Vector2Scale(direction, (float)speed));
if (get_world().grid[indexify_position(new_position)] == nullptr){ World& world = get_world();
if (world.grid[indexify_position(new_position)] == nullptr){
this->position=new_position; this->position=new_position;
} }
// Bound check // Bound check
if (this->position.x < 16){ if (this->position.x < world.bound_offset*CELL_SIZE){
this->position.x += 288; this->position.x += world.width-2*world.bound_offset*CELL_SIZE;
} }
if (this->position.y < 16){ if (this->position.y < world.bound_offset*CELL_SIZE){
this->position.y += 288; this->position.y += world.height-2*world.bound_offset*CELL_SIZE;
} }
if (this->position.x >= 304){ if (this->position.x >= world.width-(world.bound_offset-1)*CELL_SIZE){
this->position.x -= 288; this->position.x -= world.width-2*world.bound_offset*CELL_SIZE;
} }
if (this->position.y >= 304){ if (this->position.y >= world.height-(world.bound_offset-1)*CELL_SIZE){
this->position.y -= 288; this->position.y -= world.height-2*world.bound_offset*CELL_SIZE;
} }
} }

View file

@ -8,6 +8,7 @@ World::World(){
this->seconds_per_tick = 0; this->seconds_per_tick = 0;
this->clock = 0; this->clock = 0;
this->debug = false; this->debug = false;
this->bound_offset = 1;
} }
World::~World(){ World::~World(){

View file

@ -9,6 +9,7 @@
const int GRID_ROWS = 20; const int GRID_ROWS = 20;
const int GRID_COLUMNS = 20; const int GRID_COLUMNS = 20;
const int GRID_CAPACITY = GRID_COLUMNS*GRID_ROWS; const int GRID_CAPACITY = GRID_COLUMNS*GRID_ROWS;
const int CELL_SIZE = 16;
/// Class that holds information about game world /// Class that holds information about game world
class World { class World {
@ -19,6 +20,9 @@ class World {
std::vector<Entity*> entities; /// Main subjects of game world. std::vector<Entity*> entities; /// Main subjects of game world.
Entity* grid[GRID_CAPACITY]; /// Grid representation Entity* grid[GRID_CAPACITY]; /// Grid representation
float seconds_per_tick; /// Internal clock speed float seconds_per_tick; /// Internal clock speed
int width;
int height;
int bound_offset;
void setup(); /// Sets up game world. void setup(); /// Sets up game world.
/// Should be called once when entites are set. /// Should be called once when entites are set.
@ -36,5 +40,6 @@ class World {
void create_world_with(float seconds_per_tick); void create_world_with(float seconds_per_tick);
World& get_world(); // Thanks, 2ndbeam, helps a lot World& get_world(); // Thanks, 2ndbeam, helps a lot
int indexify_position(Vector2 vector); int indexify_position(Vector2 vector);
void load_world(World& world, const char* path);
#endif #endif