Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 27.11.2017, 18:24
Новичок на форуме
Отправить личное сообщение для Arr0w_ Посмотреть профиль Найти все сообщения от Arr0w_
 
Регистрация: 27.11.2017
Сообщений: 1

Помогите с созданием коллизии
Здресте, у меня есть что-то похожее на платформер, нужно сдлеать коллизию игрока с платформами.
function Game(window) {
    var width = window.innerWidth - 20;
    var height = window.innerHeight - 20;

    var canvas = document.getElementById("game")
    canvas.setAttribute("width", width+"px")
    canvas.setAttribute("height", height+"px")
    var context = canvas.getContext("2d");

    var player = new Player();
    var platforms = new Platforms();

    this.draw = function() {
//        console.log('Game.draw:');
	context.clearRect(0, 0, width, height)
        platforms.draw(context);
        player.draw(context);
    }

    function on_tick(obj) {
        var player_changed = player.on_tick();
            obj.draw();
    }

    this.start = function() {
        platforms.load();
        this.timer_id = setInterval(on_tick, 10, this);
        this.draw();
    }

    window.onkeyup = function(event) {
//        console.log('Game.on_key_up:', event.key);
        if (event.key == 'ArrowRight') {
            player.stop();
        }
        if (event.key == 'ArrowLeft') {
            player.stop();
        }
        if(event.key == 'ArrowUp'){
            player.stop();
        }
        return false;
    }
    
    window.onkeydown = function(event) {
//        console.log('Game.on_key_down:', event.key);
        if (event.key == 'ArrowRight') {
            player.start_normal();
        }
        if (event.key == 'ArrowLeft') {
            player.start_reverse();
        }
        if(event.key == 'ArrowUp'){
            player.start_up();
        }
        return false;
    }
}


function Brick(width, height, src) {
    this.width = width;
    this.height = height;
    this.image = new Image(width, height);
    this.image.src = src
}

function Platforms() {
    var data = [];
    var objects = { 'brick' : new Brick(20, 20, 'images/brick.png')};
    
    this.draw = function(context) {
//        console.log('Platforms.draw:');
        for(i=0; i<data.length; i++) {
            var platform = data[i];
//            console.log('platform:', platform);
            var p_object = objects[platform.type];
	    var x_start = platform.x;
	    var y_start = platform.y;
	    var x_number = platform.width / p_object.width;
	    var y_number = platform.height / p_object.height;
//
	    for(k=0; k<x_number; k++) {
		for(l=0; l<y_number; l++) {
		    context.drawImage(p_object.image, x_start + p_object.width * k, y_start + p_object.height * l, p_object.width, p_object.height);
		}
	    }
        }
    }

    this.load = function() {
        data = [
	    {x: 50, y: 450, width: 1000, height: 10, type: "brick", shm: false},
	    {x: 200, y: 350, width: 100, height: 10, type: "brick", shm: false}
        ];
    }
}


function Player() {
    var width = 24;
    var height = 40;
    var x = 0.0;
    var y = 0.0;
    var reverse = false;
    var velocity_x = 5.0;
    var velocity_y = 0.0;
    var runned = false;
    var fly = false;
    var jump =false;
    var setting_jump=0;
    var on_jump = false;
//
    var image_normal = new Image(width, height);
    image_normal.src = 'images/hero_normal.png';
//
    var image_reverse = new Image(width, height);
    image_reverse.src = 'images/hero_reverse.png';

    this.draw = function(context) {
//        console.log('Player.draw:');
        image = reverse ? image_reverse : image_normal;
	context.drawImage(image, x, y, width, height);
    }

    this.on_tick = function() {
        var changed = false;
        if (runned) {
            var old_x = Math.round(x);
            var old_y = Math.round(y);
            var v_x = reverse ? -velocity_x : velocity_x;
            var v_y = reverse ? -velocity_y : velocity_y;
            x += v_x; y += v_y;
//        console.log('old_x:', old_x, 'old_y:', old_y, 'x:', Math.round(x), 'y:', Math.round(y));
            if ((Math.round(x) != old_x) || (Math.round(y) != old_y)) {
                changed = true;
            }
        }
        if(fly){
            y+=4;
        }
        if (x>=50&&x<=1050&&y>=410&&y<=420) { //затычка
            fly=false;
        }
        else{
            fly=true;
        }
        if (jump||on_jump) {
            setting_jump+=1;
            on_jump=true;
        }
        if (setting_jump>0) {
            y-=10;
            setting_jump+=1;
            if(setting_jump>40){
                setting_jump=0;
                jump=false;
                on_jump=false;
            }

        }

        
        return changed;
    }
    
    this.start_normal = function() {
        reverse = false;
        runned = true;
    }

    this.start_reverse = function() {
        reverse = true;
        runned = true;
    }

    this.stop = function() {
        runned = false;
        jump = false;
    }
    this.start_up = function()
    {
        if(x>=50&&x<=1050&&y>=410&&y<=420){
        jump=true
        }
    }

    /*this.colision=function{
        for(int i=0;i<this.platforms..length;i++)
        if()
    }*/

}


PS. До этого она была сделана так
var resultforloop = false;
	for(i=0;i<this.platforms[level].length;i++) {
		if(this.detectCollision(player, this.platforms[level][i])) {
			resultforloop = true;
			player.collided = true;
			
			if(player.y + player.height - this.platforms[level][i].y < 10) {
				if(this.platforms[level][i].shm == true) {
						if(this.platforms[level][i].shm_info.shm_in == "x") {
						if(this.platforms[level][i].shm_info.moving_positive == true) player.x  += 0.5;
						else player.x  -= 0.5;


Но препод заставил переписать код.
Сессия через 2 недели хз что делать.
Ответить с цитированием
  #2 (permalink)  
Старый 29.11.2017, 16:45
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Arr0w_,
Что за компот?) Из разных игр что-ли? Не работает? 2D collision detection
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите с созданием функции Haklag jQuery 1 21.08.2012 19:31
Помогите с созданием простого скрипта Sashok) Элементы интерфейса 11 24.02.2012 15:50
Помогите с созданием нового объекта yambbkru Общие вопросы Javascript 35 08.09.2011 15:06
Помогите с созданием обменного пункта dikabraz Работа 2 23.04.2011 22:17
Пожалуйста, помогите с созданием скрипта! Елизавета Общие вопросы Javascript 10 08.06.2010 13:20