Justin Ma Talk - Into the Breach
Built with blockbuilder.org
| license: mit |
Justin Ma Talk - Into the Breach
Built with blockbuilder.org
| /* | |
| AOE | |
| actorData | |
| 1. parabolic arc to target square | |
| 2. show that surrounding squares will be affected | |
| 3. light up surrounding squares | |
| */ | |
| const cellSkins = d3.selectAll(".cell"); | |
| const actorSkins = d3.selectAll(".actor"); | |
| const fireEffect = target => { | |
| } | |
| const aoe = (targets,duration,dely) => { | |
| const handleEnd = () => { | |
| console.log("handle aoe end"); | |
| } | |
| const afftectTarget = target => { | |
| d3.select(target) | |
| .select("rect") | |
| .transition() | |
| .duration(duration) | |
| .delay(delay) | |
| .attr("fill", "red") | |
| .on("end", handleEnd); | |
| } | |
| targets | |
| .each(target, afftectTarget); | |
| } | |
| const getSkinTrans = target => { | |
| const HALF = Math.floor((CELL_SIZE / 2) - (ACTOR_SIZE /2)); | |
| return `translate (${target.x * CELL_PAD + HALF },${target.y * CELL_PAD + HALF})`; | |
| } | |
| // move wizard down to bottom left corner | |
| function moveActor(profession,target,onCompleteCallback,duration,delay){ | |
| d3.select(`#${profession}`) | |
| .transition() | |
| .duration(duration) | |
| .delay(delay) | |
| .attr("transform", d => getSkinTrans(target)) | |
| .on("end", d => onCompleteCallback(d,profession)); | |
| } | |
| const onCompleteCallback = (d,profession) => { | |
| console.log(`${profession} all done`); | |
| } | |
| moveActor("wizard", {x: 0,y:3},onCompleteCallback,3000,0); | |
| <!DOCTYPE html> | |
| <head> | |
| <meta charset="utf-8"> | |
| <script src="https://d3js.org/d3.v5.min.js"></script> | |
| <style> | |
| body { margin:0;position:fixed;top:0;right:0;bottom:0;left:0; } | |
| </style> | |
| </head> | |
| <body> | |
| <script src="meadow.js"></script> | |
| <script src="aoe.js"></script> | |
| <!--<script src="serra.js"></script>--> | |
| </body> |
| // Feel free to change or delete any of the code you see in this editor! | |
| const svg = d3.select("body").append("svg") | |
| .attr("width", 960) | |
| .attr("height", 500) | |
| const getGridData = (total) => { | |
| const gridData = []; | |
| const flatGrid = []; | |
| for (let i=0; i<total;i++){ | |
| if (!gridData[i]) gridData[i] = []; | |
| for (let j=0; j<total;j++){ | |
| if (!gridData[i][j]) gridData[i][j] = []; | |
| gridData[i][j].push({x: j, y: i, type: "floor"}) | |
| flatGrid.push({x: j, y: i, type: "floor"}); | |
| } | |
| } | |
| return flatGrid; | |
| } | |
| const gridData = getGridData(4); | |
| const meadow = d3.select("svg") | |
| .append("g") | |
| .attr("transform","translate (20,20)") | |
| .attr("id","meadow"); | |
| const stage = d3.select("svg") | |
| .append("g") | |
| .attr("transform","translate (20,20)") | |
| .attr("id","stage"); | |
| const grid = meadow.selectAll("g").data(gridData); | |
| const CELL_SIZE = 40; | |
| const CELL_PAD = CELL_SIZE + 2; | |
| const getTrans = d => { | |
| return `translate (${d.x * CELL_PAD},${d.y * CELL_PAD})`; | |
| } | |
| const gridEnter = grid.enter(); | |
| const gridG = gridEnter.append("g") | |
| .attr("class", "cell") | |
| .attr("transform", getTrans ); | |
| gridG | |
| .append("rect") | |
| .attr("width", CELL_SIZE) | |
| .attr("height", CELL_SIZE) | |
| .style("fill", "green"); | |
| // add actors | |
| const ACTOR_SIZE = 10; | |
| const ACTOR_PAD = 12; | |
| const professions = ["thief", "wizard", "warrior", "cleric"]; | |
| const fighters = [ | |
| {name: "Glendra", profession: "thief", color:"black", type: "actor"}, | |
| {name: "Allsion", profession: "wizard", color:"white", type: "actor"}, | |
| {name: "Bearheart", profession: "warrior",color:"darkred", type: "actor"}, | |
| {name: "Sensulla", profession: "cleric", color:"pink", type: "actor"} | |
| ] | |
| const actorData = fighters; | |
| const getActorTrans = (d,i) => { | |
| const cell = gridData[i]; | |
| const HALF = Math.floor((CELL_SIZE / 2) - (ACTOR_SIZE /2)); | |
| return `translate (${cell.x * CELL_PAD + HALF },${cell.y * CELL_PAD + HALF})`; | |
| } | |
| const actors = stage.selectAll("g").data(actorData); | |
| const actorsG = actors.enter() | |
| .append("g") | |
| .attr("class", "actor") | |
| .attr("id", d => d.profession) | |
| .attr("transform", getActorTrans); | |
| actorsG | |
| .append("rect") | |
| .attr("width", ACTOR_SIZE) | |
| .attr("height", ACTOR_SIZE) | |
| .style("fill", d => d.color); |
| // serra parabolic arc angel | |
| //The data for our line | |
| const lineDataa = [ { "x": 1, "y": 30}, { "x": 20, "y": 20}, | |
| { "x": 40, "y": 10}, { "x": 60, "y": 40}, | |
| { "x": 80, "y": 5}, { "x": 100, "y": 60}]; | |
| const lineDataB = [ { "x": 1, "y": 30}, { "x": 25, "y": 11}, | |
| { "x": 30, "y": 5}, { "x": 60, "y": 27}, | |
| { "x": 102, "y": 80}, { "x": 7, "y": 34}]; | |
| const calcDist = (x1,x2,y1,y2) => { | |
| return Math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2); | |
| } | |
| const createLineDate = (start,end,total) => { | |
| const lineData = []; | |
| const dist = calcDist(start.x,end.x,start.y,end.y); | |
| const inc = Math.floor(dist / 5); | |
| const totalPoints = [...Array(total).keys()]; | |
| let up = true; | |
| totalPoints.map( idx => { | |
| let x,y; | |
| if (up){ | |
| lineData.push({x: start.x + (inc * idx), y: start.y + inc}) | |
| } else { | |
| lineData.push({x:start.x + (inc * idx), y:start.y - inc}) | |
| } | |
| up = !up; | |
| }); | |
| return lineData; | |
| } | |
| const lineData = createLineDate({x: 0, y: 200}, {x: 400, y:200}) | |
| console.log(lineData) | |
| //This is the accessor function we talked about above | |
| const lineFunction = d3.line() | |
| .x(function(d) { return d.x; }) | |
| .y(function(d) { return d.y; }) | |
| .curve(d3.curveLinear) | |
| //The SVG Container | |
| const svgContainer = d3.select("svg"); | |
| let count = 0; | |
| function lightening() { | |
| const action = (count < 5) ? lightening : null; | |
| count++; | |
| d3.active(this) | |
| .attr("stroke", "white") | |
| .attr("d", lineFunction(lineData)) | |
| .transition() | |
| .attr("stroke", "blue") | |
| .attr("transform","translate(150,190)") | |
| .attr("d", lineFunction(lineDataB)) | |
| .transition() | |
| .on("start", action) | |
| } | |
| const lineGraph = svgContainer | |
| .append("path") | |
| .attr("d", lineFunction(lineData)) | |
| .attr("stroke", "blue") | |
| .attr("stroke-width", 2) | |
| .attr("transform","translate(100,200)") | |
| .attr("fill", "none") | |
| .transition() | |
| .duration(200) | |
| .on("start", lightening); |