Advertisement
Guest User

Untitled

a guest
Dec 6th, 2016
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Swift 10.31 KB | None | 0 0
  1. //
  2. //  ViewController.swift
  3. //  utahDemo
  4. //
  5. //  Created by vm mac on 2016-12-02.
  6. //  Copyright © 2016 Michael Aubie. All rights reserved.
  7. //
  8.  
  9. import GLKit
  10.  
  11. // a struct for a 2D Vector
  12. struct myVec2 {
  13.     var x:Float
  14.     var y:Float
  15.  
  16.     mutating func setX (newX: Float){
  17.         x = newX
  18.     }
  19.     mutating func setY (newY: Float){
  20.         y = newY
  21.     }
  22. }
  23.  
  24.  
  25. struct block {
  26.  
  27.     var _position:myVec2
  28.     var _size:Float
  29.     var _isHit:Bool
  30. }
  31.  
  32.  
  33.  
  34. class ViewController: GLKViewController, UIGestureRecognizerDelegate {
  35.    
  36.     // the shader program
  37.     private var _program: GLuint = 0
  38.    
  39.     //an amount to scale the player's quad
  40.     private var _scaleX:Float = 5.0
  41.     private var _scaleY:Float = 1.0
  42.    
  43.     //the speed of the players Xmovement, it will switch between positive and negative
  44.     private var _moveValue:Float = 0.08
  45.     //speed of the bullets
  46.     private let _bulletSpeed:Float = 0.08
  47.    
  48.     //position of player and bullets
  49.     private var _bulletArray:[myVec2] = []
  50.     private let _playerY:Float = -0.8
  51.     private var _playerPosition:Float = 0.0
  52.     private var _lineOfBlocks: [block] = []
  53.    
  54.    
  55.    
  56.     let triangle: [Float] = [
  57.         -0.5, 0.0,
  58.         0.5, 0.0,
  59.         0.0, 1.0
  60.     ]
  61.    
  62.    
  63.     let quad: [Float] = [
  64.         -0.05, -0.05,
  65.         0.05, -0.05,
  66.         -0.05, 0.05,
  67.         0.05, 0.05,
  68.        
  69.         ]
  70.    
  71.    
  72.    
  73.    
  74.     override func viewDidLoad() {
  75.         super.viewDidLoad()
  76.        
  77.         //setup opengl
  78.         let glkView = view as! GLKView
  79.         glkView.context = EAGLContext(api: .openGLES2)
  80.         EAGLContext.setCurrent(glkView.context)
  81.         glkView.drawableColorFormat = .RGBA8888
  82.         EAGLContext.setCurrent(glkView.context)
  83.        
  84.        
  85.         setup()
  86.        
  87.        
  88.         //recognize taps
  89.         let tap = UITapGestureRecognizer(target: self, action: #selector(ViewController.handleTap))
  90.         tap.delegate = self
  91.         view.addGestureRecognizer(tap)
  92.        
  93.         //recognize swipe left
  94.         let swipeLeft = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.handleSwipes))
  95.         swipeLeft.direction = .left
  96.         view.addGestureRecognizer(swipeLeft)
  97.        
  98.         //recognize swipe right
  99.         let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.handleSwipes))
  100.         swipeRight.direction = .right
  101.         view.addGestureRecognizer(swipeRight)
  102.  
  103.        
  104.         //add line of blocks
  105.         for x in -8...8 {
  106.             let myNewVec = myVec2(x: Float(x)*0.1, y: 0.8)
  107.             let newBlock = block(_position: myNewVec, _size: _scaleX*0.2, _isHit: false)
  108.             _lineOfBlocks.append(newBlock)
  109.         }
  110.     }
  111.    
  112.    
  113.     func handleTap(sender: UITapGestureRecognizer? = nil) {
  114.         // on tap add a new bullet to the array
  115.         let newbullet = myVec2(x: _playerPosition, y: _playerY)
  116.         _bulletArray.append(newbullet)
  117.     }
  118.    
  119.     func handleSwipes(sender:UISwipeGestureRecognizer) {
  120.         if (sender.direction == .left) {
  121.             if( _moveValue >= 0) { _moveValue *= -1}
  122.         }
  123.        
  124.         if (sender.direction == .right) {
  125.             if( _moveValue <= 0) { _moveValue *= -1}
  126.         }
  127.     }
  128.  
  129.     override func didReceiveMemoryWarning() {
  130.         super.didReceiveMemoryWarning()
  131.         // Dispose of any resources that can be recreated.
  132.     }
  133.  
  134.     func setup() {
  135.         glClearColor(0.0, 1.0, 1.0, 1.0)
  136.        
  137.         var vertexShaderSource: NSString = "" +
  138.             "attribute vec2 position;" +
  139.             "uniform vec2 translate; \n" +
  140.             "uniform vec2 scale; \n" +
  141.             "void main() \n"  +
  142.             "{ \n" as NSString
  143.         vertexShaderSource = (vertexShaderSource as String) +
  144.         "    gl_Position = vec4(position.x * scale.x + translate.x, position.y * scale.y + translate.y, 0.0, 1.0); \n" +
  145.         "} \n" as NSString
  146.  
  147.        
  148.         var fragmentShaderSource: NSString = "" +
  149.             "uniform highp vec4 color; \n" +
  150.             "void main() \n"  +
  151.             "{ \n" as NSString
  152.         fragmentShaderSource = (fragmentShaderSource as String) +
  153.             "    gl_FragColor = color; \n" +
  154.             "} \n" as NSString
  155.        
  156.        let vertexShader: GLuint = glCreateShader(GLenum(GL_VERTEX_SHADER))
  157.        
  158.         var vertexShaderSourceUTF8 = vertexShaderSource.utf8String
  159.         glShaderSource(vertexShader, 1, &vertexShaderSourceUTF8, nil)
  160.         glCompileShader(vertexShader)
  161.         var vertexShaderCompileStatus: GLint = GL_FALSE
  162.         glGetShaderiv(vertexShader, GLenum(GL_COMPILE_STATUS), &vertexShaderCompileStatus)
  163.        
  164.         if vertexShaderCompileStatus == GL_FALSE {
  165.             var vertexShaderLogLength: GLint = 0
  166.             glGetShaderiv(vertexShader, GLenum(GL_INFO_LOG_LENGTH), &vertexShaderLogLength)
  167.             let vertexShaderLog = UnsafeMutablePointer<GLchar>.allocate(capacity: Int(vertexShaderLogLength))
  168.             glGetShaderInfoLog(vertexShader, vertexShaderLogLength, nil, vertexShaderLog)
  169.             let vertexShaderLogString: NSString = NSString(utf8String: vertexShaderLog)!
  170.             print("Vertex Shader Compiling failed \(vertexShaderLogString)")
  171.            
  172.         }
  173.        
  174.         let fragmentShader: GLuint = glCreateShader(GLenum(GL_FRAGMENT_SHADER))
  175.        
  176.         var fragmentShaderSourceUTF8 = fragmentShaderSource.utf8String
  177.         glShaderSource(fragmentShader, 1, &fragmentShaderSourceUTF8, nil)
  178.         glCompileShader(fragmentShader)
  179.         var fragmentShaderCompileStatus: GLint = GL_FALSE
  180.         glGetShaderiv(fragmentShader, GLenum(GL_COMPILE_STATUS), &fragmentShaderCompileStatus)
  181.        
  182.         if fragmentShaderCompileStatus == GL_FALSE {
  183.             var fragmentShaderLogLength: GLint = 0
  184.             glGetShaderiv(fragmentShader, GLenum(GL_INFO_LOG_LENGTH), &fragmentShaderLogLength)
  185.             let fragmentShaderLog = UnsafeMutablePointer<GLchar>.allocate(capacity: Int(fragmentShaderLogLength))
  186.             glGetShaderInfoLog(fragmentShader, fragmentShaderLogLength, nil, fragmentShaderLog)
  187.             let fragmentShaderLogString: NSString = NSString(utf8String: fragmentShaderLog)!
  188.             print("fragment Shader Compiling failed \(fragmentShaderLogString)")
  189.            
  190.         }
  191.  
  192.         _program = glCreateProgram()
  193.         glAttachShader(_program, vertexShader)
  194.         glAttachShader(_program, fragmentShader)
  195.         glBindAttribLocation(_program, 0, "position")
  196.         glLinkProgram(_program)
  197.         var programLinkStatus: GLint = GL_FALSE
  198.         glGetProgramiv(_program, GLenum(GL_LINK_STATUS), &programLinkStatus)
  199.         if programLinkStatus == GL_FALSE {
  200.             var ProgramLogLength: GLint = 0
  201.             glGetProgramiv(_program, GLenum(GL_INFO_LOG_LENGTH), &ProgramLogLength)
  202.             let linkLog = UnsafeMutablePointer<GLchar>.allocate(capacity: Int(ProgramLogLength))
  203.             glGetProgramInfoLog(_program, ProgramLogLength, nil, linkLog)
  204.             let linkLogString: NSString? = NSString(utf8String: linkLog)
  205.             print("Program Link Failed \(linkLogString)")
  206.         }
  207.        
  208.         glUseProgram(_program)
  209.         glEnableVertexAttribArray(0)
  210.     }
  211.    
  212.     func update() {
  213.        
  214.        
  215.        
  216.         //move the bullets
  217.         for bullet in 0..<_bulletArray.count {
  218.             let newY = _bulletArray[bullet].y + _bulletSpeed
  219.             _bulletArray[bullet].setY(newY: newY)
  220.            
  221.             //check for collision with blocks
  222.             for block in 0..<_lineOfBlocks.count {
  223.                 if abs(_bulletArray[bullet].x - _lineOfBlocks[block]._position.x) < 0.05 &&
  224.                     abs(_bulletArray[bullet].y - _lineOfBlocks[block]._position.y) < 0.05 {
  225.                     _lineOfBlocks[block]._isHit = true
  226.                 }
  227.                
  228.                 //move the block down
  229.                 _lineOfBlocks[block]._position.y -= 0.0002
  230.             }
  231.            
  232.             //to do: delete the bullets
  233.         }
  234.        
  235.         _playerPosition += _moveValue
  236.         if _playerPosition > 0.95 || _playerPosition < -0.95 { _moveValue *= -1}
  237.        
  238.        
  239.     }
  240.    
  241.  
  242.     override func glkView(_ view: GLKView, drawIn rect: CGRect) {
  243.        
  244.        
  245.        
  246.         glClear(GLbitfield(GL_COLOR_BUFFER_BIT))
  247.      
  248.        
  249.         //draws the player
  250.         glVertexAttribPointer(0, 2, GLenum(GL_FLOAT), GLboolean(GL_FALSE), 0, quad)
  251.         glUniform2f(glGetUniformLocation(_program, "translate"), _playerPosition, -0.8)
  252.         glUniform2f(glGetUniformLocation(_program, "scale"), _scaleX, _scaleY)
  253.         glUniform4f(glGetUniformLocation(_program, "color"), 1.0, 0.0, 0.0, 1.0)
  254.         glDrawArrays(GLenum(GL_TRIANGLE_STRIP), 0, 4)
  255.        
  256.        
  257.        
  258.        
  259. //        //draws the blocks along the top
  260.         for block in 0..<_lineOfBlocks.count {
  261.             let blockPos = block - 8
  262.             glVertexAttribPointer(0, 2, GLenum(GL_FLOAT), GLboolean(GL_FALSE), 0, quad)
  263.             glUniform2f(glGetUniformLocation(_program, "translate"), GLfloat(_lineOfBlocks[block]._position.x), GLfloat(_lineOfBlocks[block]._position.y))
  264.             glUniform2f(glGetUniformLocation(_program, "scale"), _scaleX*0.2, _scaleY)
  265.            
  266.             if(block<0){
  267.                 glUniform4f(glGetUniformLocation(_program, "color"), 0.3, -0.1*GLfloat(blockPos), 0.8, 1.0)
  268.             }
  269.             else{
  270.                 glUniform4f(glGetUniformLocation(_program, "color"), 0.3, 0.1*GLfloat(blockPos), 0.8, 1.0)
  271.             }
  272.            
  273.             if _lineOfBlocks[block]._isHit == false {
  274.                 glDrawArrays(GLenum(GL_TRIANGLE_STRIP), 0, 4)
  275.             }
  276.            
  277.  
  278.         }
  279.        
  280.        
  281.         //draws the bullets
  282.         for bullet in _bulletArray {
  283.             glVertexAttribPointer(0, 2, GLenum(GL_FLOAT), GLboolean(GL_FALSE), 0, triangle)
  284.            
  285.             glUniform2f(glGetUniformLocation(_program, "translate"), bullet.x, bullet.y)
  286.             glUniform4f(glGetUniformLocation(_program, "color"), 1.0, 0.0, 1.0, 1.0)
  287.             glUniform2f(glGetUniformLocation(_program, "scale"), 0.08, 0.08)
  288.             glDrawArrays(GLenum(GL_TRIANGLES), 0, 3)
  289.         }
  290.        
  291.     }
  292.    
  293.     override var canBecomeFirstResponder: Bool {
  294.         return true
  295.     }
  296.  
  297.    
  298.    
  299.    
  300. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement