diff --git a/app/src/main/java/com/helldivers/app/ActivityGame.java b/app/src/main/java/com/helldivers/app/ActivityGame.java index 004705e..4629247 100644 --- a/app/src/main/java/com/helldivers/app/ActivityGame.java +++ b/app/src/main/java/com/helldivers/app/ActivityGame.java @@ -82,7 +82,7 @@ private static final int[][] STRATAGEMS = { new int[]{UP, DOWN, RIGHT, LEFT, UP}, // Reinforce new int[]{DOWN, DOWN, UP, RIGHT}, // Resupply new int[]{UP, DOWN, RIGHT, UP}, // SOS Beacon - new int[]{DOWN, UP, LEFT, DOWN, UP, RIGHT, DOWN, UP}, // NUX-223 Hellbomb + new int[]{DOWN, UP, LEFT, DOWN, UP, RIGHT, DOWN}, // NUX-223 Hellbomb new int[]{DOWN, DOWN, DOWN, UP, UP}, // SSSD Delivery new int[]{UP, UP, LEFT, RIGHT, DOWN, DOWN}, // Seismic Probe new int[]{UP, UP, LEFT, UP, RIGHT}, // Eagle Rearm @@ -190,7 +190,7 @@ private static final String[] NAMES = { private SoundManager soundManager; private Handler handler = new Handler(); - private TextView tvCounter; + private TextView tvCounter, tvFailuresCounter; private ImageView ivStratagemIcon; private LinearLayout sequenceContainer; private ImageButton btnUp, btnDown, btnLeft, btnRight, btnVolver; @@ -200,6 +200,7 @@ private static final String[] NAMES = { private int[] sequence; private int playerIndex = 0; private int completadas = 0; + private int fallos = 0; private boolean esperando = false; private boolean juegoActivo = true; private int currentStratagemIndex = 0; @@ -214,6 +215,7 @@ private static final String[] NAMES = { catch (Exception e) { soundManager = null; } tvCounter = findViewById(R.id.tv_counter); + tvFailuresCounter = findViewById(R.id.tv_failures_counter); ivStratagemIcon = findViewById(R.id.iv_stratagem_icon); sequenceContainer = findViewById(R.id.sequence_container); btnUp = findViewById(R.id.btn_up); @@ -226,14 +228,32 @@ private static final String[] NAMES = { btnVolver.setOnClickListener(v -> finish()); - if (btnUp != null) btnUp.setOnClickListener(v -> onInputWithSound(UP)); - if (btnDown != null) btnDown.setOnClickListener(v -> onInputWithSound(DOWN)); - if (btnLeft != null) btnLeft.setOnClickListener(v -> onInputWithSound(LEFT)); - if (btnRight != null) btnRight.setOnClickListener(v -> onInputWithSound(RIGHT)); + if (btnUp != null) btnUp.setOnClickListener(v -> { animateButtonClick(v); onInputWithSound(UP); }); + if (btnDown != null) btnDown.setOnClickListener(v -> { animateButtonClick(v); onInputWithSound(DOWN); }); + if (btnLeft != null) btnLeft.setOnClickListener(v -> { animateButtonClick(v); onInputWithSound(LEFT); }); + if (btnRight != null) btnRight.setOnClickListener(v -> { animateButtonClick(v); onInputWithSound(RIGHT); }); nuevaRonda(); } + private void animateButtonClick(View v) { + // Feedback háptico (vibración corta) + v.performHapticFeedback(android.view.HapticFeedbackConstants.VIRTUAL_KEY); + + // Animación de escala más agresiva y rápida + v.animate() + .scaleX(0.7f) + .scaleY(0.7f) + .setDuration(40) + .withEndAction(() -> v.animate() + .scaleX(1.0f) + .scaleY(1.0f) + .setDuration(150) + .setInterpolator(new android.view.animation.OvershootInterpolator(4.0f)) // Rebote más fuerte + .start()) + .start(); + } + private int getArrowRotation(int dir) { switch(dir) { case UP: return 0; @@ -277,18 +297,20 @@ private static final String[] NAMES = { sequenceContainer.removeAllViews(); for (int i = 0; i < sequence.length; i++) { - TextView arrowView = new TextView(this); - int size = (int)(56 * getResources().getDisplayMetrics().density); - int margin = (int)(4 * getResources().getDisplayMetrics().density); + ImageView arrowView = new ImageView(this); + int size = (int) (45 * getResources().getDisplayMetrics().density); + int margin = (int) (2 * getResources().getDisplayMetrics().density); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(size, size); params.setMargins(margin, margin, margin, margin); arrowView.setLayoutParams(params); - - arrowView.setText(String.valueOf(ARROW_CHARS.charAt(sequence[i]))); - arrowView.setTextColor(Color.parseColor("#FFFFFF")); - arrowView.setGravity(Gravity.CENTER); - arrowView.setBackgroundResource(R.drawable.arrow_white); - + + arrowView.setImageResource(R.drawable.ic_dpad_button); + arrowView.setBackgroundResource(R.drawable.btn_direction); + arrowView.setRotation(getArrowRotation(sequence[i])); + arrowView.setColorFilter(Color.WHITE); + int padding = (int) (8 * getResources().getDisplayMetrics().density); + arrowView.setPadding(padding, padding, padding, padding); + sequenceContainer.addView(arrowView); } } @@ -309,9 +331,9 @@ private static final String[] NAMES = { if (sequenceContainer != null && playerIndex <= sequence.length) { View child = sequenceContainer.getChildAt(playerIndex - 1); - if (child instanceof TextView) { - TextView arrowView = (TextView) child; - arrowView.setTextColor(Color.parseColor("#00FF00")); + if (child instanceof ImageView) { + ImageView arrowView = (ImageView) child; + arrowView.setColorFilter(Color.parseColor("#fde902")); } } @@ -337,8 +359,11 @@ private static final String[] NAMES = { try { soundManager.playFailure(); } catch (Exception e) {} } juegoActivo = false; - if (ivFailure != null) ivFailure.setVisibility(View.VISIBLE); - handler.postDelayed(this::nuevaRonda, 1500); + fallos++; + if (tvFailuresCounter != null) tvFailuresCounter.setText(String.valueOf(fallos)); + + // Delay de medio segundo antes de reiniciar + handler.postDelayed(this::nuevaRonda, 500); } } diff --git a/app/src/main/java/com/helldivers/app/ActivityQR.java b/app/src/main/java/com/helldivers/app/ActivityQR.java index 7061d37..25bd378 100644 --- a/app/src/main/java/com/helldivers/app/ActivityQR.java +++ b/app/src/main/java/com/helldivers/app/ActivityQR.java @@ -54,14 +54,14 @@ public class ActivityQR extends AppCompatActivity { int width = bitMatrix.getWidth(); int height = bitMatrix.getHeight(); - Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); + Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); - int black = 0xFF000000; - int white = 0xFFFFFFFF; + int qrColor = 0xFFFFFFFF; // Blanco para los módulos del QR + int transparent = 0x00000000; // Transparente para el fondo for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { - bmp.setPixel(x, y, bitMatrix.get(x, y) ? black : white); + bmp.setPixel(x, y, bitMatrix.get(x, y) ? qrColor : transparent); } } diff --git a/app/src/main/java/com/helldivers/app/MainActivity.java b/app/src/main/java/com/helldivers/app/MainActivity.java index cfb3af3..58a5299 100644 --- a/app/src/main/java/com/helldivers/app/MainActivity.java +++ b/app/src/main/java/com/helldivers/app/MainActivity.java @@ -1,6 +1,7 @@ package com.helldivers.app; import android.content.Intent; +import android.media.MediaPlayer; import android.os.Bundle; import android.view.View; import android.widget.Button; @@ -13,7 +14,9 @@ public class MainActivity extends AppCompatActivity { private SoundManager soundManager; private Button btnQrInstagram; private Button btnMinijuego; + private Button btnMusic; private ImageButton btnUp, btnDown, btnLeft, btnRight; + private MediaPlayer mediaPlayer; @Override protected void onCreate(Bundle savedInstanceState) { @@ -32,6 +35,7 @@ public class MainActivity extends AppCompatActivity { btnDown = findViewById(R.id.btn_down); btnLeft = findViewById(R.id.btn_left); btnRight = findViewById(R.id.btn_right); + btnMusic = findViewById(R.id.btn_music); if (btnQrInstagram != null) { btnQrInstagram.setOnClickListener(v -> { @@ -45,6 +49,10 @@ public class MainActivity extends AppCompatActivity { }); } + if (btnMusic != null) { + btnMusic.setOnClickListener(v -> toggleMusic()); + } + View.OnClickListener arrowSoundListener = v -> { if (soundManager != null) { try { soundManager.playButtonClick(); } catch (Exception e) {} @@ -57,6 +65,31 @@ public class MainActivity extends AppCompatActivity { if (btnRight != null) btnRight.setOnClickListener(arrowSoundListener); } + private void toggleMusic() { + if (mediaPlayer == null) { + mediaPlayer = MediaPlayer.create(this, R.raw.ost); + mediaPlayer.setOnCompletionListener(mp -> { + stopMusic(); + }); + } + + if (mediaPlayer.isPlaying()) { + stopMusic(); + } else { + mediaPlayer.start(); + btnMusic.setAlpha(0.5f); // Efecto visual de activado + } + } + + private void stopMusic() { + if (mediaPlayer != null) { + mediaPlayer.stop(); + mediaPlayer.release(); + mediaPlayer = null; + btnMusic.setAlpha(1.0f); // Restaurar opacidad + } + } + @Override protected void onResume() { super.onResume(); @@ -72,6 +105,7 @@ public class MainActivity extends AppCompatActivity { @Override protected void onDestroy() { super.onDestroy(); + stopMusic(); if (soundManager != null) soundManager.release(); } } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_game.xml b/app/src/main/res/layout/activity_game.xml index d82c6a8..cd1858e 100644 --- a/app/src/main/res/layout/activity_game.xml +++ b/app/src/main/res/layout/activity_game.xml @@ -9,20 +9,35 @@ - + android:layout_marginBottom="180dp" + android:gravity="center_horizontal" + android:orientation="vertical"> + + + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index bb1d670..abb574e 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -60,6 +60,7 @@ android:layout_height="wrap_content" android:layout_centerInParent="true" android:layout_marginTop="40dp" + android:translationY="30dp" android:rowCount="3" android:columnCount="3" android:padding="8dp"> @@ -128,4 +129,19 @@ + +