- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我的代码在碰到蓝色方 block 时停止红色方 block ,但我不希望红色方 block 无限期地停止。我该如何解决?
我已经创建了碰撞检测,如果红色方 block 接触到蓝色方 block ,它会使速度 = 0。
//r=red
float rx = 200;
float ry = 375;
float rw = 50;
float rh = 50;
//b=blue
float bx = 550;
float by = 375;
float bw = 50;
float bh = 50;
float speed = 2;
//float cspeed = 2;
void setup() {
size(800, 800);
noStroke();
noSmooth();
noCursor();
}
void draw() {
surface.setTitle(mouseX + ", " + mouseY);
background(50);
collision();
move();
display();
}
void collision() {
//Check if blue and red are touching
boolean hit = rectRect(rx, ry, rw, rh, bx, by, bw, bh);
if (hit) {
speed = 0;
} else {
speed = 2;
}
}
void display() {
fill(0, 0, 255); //Blue square
rect(bx, by, bw, bh);
fill(255, 0, 0); //Red square
rect(rx, ry, rw, rh);
}
void move() {
//Red square movement
if (keyPressed) {
if (key == 'd' || key == 'D') {
rx = rx + speed;
if (rx > width) {
}
}
}
if (keyPressed) {
if (key == 'a' || key == 'A') {
rx = rx - speed;
if (rx > width) {
}
}
}
if (keyPressed) {
if (key == 'w' || key == 'W') {
ry = ry - speed;
if (ry > width) {
}
}
}
if (keyPressed) {
if (key == 's' || key == 'S') {
ry = ry + speed;
if (ry > width) {
}
}
}
}
boolean rectRect(float rx, float ry, float rw, float rh, float bx, float by, float bw, float bh) {
//is red touching blue?
if (rx + rw >= bx &&
rx <= bx + bw &&
ry + rh >= by &&
ry <= by + bh) {
return true;
}
return false;
}
我不希望红色方 block 和蓝色方 block 重叠,但我想在它们接触时继续播放。现在红色方 block 无限期地停止。
最佳答案
在 void collision()
中,您设置当发生碰撞时方 block 的速度将降低到 0.01。
你在你的方 block 移动后检查碰撞。
一旦你的方 block 发生碰撞,它们就不能再移动,所以速度停留在 0.01。永远。
有很多方法可以解决这个问题。由于蓝色方 block 永远不会移动,您可以在它们重叠之前先检查碰撞,或者在发生碰撞时“反弹”红色方 block 。
一个快速/简单的解决方法是修改这个函数:
void move() {
//Red square movement
// You only need to check for input once, then for which input interests you
if (keyPressed) {
// I think this would look better in a switch statement, but we'll keep it an If for simplicity
if (key == 'd' || key == 'D') {
// checking if the square will collide BEFORE it does
// notice that the square won't move if it detects that this move will be a collision
if (!rectRect(rx + speed, ry, rw, rh, bx, by, bw, bh)) {
rx = rx + speed;
}
}
else if (key == 'a' || key == 'A') {
if (!rectRect(rx - speed, ry, rw, rh, bx, by, bw, bh)) {
rx = rx - speed;
}
}
else if (key == 'w' || key == 'W') {
if (!rectRect(rx, ry - speed, rw, rh, bx, by, bw, bh)) {
ry = ry - speed;
}
}
else if (key == 's' || key == 'S') {
if (!rectRect(rx, ry + speed, rw, rh, bx, by, bw, bh)) {
ry = ry + speed;
}
}
if (ry > width) {
// insert whatever you were planning with this condition
}
}
}
现在,void collision()
已被 void move()
接管,因此您可以删除 void collision()
。它永远不会发生,因为我们在任何碰撞发生之前停止广场。
现在...您想要添加更多的正方形。很简单。
当然,您可以为每个方 block 编写一个移动
函数。但这很累人,肯定有更好的方法。
有,但这会考验你的技能。我们会让事情变得简单,以避免您一开始就不知所措,但要知道我们将进入 OOP(面向对象编程)领域。如果你在学校,你会从理解类中受益匪浅(好吧,即使你不在学校,类仍然很棒)。
首先,我们将编写一个简单的类,我们可以使用它来创建和管理您在此程序中使用的矩形形状。如果您使用的是 Processing IDE,我建议您创建一个“新标签”,以便我们保持代码整洁。您不一定非得这样做,因为编译器看不出差异,但是随着您的项目变得越来越复杂,选项卡是组织代码的好工具。
在您的新标签中,输入此代码:
class Rectangle {
// This should be 'private', but I'm using 'protected' in case I wan to inherit those later, and 'public' to keep things simple
public float x = 0;
public float y = 0;
public float w = 50;
public float h = 50;
protected boolean isVisible = true;
protected color fillColor;
// This is the constructor. It serves to initialize the class.
public Rectangle(float xx, float yy, float ww, float hh, color cc) {
x = xx;
y = yy;
w = ww;
h = hh;
fillColor = cc;
}
public void Render() {
// I like to let my class draw themselves!
if (isVisible) {
fill(fillColor);
rect(x, y, w, h);
}
}
public void Move(float moveX, float moveY) {
// This will be used to move. Since the variables are 'protected', they cannot be accessed from outside this class, so I have to create a tool to use them.
// It is good practice to set 'public' only what's needed, and to manage class variables inside the class.
// This is for many good reasons. Among those, remember that it's harder to debug 'why is my x position weird' when it can be accessed from anywhere.
x += moveX;
y += moveY;
}
public boolean Collision(float xx, float yy, float ww, float hh, float moveX, float moveY) {
// Give coordinates to this function and it will tell you if there's a collision with this rectangle
return Intersect(x + moveX, y + moveY, w, h, xx, yy, ww, hh);
}
}
完成了吗?伟大的!现在您有了一个 Rectangle 类,它将包含矩形的坐标、颜色等内容。
现在我们必须对您的代码进行一些更改。
首先,您不需要全局变量来跟踪红色和蓝色方 block 的位置,因为这将由您刚刚创建的类处理。你可以删除那些。全局变量很有用,但作为一般规则,您使用的越少越好,因为全局变量可能成为跟踪的噩梦并导致无法预料的错误。
然后,您需要将新类初始化为几个漂亮的矩形。为了保持整洁,我们将有一个名为“red”的矩形,以及一个无名矩形的 ArrayList,它们将成为障碍物。 ArrayLists 是一个很棒的工具,您可以稍后学习使用;现在我们只说它将所有这些障碍包含在一个整洁的列表中,我们会在需要时调用。
move
函数将不得不处理所有新的障碍,还要处理我们处理的是一个对象而不是一堆全局变量这一事实。
最后,必须更新 rectRect 函数。目前,它用于检查红色和蓝色是否相交,但从现在开始,它需要能够检查任何和所有矩形。我们将使它更加中立,并以不同的方式使用它。
修改后的代码如下:
//red
Rectangle red;
//all other rectangles
ArrayList <Rectangle> rectList;
float speed = 2;
//float cspeed = 2;
void setup() {
size(800, 800);
noStroke();
noSmooth();
noCursor();
// Initializing Red square
red = new Rectangle(200, 375, 50, 50, color(255, 0, 0));
// Initializing a bunch of rectangles
rectList = new ArrayList <Rectangle>();
rectList.add(new Rectangle(550, 375, 50, 50, color(0, 0, 255))); // Red
rectList.add(new Rectangle(300, 500, 50, 50, color(0, 255, 0))); // Green
// you can add as many as you want
}
void draw() {
surface.setTitle(mouseX + ", " + mouseY);
background(50);
move();
display();
}
void display() {
red.Render();
// this is a java 'For Each' loop. Research it, it's very useful.
for ( Rectangle r : rectList) {
r.Render();
}
}
void move() {
//Red square movement
float moveX = 0;
float moveY = 0;
if (keyPressed) {
// We're going calculate up how much we want to move the red square first
// Then we'll check for collisions
// Then we'll move the square (it there are no collisions)
if (key == 'd' || key == 'D') {moveX += speed;}
else if (key == 'a' || key == 'A') {moveX -= speed;}
else if (key == 'w' || key == 'W') {moveY -= speed;}
else if (key == 's' || key == 'S') {moveY += speed;}
for (Rectangle r : rectList) {
if (red.Collision(r.x, r.y, r.w, r.h, moveX, moveY)) {
// If a collision is detected, we exit this function so there will be no move
return;
}
}
red.Move(moveX, moveY);
}
}
// INTERSECT RECTs
// The old function was nice, but it was really useful only with your specific example. You can re-use this one with any set of rectangles.
// There are many ways to write this function. I wrote this instance back when I was a student, and I still use it to this day.
boolean Intersect(float x1, float y1, float w1, float h1, float x2, float y2, float w2, float h2)
{
boolean checkX = false;
boolean checkY = false;
if ( (x1<=x2 && (x1+w1)>=x2) || (x1<=(x2+w2) && (x1+w1)>=x2+w2) || (x1>=x2 && (x1+w1)<=(x2+w2)) ) {checkX = true;}
if ( (y1<=y2 && (y1+h1)>=y2) || (y1<=(y2+h2) && (y1+h1)>=y2+h2) || (y1>=y2 && (y1+h1)<=(y2+h2)) ) {checkY = true;}
if (checkX && checkY) {return true;}
return false;
}
现在您可以添加一堆其他任何大小和颜色的正方形和长方形!尝试一下!但是,更重要的是,试着理解它。如果您有任何疑问,请记住我随时为您提供帮助。
玩得开心!
关于java - 如何开始然后停止运动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58096356/
这是否可以检测到手机何时像图片上那样移动?这个在android中叫什么名字? 是否有处理此类事情的事件?一年前,我看到一个带指南针的应用程序,它可以实时运行。 谢谢! 最佳答案 我希望这段代码能有所帮
我正在为这个而撕扯我的头发。出于某种奇怪的原因,我找不到/想不出如何在 SFML 和/或 SDL 中移动 Sprite 。我看过的这两个库的教程对此一无所知;所以我认为它更像是 C++ 的东西而不是库
所以我最近一直在研究 DirectX11,但我对它还是很陌生。我现在正在尝试通过翻译来移动一些东西,这就是我所拥有的。我一直在阅读 Frank D Luna 关于 DirectX11 的书,他提供了一
我一直在尝试为绘图元素制作动画,但没有成功。我可以对导入的图像进行动画处理,但是当我尝试对 pygame 生成的绘图进行动画处理时,它们仍然是静态的。 编辑:“动画”是指“移动”。就像使圆在 x 和
好吧,我已经尝试 Java 几个星期了,遵循类和在线教程。我做了一个简单的游戏,其中方 block 落向屏幕底部,而玩家控制一个小球,仅在 x 轴上移动并尝试避开它们。 我遇到的问题是方 block
我的 python 代码遇到一些问题,我正在制作蛇的一个版本,我的问题涉及蛇本身的运动。我已经得到了工作正常的方向,我只需要做到这一点,以便蛇继续沿着通过按键告诉它的方向移动,我还需要使它成为一个 b
那是我的代码。 -(void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event { [[NSNotificationC
我正在构建这个用于慢跑的 Android 应用程序,它应该测量用户从某个时间点开始的距离。 我对使用 GPS 选项(经度、纬度)不感兴趣,所以如果没有 GPS 选项并且只使用 android 传感器,
什么是自律?网上有这样一个回答:“最健康的自律是早睡,最实用的自律是运动,最丰盈内心的自律是读书。”早睡养神,运动养身,读书养脑。坚持把这三件事做好,你就已经超越了很多人。 1 每天早点睡 你有没有过
考虑下面这行 Lisp 代码: (some-function 7 8 | 9) ;; some comment. note the extra indentation 该点位于“8”和
在 Vim 中,如何移动到 xml 文件中的父/表亲标签?我正在寻找类似的东西: vatat " create a selection for second parent tag with all c
用 Dart 做这样的 Canvas 运动的最佳方法是什么? http://jsfiddle.net/loktar/dMYvG/ 我正在尝试使 Canvas 运动平稳,并想看看Dart可以做什么。 还
我试图让一个物体在固定的时间段内沿着圆形路径移动。 这个应用程序是一个“平滑运动”时钟。 因此,我不想每次 .getSeconds() 更新时将位置移动到固定坐标,而是想使用 ( .getSecond
我正在尝试创建一个简单的动画,其中一系列气泡围绕中心点旋转。我有一个动画版本,其中气泡在开始旋转之前从中心点扩散,效果很好,但是一旦我单击其中一个图像(引发动画),屏幕就会卡住一会儿,然后气泡出现在他
不久前我开始学习java作为一种爱好,因为我想制作一个小游戏。我学习了 Java 基础知识,并决定尝试解决游戏开发问题。我的 JFrame 和一切都很好,从技术上讲我没有错误,但我的小矩形家伙不会在屏
我在制作台球游戏时遇到问题,当我模拟击球时,我需要球使用react,程序是这样工作的,您单击击球的方向和力量,然后单击开始, go按钮位于创建标签的GUI类中,该按钮调用我的主类中的一个方法来接收参数
我以前在 2d 项目中使用过类似的东西来移动并且它总是有效。我现在正在使用它,它为我提供了一些输出的正确角度和错误的角度。我认为我的触发器中有一些错误,我弄错了。不过,我已经检查了大约一百万次。 Pr
我的 OpenGL 应用程序有问题,您可以在 this gif 中清楚地看到.基本上我想朝光标指向的方向移动,但这并没有发生,而是“前进”方向保持不变。 例如,如果我转身 180° 并按“w”向前走,
因此,我再次开始使用 C++ 编程并尝试使用 OpenGL。目前我有一个基本的应用程序,我只想用键移动相机。我读了很多关于这个的文章,但我仍然对运动有问题,我猜是因为即使只有一点点,但它们与我的程序不
我在 Android OpenGL 中有一个 Sprite 。这个 Sprite (一只小甲虫)总是向前移动,我使用: sprite.setPosition(posX, posY); 现在我有一个旋转
我是一名优秀的程序员,十分优秀!