Correction mouvement + debug

This commit is contained in:
attilavs2 2023-10-27 17:10:16 +02:00
parent 839f21d06a
commit d18cbe8c66
6 changed files with 152 additions and 108 deletions

View File

@ -2,62 +2,62 @@
# toolchain file and module path of the fxSDK
cmake_minimum_required(VERSION 3.15)
project(ShooterGame)
project(RaycasterGame)
#FX-CG50 build
include(GenerateG3A)
include(Fxconv)
find_package(Gint 2.10 REQUIRED)
find_package(LibProf 2.4 REQUIRED)
set(SOURCES
src/main.c
src/moteur.c
#src/shaders.c
src/player.c
src/sprites.c
src/map.c
src/utils.c
)
set(ASSETS
assets-cg/map/0.json
assets-cg/textures/briques0.png
assets-cg/textures/buisson1.png
assets-cg/textures/herbe0.png
assets-cg/sprites/zombard1.png
#assets-cg/skybox0.png
)
fxconv_declare_converters(assets-cg/map/converters.py)
#Les lignes suivantes proviennent de https://gitea.planet-casio.com/Slyvtt/Collab_RPG
add_custom_command(
COMMENT "Convert Tiled TMX map to usable JSON file"
COMMAND 'find | grep .*.tmx | sed 's/.tmx//g' | xargs -l bash -c 'tiled --export-map json $$0.tmx $$0.json''
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/assets-cg/map/
OUTPUT "${CMAKE_CURRENT_LIST_DIR}/assets-cg/map/Shooterlevel0.json"
# if several levels/maps are created, just copy the previous line and change the .json name with the new level/map
DEPENDS assets-cg/map/converters.py
assets-cg/map/0.tmx
)
fxconv_declare_assets(${ASSETS} ${ASSETS_fx} ${ASSETS_cg} WITH_METADATA)
add_executable(RaycasterGame ${SOURCES} ${ASSETS} ${ASSETS_${FXSDK_PLATFORM}})
target_compile_options(RaycasterGame PRIVATE -Wall -Wextra -O0)
target_link_libraries(RaycasterGame LibProf::LibProf)
target_link_options(RaycasterGame PRIVATE -Wl,--print-memory-usage)
if("${FXSDK_PLATFORM_LONG}" STREQUAL fxCG50)
#FX-CG50 build
include(GenerateG3A)
include(Fxconv)
find_package(Gint 2.10 REQUIRED)
find_package(LibProf 2.4 REQUIRED)
set(SOURCES
src/main.c
src/moteur.c
#src/shaders.c
src/player.c
src/sprites.c
src/map.c
src/utils.c
)
set(ASSETS
assets-cg/map/0.json
assets-cg/textures/briques0.png
assets-cg/textures/buisson1.png
assets-cg/textures/herbe0.png
assets-cg/sprites/zombard1.png
#assets-cg/skybox0.png
)
fxconv_declare_converters(assets-cg/map/converters.py)
#Les lignes suivantes proviennent de https://gitea.planet-casio.com/Slyvtt/Collab_RPG
add_custom_command(
COMMENT "Convert Tiled TMX map to usable JSON file"
COMMAND 'find | grep .*.tmx | sed 's/.tmx//g' | xargs -l bash -c 'tiled --export-map json $$0.tmx $$0.json''
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/assets-cg/map/
OUTPUT "${CMAKE_CURRENT_LIST_DIR}/assets-cg/map/Shooterlevel0.json"
# if several levels/maps are created, just copy the previous line and change the .json name with the new level/map
DEPENDS assets-cg/map/converters.py
assets-cg/map/0.tmx
)
fxconv_declare_assets(${ASSETS} ${ASSETS_fx} ${ASSETS_cg} WITH_METADATA)
add_executable(myaddin ${SOURCES} ${ASSETS} ${ASSETS_${FXSDK_PLATFORM}})
target_compile_options(myaddin PRIVATE -Wall -Wextra -O0)
target_link_libraries(myaddin LibProf::LibProf)
target_link_options(myaddin PRIVATE -Wl,--print-memory-usage)
generate_g3a(TARGET myaddin OUTPUT "ShooterGame.g3a"
NAME "ShGame" ICONS assets-cg/icon-uns.png assets-cg/icon-sel.png)
generate_g3a(TARGET RaycasterGame OUTPUT "RaycasterGame.g3a"
NAME "RcGame" ICONS assets-cg/icon-uns.png assets-cg/icon-sel.png)
else()
#SDL build
target_compile_definitions(RaycasterGame PRIVATE SDL2)
endif()

View File

@ -4,6 +4,10 @@
#define debug //pour afficher les infos de debug
//#define USB //Pour la capture USB
//A caser autrpart
#define player_height 0x7FFF
//param. graphiques
#define screen_w 396
@ -20,7 +24,7 @@
#define fpi 0x3243F //pi en fixed_t
#define G 0x9CCCC //Gravity
#define G 0x9CCCC //Gravity, m/s/s
#define map_h 128
#define map_w 128

View File

@ -14,10 +14,16 @@
#include <math.h>
#include <time.h>
//SDL is defined by CMake
#ifndef SDL
#include <gint/display.h>
#include <gint/keyboard.h>
#include <gint/image.h>
#include <libprof.h>
#endif
#ifdef SDL
#endif
#ifdef debug
#include <gint/kmalloc.h>
@ -28,4 +34,4 @@
#include <gint/usb-ff-bulk.h>
#endif
#endif
#endif //includes__h

View File

@ -57,38 +57,40 @@ int a;
int raycast_time = 0;
int draw_time = 0;
void keys_get(ShooterMap *ShooterLevel, Player *player){
extern char screenshot;
extern char record;
extern char screenshot;
extern char record;
move(ShooterLevel, player);
move(ShooterLevel, player);
//pollevent();
if (keydown(KEY_F1) && frame_time_timer <= 0) {
if (disp_frame_time == 0) {
disp_frame_time = 1;
frame_time_timer = 10;
}
else {
disp_frame_time = 0;
frame_time_timer = 10;
}
}
frame_time_timer--;
if (keydown(KEY_F6)) exit_game = 1;
//pollevent();
if (keydown(KEY_F1) && frame_time_timer <= 0) {
if (disp_frame_time == 0) {
disp_frame_time = 1;
frame_time_timer = 10;
}
else {
disp_frame_time = 0;
frame_time_timer = 10;
}
}
frame_time_timer--;
if (keydown(KEY_F6)) exit_game = 1;
#ifdef debug
if (keydown(KEY_TAN)) end_screen();
#endif
#ifdef debug
if (keydown(KEY_TAN)) end_screen();
#endif
#ifdef USB
screenshot = 0;
if (keydown(KEY_0) && keydown(KEY_EXE) && capture_timer <= 0) {
if(screenshot == 0) screenshot = 1;
capture_timer = 10;
}
capture_timer--;
#endif
#ifdef USB
screenshot = 0;
if (keydown(KEY_0) && keydown(KEY_EXE) && capture_timer <= 0) {
if(screenshot == 0) screenshot = 1;
capture_timer = 10;
}
capture_timer--;
#endif
}
void main_menu(){
@ -172,7 +174,7 @@ int main(){
//draw_sprites(&zombard, &ShooterLevel0, &player1);
//draw_walls(&ShooterLevel0, &player1, vram);
draw_walls(&ShooterLevel0, &player1, vram);
//if(first_frame == 1) main_menu();

View File

@ -36,14 +36,29 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
image_t *tex_index[tindex_size];
int8_t on_solid_ground(ShooterMap *ShooterLevel, Vector3d pos) {
// If the tile under pos == 0 and it isn't layer 0
if(ShooterLevel->wall[ffloor(pos.x)][ffloor(pos.y)][ffloor(pos.z) > 0] && ffloor(pos.z)) return 0;
else return 1;
// If pos is int and tile under is either solid or z is 0
if(fix(ffloor(pos.z)) == pos.z){
if(pos.z < 0xFFFF) return 1;
if(ShooterLevel->wall[ffloor(pos.x)][ffloor(pos.y)][ffloor(pos.z - 0x0001)] > 0){
return 1;
}
}
return 0;
}
int8_t bumps_head(ShooterMap *ShooterLevel, Vector3d pos) {
pos.z += player_height;
if(fix(ffloor(pos.z)) == pos.z){
if(pos.z > 0x20000) return 1;
if(ShooterLevel->wall[ffloor(pos.x)][ffloor(pos.y)][ffloor(pos.z + 0x0001)] > 0){
return 1;
}
}
return 0;
}
void move(ShooterMap *ShooterLevel, Player *player) {
extern int frame_time;
fixed_t sFrameTime = fix(frame_time)/1000;
fixed_t sFrameTime = fix(frame_time)/1000; //Frame time in seconds
fixed_t moveSpeed = fmul(fix(frame_time), fmul(0x148, player->speed_mult)); //frame_time * fix(carrés/seconde/1000) là carrés/seconde = 5
fixed_t rotSpeed = fmul(fix(frame_time), 0x83); //frame_time * fix(radians/seconde/1000) là radians/seconde = 2
fixed_t c_rotSpeed = fix(cos(f2float(rotSpeed)));
@ -57,15 +72,14 @@ void move(ShooterMap *ShooterLevel, Player *player) {
pollevent();
if (keydown(KEY_UP)) {
player->velocity.x += fmul(player->dir.x, -fsq(player->velocity.x) + fsq(moveSpeed));
player->velocity.y += fmul(player->dir.y, -fsq(player->velocity.y) + fsq(moveSpeed));
player->velocity.x = fmul(player->dir.x, moveSpeed);
player->velocity.y = fmul(player->dir.y, moveSpeed);
}
//move backwards if no wall behind you
if (keydown(KEY_DOWN)) {
player->velocity.x -= fmul(player->dir.x, -fsq(player->velocity.x) + fsq(moveSpeed));
player->velocity.y -= fmul(player->dir.y, -fsq(player->velocity.y) + fsq(moveSpeed));
player->velocity.x = -fmul(player->dir.x, moveSpeed);
player->velocity.y = -fmul(player->dir.y, moveSpeed);
}
//rotate to the rightdouble sin_rotspeed;
//rotate to the right
if (keydown(KEY_RIGHT)) {
//both camera direction and camera plane must be rotated
oldDirX = player->dir.x;
@ -85,6 +99,11 @@ void move(ShooterMap *ShooterLevel, Player *player) {
player->plane.x = (fmul(player->plane.x, c_rotSpeed)-1) - (fmul(player->plane.y, s_rotSpeed) - 1);
player->plane.y = (fmul(oldPlaneX, s_rotSpeed)+1) + (fmul(player->plane.y, c_rotSpeed) + 1);
}
if (keydown(KEY_SHIFT)) {
if(on_solid_ground(ShooterLevel, player->pos)){
player->velocity.z = moveSpeed;
}
}
temp.x = ffloor(player->pos.x + fmul(player->velocity.x, sFrameTime));
temp.y = ffloor(player->pos.y + fmul(player->velocity.y, sFrameTime));
@ -93,12 +112,19 @@ void move(ShooterMap *ShooterLevel, Player *player) {
fpos.y = ffloor(player->pos.y);
fpos.z = ffloor(player->pos.z);
player->pos.x = temp.x;
player->pos.y = temp.y;
/*
if(ShooterLevel->wall[temp.x][fpos.y][fpos.z] == 0) player->pos.x = temp.x;
else player->velocity.x = 0;
if(ShooterLevel->wall[fpos.x][temp.y][fpos.z] == 0) player->pos.y = temp.y;
else player->velocity.y = 0;
if(on_solid_ground(ShooterLevel, (Vector3d){player->pos.x, player->pos.y, temp.z}) > 0) player->velocity.z += G * sFrameTime;
else player->velocity.z = 0;
*/
if(on_solid_ground(ShooterLevel, (Vector3d){player->pos.x, player->pos.y, temp.z}) > 0
|| bumps_head(ShooterLevel, (Vector3d){player->pos.x, player->pos.y, temp.z})) {
player->velocity.z = 0;
}
else player->velocity.z -= 2*fmul(G, sFrameTime);
if (player->dir.x > 0xFFFF) player->dir.x = 0xFFFF;
if (player->dir.y > 0xFFFF) player->dir.y = 0xFFFF;
@ -135,7 +161,7 @@ void draw_walls(ShooterMap *ShooterLevel, Player *player, image_t *vram){
fixed_t deltaDistY;
fixed_t perpWallDist;
fixed_t texSize;
uint8_t walls[map_d];
uint8_t walls[map_d + 1];
int x;
int i;
int mapX;
@ -227,13 +253,27 @@ void draw_walls(ShooterMap *ShooterLevel, Player *player, image_t *vram){
//Otherwise check if ray has hit a wall
else {
for(i = 0; i <3; i++){
if(ShooterLevel->wall[mapX][mapY][i]) walls[i] = 1;
if(ShooterLevel->wall[mapX][mapY][i]) {
walls[i] = 1;
walls[map_d] = 1;
}
}
if (walls > 0) {
if (walls[map_d] > 0) {
hit = 1;
prof_leave(rayscat);
prof_enter(img_drw);
//texturing calculations
//Calculate distance projected on camera direction. This is the shortest distance from the point where the wall is
//hit to the camera plane. Euclidean to center camera point would give fisheye effect!
//This can be computed as (mapX - posX + (1 - stepX) / 2) / rayDirX for side == 0, or same formula with Y
//for size == 1, but can be simplified to the code below thanks to how sideDist and deltaDist are computed:
//because they were left scaled to |rayDir|. sideDist is the entire length of the ray above after the multiple
//steps, but we subtract deltaDist once because one step more into the wall was taken above.
if (side == 0) perpWallDist = (sideDistX - deltaDistX);
else perpWallDist = (sideDistY - deltaDistY);
//texturing calculation
//calculate value of wallX
fixed_t wallX; //where exactly the wall was hit
if (side == 0) wallX = player->pos.y + fmul(perpWallDist, rayDirY);
@ -271,6 +311,7 @@ void draw_walls(ShooterMap *ShooterLevel, Player *player, image_t *vram){
image_linear(tex_stripe, image_at(vram, x, linepos), &temp);
prof_leave(img_drw);
prof_enter(rayscat);
}
}
}
@ -286,15 +327,6 @@ void draw_walls(ShooterMap *ShooterLevel, Player *player, image_t *vram){
side = 1;
}
}
//Calculate distance projected on camera direction. This is the shortest distance from the point where the wall is
//hit to the camera plane. Euclidean to center camera point would give fisheye effect!
//This can be computed as (mapX - posX + (1 - stepX) / 2) / rayDirX for side == 0, or same formula with Y
//for size == 1, but can be simplified to the code below thanks to how sideDist and deltaDist are computed:
//because they were left scaled to |rayDir|. sideDist is the entire length of the ray above after the multiple
//steps, but we subtract deltaDist once because one step more into the wall was taken above.
if (side == 0) perpWallDist = (sideDistX - deltaDistX);
else perpWallDist = (sideDistY - deltaDistY);
prof_leave(rayscat);
}