旋转游戏

Posted HEIMOFA

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了旋转游戏相关的知识,希望对你有一定的参考价值。

题目描述

pipi 和 lili 各带来一个正多边形卡片。

pipi 的卡片是边长为 \\(A\\) 的正 \\(M\\) 边形,lili 的卡片是边长为 \\(B\\) 的正 \\(N\\) 边形。

pipi 和 lili 将两张卡片摆放在一起,其中两张卡片并不重叠,并且有至少一个公共顶点和一条公共边。

pipi 喜欢旋转,因此她沿 lili 的卡片顺时针旋转自己的多边形。旋转的中心点是多边形公共边上一点,且旋转过程中两张卡片不重叠。

pipi 想知道,在旋转多少次过后,pipi 的正多边形会回到原位置。

【例如】:pipi 的卡片是边长为 \\(2\\) 的正 \\(4\\) 边形,lili 的卡片是边长为 \\(3\\) 的正 \\(4\\) 边形。

前两次旋转如图所示:


输入格式

一行,四个整数 \\(A,M,B,N\\) ,含义如题目描述所述。


输出格式

一行,一个数 \\(Ans\\) ,表示 pipi 旋转的次数。


样例输入

2 4 3 4

样例输出

8

提示

对于 \\(100\\%\\) 的数据,\\(1 ≤ A ≤ B ≤ 10^6\\)\\(3 ≤ N,M ≤ 10^6\\)


很有意思的一道题目

不难看出,如果 \\(A\\)\\(B\\) 的一条边旋转到另一条边,两次接触 \\(B\\) 的长度之和必定是 \\(A\\) 的边长

那么便可以把 \\(A\\) 每次旋转出来的图形表示在一根数轴上

也就是说 \\(A\\) 的个数就是 \\(A\\) 的边长与 \\(B\\) 的周长的最小公倍数,再除以 \\(A\\) 的边长

但我们忽略了一点,当我们把这些旋转出来的图形放在数轴上时,有一部分没有放上去,那便是转角处的 \\(A\\)

转角处的 \\(A\\) 有两种情况,一种是刚好有一个顶点与 \\(B\\) 重合,这在第一次已经算过了,要删掉,第二种便是普通情况

普通情况下就是 \\(A\\) 的边长与 \\(B\\) 的周长的最小公倍数,再除以 \\(B\\) 的边长即可

特殊情况则需要 \\(A\\) 的边长与 \\(B\\) 的边长的最小公倍数,这个便是每隔多长会出现一次特殊情况

再用 \\(A\\) 的边长与 \\(B\\) 的周长的最小公倍数除以这个数便是特殊情况的个数

顺便放张样例转化成这个思路的图,自行体会吧

\\(Code:\\)

#include<bits/stdc++.h>
#define int long long//不开long long见祖宗
using namespace std;
int a,m,b,n;

int gcd(int a,int b)
	if(a%b==0) return b;
	else return gcd(b,a%b);

int lcm(int a,int b)
	return a*b/gcd(a,b);

signed main()

	scanf("%lld%lld%lld%lld",&a,&m,&b,&n);
	int x=lcm(a,n*b);
	int c1=x/a;
	int y=lcm(a,b);
	int c2=x/b-x/y; 
	printf("%lld",c1+c2);
	return 0;

游戏不旋转 PortraitUpsideDown

【中文标题】游戏不旋转 PortraitUpsideDown【英文标题】:Game not rotating PortraitUpsideDown 【发布时间】:2015-02-12 11:08:00 【问题描述】:

方向显示在 info.plist 文件中的“支持界面方向”中,但转动时仍不旋转。

我希望制作 Portrait & Portraitupsidedown

这是来自 RootViewController.m

   - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 

        //
        // There are 2 ways to support auto-rotation:
        //  - The OpenGL / cocos2d way
        //     - Faster, but doesn't rotate the UIKit objects
        //  - The ViewController way
        //    - A bit slower, but the UiKit objects are placed in the right place
        //

    #if GAME_AUTOROTATION==kGameAutorotationNone
        //
        // EAGLView won't be autorotated.
        // Since this method should return YES in at least 1 orientation, 
        // we return YES only in the Portrait orientation
        //

    #elif GAME_AUTOROTATION==kGameAutorotationCCDirector
        //
        // EAGLView will be rotated by cocos2d
        //
        // Sample: Autorotate only in landscape mode
        //
        if( interfaceOrientation == UIInterfaceOrientationLandscapeLeft ) 
            [[CCDirector sharedDirector] setDeviceOrientation: kCCDeviceOrientationLandscapeRight];
         else if( interfaceOrientation == UIInterfaceOrientationLandscapeRight) 
            [[CCDirector sharedDirector] setDeviceOrientation: kCCDeviceOrientationLandscapeLeft];
        

        // Since this method should return YES in at least 1 orientation,
        // we return YES only in the Portrait orientation
        return ( interfaceOrientation == UIInterfaceOrientationPortrait );

    #elif GAME_AUTOROTATION == kGameAutorotationUIViewController
        //
        // EAGLView will be rotated by the UIViewController
        //
        // Sample: Autorotate only in landscpe mode
        //
        // return YES for the supported orientations

        return ( UIInterfaceOrientationIsPortrait(interfaceOrientation));

    #else
    #error Unknown value in GAME_AUTOROTATION

    #endif // GAME_AUTOROTATION


        // Shold not happen
        return NO;
    

    //
    // This callback only will be called when GAME_AUTOROTATION == kGameAutorotationUIViewController
    //
    #if GAME_AUTOROTATION == kGameAutorotationUIViewController
    -(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
    
        //
        // Assuming that the main window has the size of the screen
        // BUG: This won't work if the EAGLView is not fullscreen
        ///
        CGRect screenRect = [[UIScreen mainScreen] bounds];
        CGRect rect = CGRectZero;

        if(toInterfaceOrientation == UIInterfaceOrientationPortrait || toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)
            rect = screenRect;


        else if(toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight)
            rect.size = CGSizeMake( screenRect.size.height, screenRect.size.width );

        CCDirector *director = [CCDirector sharedDirector];
        EAGLView *glView = [director openGLView];
        float contentScaleFactor = [director contentScaleFactor];

        if( contentScaleFactor != 1 ) 
            rect.size.width *= contentScaleFactor;
            rect.size.height *= contentScaleFactor;
        
        glView.frame = rect;
    
    #endif // GAME_AUTOROTATION == kGameAutorotationUIViewController


From the AppDelegate.m file I also have;

    // Init the window
    window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    // Try to use CADisplayLink director
    // if it fails (SDK < 3.1) use the default director
    if( ! [CCDirector setDirectorType:kCCDirectorTypeDisplayLink] )
        [CCDirector setDirectorType:kCCDirectorTypeDefault];

    CCDirector *director = [CCDirector sharedDirector];

    // Init the View Controller
    viewController = [[RootViewController alloc] initWithNibName:nil bundle:nil];
    viewController.wantsFullScreenLayout = YES;

    //
    // Create the EAGLView manually
    //  1. Create a RGB565 format. Alternative: RGBA8
    //  2. depth format of 0 bit. Use 16 or 24 bit for 3d effects, like CCPageTurnTransition
    //
    //
    EAGLView *glView = [EAGLView viewWithFrame:[window bounds]
                                   pixelFormat:kEAGLColorFormatRGB565   // kEAGLColorFormatRGBA8
                                   depthFormat:0                        // GL_DEPTH_COMPONENT16_OES
                        ];

    // attach the openglView to the director
    [director setOpenGLView:glView];

//  // Enables High Res mode (Retina Display) on iPhone 4 and maintains low res on all other devices
    if( ! [director enableRetinaDisplay:YES] )
        CCLOG(@"Retina Display Not supported");

    //
    // VERY IMPORTANT:
    // If the rotation is going to be controlled by a UIViewController
    // then the device orientation should be "Portrait".
    //
    // IMPORTANT:
    // By default, this template only supports Landscape orientations.
    // Edit the RootViewController.m file to edit the supported orientations.
    //

    [director setDeviceOrientation:kCCDeviceOrientationPortrait];
    [director setAnimationInterval:1.0/60];
    [director setDisplayFPS:NO];


    // make the OpenGLView a child of the view controller
    [viewController setView:glView];

    // make the View Controller a child of the main window
    [window addSubview: viewController.view];

    [window makeKeyAndVisible];

我有其他游戏,使用 Cocos2d,我已经设法旋转,我与那些交叉检查了设置,它们是相同的,所以我不知道为什么它不旋转?

编辑 -

这可能是关于这个的一个有说服力的消息......

Application windows are expected to have a root view controller at the end of application launch

【问题讨论】:

你试过追踪它吗?设置断点以及发生了什么。 我不确定在哪里放置断点? 【参考方案1】:

尝试添加rootViewController

[window setRootViewController: viewController];

【讨论】:

嗨@gururaj.T,效果更好,它现在可以旋转,但一切都在屏幕外,即它旋转并出现黑屏(所以一切都在屏幕外) 好的解决方案是将代码移植到 Cocos2d 2.x 或 3.x【参考方案2】:

在你的 rootview 控制器中,注释掉

CCDirector *director = [CCDirector sharedDirector];
EAGLView *glView = [director openGLView];
float contentScaleFactor = [director contentScaleFactor];

if( contentScaleFactor != 1 ) 
    rect.size.width *= contentScaleFactor;
    rect.size.height *= contentScaleFactor;

glView.frame = rect;

【讨论】:

以上是关于旋转游戏的主要内容,如果未能解决你的问题,请参考以下文章

我需要使用 c# 将一个游戏对象旋转到 Unity 中的另一个游戏对象,但我希望旋转仅在 z 中

Unity3D视图中心 ( 视图中心概念 | 围绕游戏物体旋转 | 添加游戏物体到游戏场景的位置 )

游戏不旋转 PortraitUpsideDown

Unity3D游戏物体操作 ③ ( 旋转操作 | 旋转工具 | 基本旋转 | 设置旋转属性 | 增量旋转 | 缩放操作 | 轴向缩放 | 整体缩放 | 操作工具切换 | 操作模式切换 )

随着时间的推移旋转游戏对象

随着时间的推移旋转游戏对象