Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "fxlib.h"
- #include "MonochromeLib.h"
- #include "syscall.h"
- #include <math.h>
- #include <stdio.h>
- static int SysCallCode[] = {0xD201422B,0x60F20000,0x80010070};
- static int (*SysCall)(int R4, int R5, int R6, int R7, int FNo ) = (void*)&SysCallCode;
- int RTC_GetTicks(void)
- {
- return (*SysCall)(0, 0, 0, 0, 0x3B);
- }
- long abs(long value)
- {
- if (value < 0) return -value;
- else return value;
- }
- #define mapWidth 64
- #define mapHeight 64
- int worldMap[mapWidth][mapHeight]=
- {
- {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
- {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
- {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
- {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
- {1,0,0,0,0,0,2,2,2,2,2,0,0,0,0,3,0,3,0,3,0,0,0,1},
- {1,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1},
- {1,0,0,0,0,0,2,0,0,0,2,0,0,0,0,3,0,0,0,3,0,0,0,1},
- {1,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1},
- {1,0,0,0,0,0,2,2,0,2,2,0,0,0,0,3,0,3,0,3,0,0,0,1},
- {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
- {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
- {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
- {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
- {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
- {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
- {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
- {1,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
- {1,4,0,4,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
- {1,4,0,0,0,0,5,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
- {1,4,0,4,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
- {1,4,0,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
- {1,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
- {1,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
- {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
- };
- int AddIn_main(int isAppli, unsigned short OptionNum)
- {
- int rotSpeed, moveSpeed; // Vitesse de rotation et de mouvement
- int w = 128, h = 64, x; // Dimensions de l'écran
- double posX = 22, posY = 12; // Position du joueur
- double dirX = -1, dirY = 0;
- double planeX = 0, planeY = 0.66;
- double time = 0, oldTime = 0;
- char fps[3];
- double cameraX;
- double rayPosX, rayPosY;
- double rayDirX, rayDirY;
- int mapX, mapY;
- double sideDistX, sideDistY;
- double deltaDistX, deltaDistY;
- double perpWallDist;
- int stepX, stepY;
- int hit, side;
- int lineHeight;
- int drawStart;
- int drawEnd;
- double frameTime;
- double oldDirX;
- double oldPlaneX;
- while(IsKeyUp(KEY_CTRL_EXIT))
- {
- ML_clear_vram();
- for(x = 0; x < w; x++)
- {
- cameraX = 2 * x / (double)(w) - 1;
- rayPosX = posX, rayPosY = posY;
- rayDirX = dirX + planeX * cameraX, rayDirY = dirY + planeY * cameraX;
- mapX = (int)(rayPosX), mapY = (int)(rayPosY);
- sideDistX, sideDistY;
- deltaDistX = sqrt(1 + (rayDirY * rayDirY) / (rayDirX * rayDirX)), deltaDistY = sqrt(1 + (rayDirX * rayDirX) / (rayDirY * rayDirY));
- perpWallDist;
- stepX, stepY;
- hit = 0, side;
- if (rayDirX < 0)
- {
- stepX = -1;
- sideDistX = (rayPosX - mapX) * deltaDistX;
- }
- else
- {
- stepX = 1;
- sideDistX = (mapX + 1.0 - rayPosX) * deltaDistX;
- }
- if (rayDirY < 0)
- {
- stepY = -1;
- sideDistY = (rayPosY - mapY) * deltaDistY;
- }
- else
- {
- stepY = 1;
- sideDistY = (mapY + 1.0 - rayPosY) * deltaDistY;
- }
- while (hit == 0) // DDA
- {
- if (sideDistX < sideDistY)
- {
- sideDistX += deltaDistX;
- mapX += stepX;
- side = 0;
- }
- else
- {
- sideDistY += deltaDistY;
- mapY += stepY;
- side = 1;
- }
- if (worldMap[mapX][mapY] > 0) hit = 1;
- }
- if (side == 0)
- perpWallDist = fabs((mapX - rayPosX + (1 - stepX) / 2) / rayDirX);
- else
- perpWallDist = fabs((mapY - rayPosY + (1 - stepY) / 2) / rayDirY);
- lineHeight = abs((int)(h / perpWallDist));
- drawStart = -lineHeight / 2 + h / 2;
- if(drawStart < 0)drawStart = 0;
- drawEnd = lineHeight / 2 + h / 2;
- if(drawEnd >= h)drawEnd = h - 1;
- ML_vertical_line(x, drawStart, drawEnd, ML_BLACK);
- }
- //Gestion du temps et de la vitesse
- oldTime = time;
- time = RTC_GetTicks();
- frameTime = (time - oldTime) / 1000.0;
- sprintf(fps,"%d",frameTime / 1000.0);
- PrintXY(0,0,(const unsigned char *) fps,0);
- moveSpeed = frameTime * 30.0;
- rotSpeed = frameTime * 15.0;
- //Gestion des touches
- if (IsKeyDown(KEY_CTRL_UP))
- {
- if(worldMap[(int)(posX + dirX * moveSpeed)][(int)(posY)] == 0) posX += dirX * moveSpeed;
- if(worldMap[(int)(posX)][(int)(posY + dirY * moveSpeed)] == 0) posY += dirY * moveSpeed;
- }
- if (IsKeyDown(KEY_CTRL_DOWN))
- {
- if(worldMap[(int)(posX - dirX * moveSpeed)][(int)(posY)] == 0) posX -= dirX * moveSpeed;
- if(worldMap[(int)(posX)][(int)(posY - dirY * moveSpeed)] == 0) posY -= dirY * moveSpeed;
- }
- if (IsKeyDown(KEY_CTRL_RIGHT))
- {
- oldDirX = dirX;
- dirX = dirX * cos(-rotSpeed) - dirY * sin(-rotSpeed);
- dirY = oldDirX * sin(-rotSpeed) + dirY * cos(-rotSpeed);
- oldPlaneX = planeX;
- planeX = planeX * cos(-rotSpeed) - planeY * sin(-rotSpeed);
- planeY = oldPlaneX * sin(-rotSpeed) + planeY * cos(-rotSpeed);
- }
- if (IsKeyDown(KEY_CTRL_LEFT))
- {
- oldDirX = dirX;
- dirX = dirX * cos(rotSpeed) - dirY * sin(rotSpeed);
- dirY = oldDirX * sin(rotSpeed) + dirY * cos(rotSpeed);
- oldPlaneX = planeX;
- planeX = planeX * cos(rotSpeed) - planeY * sin(rotSpeed);
- planeY = oldPlaneX * sin(rotSpeed) + planeY * cos(rotSpeed);
- }
- ML_display_vram();
- }
- return 1;
- }
- #pragma section _BR_Size
- unsigned long BR_Size;
- #pragma section
- #pragma section _TOP
- int InitializeSystem(int isAppli, unsigned short OptionNum)
- {
- return INIT_ADDIN_APPLICATION(isAppli, OptionNum);
- }
- #pragma section
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement