v3.2.5: further improved dynamic island handling
This commit is contained in:
committed by
Evan Debenham
parent
a511156298
commit
c9cb58bcf1
@@ -372,7 +372,9 @@ public class GameScene extends PixelScene {
|
|||||||
float heroPaneExtraWidth = insets.left;
|
float heroPaneExtraWidth = insets.left;
|
||||||
float menuBarMaxLeft = uiCamera.width-insets.right-MenuPane.WIDTH;
|
float menuBarMaxLeft = uiCamera.width-insets.right-MenuPane.WIDTH;
|
||||||
int hpBarMaxWidth = 50; //default max width
|
int hpBarMaxWidth = 50; //default max width
|
||||||
float buffBarTopRowMaxWidth = 55; //default max width
|
float[] buffBarRowLimits = new float[9];
|
||||||
|
float[] buffBarRowAdjusts = new float[9];
|
||||||
|
|
||||||
if (largeInsetTop == 0 && insets.top > 0){
|
if (largeInsetTop == 0 && insets.top > 0){
|
||||||
//smaller non-notch cutouts are of varying size and may obstruct various UI elements
|
//smaller non-notch cutouts are of varying size and may obstruct various UI elements
|
||||||
// some are small hole punches, some are huge dynamic islands
|
// some are small hole punches, some are huge dynamic islands
|
||||||
@@ -406,9 +408,21 @@ public class GameScene extends PixelScene {
|
|||||||
&& cutout.top < 10
|
&& cutout.top < 10
|
||||||
&& cutout.right > 32
|
&& cutout.right > 32
|
||||||
&& cutout.bottom > 11) {
|
&& cutout.bottom > 11) {
|
||||||
|
int i = 1;
|
||||||
|
int rowTop = 11;
|
||||||
|
//in most cases this just obstructs one row, but dynamic island can block more =S
|
||||||
|
while (cutout.bottom > rowTop){
|
||||||
|
if (i == 1 || cutout.bottom > rowTop+2 ) { //always shorten first row
|
||||||
//subtract starting position, add a bit back to allow slight overlap
|
//subtract starting position, add a bit back to allow slight overlap
|
||||||
buffBarTopRowMaxWidth = cutout.left - 32 + 3;
|
buffBarRowLimits[i] = cutout.left - 32 + 3;
|
||||||
//TODO dynamic island can block 2nd row too =S
|
} else {
|
||||||
|
//if row is only slightly cut off, lower it instead of limiting width
|
||||||
|
buffBarRowAdjusts[i] = cutout.bottom - rowTop + 1;
|
||||||
|
rowTop += buffBarRowAdjusts[i];
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
rowTop += 8;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -438,7 +452,8 @@ public class GameScene extends PixelScene {
|
|||||||
status.camera = uiCamera;
|
status.camera = uiCamera;
|
||||||
StatusPane.heroPaneExtraWidth = heroPaneExtraWidth;
|
StatusPane.heroPaneExtraWidth = heroPaneExtraWidth;
|
||||||
StatusPane.hpBarMaxWidth = hpBarMaxWidth;
|
StatusPane.hpBarMaxWidth = hpBarMaxWidth;
|
||||||
StatusPane.buffBarTopRowMaxWidth = buffBarTopRowMaxWidth;
|
StatusPane.buffBarRowMaxWidths = buffBarRowLimits;
|
||||||
|
StatusPane.buffBarRowAdjusts = buffBarRowAdjusts;
|
||||||
status.setRect(insets.left, uiSize > 0 ? uiCamera.height-39-insets.bottom : screentop, uiCamera.width - insets.left - insets.right, 0 );
|
status.setRect(insets.left, uiSize > 0 ? uiCamera.height-39-insets.bottom : screentop, uiCamera.width - insets.left - insets.right, 0 );
|
||||||
add(status);
|
add(status);
|
||||||
|
|
||||||
@@ -455,6 +470,13 @@ public class GameScene extends PixelScene {
|
|||||||
boss = new BossHealthBar();
|
boss = new BossHealthBar();
|
||||||
boss.camera = uiCamera;
|
boss.camera = uiCamera;
|
||||||
boss.setPos( (uiCamera.width - boss.width())/2, screentop + (landscape() ? 7 : 26));
|
boss.setPos( (uiCamera.width - boss.width())/2, screentop + (landscape() ? 7 : 26));
|
||||||
|
if (buffBarRowLimits[2] != 0){
|
||||||
|
//if we potentially have a 3rd buff bar row, lower by 7px
|
||||||
|
boss.setPos(boss.left(), boss.top() + 7);
|
||||||
|
} else if (buffBarRowAdjusts[2] != 0){
|
||||||
|
//
|
||||||
|
boss.setPos(boss.left(), boss.top() + buffBarRowAdjusts[2]);
|
||||||
|
}
|
||||||
add(boss);
|
add(boss);
|
||||||
|
|
||||||
resume = new ResumeIndicator();
|
resume = new ResumeIndicator();
|
||||||
|
|||||||
@@ -149,7 +149,10 @@ public class BuffIndicator extends Component {
|
|||||||
|
|
||||||
private boolean large = false;
|
private boolean large = false;
|
||||||
|
|
||||||
public float firstRowWidth = -1;
|
//in some cases we want to limit some rows but not all by just reducing width
|
||||||
|
public float[] rowWidthLimits = new float[9]; //0 = no limit
|
||||||
|
//sometimes we also need to slightly lower a row, to avoid having to cut off width
|
||||||
|
public float[] rowHeightAdjusts = new float[9]; //0 = default adjust of 1
|
||||||
|
|
||||||
public BuffIndicator( Char ch, boolean large ) {
|
public BuffIndicator( Char ch, boolean large ) {
|
||||||
super();
|
super();
|
||||||
@@ -231,6 +234,7 @@ public class BuffIndicator extends Component {
|
|||||||
|
|
||||||
//layout
|
//layout
|
||||||
int row = 1;
|
int row = 1;
|
||||||
|
float rowTop = 0;
|
||||||
int pos = 0;
|
int pos = 0;
|
||||||
float lastIconRight = 0;
|
float lastIconRight = 0;
|
||||||
int total = 0;
|
int total = 0;
|
||||||
@@ -241,18 +245,21 @@ public class BuffIndicator extends Component {
|
|||||||
}
|
}
|
||||||
icon.visible = true;
|
icon.visible = true;
|
||||||
|
|
||||||
|
//offset is needed to handle adjusting oversized click boxes on multiple rows
|
||||||
icon.topOffset = (row > 1 && !large) ? -1 : 0;
|
icon.topOffset = (row > 1 && !large) ? -1 : 0;
|
||||||
icon.updateIcon();
|
icon.updateIcon();
|
||||||
//button areas are slightly oversized, especially on small buttons
|
//button areas are slightly oversized, especially on small buttons
|
||||||
icon.setRect(x + pos * (size + 1), y + (row-1)*(size+1)-icon.topOffset, size + 1, size + (large ? 0 : 5));
|
icon.setRect(x + pos * (size + 1), y + rowTop-icon.topOffset, size + 1, size + (large ? 0 : 5));
|
||||||
PixelScene.align(icon);
|
PixelScene.align(icon);
|
||||||
pos++;
|
pos++;
|
||||||
|
|
||||||
lastIconRight = icon.right()-1;
|
lastIconRight = icon.right()-1;
|
||||||
|
|
||||||
if ((row+1)*(size+1) <= height
|
//if we're out of overall width but have more height, or this row has hits its limit
|
||||||
&& (pos * (size + 1) + size > width || (row == 1 && firstRowWidth != -1 && pos * (size + 1) + size > firstRowWidth))){
|
if ((rowTop+2*size+2 <= height && (pos * (size + 1) + size > width))
|
||||||
|
|| (rowWidthLimits[row] != 0 && pos * (size + 1) + size > rowWidthLimits[row])){
|
||||||
row++;
|
row++;
|
||||||
|
rowTop += size+1 + rowHeightAdjusts[row];
|
||||||
pos = 0;
|
pos = 0;
|
||||||
}
|
}
|
||||||
total++;
|
total++;
|
||||||
@@ -265,7 +272,7 @@ public class BuffIndicator extends Component {
|
|||||||
if (excessWidth > 0) {
|
if (excessWidth > 0) {
|
||||||
//if multiple rows, only compress last row
|
//if multiple rows, only compress last row
|
||||||
ArrayList<BuffButton> buttons = new ArrayList<>();
|
ArrayList<BuffButton> buttons = new ArrayList<>();
|
||||||
float lastRowY = PixelScene.align(y + (row-1)*(size+1));
|
float lastRowY = PixelScene.align(y + rowTop);
|
||||||
int i = 1;
|
int i = 1;
|
||||||
for (BuffButton button : buffButtons.values()){
|
for (BuffButton button : buffButtons.values()){
|
||||||
if (i > maxBuffs){
|
if (i > maxBuffs){
|
||||||
|
|||||||
@@ -83,8 +83,9 @@ public class StatusPane extends Component {
|
|||||||
//potentially shrinks and/or repositions the hp bar to avoid some cutouts
|
//potentially shrinks and/or repositions the hp bar to avoid some cutouts
|
||||||
public static int hpBarMaxWidth = 50;
|
public static int hpBarMaxWidth = 50;
|
||||||
private Image hpCutout;
|
private Image hpCutout;
|
||||||
//potentially cuts off the top row of the the buff indicator to avoid some cutouts
|
//potentially adjusts the row(s) of the the buff indicator to avoid some cutouts
|
||||||
public static float buffBarTopRowMaxWidth = 50;
|
public static float[] buffBarRowMaxWidths;
|
||||||
|
public static float[] buffBarRowAdjusts;
|
||||||
|
|
||||||
public StatusPane( boolean large ){
|
public StatusPane( boolean large ){
|
||||||
super();
|
super();
|
||||||
@@ -264,7 +265,12 @@ public class StatusPane extends Component {
|
|||||||
|
|
||||||
heroInfoOnBar.setRect(heroInfo.right(), y, 50, 9);
|
heroInfoOnBar.setRect(heroInfo.right(), y, 50, 9);
|
||||||
|
|
||||||
buffs.firstRowWidth = buffBarTopRowMaxWidth;
|
if (buffBarRowMaxWidths != null){
|
||||||
|
buffs.rowWidthLimits = buffBarRowMaxWidths;
|
||||||
|
}
|
||||||
|
if (buffBarRowAdjusts != null){
|
||||||
|
buffs.rowHeightAdjusts = buffBarRowAdjusts;
|
||||||
|
}
|
||||||
buffs.setRect( x + heroPaneWidth + 1, y + 8, 55, 16 );
|
buffs.setRect( x + heroPaneWidth + 1, y + 8, 55, 16 );
|
||||||
|
|
||||||
busy.x = x + 1;
|
busy.x = x + 1;
|
||||||
|
|||||||
+10
-3
@@ -36,7 +36,6 @@ import com.watabou.utils.PlatformSupport;
|
|||||||
import com.watabou.utils.RectF;
|
import com.watabou.utils.RectF;
|
||||||
|
|
||||||
import org.robovm.apple.audiotoolbox.AudioServices;
|
import org.robovm.apple.audiotoolbox.AudioServices;
|
||||||
import org.robovm.apple.coregraphics.CGRect;
|
|
||||||
import org.robovm.apple.systemconfiguration.SCNetworkReachability;
|
import org.robovm.apple.systemconfiguration.SCNetworkReachability;
|
||||||
import org.robovm.apple.systemconfiguration.SCNetworkReachabilityFlags;
|
import org.robovm.apple.systemconfiguration.SCNetworkReachabilityFlags;
|
||||||
import org.robovm.apple.uikit.UIApplication;
|
import org.robovm.apple.uikit.UIApplication;
|
||||||
@@ -75,9 +74,17 @@ public class IOSPlatformSupport extends PlatformSupport {
|
|||||||
// this is inaccurate, as there's space left and right, but we don't care
|
// this is inaccurate, as there's space left and right, but we don't care
|
||||||
return new RectF(0, 0, Game.width, topInset / 1.2f);
|
return new RectF(0, 0, Game.width, topInset / 1.2f);
|
||||||
} else {
|
} else {
|
||||||
//we estimate dynamic island as being 130x390 px, 35px from top.
|
//we estimate dynamic island as being 390x120 px, 40px from top.
|
||||||
// this is mostly accurate, slightly oversized
|
// this is mostly accurate, slightly oversized
|
||||||
RectF cutout = new RectF( Game.width/2 - 195, 35, Game.width/2 + 195, 165);
|
RectF cutout = new RectF( Game.width/2 - 195, 40, Game.width/2 + 195, 160);
|
||||||
|
|
||||||
|
//iPhone air specifically has its island a bit lower
|
||||||
|
// so we check for its machine string and also simulator with same width
|
||||||
|
String machineString = HWMachine.getMachineString();
|
||||||
|
if (machineString.equals("iPhone18,4")
|
||||||
|
|| (machineString.equals("arm64") && Game.width == 1260)){
|
||||||
|
cutout.shift(0, 15);
|
||||||
|
}
|
||||||
return cutout;
|
return cutout;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user