- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
下面是工作 View Controller ,它允许根据点击位置创建多个球,然后计算球的 x 和 y 速度。创建球后,它会根据计算出的速度移动并弹离屏幕周边。我使用 NSTimer 来制作球运动的动画。问题只是最近创建的球移动。创建新球后,先前的球停止移动。 Methinks这是一个并发类型的问题。我做了一些研究并尝试了一些线程,但无法让它工作。也许使用 NSTimer 不是最好的方法?
无论如何,这里的最终目标是让所有创建的球同时移动。
#import "ViewController.h"
#import "Ball.h"
#import "Constants.h"
NSTimeInterval lastTouch;
NSTimeInterval eventTime;
Ball *currentBall;
CGPoint ballStartPosition;
NSMutableArray *balls;
// get iPhone display size & aspect ratio
CGSize screen_size;
@interface ViewController () {
}
@property (strong, nonatomic) EAGLContext *context;
- (void)setupGL;
- (void)tearDownGL;
- (void)setupOrthographicView;
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];
if (!self.context) {
NSLog(@"Failed to create ES context");
}
GLKView *view = (GLKView *)self.view;
view.context = self.context;
view.drawableDepthFormat = GLKViewDrawableDepthFormat24;
balls = [[NSMutableArray alloc] initWithObjects: nil];
[self setupGL];
self.motionManager = [[CMMotionManager alloc] init];
self.motionManager.accelerometerUpdateInterval = .2;
[self.motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue currentQueue]
withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {
[self updateAcceleration:accelerometerData.acceleration];
if(error){ NSLog(@"%@", error); }
}];}
- (void)dealloc
{
[self tearDownGL];
if ([EAGLContext currentContext] == self.context) {
[EAGLContext setCurrentContext:nil];
}
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
if ([self isViewLoaded] && ([[self view] window] == nil)) {
self.view = nil;
[self tearDownGL];
if ([EAGLContext currentContext] == self.context) {
[EAGLContext setCurrentContext:nil];
}
self.context = nil;
}
// Dispose of any resources that can be recreated.
}
- (void)update
{
[self setupOrthographicView];
}
- (void)setupGL
{
[EAGLContext setCurrentContext:self.context];
}
- (void)tearDownGL
{
[EAGLContext setCurrentContext:self.context];
}
- (void)setupOrthographicView
{
screen_size= self.view.bounds.size;
// set viewport based on display size
glViewport(0, 0, screen_size.width, screen_size.height);
// set up orthographic projection
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrthof(0, screen_size.width, 0, screen_size.height, -1.0f, 1.0f);
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
lastTouch = [NSDate timeIntervalSinceReferenceDate];
// get iPhone display size & aspect ratio
CGSize screen_size = self.view.bounds.size;
// get the touch point and fix coordinates
CGPoint touch_point = [[touches anyObject] locationInView:self.view];
touch_point.y = screen_size.height - touch_point.y;
touch_point = CGPointMake(touch_point.x, touch_point.y);
ballStartPosition = touch_point;
// generate random RGB values and store them in an array
float r = RANDOM_FLOAT_BETWEEN(0.0, 1.0);
float g = RANDOM_FLOAT_BETWEEN(0.0, 1.0);
float b = RANDOM_FLOAT_BETWEEN(0.0, 1.0);
NSMutableArray *random_color = [[NSMutableArray alloc] init];
[random_color addObject:[NSNumber numberWithFloat:r]];
[random_color addObject:[NSNumber numberWithFloat:g]];
[random_color addObject:[NSNumber numberWithFloat:b]];
currentBall = [[Ball alloc] init];
int initialBallRadius = 2;
[currentBall makeBallWithRadius: initialBallRadius position:touch_point color:random_color];
[currentBall setStart_position:ballStartPosition];
[balls addObject:currentBall];
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
eventTime = [NSDate timeIntervalSinceReferenceDate];
NSTimeInterval touchBeginEndInterval = eventTime - lastTouch;
// NSLog(@"%f", touchBeginEndInterval );
// get the touch point and fix coordinates
CGPoint touch_point = [[touches anyObject] locationInView:self.view];
touch_point.y = screen_size.height - touch_point.y;
touch_point = CGPointMake(touch_point.x, touch_point.y);
int ball_scale = 15;
[currentBall setRadius:touchBeginEndInterval*ball_scale];
float x_distance = touch_point.x - ballStartPosition.x;
float y_distance = touch_point.y - ballStartPosition.y;
// NSLog(@"dx: %f dy: %f",x_distance, y_distance );
float x_velocity = x_distance / touchBeginEndInterval;
float y_velocity = y_distance / touchBeginEndInterval;
// NSLog(@"vx: %f vy: %f",x_velocity, y_velocity );
[currentBall setX_velocity:x_velocity];
[currentBall setY_velocity:y_velocity];
[NSTimer scheduledTimerWithTimeInterval:0.0001 target:self selector:@selector(doBallTick) userInfo:NULL repeats:YES];
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
// get the touch point and fix coordinates
CGPoint touch_point = [[touches anyObject] locationInView:self.view];
touch_point.y = screen_size.height - touch_point.y;
touch_point = CGPointMake(touch_point.x, touch_point.y);
// NSLog(@"x: %f y: %f", touch_point.x, touch_point.y);
[currentBall setPosition:touch_point];
}
- (void) doBallTick {
NSTimeInterval current_time = [NSDate timeIntervalSinceReferenceDate];
[currentBall setCurrent_time:(current_time - eventTime)];
[currentBall update];
//NSLog(@"%f", (eventTime));
//Checks if the ball is outside bounds
if ((currentBall.position.x - currentBall.radius) <= 0) {
eventTime = current_time;
[currentBall hitLeft];
}else if ((currentBall.position.x + currentBall.radius) >= screen_size.width){
eventTime = current_time;
[currentBall hitRight];
}else if ((currentBall.position.y - currentBall.radius) <= 0) {
eventTime = current_time;
[currentBall hitBottom];
}else if ((currentBall.position.y + currentBall.radius) >= screen_size.height){
eventTime = current_time;
[currentBall hitTop];
}
}
- (void)updateAcceleration:(CMAcceleration)acceleration
{
// add acceleration code here
}
void GLDrawEllipse (int segments, CGFloat width, CGFloat height, CGPoint center, bool filled)
{
glPushMatrix();
glTranslatef(center.x, center.y, 0.0);
GLfloat vertices[segments*2];
int count=0;
for (GLfloat i = 0; i < 360.0f; i+=(360.0f/segments))
{
vertices[count++] = (cos(DEGREES_TO_RADIANS(i))*width);
vertices[count++] = (sin(DEGREES_TO_RADIANS(i))*height);
}
glVertexPointer (2, GL_FLOAT , 0, vertices);
glDrawArrays ((filled) ? GL_TRIANGLE_FAN : GL_LINE_LOOP, 0, segments);
glPopMatrix();
}
void GLDrawCircle (int circleSegments, CGFloat circleSize, CGPoint center, bool filled)
{
GLDrawEllipse(circleSegments, circleSize, circleSize, center, filled);
}
#pragma mark - GLKView and GLKViewController delegate methods
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
// clear the rendering buffer
glClear(GL_COLOR_BUFFER_BIT);
// enable the vertex array rendering
glEnableClientState(GL_VERTEX_ARRAY);
// draw and dispaly the balls
for(int i = 0; i < [balls count]; i++) {
Ball *current_ball = (Ball *) [balls objectAtIndex: i];
NSMutableArray *random_color = [current_ball color];
glColor4f([[random_color objectAtIndex:0] floatValue], [[random_color objectAtIndex:1] floatValue], [[random_color objectAtIndex:2] floatValue], 1);
GLDrawCircle(30, [current_ball radius], [current_ball position], true);
}
}
@end
最佳答案
在您的doBallTick
方法中,您只移动currentBall
。你应该只在 init 方法中安排你的选择器一次(而不是每次你创建一个球),然后在你的 doBallTick
中遍历 balls
nsarray 中的所有球方法。
关于iOS 多个弹跳球,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22413163/
我试图让球弹起,或者在它们碰撞时反转方向。我让它检查移动方法中的碰撞。它检查两个球之间是否发生碰撞,如果发生碰撞,它将反转速度。问题是,有时球会互相穿过,主要是较小的球。球要么弹跳得早,要么弹得晚,要
我一直在努力根据 2 个弹跳圆/球获得正确的矢量值。我知道他们什么时候反弹;使用毕达哥拉斯,但后来我迷路了。我知道我可能不得不使用三 Angular 函数 cos/sin/tan2。 情况,以我的形象
using UnityEngine; using System.Collections; public class audio : MonoBehaviour { public AudioClip
我正在尝试创建 3d 球体的动画,该动画是由该球体表面上的随机点制作的。这是我的代码,我在其中创建 500 个随机极点,然后将这些极坐标转换为笛卡尔坐标,然后将 X 和 Y 坐标映射到屏幕。这就是我得
我创建的这个程序应该基本上使用公式 V=Pi*h^2(3r-h)/3 但我的最终答案并没有相加。 例如:如果我用 1 代替半径,用 2 代替高度,我应该得到 4.18,但通过程序我得到 -1。 #in
我正在尝试制作一个简单的游戏,但如果我需要弹跳球的图像,我该怎么做呢?我正在做这个- function draw() { ctx.clearRect(0, 0, 300, 300);
我只是提出一个有可能结束的想法。我需要画一个 Crystal 球,红色和蓝色粒子随机分布在其中。我想我必须使用 photoshop,甚至尝试在图像中制作球,但由于这是用于研究论文并且不必很花哨,我想知
我有圆与圆相交的代码。但我需要将其扩展到 3-D。你能帮我写函数吗? static class Point{ double x, y, z; int dimension; Po
目标:我有一个三 Angular 形的球。球具有初始位置和速度。我试图弄清楚球会击中三 Angular 形的哪一边。 我试过的: I derived a formula通过参数化球的路径和三 Angu
由于我是 cocos2d 的新手,而且我很挣扎。任何人都可以建议我如何解决这个问题。 我有 3 个盒子(它们是运动体) 还有多个球(它们是动态物体),每个球都有一个标签值(盒子编号)。 我在射球位置和
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 7 年前。 Improve this qu
我正在为 rpm 编写一个 .spec 文件,它只是将一个 tar 球解压到文件系统上的某个目录中 那么我把原来的 tar 球放在哪里呢?我看到的所有示例都是从互联网上下载原始 tar 球的。但就我而
我是 THREE.js 的新手,对物理知识知之甚少 - 但我正在尝试构建一个足球游戏引擎(从顶部看),现在我正在为球的运动而苦苦挣扎。 当尝试将球从一侧移动到另一侧时,旋转始终朝向一个方向,我不明白如
我必须在 Android 中开发一个在屏幕上 move 球的应用程序。我需要用加速度计 move 球。我有这段代码,但球绕过边界并且没有反弹。 package com.example.test
我正在尝试创建一个 Roomba 程序,其中有一个球在屏幕上弹跳,以清洁它经过的瓷砖。该程序应该从所有灰色瓷砖开始,当球经过它们时,瓷砖就会变成白色。目前我有一个可以到处弹跳的球和一个创建 5x5 网
我正在尝试为我当前的作业创建一个加载屏幕效果。 它需要我们创建一个与 position: fixed .以此资金为背景。使用这个 div,有 4 个 与 position: absolute . 我们
我想将一个球(带有图像)扔到一个二维场景中,并在它到达一定距离时检查它是否发生碰撞。但我无法让它正确地“飞”。似乎这个问题已经被问过一百万次了,但随着我发现的越多,我就越困惑..现在我关注了this
这是我的代码 import java.util.*; import javafx.application.Application; import javafx.scene.Scene; import
我是一名优秀的程序员,十分优秀!