javascript - 碰撞适用于顶部,但不适用于底部

标签 javascript canvas

我的游戏测试环境中有一个矩形,我试图让它与其发生碰撞。自从我编写了正确的代码以来,碰撞就适用于顶部。然而,我在尝试让它与矩形的底部碰撞时遇到了很多困难。

我已经尝试过更改 x 和 y 并将它们交换出来。我也尝试过更改比较功能。我想过完全切换它们,但我认为这也行不通。

        var canvas = document.getElementById("gametester");
        var ctx = canvas.getContext("2d");
        
        var canvasWidth = canvas.width;
        var canvasHeight = canvas.height;

	   rectWidth = 100;
       rectHeight = 50;
       var redX = canvasWidth / 2 - rectWidth / 2; 
       var redY = canvasHeight / 2 - rectHeight / 2; 
       var redDx = 0;
       var redDy = 0;
       var speed = 2;

      
       rectWidth = 100;
       rectHeight = 50;
       var blueX = canvasWidth / 2 - rectWidth / 2; 
       var blueY = canvasHeight / 2 - rectHeight / 2; 
       var blueDx = 0;
       var blueDy = 0;
       var speed = 2;
       var rectTwoColour = "blue";


        
        var dx = 0;
        var dy = 0;
        var speed = 2;

        function rectangle(x, y, w, h, c) {
            ctx.beginPath();
            ctx.rect(x, y, w, h);
            ctx.fillStyle = c;
            ctx.fill();
            ctx.closePath();
        }
		
		
		var rightPressed = false;
		var leftPressed = false;
		var upPressed = false;
		var downPressed = false;
		
		
		document.addEventListener("keydown", keyDownHandler, false);
		document.addEventListener("keyup", keyUpHandler, false);
		
		
		function keyDownHandler(e) {
					if (e.keyCode == 39) {
						rightPressed = true;
					} else if (e.keyCode == 37) {
						leftPressed = true;
					} else if (e.keyCode == 38) {
						upPressed = true;
					} else if (e.keyCode == 40) {
						downPressed = true;
					}
				}
		
				function keyUpHandler(e) {
					if (e.keyCode == 39) {
						rightPressed = false;
					} else if (e.keyCode == 37) {
						leftPressed = false;
					} else if (e.keyCode == 38) {
						upPressed = false;
					} else if (e.keyCode == 40) {
						downPressed = false;
					}
				}

			function collision(){
       
           var collide = false;
          
           if (blueY>=redY && blueY <= redY + rectHeight){
         
           if (redX + rectWidth >= blueX && redX + rectWidth <= blueX + rectWidth){
                   collide = true;	   
             blueX = Math.floor(Math.random() * (canvasWidth - rectWidth));
             blueY = Math.floor(Math.random() * (canvasHeight - rectWidth));
               }
              
               if (redX>=blueX && redX <= blueX + rectWidth){
                   collide = true;
			 blueX = Math.floor(Math.random() * (canvasWidth - rectWidth));
             blueY = Math.floor(Math.random() * (canvasHeight - rectWidth));
               }
           }
		   
		
		   
           
           


           return collide
       }




        function draw() {
		ctx.clearRect(0, 0, canvas.width, canvas.height);
            
			rectangle(redX, redY, rectWidth, rectHeight, 'red')
			rectangle(blueX, blueY, rectWidth, rectHeight, rectTwoColour)
			if (rightPressed==true) {
		    redDx = speed;
	        } else if (leftPressed==true) {
		    redDx = -speed;
	        } else if (upPressed==true) {
		    redDy = -speed;
	        } else if (downPressed==true) {
		    redDy = speed
	        }
			if (rightPressed==false && leftPressed==false && upPressed==false && downPressed == false){
            redDx = 0;
            redDy = 0;
            }
			redX = redX + redDx;
            redY = redY + redDy; 
			if (redX > canvasWidth - rectWidth){
            redX = canvasWidth - rectWidth;
            }
			if (redY > canvasHeight - rectHeight){
            redY = canvasHeight - rectHeight;
            }
			if (redY<0){
            redY = 0
            }
			if (redX<0){
            redX = 0
            }
			
			
           collided = collision();
          
           
           if (collided == true){
               rectTwoColour = "purple";
             } else {
               rectTwoColour = "blue";
            }
			

          

            }

        setInterval(draw, 14);
   canvas {
            border-width: 6.2px;
            border-color: #FF0000;
        }
    <canvas id="gametester" width="560" height="300"></canvas>

最佳答案

您需要检查 4 面,目前只检查 3 面。 提示:查看第一个 if 内部碰撞函数,看看它是否缺少某些内容

if (
   blueY >= redY && blueY <= redY + rectHeight || // north side
   ... // south side
) 

如果您无法解决,请检查此 https://jsfiddle.net/dn6ar45x/1/

关于javascript - 碰撞适用于顶部,但不适用于底部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56479845/

相关文章:

javascript - 清理 Canvas

javascript - html5 - 亮度、对比度、饱和度、色相如何上下调整?

javascript - 我应该使用 php 还是 javascript

javascript - 现代浏览器是否支持 onbeforeprint/onafterprint HTML 事件?

javascript - 如何使用 JQuery 递归地为 DOM 子级设置样式值?

javascript - Ng-model 不适用于动态添加的 html 控件

javascript - 在html5 canvas中显示和绘制

html - 在 HTML5 Canvas 上模仿 photoshop/painter 平滑绘制?

javascript - canvasContext.fillRect 在 Firefox 中抛出 NS_ERROR_FAILURE 异常

javascript - zipAll 函数(例如 lodash/fp)的流类型是什么?