Коллизия в платформере. Как это подчинить.
<!DOCTYPE html> <html> <head> <canvas id="app">Your browser doesnt support the Canvas. Please update it to actual version.</canvas> </head> <body> <script defend src="js2d.js"></script> <script defend src="key.js"></script> <script defend src="engine.js"></script> <script> /*load game script*/ 'use strict' var game = { width: 800, height: 600, scene: 'loader' }; /*in this variable i contian all game configurations*/ /*and load canvas*/ var c = document.getElementById('app'); var ctx = c.getContext('2d'); c.width=game.width; c.height=game.height; /*load image*/ var loader_first = new Image(); var loader_second = new Image(); var loader_third = new Image(); loader_first.src="http://vkapilessons.esy.es/1.png"; loader_second.src="http://vkapilessons.esy.es/2.png"; loader_third.src="http://vkapilessons.esy.es/3.png"; var isLoad = false; /*create the loader*/ if(game.scene=='loader') { window.onload = function getLoader() { ctx.drawImage(loader_first,0,0,game.width,game.height); setTimeout( function() { ctx.clearRect(0,0,game.width,game.height); ctx.drawImage(loader_second,0,0,game.width,game.height); } , 900); setTimeout( function() { ctx.clearRect(0,0,game.width,game.height); ctx.drawImage(loader_third,0,0,game.width,game.height); isLoad=true; player.draw(); } , 1600); }; }; /*change gamescene*/ if(isLoad) { game.scene='gamelesson' }; /*global obj player with player.config*/ var player = { x:150, y: 250, width: 50, height: 50, /*player behv.*/ isRight: false, isLeft: false, isJump: false, isDestroy: false, speed: 3, draw: function drawPlayer() { clearCanvas(0,0,game.width,game.height); draw(player.x, player.y, player.width, player.height); map.draw(); } }; /*in this function we create the player-move*/ function movePlayerLeft() { clearCanvas(player.x, player.y, player.width, player.height); player.x-=player.speed player.draw() }; function movePlayerRight() { clearCanvas(player.x, player.y, player.width, player.height); player.x+=player.speed player.draw() }; var isJump = 0; function playerJump() { if (isJump==0) { setTimeout(function() { clearCanvas(player.x, player.y, player.width, player.height); player.y-=10; player.draw(); isJump = 1; },100); setTimeout(function(){ clearCanvas(player.x, player.y, player.width, player.height); player.y+=10; player.draw(); isJump=0; },300); }; }; /*big func to clear or draw canvas easy*/ function clearCanvas(x,y,width,height) { ctx.clearRect(x,y,width,height); }; function draw(x,y,width,height) { ctx.fillRect(x,y,width,height); }; /*in game loop we give keyCode and dofunc*/ startGame( function() { if(isKeyDown('D')) { movePlayerRight(); }; if(isKeyDown('A')) { movePlayerLeft(); }; if(isKeyDown('LEFT')) { movePlayerLeft(); }; if(isKeyDown('RIGHT')) { movePlayerRight(); }; if(isKeyDown('W')) { if(isJump==0) { playerJump(); }; }; if(isKeyDown('UP')) { if(isJump==0) { playerJump(); }; }; }); var map = { x: [150,350,480], y: [290,250, 250], w: [100,100, 250], h: [30,30,40], draw: function() { for(var i=map.x.length; i!=-1; i--) ctx.fillRect(map.x[i], map.y[i], map.w[i], map.h[i]); } }; var isCollision = 0; function checkCollision() { for(var i=map.x.length; i!=-1; i--){ if (player.x < map.x[i] + map.w[i] && player.x + player.width > map.x[i] && player.y < map.y[i] + map.h[i] && player.height + player.y > map.y[i]) { console.log('Hello motherfucker'); player.y=map.y[i]+map.w[i]; isCollision=1; var fall=0; } else { if(isCollision==0) { var fall = setInterval(function() { clearCanvas(player.x,player.y,player.width,player.height); player.y+=3; player.draw(); if(player.y>800) { clearInterval(fall) console.log('Fall has been stoped!:)') }; },10) fall(); }; }; }; }; var fall; function fall() { if(isCollision==0) { var fall; }; }; </script> </body> Содержимое файлов key.js и engine.js отвечают за клавишу и игровой цикл. Как я себе представляю механизм и вообще в чем проблема? Дело такое. Мне нужно постоянно (т.е., нужно действие в цикл засунуть, я бы это уже сделал, да только вот оно вообще не работает, цикл в функции startGame) сравнивать значения из массива мапы с координатами игрока, если все совпадает - игрок становится на координату платформы (player.y = map.y[i]+map.w[i]). Казалось бы все должно работать. но есть одно НО. В массиве несколько значений, а значит что для одной платформы - коллизия есть, для остальных нет, в следствии чего происходит и console.log() и fall();. Как я представлял себе решение задачи? var global=0 var try=0 while(global==0) { for() if() { global=1 } else { global==0 try++ If(try==map.x.lenght) { fall(); }; }; } но в данном случае значение функции - undefined. для запуска функции использовал консоль(checkCollision();) Что должно получится? персонаж должен уметь ходить и прыгать по платформам и падать, если не допрыгнул (стандартная механика платформера, короче). ОЧЕНЬ буду благодарен за помощь, заранее спасибо :) |
/*engine.js*/ var _renderer = (function() { return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || window.mozRequestAnimationFrame || function (callback) { setTimeout(callback,1000/60); }; })(); var _engine = function() { console.log('Игровой цикл не инициализирован!'); }; var startGame = function(game) { if(typeof game == 'function') { _engine = game; }; gameLoop(); }; var setGame = function(game) { if(typeof game == 'function') { _engine = game; }; }; var gameLoop = function() { _engine(); _renderer(gameLoop); }; |
/*key.js*/ var keys = { 'W':87, 'A':65, 'D':68, 'LEFT':37, 'RIGHT':39, 'UP':38 }; var keyDown = {}; var setKey = function (keyCode) { keyDown[keyCode] = true; }; var clearKey = function (keyCode) { keyDown[keyCode] = false; }; var isKeyDown = function (keyName) { return keyDown[keys[keyName]]==true; }; window.onkeydown = function(e) { setKey(e.keyCode); }; window.onkeyup = function(e) { clearKey(e.keyCode); }; |
P.S: решения не прошу. если можете - подкиньте идейку
|
Спасибо за помощь :)
|
АУ ТОВАРИЩИ?
вы спите? неужели никто не знает? мда.. |
Цитата:
В общем эльфы набигают грабить корованы. |
Это господа знаете, что такое?
If(try==map.x.lenght) Парень поцеловал девушку, после этого она сказала слово из трех букв, и в этом слове сделала три ошибки. Что она сказала? |
Цитата:
|
Цитата:
|
Ошибка? Какая еще ошибка? Тут нет никакой ошибки, тут просто голимый сюрреализм. Открой консоль браузера и почитай его мнение о твоем произведении.
If(try==map.x.lenght) js регистро-зависимый, нет такой конструкции If, сейчас js пытается вызвать функцию If(), правильно if try - зарезервированное слово под оператор блока try... catch x.lenght - опечатка, .length С русским у тебя такая же проблема. Я понял только про эльфов. ))) ЗЫ "в следствии". Внезапно это предлог, бывает такое в русском языке. Сейчас у тебя идет следствие по какому-то уголовному делу и в этом следствии - в следствии - происходит "чего" и вывод в консоль. Правильно: вследствие чего. |
Цитата:
var trycount = 0; var isCollision = setInterval( function checkCollision() { for(var i=0; i<=map.x.length; i++) { if(player.x < map.x[i] + map.w[i] && player.x + player.width > map.x[i] && player.y < map.y[i] + map.h[i] && player.height + player.y > map.y[i]) { i=map.x.length+1; /*close if*/} else { trycount++ var arrlong = 3; if (trycount==arrlong) { fall(); i = map.x.lenght+1 clearInterval(isCollision); }; }; }; },1); function fall() { var fallCount = 0; if(isJump==0) { var falIntrv = setInterval(function() { clearCanvas(player.x,player.y,player.width,player.height); player.y+=20; draw(player.x,player.y,player.width,player.height); fallCount++; if(fallCount==100) { clearInterval(falIntrv); player.isDestroy = true; }; },20) |
Прощаю. Теперь вопрос
Если проблема реальная, попробуй вернуть отступы в исходный код и без помощи эльфов объяснить, что не работает и как работать должно. ) |
Цитата:
<!DOCTYPE html> <html > <head> <canvas id = "app" > Your browser doesnt support the Canvas.Please update it to actual version. </canvas> </head> <body> <script defend src = "js2d.js"></script> <script defend src = "key.js"></script> <script defend src = "engine.js"> </script> <script> /*load game script*/ 'use strict' var game = { width: 800, height: 600, scene: 'loader' }; /*in this variable i contian all game configurations*/ /*and load canvas*/ var c = document.getElementById('app'); var ctx = c.getContext('2d'); c.width = game.width; c.height = game.height; /*load image*/ var loader_first = new Image(); var loader_second = new Image(); var loader_third = new Image(); loader_first.src = "http://vkapilessons.esy.es/1.png"; loader_second.src = "http://vkapilessons.esy.es/2.png"; loader_third.src = "http://vkapilessons.esy.es/3.png"; var isLoad = false; /*create the loader*/ if (game.scene == 'loader') { window.onload = function getLoader() { ctx.drawImage(loader_first, 0, 0, game.width, game.height); setTimeout( function() { ctx.clearRect(0, 0, game.width, game.height); ctx.drawImage(loader_second, 0, 0, game.width, game.height); }, 900); setTimeout( function() { ctx.clearRect(0, 0, game.width, game.height); ctx.drawImage(loader_third, 0, 0, game.width, game.height); isLoad = true; player.draw(); }, 1600); }; }; /*change gamescene*/ if (isLoad) { game.scene = 'gamelesson' }; /*global obj player with player.config*/ var player = { x: 150, y: 250, width: 50, height: 50, startX: 150, endX: 450, /*player behv.*/ isRight: false, isLeft: false, isJump: false, isDestroy: false, speed: 1, draw: function drawPlayer() { clearCanvas(0, 0, game.width, game.height); draw(player.x, player.y, player.width, player.height); map.draw(); }, }; /*in this function we create the player-move*/ function movePlayerLeft() { clearCanvas(player.x, player.y, player.width, player.height); player.x -= player.speed; player.draw() camera('right'); }; function movePlayerRight() { clearCanvas(player.x, player.y, player.width, player.height); player.x += player.speed; player.draw(); camera('left'); }; var isJump = 0; function playerJump() { if (isJump == 0) { setTimeout(function() { clearCanvas(player.x, player.y, player.width, player.height); player.y -= 10; player.draw(); isJump = 1; }, 100); setTimeout(function() { clearCanvas(player.x, player.y, player.width, player.height); player.y += 10; player.draw(); isJump = 0; }, 300); }; }; /*big func to clear or draw canvas easy*/ function clearCanvas(x, y, width, height) { ctx.clearRect(x, y, width, height); }; function draw(x, y, width, height) { ctx.fillRect(x, y, width, height); }; /*in game loop we give keyCode and dofunc*/ startGame( function() { if (isKeyDown('D')) { movePlayerRight(); }; if (isKeyDown('A')) { movePlayerLeft(); }; if (isKeyDown('LEFT')) { movePlayerLeft(); }; if (isKeyDown('RIGHT')) { movePlayerRight(); }; if (isKeyDown('W')) { if (isJump == 0) { playerJump(); }; }; if (isKeyDown('UP')) { if (isJump == 0) { playerJump(); }; }; if (player.x == 0 || player.x < 0) { clearCanvas(player.x, player.y, player.width, player.height); player.x = 0; draw(player.x, player.y, player.width, player.height); }; }); var map = { x: [150, 250, 350], y: [290, 250, 290], w: [100, 100, 100], h: [40, 40, 40], draw: function() { for (var i = map.x.length; i != -1; i--) { ctx.fillRect(map.x[i], map.y[i], map.w[i], map.h[i]); } } }; function camera(place) { if (place == 'right') { if (player.x > 0) { for (var i = map.x.length; i != -1; i--) { map.x[i]++; player.draw(); }; } else { clearCanvas(player.x, player.y, player.width, player.height); player.x = 0; draw(player.x, player.y, player.width, player.height); }; } else { if (player.x < 630) { for (var i = map.x.length; i != -1; i--) { map.x[i]--; player.draw(); }; } else { clearCanvas(player.x, player.y, player.width, player.height); player.x = 630; draw(player.x, player.y, player.width, player.height); }; } }; var trycount = 0; function collision() { if (isJump == 0) { for (var i = 0; i <= map.x.length; i++) { if (player.x <= map.x[i] + map.w[i] && player.x + player.width >= map.x[i] && player.y <= map.y[i] + map.h[i] && player.height + player.y >= map.y[i]) { console.log('cd'); i = map.x.lenght + 1; clearCanvas(player.x, player.y, player.width, player.height); map.draw(); player.y = map.y[i] - map.h[i] - 10; draw(player.x, player.y, player.width, player.height); } else { trycount++ if (trycount == map.x.length) { fall(); trycount = 0; }; }; }; }; }; function fall() { var fall = setInterval(function() { clearCanvas(player.x, player.y, player.width, player.height); player.y += 5 draw(player.x, player.y, player.width, player.height); map.draw(); if (player.y > 900) { clearInterval(fall); }; }, 1); }; </script> </body> </html> |
Ошибку нашел и исправил :)
просто player.y= нужно было переместить над i = map.x.lenght++ так как в данном случае i становился 4 а map[4] не существует :) |
Цитата:
Надо просто вычислять эти границы в координатах и сравнивать относительно 0, то есть вычитать. Если <=0, то соприкоснулись. Тут я дошел до границы своих возможностей. У меня графический моск, который арифметику не принимает. ) |
Цитата:
|
Цитата:
|
Часовой пояс GMT +3, время: 06:28. |