- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试学习表面 View 并且我确实读到了它。
所以,我试着制作了一个游戏,我认为它可以帮助我更好地学习。
我创建了一个表面 View 类,如下所示:
class SnakeEngine extends SurfaceView implements Runnable,View.OnTouchListener {
private Thread thread = null;
private Context context;
private SoundPool soundPool;
private int eat_bob = -1;
private int snake_crash = -1;
private Rect rect2;
private Rect rect1;
private boolean snakeHungry=true;
private boolean runThread=true;
public enum Heading {UP, RIGHT, DOWN, LEFT}
private Heading heading = Heading.RIGHT;
private int screenX;
private int screenY;
private int snakeLength=1;
private float x;
private float y;
private float bobX=0;
private float bobY=0;
private final int blockSize=40;
private final int FPS = 10;
private int score=0;
private int[] snakeXs;
private int[] snakeYs;
private int xSpeed=FPS;
private int yspeed=FPS;
private boolean foodOnTable=false;
private volatile boolean isPlaying=true;
private SurfaceHolder surfaceHolder;
private Paint paint;
public SnakeEngine(Context context, AttributeSet attrs) {
super(context, attrs);
}
public SnakeEngine(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public SnakeEngine(Context context) {
super(context);
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = null;
if (wm != null) {
display = wm.getDefaultDisplay();
}
Point size = new Point();
if (display != null) {
display.getSize(size);
}
screenX = size.x;
screenY = size.y;
surfaceHolder=getHolder();
setOnTouchListener(this);
paint=new Paint();
paint.setColor(Color.GREEN);
snakeXs=new int[200];
snakeYs=new int[200];
}
@Override
public void run() {
while (runThread) {
try {
long MILLIS_PER_SECOND = 20;
Thread.sleep(MILLIS_PER_SECOND);
} catch (InterruptedException e) {
e.printStackTrace();
thread.interrupt();
}
if(!surfaceHolder.getSurface().isValid())
continue;
Canvas canvas = surfaceHolder.lockCanvas();
update();
draw(canvas);
surfaceHolder.unlockCanvasAndPost(canvas);
}
}
public void resume() {
thread=new Thread(this);
thread.start();
}
@Override
public void draw(Canvas canvas) {
super.draw(canvas);
canvas.drawColor(Color.argb(255, 26, 128, 182));
int foodSize = 20;
canvas.drawRect(x, y, (int) (x + foodSize), y + foodSize, paint);
for (int i = 0; i < snakeLength; i++) {
canvas.drawRect(snakeXs[i], snakeYs[i], snakeXs[i] + blockSize, snakeYs[i] + blockSize, paint);
}
}
public void getLocation() {
Random random = new Random();
x= random.nextInt(screenX-blockSize);
y= random.nextInt(screenY-blockSize);
}
private void update() {
Log.e("here","here");
if(!foodOnTable){
getLocation();
foodOnTable=true;
}
if(bobX<x && bobY<y && (bobX+blockSize)>x && (bobY+blockSize)>y){
eatFood();
getLocation();
foodOnTable=true;
}
bobX+=xSpeed;
bobY+=yspeed;
moveSnake((int)bobX,(int)bobY);
if(bobX+blockSize>=screenX || bobY+blockSize>=screenY ||
(bobY+FPS<=0 && bobX!=0) || (bobX!=0 && bobY>=screenY) || (bobX==0 && bobY+FPS==0)
||(bobX+FPS==0 && bobY==0)|| (bobY!=0 && bobX+FPS<=0)){
bobX-=xSpeed;
bobY-=yspeed;
}
}
private void moveSnake(int bobX,int bobY) {
if (snakeHungry) {
for (int i = 0; i < snakeLength - 1; i++) {
snakeXs[i] = snakeXs[i + 1];
snakeYs[i] = snakeYs[i + 1];
}
}else snakeHungry=!snakeHungry;
snakeXs[snakeLength - 1] = bobX;
snakeYs[snakeLength - 1] = bobY;
}
private void eatFood() {
snakeLength++;
snakeHungry=false;
}
public void pause() {
if(thread!=null){
runThread=false;
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void directSnake(Heading heading){
switch (heading){
case UP:
xSpeed=0;
yspeed=-FPS;
break;
case DOWN:
xSpeed=0;
yspeed=FPS;
break;
case LEFT:
xSpeed=-FPS;
yspeed=0;
break;
case RIGHT:
xSpeed=FPS;
yspeed=0;
break;
}
}
@Override
public boolean onTouch(View v, MotionEvent event) {
int x=(int)event.getX();
int y=(int)event.getY();
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:{
if(heading==Heading.LEFT || heading ==Heading.RIGHT){
if(y>(bobY+blockSize)){
directSnake(Heading.DOWN);
heading=Heading.DOWN;
}else {
directSnake(Heading.UP);
heading=Heading.UP;
}
break;
}else if(heading==Heading.DOWN || heading==Heading.UP) {
if(x<(bobX+blockSize)){
directSnake(Heading.LEFT);
heading=Heading.LEFT;
}else {
directSnake(Heading.RIGHT);
heading=Heading.RIGHT;
}
break;
}
break;
}
}
return true;
}
}
我的主要 Activity 文件如下所示:
public class MainActivity extends AppCompatActivity {
SnakeEngine snakeEngine;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
snakeEngine=new SnakeEngine(this);
setContentView(R.layout.activity_main);
}
@Override
protected void onResume() {
super.onResume();
snakeEngine.resume();
}
@Override
protected void onPause() {
super.onPause();
snakeEngine.pause();
}
}
布局文件:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.snake.tilak.myapplication.MainActivity">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.snake.tilak.myapplication.SnakeEngine
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/surfaceView">
</com.snake.tilak.myapplication.SnakeEngine>
<LinearLayout android:id="@+id/linearLayout1" android:layout_width="wrap_content" android:layout_height="wrap_content">
<ImageButton android:contentDescription="@string/down_button" android:id="@+id/buttonDown" android:background="@mipmap/ic_keyboard_arrow_down_black_24dp" android:layout_width="wrap_content" android:layout_height="wrap_content"/>
<ImageButton android:contentDescription="@string/up_button" android:id="@+id/buttonUp" android:background="@mipmap/ic_keyboard_arrow_up_black_24dp" android:layout_width="wrap_content" android:layout_height="wrap_content"/>
<ImageButton android:contentDescription="@string/left_button" android:id="@+id/buttonLeft" android:background="@mipmap/ic_keyboard_arrow_left_black_24dp" android:layout_width="wrap_content" android:layout_height="wrap_content"/>
<ImageButton android:contentDescription="@string/right_button" android:id="@+id/buttonRight" android:background="@mipmap/ic_keyboard_arrow_right_black_24dp" android:layout_width="wrap_content" android:layout_height="wrap_content"/>
</LinearLayout>
</FrameLayout>
</android.support.constraint.ConstraintLayout>
现在当我运行它时,我看到的只是黑屏吗?
我哪里错了?我应该改变什么?
我在这里阅读了关于这个主题的各种问题,但似乎无法解决任何问题。
最佳答案
那是因为你试图实例化新的 SnakeEngine
,但你应该通过 id 找到它的一个实例,因为你已经将它添加到 XML
文件中:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// snakeEngine = new SnakeEngine(this);
setContentView(R.layout.activity_main);
snakeEngine = findViewById(R.id.surfaceView);
}
然后,当你修复它时,你应该将所有启动逻辑从 public SnakeEngine(Context context)
构造函数移动到单独的方法,并从 SnakeEngine
的每个构造函数调用它>:
public SnakeEngine(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public SnakeEngine(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
public SnakeEngine(Context context) {
super(context);
init(context);
}
private void init(Context context) {
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = null;
if (wm != null) {
display = wm.getDefaultDisplay();
}
Point size = new Point();
if (display != null) {
display.getSize(size);
}
screenX = size.x;
screenY = size.y;
surfaceHolder = getHolder();
setOnTouchListener(this);
paint = new Paint();
paint.setColor(Color.GREEN);
snakeXs = new int[200];
snakeYs = new int[200];
}
关于android - 表面 View 显示黑屏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48021928/
我有以 xyz 点格式表示 3D 表面(即地震断层平面)的数据。我想创建这些表面的 3D 表示。我使用 rgl 和 akima 取得了一些成功,但是它无法真正处理可能会自行折叠或在同一 x,y 点具有
我正在尝试将此 X、Y、Z 数据集拟合到未知表面。 不幸的是,线性拟合不足以显示表面数据。我认为多项式拟合可能适合这种情况。另外,问题是我不知道如何建立多项式拟合函数来完成曲面拟合。 任何帮助都会很棒
我已经用plotly构建了一个表面图表,并且我正在尝试根据我自己的文本获得hoverinfo。奇怪的是它不再工作了。 library(plotly) x % layout(dragmode = "tu
我有以下数据: library(rgl) x y,y->z,z->x) zmat <- matrix(data = z, nrow = 6, ncol = 5, byrow = FALSE) surf
我正在使用 DXVA 视频解码器。它工作正常,但我想与另一个 IDirect3D9 设备对象共享解压缩的表面。 我读了this文件,我调用 IDirectXVideoDecoderService::C
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
import pygame, sys, os.path pygame.init() # set up the colours # R G B BLACK = ( 0,
我的目标是在 pygame 实例内显示一个颜色图,以 49 个元素 ndarray 的形式反射(reflect)实时输入,范围从 -6 到 2,标准化为 0 到 1 的值。到目前为止,我正在使用 ma
我在 Visual C# -> surface -> v2.0 -> MS visual C# 2010 express 中的 Surface Application (WPF) 模板中工作。 我正在
我正在尝试在 JavaFX 中实现我自己的 3D 表面动画,但我不理解它应该工作的一切,有人可以帮助我理解哪个应该放在哪里吗? 已经知道使用类构建Mesh需要类对象TraingleMesh然后必须使用
根据我的阅读,我不相信 SurfaceView 可以设置动画,但我会问这个问题: 我在 ViewFlipper 中有一个 surfaceView 对象。当 ViewFlipper 向左或向右移动到新的
我想在 android 屏幕上有一个图像,图像的不同部分可以点击。我的意思是,如果它是 3 个圆圈的图像,我希望能够单击这些圆圈中的每一个, 然后我可以为每个可点击的圆圈添加不同的功能。对于下图中的示
我有一个通过kinect获得的点集,现在我想创建一个网格。我正在尝试使用 CGAL 库并且正在关注 this example . 我使用的是 VS2010,它运行没有任何错误,但是当然它没有在行中
在让我的 SurfaceView 显示我的相机预览时遇到一点问题。我在这里查看了一些问题并通过 Google 搜索了一些 tuts,但我认为这可能是我这边的一个小错误,我只是没有看到。 代码 publ
任何人都可以为我指出一些类(class)或对以下情况提出任何建议吗? 我有一个 SurfaceView,它有一个背景图像,我希望在其上绘制其他位图。我想支持以下操作: 点击一下,新的位图就会添加到背景
我正在尝试学习表面 View 并且我确实读到了它。 所以,我试着制作了一个游戏,我认为它可以帮助我更好地学习。 我创建了一个表面 View 类,如下所示: class SnakeEngine exte
我希望笑脸 div(在用户进入墙壁后显示)将覆盖主迷宫表面而不改变笑脸大小:你能帮帮我吗? 这是 fiddle 链接: http://jsfiddle.net/uqcLn/66/ 这是笑脸 div:
我有一组 (x,y,z) 点,这些点具有相应的法线和值。所以数据的形式是 [x y z nx ny nz c]。我想在这些垂直于这些法线的点上绘制一个 3D 表面,并且具有与该值对应的颜色。所以我想要
我有一个不是函数图的表面的 3D 数据集。数据只是 3D 中的一堆点,我唯一能想到的就是在 Matlab 中尝试 scatter3。 Surf 将不起作用,因为表面不是函数图。 使用 scatter3
假设我有一个函数,例如: 现在,我想绘制它的曲面图(matplotlib plot_surface )。我使用 np.arange(stop,end,increment) 构造了三个数组。 在这里,我
我是一名优秀的程序员,十分优秀!