我现在按照在线指南操作后,正在android studio中构建一个蛇游戏,我试图通过添加一个“弹出”框添加到它上,直到死后再玩,但是我遇到了问题。
我的AlertDialog中出现错误
AlertDialog.Builder alert = new AlertDialog.Builder( this );
有人告诉我
error: incompatible types: SnekEngine cannot be converted to Context
,并且错误指向this
。
这是整堂课,给我带来麻烦的是最底层。
package com.example.snek;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.res.AssetFileDescriptor;
import android.graphics.Point;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Bundle;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import java.io.IOException;
import java.util.Random;
import android.content.res.AssetManager;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.TextView;
public class SnekEngine extends SurfaceView implements Runnable
{
// Our game thread for the main game loop
private Thread thread = null;
// To hold a reference to the Activity
private Context context;
// for playing sound effects
private SoundPool soundPool;
private int eat_food = -1;
private int snake_crash = -1;
// For tracking movement Heading
public enum Heading {UP, RIGHT, DOWN, LEFT}
// Start by heading to the right
private Heading heading = Heading.RIGHT;
// To hold the screen size in pixels
private int screenX;
private int screenY;
// How long is the snake
private int snakeLength;
// Where is Food hiding?
private int foodX;
private int foodY;
// The size in pixels of a snake segment
private int blockSize;
// The size in segments of the playable area
private final int NUM_BLOCKS_WIDE = 40;
private int numBlocksHigh;
// Control pausing between updates
private long nextFrameTime;
// Update the game 10 times per second
private final long FPS = 10;
// There are 1000 milliseconds in a second
private final long MILLIS_PER_SECOND = 1000;
// We will draw the frame much more often
// How many points does the player have
private int score;
private int highscore;
// The location in the grid of all the segments
private int[] snakeXs;
private int[] snakeYs;
// Everything we need for drawing
// Is the game currently playing?
private volatile boolean isPlaying;
// A canvas for our paint
private Canvas canvas;
// Required to use canvas
private SurfaceHolder surfaceHolder;
// Some paint for our canvas
private Paint snekcolor;
private Paint textcolor;
private Paint foodcolor;
public SnekEngine(Context context, Point size) {
super(context);
context = context;
screenX = size.x;
screenY = size.y;
// Work out how many pixels each block is
blockSize = screenX / NUM_BLOCKS_WIDE;
// How many blocks of the same size will fit into the height
numBlocksHigh = screenY / blockSize;
// Set the sound up
soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
try {
// Create objects of the 2 required classes
// Use m_Context because this is a reference to the Activity
AssetManager assetManager = context.getAssets();
AssetFileDescriptor descriptor;
// Prepare the two sounds in memory
descriptor = assetManager.openFd("get_mouse_sound.ogg");
eat_food = soundPool.load(descriptor, 0);
descriptor = assetManager.openFd("death_sound.ogg");
snake_crash = soundPool.load(descriptor, 0);
} catch (IOException e) {
// Error
}
// Initialize the drawing objects
surfaceHolder = getHolder();
snekcolor = new Paint();
textcolor = new Paint();
foodcolor = new Paint();
// If you score 200 you are rewarded with a crash achievement!
snakeXs = new int[200];
snakeYs = new int[200];
// Start the game
newGame();
}
@Override
public void run() {
while (isPlaying) {
// Update 10 times a second
if(updateRequired()) {
update();
draw();
}
}
}
public void pause() {
isPlaying = false;
try {
thread.join();
} catch (InterruptedException e) {
// Error
}
}
public void resume() {
isPlaying = true;
thread = new Thread(this);
thread.start();
}
public void newGame() {
// Start with a single snake segment
snakeLength = 1;
snakeXs[0] = NUM_BLOCKS_WIDE / 2;
snakeYs[0] = numBlocksHigh / 2;
// Get Food ready for dinner
spawnFood();
// Setting the high score
if (score > highscore)
highscore = score;
// Reset the score
score = 0;
// Setup nextFrameTime so an update is triggered
nextFrameTime = System.currentTimeMillis();
}
public void spawnFood() {
Random random = new Random();
foodX = random.nextInt(NUM_BLOCKS_WIDE - 1) + 1;
foodY = random.nextInt(numBlocksHigh - 1) + 1;
}
private void eatFood(){
// Got him!
// Increase the size of the snake
snakeLength++;
//replace Bob
// This reminds me of Edge of Tomorrow. Oneday Bob will be ready!
spawnFood();
//add to the score
score = score + 1;
// Setting the high score
if (score > highscore)
highscore = score;
soundPool.play(eat_food, 1, 1, 0, 0, 1);
}
private void moveSnake(){
// Move the body
for (int i = snakeLength; i > 0; i--) {
// Start at the back and move it
// to the position of the segment in front of it
snakeXs[i] = snakeXs[i - 1];
snakeYs[i] = snakeYs[i - 1];
// Exclude the head because
// the head has nothing in front of it
}
// Move the head in the appropriate heading
switch (heading) {
case UP:
snakeYs[0]--;
break;
case RIGHT:
snakeXs[0]++;
break;
case DOWN:
snakeYs[0]++;
break;
case LEFT:
snakeXs[0]--;
break;
}
}
private boolean detectDeath(){
// Has the snake died?
boolean dead = false;
// Hit the screen edge
if (snakeXs[0] == -1) dead = true;
if (snakeXs[0] >= NUM_BLOCKS_WIDE) dead = true;
if (snakeYs[0] == -1) dead = true;
if (snakeYs[0] == numBlocksHigh) dead = true;
// Eaten itself?
for (int i = snakeLength - 1; i > 0; i--) {
if ((i > 4) && (snakeXs[0] == snakeXs[i]) && (snakeYs[0] == snakeYs[i])) {
dead = true;
}
}
return dead;
}
public void update() {
// Did the head of the snake eat Food?
if (snakeXs[0] == foodX && snakeYs[0] == foodY) {
eatFood();
}
moveSnake();
if (detectDeath()) {
//start again
soundPool.play(snake_crash, 1, 1, 0, 0, 1);
newGame();
}
}
public void draw() {
// Get a lock on the canvas
if (surfaceHolder.getSurface().isValid()) {
canvas = surfaceHolder.lockCanvas();
// Fill the screen with Game Code School blue
canvas.drawColor(Color.argb(255, 0, 0, 0));
// Set the color of the paint to draw the snake white
textcolor.setColor(Color.argb(255, 153, 255, 153));
snekcolor.setColor(Color.argb(255, 153, 255, 153));
// Scale the HUD text
textcolor.setTextSize(90);
canvas.drawText("High Score:" + highscore, 10, 70, textcolor);
canvas.drawText("Score:" + score, 10, 150, textcolor);
// Draw the snake one block at a time
for (int i = 0; i < snakeLength; i++) {
canvas.drawRect(snakeXs[i] * blockSize,
(snakeYs[i] * blockSize),
(snakeXs[i] * blockSize) + blockSize,
(snakeYs[i] * blockSize) + blockSize,
snekcolor);
}
// Set the color of the paint to draw Food red
foodcolor.setColor(Color.argb(255, 0, 255, 255));
// Draw Food
canvas.drawRect(foodX * blockSize,
(foodY * blockSize),
(foodX * blockSize) + blockSize,
(foodY * blockSize) + blockSize,
foodcolor);
// Unlock the canvas and reveal the graphics for this frame
surfaceHolder.unlockCanvasAndPost(canvas);
}
}
public boolean updateRequired() {
// Are we due to update the frame
if(nextFrameTime <= System.currentTimeMillis()){
// Tenth of a second has passed
// Setup when the next update will be triggered
nextFrameTime =System.currentTimeMillis() + MILLIS_PER_SECOND / FPS;
// Return true so that the update and draw
// functions are executed
return true;
}
return false;
}
@Override
public boolean onTouchEvent(MotionEvent motionEvent) {
switch (motionEvent.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_UP:
if (motionEvent.getX() >= screenX / 2) {
switch(heading){
case UP:
heading = Heading.RIGHT;
break;
case RIGHT:
heading = Heading.DOWN;
break;
case DOWN:
heading = Heading.LEFT;
break;
case LEFT:
heading = Heading.UP;
break;
}
} else {
switch(heading){
case UP:
heading = Heading.LEFT;
break;
case LEFT:
heading = Heading.DOWN;
break;
case DOWN:
heading = Heading.RIGHT;
break;
case RIGHT:
heading = Heading.UP;
break;
}
}
}
return true;
}
public void showNewGameDialog()
{
AlertDialog.Builder alert = new AlertDialog.Builder( this );
alert.setTitle( "This is fun" );
alert.setMessage( "Play again?" );
PlayDialog playAgain = new PlayDialog();
alert.setPositiveButton( "YES", playAgain );
alert.setNegativeButton( "No", playAgain );
alert.show();
}
private class PlayDialog implements DialogInterface.OnClickListener
{
public void onClick( DialogInterface dialog, int id)
{
if ( id == -1 ) // yes button
{
newGame();
}
else if ( id == -2 ) //no button
//figure out how to exit game.
}
}
}
答案 0 :(得分:0)
使用this
代替context
AlertDialog.Builder alert = new AlertDialog.Builder( context );