commit 68b5c32bbc87ba034a1d8c810613b98c2cc79590 Author: Markus Scully Date: Sat Jun 15 13:06:51 2013 +0100 Version 0.1 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..412eeda --- /dev/null +++ b/.gitattributes @@ -0,0 +1,22 @@ +# Auto detect text files and perform LF normalization +* text=auto + +# Custom for Visual Studio +*.cs diff=csharp +*.sln merge=union +*.csproj merge=union +*.vbproj merge=union +*.fsproj merge=union +*.dbproj merge=union + +# Standard to msysgit +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b9d6bd9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,215 @@ +################# +## Eclipse +################# + +*.pydevproject +.project +.metadata +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.classpath +.settings/ +.loadpath + +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" +*.launch + +# CDT-specific +.cproject + +# PDT-specific +.buildpath + + +################# +## Visual Studio +################# + +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.sln.docstates + +# Build results + +[Dd]ebug/ +[Rr]elease/ +x64/ +build/ +[Bb]in/ +[Oo]bj/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +*_i.c +*_p.c +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.log +*.scc + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +*.ncrunch* +.*crunch*.local.xml + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.Publish.xml +*.pubxml + +# NuGet Packages Directory +## TODO: If you have NuGet Package Restore enabled, uncomment the next line +#packages/ + +# Windows Azure Build Output +csx +*.build.csdef + +# Windows Store app package directory +AppPackages/ + +# Others +sql/ +*.Cache +ClientBin/ +[Ss]tyle[Cc]op.* +~$* +*~ +*.dbmdl +*.[Pp]ublish.xml +*.pfx +*.publishsettings + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file to a newer +# Visual Studio version. Backup files are not needed, because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +App_Data/*.mdf +App_Data/*.ldf + +############# +## Windows detritus +############# + +# Windows image file caches +Thumbs.db +ehthumbs.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Mac crap +.DS_Store + + +############# +## Python +############# + +*.py[co] + +# Packages +*.egg +*.egg-info +dist/ +build/ +eggs/ +parts/ +var/ +sdist/ +develop-eggs/ +.installed.cfg + +# Installer logs +pip-log.txt + +# Unit test / coverage reports +.coverage +.tox + +#Translations +*.mo + +#Mr Developer +.mr.developer.cfg diff --git a/favicon.png b/favicon.png new file mode 100644 index 0000000..0b0b647 Binary files /dev/null and b/favicon.png differ diff --git a/index.php b/index.php new file mode 100644 index 0000000..3770f05 --- /dev/null +++ b/index.php @@ -0,0 +1,21 @@ + + + + + + Sint + + + + + + + + + + \ No newline at end of file diff --git a/newsprites.png b/newsprites.png new file mode 100644 index 0000000..a6a4ec3 Binary files /dev/null and b/newsprites.png differ diff --git a/sint.js b/sint.js new file mode 100644 index 0000000..5a2297e --- /dev/null +++ b/sint.js @@ -0,0 +1,415 @@ +window.onload = function(){ + canvas = document.getElementById('game'); + context = canvas.getContext('2d'); + imagesLoading = 0; + reset(); +}; + +window.requestAnimFrame = (function(){ + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + window.msRequestAnimationFrame || + function(callback, element){ + window.setTimeout(callback, 1000 / 60); + }; +})(); + +// Set up variables. + +function reset(){ + actors = []; + controllers = []; + particles = []; + ais = []; + keys = []; + + actors[0] = new Actor(1, 200, 3, 5, 5); + actors[1] = new Actor(2, 200, 3, 50, 5); + + actors[2] = new Actor(2, 200, 1, 100, -100); + + controllers[0] = new Controller(actors[0], [[68, 'moveRight'], [65, 'moveLeft'], [87, 'jump'], [67, 'camera'], [77, 'flo', 100]]); + controllers[1] = new Controller(actors[1], [[39, 'moveRight'], [37, 'moveLeft'], [38, 'jump'], [88, 'camera'], [78, 'bounce', 100]]); + controllers[2] = new Controller(actors[2], [[90, 'camera']]); + + ais[0] = new Ai(actors[2], 'pace'); + + particles[0] = new Particle(0, 0, 2000, 100, 200, 10, 0); + + camera = [actors[0], actors[1]]; + canvas.style.background = '#fff'; + canvas.style.display = 'block'; + canvas.style.border = '1px solid #ddd' + spritesheet = new Image() + spritesheet.src = 'newsprites.png'; + document.addEventListener('keydown', keyDown, true); + document.addEventListener('keyup', keyUp, true); + animate(); +} + +level = [ + ['#...................#'] + ,['#...................#'] + ,['########............#'] + ,['################...##'] + ,['#####################'] + ] + +function animate() { + requestAnimFrame(animate); + loopGame(); +} + +function r(num){ + return Math.round(num); +} + +function keyDown(e){ + var keyPress; + if (typeof event !== 'undefined') { + keyPress = event.keyCode; + }else if(e){ + keyPress = e.which; + } + if(keys.indexOf(keyPress) == -1){ + keys.push(keyPress); + } +} + +function keyUp(e){ + var keyPress; + if (typeof event !== 'undefined') { + keyPress = event.keyCode; + }else if(e){ + keyPress = e.which; + } + keys.splice(keys.indexOf(keyPress), 1); +} + +// Define objects. + +function Controller(object, actions){ + this.actor = object; + this.checkKeys = function(){ + for(i in actions){ + if(keys.indexOf(actions[i][0]) > -1){ + this.actor.action(actions[i][1]); + } + } + this.actor.refreshActions(); + } +} + +function Ai(object, ai){ + this.actor = object; + this.aivars = [0, 0, 0]; + this.run = function(){ + switch(ai){ + case 'alphaBot': + var playerIndex = -1; + var topDistance = 400; + for(i in actors){ + if(actors[i].image == 0 && Math.abs(actors[i].x - this.actor) < topDistance){ + playerIndex = i; + topDistance = Math.abs(actors[i].x - this.actor) - 50; + } + } + if(playerIndex >= 0){ + + } + break; + case 'pace': + if(this.aivars[0] == 0 || this.actor.x < -300 || this.actor.x > 300){ + this.aivars[0] = (this.actor.x > 0 ? -1 : 1); + } + if(this.xvel == 0){ + this.action('jump'); + } + this.actor.xvel += ((0.02 * this.aivars[0]) * speed); + } + } +} + +function Actor(type, health, power, xpos, ypos){ + this.image = type; + this.health = health; + this.power = power; + this.xvel = this.yvel = this.jump = 0; + this.imageLoad = 2; + this.right = false; + this.left = false; + this.down = false; + this.up = false; + this.x = xpos; + this.y = ypos; + this.oneactions = []; + this.actionsturn = []; + + this.refreshActions = function(){ + this.oneactions = []; + for(i in this.actionsturn){ + this.oneactions.push(this.actionsturn[i]); + } + } + + this.action = function(type){ + switch(type){ + case 'moveLeft': + this.xvel -= (0.05 * speed); + break; + case 'moveRight': + this.xvel += (0.05 * speed); + break; + case 'jump': + this.yvel = (this.down ? -4 - this.power : this.yvel); + break; + case 'melee': + this.yvel = -6; + break; + case 'camera': + camera = [this]; + break; + case 'stream': + particles.push(new Particle(0, 0, 60000, this.x, this.y - 1, this.xvel * 3 + ((Math.random() - 0.5) * 10), -3 + this.yvel * 3)); + break; + case 'bounce': + particles.push(new Particle(1, 0, 5000, this.x, this.y - 1, this.xvel * 2 + ((Math.random() - 0.5) * 5), -5 + this.yvel * 3)); + break; + case 'flo': + particles.push(new Particle(2, 0, 100000, this.x, this.y - 16, this.xvel * 4 + ((Math.random() - 0.5) * 10), -10)); + break; + } + this.actionsturn.push(type); + } + + this.xCheck = function(){ + this.left = this.right = false; + for(j in actors){ + if(actors[j].image != this.image){ + if(actors[j].x + 17 > this.x && this.x > actors[j].x && this.sameY(actors[j])){ + this.left = true; + this.x = actors[j].x + 16; + this.xvel = (this.xvel < 0 ? 0 : this.xvel); + } + if(this.x + 17 > actors[j].x && this.x < actors[j].x && this.sameY(actors[j])){ + this.right = true; + this.x = actors[j].x - 16; + this.xvel = (this.xvel > 0 ? 0 : this.xvel); + } + } + } + } + + this.yCheck = function(){ + this.up = this.down = false; + if(this.y >= 216){ + this.down = true; + this.y = 216; + this.yvel = 0; + } + for(j in actors){ + if(actors[j].image != this.image){ + if(this.y + 15 > actors[j].y && this.y < actors[j].y + 15 && this.sameX(actors[j])){ + this.down = true; + this.y = actors[j].y - 18; + this.yvel = 0; + } + } + } + } + + this.sameY = function(obj){ + return (this.y < obj.y + 15 && this.y + 15 > obj.y); + } + + this.sameX = function(obj){ + return (this.x + 16 > obj.x && this.x < obj.x + 16); + } + + this.simulate = function(){ + this.y += this.yvel; + this.yCheck(); + if(this.down){ + if(this.yvel > 10){ + this.yvel *= -0.2; + this.y -= 1; + }else{ + this.yvel = 0; + } + }else{ + this.yvel += 0.03 * speed; + } + this.x += this.xvel; + this.xCheck(); + this.xvel /= 1 + (0.005 * speed); + } + + this.draw = function(){ + context.drawImage(spritesheet, this.image * 17, 0, 16, 16, r(this.x - lookx), r(this.y - 16 - looky), 16, 16); + context.globalAlpha = 1; + context.drawImage(spritesheet, this.image * 17, 17, 16, 16, r(this.x - lookx), r((216 - (this.y - 216)) - looky), 16, 16); + // StartX, StartY, EndX, EndY + var gradient = context.createLinearGradient(r(this.x - lookx), r((214 - (this.y - 216)) - looky - 5), r(this.x - lookx), r((214 - (this.y - 216)) - looky) + 16); + gradient.addColorStop(0.1, 'rgba(255, 255, 255, 0)'); + gradient.addColorStop(0.9, 'rgba(255, 255, 255, 1)'); + context.fillStyle = gradient; + context.fillRect(r(this.x - lookx), r((216 - (this.y - 216)) - looky), 16, 16); + context.globalAlpha = 1; + context.fillStyle = "#444"; + context.font = "10pt Arial"; + context.fillText(actors[0].sameY(actors[1]), 10, 100); + //context.fillText(particles[0].deleteme, 10, 120); + } + //this.xvel += (canMove(xpos, ypos, '-1', this.xvel)); +} + +function Particle(type, affiliation, lifespan, xpos, ypos, xvel, yvel){ + this.x = xpos; + this.y = ypos; + this.xvel = xvel; + this.yvel = yvel; + this.type = type; + this.life = lifespan; + this.size = [3, 5, 7][type]; + this.created = this.timeup = new Date(); + this.timeup = new Date(this.timeup.getTime() + lifespan); + this.deleteme = false; + var angle = Math.random() * 360 + this.addx = Math.sin(angle) * ((particles.length + 200) / 5); + this.addy = Math.cos(angle) * ((particles.length + 200) / 10); + + this.draw = function(){ + //context.beginPath(); + //context.rect(this.x, this.y, 3, 3); + switch(this.type){ + case 0: + context.globalAlpha = 1; + context.lineWidth = 1; + context.strokeStyle = '#66b'; + context.strokeRect(r(this.x - lookx) + 0.5, r(this.y - looky) + 0.5, 2, 2); + context.strokeStyle = '#aaf'; + context.strokeRect(r(this.x - lookx) + 0.5, r(213 - (this.y - 216) - looky) + 0.5, 2, 2); + break; + case 1: + context.globalAlpha = 1; + context.lineWidth = 2; + context.strokeStyle = '#b79'; + context.strokeRect(r(this.x - lookx) + 0.5, r(this.y - looky) + 0.5, 4, 4); + context.strokeStyle = '#fac'; + context.strokeRect(r(this.x - lookx) + 0.5, r(213 - (this.y - 216) - looky) + 0.5, 4, 4); + break; + case 2: + context.globalAlpha = 0.2; + context.lineWidth = 1; + context.strokeStyle = '#363'; + context.strokeRect(r(this.x - lookx) + 0.5, r(this.y - looky) + 0.5, 5, 5); + context.strokeStyle = '#7b7'; + context.strokeRect(r(this.x - lookx) + 0.5, r(213 - (this.y - 216) - looky) + 0.5, 5, 5); + context.globalAlpha = 1; + break; + } + } + + this.onGround = function(){ + return (this.y + this.size >= 216); + } + + this.simulate = function(){ + switch(this.type){ + case 0: + this.yvel += (this.onGround() ? 0 : 0.01 * speed); + this.xvel /= 1 + (0.005 * speed); + this.x += this.xvel; + this.y += this.yvel; + if(this.onGround()){ + this.y = 216 - this.size; + this.yvel = 0; + } + break; + case 1: + this.yvel += (this.onGround() ? 0 : 0.007 * speed); + this.xvel /= 1 + (0.001 * speed); + this.x += this.xvel; + this.y += this.yvel; + if(this.onGround()){ + this.y = 216 - this.size; + this.yvel = (this.yvel > 2 ? this.yvel * -0.7 : 0); + } + break; + case 2: + this.yvel /= 1 + (0.005 * speed); + this.xvel /= 1 + (0.005 * speed); + this.x += this.xvel; + this.y += this.yvel; + if(this.onGround()){ + this.y = 216 - this.size; + this.yvel = 0; + } + for(j in camera){ + var distance = Math.sqrt(Math.pow(camera[j].x - this.x, 2) + Math.pow(camera[j].y - this.y, 2)); + var xmov = camera[j].x - ((this.addx / (distance / 10)) + 8) - this.x; + var ymov = camera[j].y - ((this.addy / (distance / 10)) + 0) - this.y; + this.xvel += (xmov > 0 ? 1 : -1) / (((distance + 10) / 5) / Math.abs(xmov / 10)) + (Math.random() - 0.5) * 0.4; + this.yvel += (ymov > 0 ? 1 : -1) / (((distance + 10) / 5) / Math.abs(ymov / 10)) + (Math.random() - 0.5) * 0.4; + if(distance < 35 && this.y < camera[j].y && camera[j].yvel > -1){ + camera[j].yvel -= (this.y < 50 ? this.y / 3000 : 0.05) + } + } + break; + } + if(thisLoop > this.timeup){ + this.deleteme = true; + } + } +} + +// Run game. + +var speed; +var lastLoop = new Date(); +var thisLoop = lastLoop; +function loopGame(){ + canvas.style.margin = (window.innerHeight > 360 ? window.innerHeight / 2 - 180 + 'px auto' : '10px auto'); + lastLoop = thisLoop; + thisLoop = new Date(); + speed = (thisLoop - lastLoop); + speed = (speed > 50 ? 50 : speed); + context.clearRect(0, 0, 500, 350); + lookx = looky = 0; + looky = -0; + for(i in camera){ + lookx += (camera[i] instanceof Array ? camera[i][0] : camera[i].x) - 250; + // looky += (camera[i] == instanceof Array ? camera[i][1] : camera[i].y) - 175; + } + lookx /= camera.length; + looky /= camera.length; + /* + if( instanceof Array){ + lookx = camera[0]; + looky = camera[1]; + }else{ + lookx = camera.x - 250 + camera.xvel * 5; + looky = 0; + } + */ + for(i in controllers){ + controllers[i].checkKeys(); + } + for(i in actors){ + actors[i].simulate(); + actors[i].draw(); + } + for(i in ais){ + ais[i].run(); + } + for(i in particles){ + particles[i].simulate() + particles[i]. draw() + if(particles[i].deleteme || particles.length > 3000){ + particles.splice(i, 1); + i--; + } + } +} \ No newline at end of file diff --git a/sprites.png b/sprites.png new file mode 100644 index 0000000..212c69d Binary files /dev/null and b/sprites.png differ diff --git a/sprites2.png b/sprites2.png new file mode 100644 index 0000000..8e1be95 Binary files /dev/null and b/sprites2.png differ