Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- int mapsizex = 20;
- int mapsizey = 20;
- float xintersect, yintersect;
- float [] xintersects = new float[mapsizex+10];
- float [] yintersects = new float[mapsizey+10];
- int[][] playfield = new int[mapsizex+5][mapsizey+5];
- float xhit1, xhit2, yhit1, yhit2, height1, height2, dist;
- int fov = 90;
- float degrees = 0;
- boolean view = false;
- player player1;
- void setup() {
- size (800, 600);
- for (int i = 1; i < mapsizex+1; i++) {
- playfield[i][1] = 1;
- playfield[1][i] = 1;
- playfield[mapsizex][i] = 1;
- playfield[i][mapsizey] = 1;
- playfield[i][2] = 1;
- playfield[2][i] = 1;
- playfield[mapsizex-1][i] = 1;
- playfield[i][mapsizey-1] = 1;
- }
- for (int i = 1; i < 5; i++) {
- playfield[i][5] = 1;
- playfield[7][5+i] = 1;
- playfield[i][15] = 2;
- playfield[12][5+i] = 4;
- playfield[i][11] = 3;
- playfield[2][9+i] = 1;
- }
- player1 = new player(10, 10.5, 145.001);
- player1.xpos+= 0.1*sin(radians(player1.direction));
- player1.ypos+= 0.1*cos(radians(player1.direction));
- player1.modifyvdirection(0);
- }
- boolean [] keys = new boolean[256];
- boolean [] lastKeys = new boolean[256];
- PVector hitFwd = new PVector(0,0);
- PVector hitRev = new PVector(0,0);
- void keyPressed() {
- int rawKey = key;
- if (rawKey < 256) {
- if ((rawKey>64)&&(rawKey<91)) rawKey+=32;
- keys[rawKey] = true;
- }
- }
- void keyReleased() {
- int rawKey = key;
- if (rawKey < 256) {
- if ((rawKey>64)&&(rawKey<91)) rawKey+=32;
- keys[rawKey] = false;
- }
- }
- float turnSpeed = 2.0;
- float moveSpeed = 0.1;
- float minWallDist = 0.2;
- void draw() {
- background(0);
- stroke(255);
- if (keys['v'] && !lastKeys['v']) view = !view;
- if (keys['a']) player1.modifydirection(turnSpeed);
- if (keys['d']) player1.modifydirection(-turnSpeed);
- int mov = 0;
- PVector hitLoc = new PVector(0,0);
- if (keys['w']) {
- hitLoc = hitFwd;
- mov = 1;
- }
- if (keys['s']) {
- hitLoc = hitRev;
- mov = -1;
- }
- float radians = (player1.direction/360.0) * -TWO_PI + HALF_PI;
- PVector requestedMove = new PVector(mov*moveSpeed, 0).rotate(radians);
- //Collision detection
- PVector playerLoc = new PVector( player1.xpos, player1.ypos);
- float dist = (playerLoc.copy().add(requestedMove)).dist(hitLoc);
- float distInv = 1.0 - dist/minWallDist;
- if (dist < minWallDist) {
- requestedMove.mult(-distInv);
- }
- player1.xpos += requestedMove.x;
- player1.ypos += requestedMove.y;
- ellipseMode(CENTER);
- if (!view) {
- for (int j = 1; j < mapsizex+1; j++) {
- for ( int i = 1; i < mapsizey+1; i++) {
- fill(playfield[j][i]*63);
- rect(j*30-30, i*30-30, 30, 30);
- }
- }
- ellipse(player1.xpos*30-30, player1.ypos*30-30, 10, 10);
- line (player1.xpos*30-30, player1.ypos*30-30, player1.xpos*30-30+500*sin(radians(player1.direction)), player1.ypos*30-30+500*cos(radians(player1.direction)));
- } else {
- fill (64, 128, 255);
- rect(0, 0, 800, 300);
- }
- for (int i = 450; i > -450; i--) {
- degrees = i/16.0;
- player1.modifyvdirection(degrees);
- calculateintersects();
- if (view) {
- dist = cos(radians(degrees))*sqrt((player1.xpos-xhit1)*(player1.xpos-xhit1)+(player1.ypos-yhit1)*(player1.ypos-yhit1));
- stroke(int(255/(dist/2)));
- if (dist < 2) {
- stroke(255);
- line(400-i, 0, 400-i, 600.0);
- } else {
- line(400-i, 300-(600.0/dist)*height1, 400-i, 300+600.0/dist);
- }
- } else {
- stroke(0, 255, 255);
- ellipse(xhit1*30-30, yhit1*30-30, 3, 3);
- if (i==0) {
- hitFwd = new PVector(xhit1, yhit1);
- ellipse(xhit1*30-30, yhit1*30-30, 6, 6);
- }
- }
- }
- lastKeys = keys.clone();
- }
- void calculateintersects() {
- if (((player1.vdirection >= 0) && (player1.vdirection < 90)) || ((player1.vdirection >= 270) && (player1.vdirection < 360))) {
- xintersect = player1.xpos+(1-player1.dypos())*tan(radians(player1.vdirection));
- } else {
- xintersect = player1.xpos-(player1.dypos())*tan(radians(player1.vdirection));
- }
- if ((player1.vdirection >= 0) && (player1.vdirection < 180)) {
- yintersect = player1.ypos+(1-player1.dxpos())/tan(radians(player1.vdirection));
- } else {
- yintersect = player1.ypos-(player1.dxpos())/tan(radians(player1.vdirection));
- }
- for (int i = 0; i <= mapsizex; i++) {
- if ((player1.vdirection > 90) && (player1.vdirection < 270)) {
- xintersects[i] = player1.xpos+(xintersect-player1.xpos)/player1.dypos()*(player1.dypos()+i);
- if (xintersects[i]<0) {
- yhit1 = -100;
- break;
- }
- if (xintersects[i]>mapsizex) {
- yhit1 = 100;
- break;
- }
- if (playfield[int(xintersects[i])][int(player1.ypos-player1.dypos()-i-1)]>0) {
- xhit1 = xintersects[i];
- yhit1 = player1.ypos-player1.dypos()-i;
- height1 = playfield[int(xintersects[i])][int(player1.ypos-player1.dypos()-i-1)];
- break;
- }
- } else {
- xintersects[i]=player1.xpos+(xintersect-player1.xpos)/(1-player1.dypos())*(1-player1.dypos()+i);
- if (xintersects[i]>mapsizex) {
- yhit1 = 100;
- break;
- }
- if (xintersects[i]<0) {
- yhit1 = -100;
- break;
- }
- if (playfield[int(xintersects[i])][int(player1.ypos-player1.dypos()+i+1)]>0) {
- xhit1 = xintersects[i];
- yhit1 = player1.ypos-player1.dypos()+i+1;
- height1 = playfield[int(xintersects[i])][int(player1.ypos-player1.dypos()+i+1)];
- break;
- }
- }
- }
- for (int i = 0; i <= mapsizey; i++) {
- if ((player1.vdirection > 0) && (player1.vdirection < 180)) {
- yintersects[i] = player1.ypos+(yintersect-player1.ypos)/(1-player1.dxpos())*(1-player1.dxpos()+i);
- if (yintersects[i]<0) {
- xhit2 = -100;
- break;
- }
- if (yintersects[i]>mapsizey) {
- xhit2 = 100;
- break;
- }
- if (playfield[int(player1.xpos-player1.dxpos()+i+1)][int(yintersects[i])]>0) {
- xhit2 = player1.xpos-player1.dxpos()+i+1;
- yhit2 = yintersects[i];
- height2 = playfield[int(player1.xpos-player1.dxpos()+i+1)][int(yintersects[i])];
- break;
- }
- } else {
- yintersects[i] = player1.ypos+(yintersect-player1.ypos)/player1.dxpos()*(player1.dxpos()+i);
- if (yintersects[i]<0) {
- xhit2 = -100;
- break;
- }
- if (yintersects[i]>mapsizey) {
- xhit2 = 100;
- break;
- }
- if (playfield[int(player1.xpos-player1.dxpos()-i-1)][int(yintersects[i])]>0) {
- xhit2 = player1.xpos-player1.dxpos()-i;
- yhit2 = yintersects[i];
- height2 = playfield[int(player1.xpos-player1.dxpos()-i-1)][int(yintersects[i])];
- break;
- }
- }
- }
- if (((player1.xpos-xhit2)*(player1.xpos-xhit2)+(player1.ypos-yhit2)*(player1.ypos-yhit2))<(player1.xpos-xhit1)*(player1.xpos-xhit1)+(player1.ypos-yhit1)*(player1.ypos-yhit1)) {
- xhit1 = xhit2;
- yhit1 = yhit2;
- height1 = height2;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement