Tôi đã triển khai một thói quen phát hiện va chạm đơn giản bằng cách sử dụng AABB giữa sprite trò chơi chính của tôi và các nền tảng khác nhau (Vui lòng xem mã bên dưới). Nó hoạt động rất tốt, nhưng giờ tôi đang giới thiệu lực hấp dẫn để làm cho nhân vật của tôi ngã xuống và nó xuất hiện một số vấn đề với thói quen CD của tôi.
Tôi nghĩ mấu chốt của vấn đề là thói quen CD của tôi di chuyển sprite trở lại dọc theo trục mà nó đã thâm nhập ít nhất vào sprite khác. Vì vậy, nếu nó nằm trong trục Y nhiều hơn X, thì nó sẽ di chuyển nó trở lại dọc theo Trục X.
Tuy nhiên, bây giờ sprite (anh hùng) của tôi hiện đang giảm ở tốc độ 30 pixel mỗi khung hình (Đó là màn hình cao 1504 - Tôi cần nó giảm nhanh như vậy vì tôi muốn thử mô phỏng lực hấp dẫn 'bình thường', bất kỳ tốc độ chậm nào trông cũng kỳ lạ ) Tôi đang nhận được những vấn đề này. Tôi sẽ cố gắng hiển thị những gì đang xảy ra (và những gì tôi nghĩ là gây ra nó - mặc dù tôi không chắc chắn) với một vài hình ảnh: (Mã bên dưới hình ảnh).
Tôi sẽ đánh giá cao một số gợi ý về cách khắc phục vấn đề này.
Để làm rõ, trong hình bên phải ở trên, khi tôi nói vị trí được sửa 'không chính xác' có thể hơi sai lệch. Bản thân mã đang hoạt động chính xác cho cách viết hoặc đặt một cách khác, chính thuật toán nếu hành xử theo cách tôi mong đợi, nhưng tôi cần thay đổi hành vi của nó để ngăn chặn vấn đề này xảy ra, hy vọng điều đó làm rõ ý kiến của tôi trong ảnh .
Mã của tôi
public boolean heroWithPlatforms(){
//Set Hero center for this frame
heroCenterX = hero.xScreen+(hero.quadWidth/2);
heroCenterY = hero.yScreen+(hero.quadHeight/2);
//Iterate through all platforms to check for collisions
for(x=0;x<platformCoords.length;x+=2){
//Set platform Center for this iteration
platformCenterX = platformCoords[x]+(platforms.quadWidth/2);
platformCenterY = platformCoords[x+1]+(platforms.quadHeight/2);
// the Dif variables are the difference (absolute value)
// of the center of the two sprites being compared (one for X axis difference
//and on for the Y axis difference)
difX = Math.abs(heroCenterX-platformCenterX);
difY = Math.abs(heroCenterY-platformCenterY);
//If 1
//Check the difference between the 2 centers and compare it to the vector (the sum of
//the two sprite's widths/2. If it is smaller, then the sprites are pverlapping along
//the X axis and we can now proceed to check the Y axis
if (difX<vecXPlatform){
//If 2
//Same as above but for the Y axis, if this is also true, then we have a collision
if(difY<vecYPlatform){
//we now know sprites are colliding, so we now need to know exactly by how much
//penX will hold the value equal to the amount one sprite (hero, in this case)
//has overlapped with the other sprite (the platform)
penX = vecXPlatform-difX;
penY = vecYPlatform-difY;
//One sprite has penetrated into the other, mostly in the Y axis, so move sprite
//back on the X Axis
if (penX < penY){hero.xScreen-=penX*(heroCenterX-platformCenterX>=0 ? -1 : 1);}
//Sprite has penetrated into the other, mostly in the X asis, so move sprite
//back on the Y Axis
else if (penY < penX) {hero.yScreen-=penY*(heroCenterY-platformCenterY>=0 ? -1 : 1);}
return true;
}//Close 'If' 2
} //Close 'If' 1
}
//Otherwise, no collision
return false;
}
//One sprite has penetrated into the other, mostly in the Y axis, so move sprite //back on the X Axis