// WASD to move. // QE to strafe. // C to stop. // Hold shift to turn vehicle to cursor. // Hold G to exit vehicle. //Help request: why does rotate-to-mouse tracking reset when the mouse is at the left side? angleMode = "degrees"; rectMode(CENTER); noStroke(); var keys = []; var W = 87; var A = 65; var S = 83; var D = 68; var G = 71; var C = 67; var Q = 81; var E = 69; var SPACE = 32; var shotvars = { bullet: {speed:2,range:300} }; var bullets = []; keys[71] = false; var speedmod = 0.2; var grid = function(size) { stroke(200,200,200); strokeWeight(1); for (var i = 0; i < size; i += 50) { line(i-size/2,0-size/2,i-size/2,size/2); for (var q = 0; q < size; q += 50) { line(size/2,q-size/2,0-size/2,q-size/2); } } noStroke(); }; var shoot = function(startx,starty,x,y,tarx,tary,t) { //this.x = x; //this.y = y; //this.tarx = tarx; //this.tary = tary; this.a = atan2(tarx-starty,tary-startx); if (t === "bullet") { stroke(0,0,0); strokeWeight(2); //x += cos(this.a)*shotvars.bullet.speed; //y += sin(this.a)*shotvars.bullet.speed; line(startx,starty,startx-mouseX,starty-mouseY); bullets.push(x,y,tarx,tary); noStroke(); //println(floor(startx-mouseX)); } }; // Shipmods var gun = function(occ,x,y,tarx,tary,a) { this.a = a; this.x = x; this.y = y; if (occ) { this.a = atan2(mouseY-width/2,mouseX-height/2)+90; if (keys[SPACE]) { shoot(x,y,this.x,this.y,tarx,tary,"bullet"); } } pushMatrix(); translate(x,y); rotate(this.a); fill(20,20,20); rect(0,0,7,20); popMatrix(); }; var engine = function(){}; //Work on this. var cargobay = function(){}; // And this. var shipvars = [ {type:"ship",x:100,y:100,a:30,w:15,h:40,speed:8,agility:6,acc:3,xsp:0,ysp:0,modules:[gun]}, {type:"ship",x:200,y:300,a:80,w:40,h:80,speed:3,agility:2,acc:0.3,xsp:0,ysp:0,modules:[]}]; var char = { maxhealth:10, speed:10, strength:10, mago:0, x:200, y:200, a:0, inship: false, setup : function(cla) { char.c = cla; if (char.c === "fight") { char.maxhealth = 15; char.strength = 15; char.speed = 5; } else if (char.c === "mage") { char.maxhealth = 5; char.speed = 12; char.mago = 5; } else if (char.c === "tink") { char.maxhealth = 8; char.speed = 12; char.mechan = 5; } }, disp : function() { fill(255,0,0); if (!char.inship) { pushMatrix(); translate(char.x,char.y); rotate(char.a); rect(0,0,15,15); popMatrix(); } }, move : function() { char.a = atan2(mouseY-width/2,mouseX-height/2); if (char.inship === false) { if (keys[W]){ char.y -= speedmod*char.speed; } if (keys[S]){ char.y += speedmod*char.speed; } if (keys[A]){ char.x -= speedmod*char.speed; } if (keys[D]){ char.x += speedmod*char.speed; } } if (char.inship === true) { if (keys[G]) { char.inship = false; } } }, }; var displayship = function(control) { if (control.a > 360) { control.a = 0; } if (control.type === "ship") { var acc = control.acc*speedmod; control.x += control.xsp; control.y += control.ysp; if (control.xsp > control.speed) { control.xsp = control.speed; } else if (control.xsp < -control.speed) { control.xsp = -control.speed; } if (control.ysp > control.speed) { control.ysp = control.speed; } else if (control.ysp < -control.speed) { control.ysp = -control.speed; } if (char.inship === true && control.occupied === true) { char.a = control.a; if (keys[SHIFT]) { if (control.a < atan2(mouseY-width/2,mouseX-height/2)-90) { control.a += control.agility; } if (control.a > atan2(mouseY-width/2,mouseX-height/2)-90) { control.a -= control.agility; } } if (keys[W]){ control.xsp += cos(control.a+90)*acc; control.ysp += sin(control.a+90)*acc; } if (keys[S]){ control.xsp -= cos(control.a+90)*acc; control.ysp -= sin(control.a+90)*acc; } if (keys[Q]){ control.xsp += cos(control.a)*acc; control.ysp += sin(control.a)*acc; } if (keys[E]){ control.xsp -= cos(control.a)*acc; control.ysp -= sin(control.a)*acc; } if (!keys[SHIFT]) { if (keys[A]){ control.a -= control.agility; } if (keys[D]){ control.a += control.agility; } } if (keys[C]){ // Slow down if (control.xsp >= 0+acc) { control.xsp -= acc; } if (control.xsp <= 0-acc) { control.xsp += acc; } if (control.ysp >= 0+acc) { control.ysp -= acc; } if (control.ysp <= 0-acc) { control.ysp += acc; } // Finish it off if (control.xsp <= acc && control.xsp > 0) { control.xsp = 0; } if (control.xsp >= -acc && control.xsp < 0) { control.xsp = 0; } if (control.ysp <= acc && control.ysp > 0) { control.ysp = 0; } if (control.ysp >= -acc && control.ysp < 0) { control.ysp = 0; } } } } // Standard things fill(55,55,55); pushMatrix(); translate(control.x,control.y); rotate(control.a); rect(0,0,control.w,control.h); fill(30,30,30); rect(0,control.h/2,control.w,control.h/10); popMatrix(); if (control.check) { char.inship = true; control.occupied = true; char.x = control.x; char.y = control.y; } if (dist(char.x,char.y,control.x,control.y) <= control.w/2 && keys[G] !== true && char.inship === false) { control.check = true; } else if (dist(char.x,char.y,control.x,control.y) > control.w/2 && keys[G] === true) { char.inship = false; control.occupied = false; } if (keys[G]) { control.check = false; } for (var i = 0; i < control.modules.length; i ++) { control.modules[i](control.occupied,control.x,control.y,mouseX-control.x,mouseY-control.y,control.a); } }; var runships = function(level) { for (var i = 0; i < level.length; i ++) { displayship(level[i]); } }; char.setup("mage"); var draw = function() { background(255, 255, 255); pushMatrix(); translate(-char.x+width/2,-char.y+height/2); grid(3000); runships(shipvars); char.disp(200,200); char.move(); popMatrix(); }; keyPressed = function() { keys[keyCode] = true; //println(keyCode); }; keyReleased = function() { keys[keyCode] = false; };