C语言学习记录20240626

飞船无论朝哪边行驶,都能通过结构体记录获取它的初始坐标、转向角度和在该方向行进的距离,需要根据这些信息计算飞船移动后的坐标。

向量(vector)指具有大小(magnitude)和方向(direction)的量,可以理解为有方向的线段。
标量或纯量(scalar)指只有大小没有方向的量。
向量的分量(component)是指向量在不同方向上的投影或分解。
二维向量 V ⃗ ( 2 , − 5 ) \vec{V}(2, -5) V (2,5),X 轴方向上分量为 2, Y 轴方向上分量为 -5,向量大小 ∣ ∣ V ⃗ ∣ ∣ ||\vec{V}|| ∣∣V ∣∣ 由勾股定理得到 2 2 + ( − 5 ) 2 \sqrt{2^2 + (-5)^2} 22+(5)2 ,书写参考 《Markdown 数学公式详解》https://blog.csdn.net/qq_34745941/article/details/126598575

单位向量(unit vector)为大小或模为1个单位的向量。一个非零向量除以它的模,就可以得到相应的单位向量。所以向量也可以记为标量乘以指定方向的单位向量,然后相加,如 (2,-5) 可以记为 2(1,0)-5(0,1)

向量还有一种记法是以大小和方向表示,这里的方向通常为向量线与 X 正轴的夹角,X 正轴逆时针方向夹角为正,顺时针方向夹角为负。由于屏幕坐标左上角为原点,屏幕范围为正轴,纵轴与通常坐标轴方向相反,Allegro 函数 al_rotate_transform 应用转换矩阵旋转时,弧度为正则是顺时针,为负则是逆时针。

为了便于计算,假设飞船初始朝向与 X 轴平行,绘制初始画面时,飞船朝上与 Y 轴平行,向量夹角为负 90 度,右转 30 度向前行驶一段距离,则飞船终点相对于初始坐标变化 X 坐标为 ∣ ∣ V ⃗ ∣ ∣ c o s ( 30 − 90 ) ||\vec{V}||cos(30-90) ∣∣V ∣∣cos(3090),Y 坐标为 ∣ ∣ V ⃗ ∣ ∣ s i n ( 30 − 90 ) ||\vec{V}||sin(30-90) ∣∣V ∣∣sin(3090)

C 语言 math 模块中的 cos 和 sin 传入参数也是弧度。

Allegro 中按住按键不放,并不会持续产生按键事件,可以在定时器事件中循环检查所有按键状态 al_get_keyboard_state,然后通过 al_key_down 判断指定按键按下状态,未检测到按下状态即为弹起 https://liballeg.org/a5docs/trunk/keyboard.html#al_get_keyboard_state ,类似 pygame.key.get_pressed https://www.pygame.org/docs/ref/key.html#pygame.key.get_pressed

C语言学习记录20240626
spaceship.h

#ifndef _SPACESHIP_H
#define _SPACESHIP_H#include <allegro5/allegro.h>extern const int WIDTH;
extern const int HEIGHT;typedef struct {float sx; // 飞船中屏幕中的坐标 float sy;float heading; //飞船朝向角度,如 30 度为 30.0 float speed;int gone; // 是否阵亡ALLEGRO_COLOR color; 
} Spaceship;void draw_ship(Spaceship *s);
void rotate_ship(Spaceship *s, int direction);
void accelerate_ship(Spaceship *s, int gas);#endif

spaceship.c

#include <stdlib.h>
#include <math.h>
#include <stdio.h>
#include <allegro5/allegro_primitives.h>#define DEGREES(x) ((x) * ALLEGRO_PI / 180.0)
#define DEFAULT_DEGREE 10.0
#define REAL_ROTATE(x) ((x) - 90.0)
#define DEFAULT_SPEED 0.1
#define MAX_SPEED 3.0#include "./spaceship.h"// 绘制飞船
void draw_ship(Spaceship *s) {ALLEGRO_TRANSFORM transform;al_identity_transform(&transform);al_rotate_transform(&transform, DEGREES(s->heading));al_translate_transform(&transform, s->sx, s->sy);al_use_transform(&transform);// 画线需要在调用 al_create_display 前设置多重采样以抗锯齿 al_draw_line(-8, 9, 0, -11, s->color, 3.0f);al_draw_line(0, -11, 8, 9, s->color, 3.0f);al_draw_line(-6, 4, -1, 4, s->color, 3.0f);al_draw_line(6, 4, 1, 4, s->color, 3.0f);// 重置变换矩阵,不然会影响其他绘制内容 al_identity_transform(&transform);al_use_transform(&transform);// 画辅助线 al_draw_line(s->sx, 0, s->sx, HEIGHT, al_map_rgb(255, 255, 255), 0.3f);al_draw_line(0, s->sy, WIDTH, s->sy, al_map_rgb(255, 255, 255), 0.3f);
}// 飞船左右控制转向, direction -1-左转 1-右转 
void rotate_ship(Spaceship *s, int direction) {if (direction == 0) return;s->heading += DEFAULT_DEGREE * direction;if (abs(s->heading) >= 360.0) {s->heading -= 360.0 * direction;}
}// 飞船上下控制加减速 gas -1-减速 1-加速,这里飞船速度为每帧前进距离 
void accelerate_ship(Spaceship *s, int gas) {if (gas == 0) return;s->speed += DEFAULT_SPEED * gas;if (s->speed < 0.0) {s->speed = 0.0;return;}if (s->speed > MAX_SPEED) {s->speed = MAX_SPEED;}s->sx += s->speed * cos(DEGREES(REAL_ROTATE(s->heading)));s->sy += s->speed * sin(DEGREES(REAL_ROTATE(s->heading)));printf("Rotate:%.2f X:%.2f Y:%.2f SPEED:%.2f\n", REAL_ROTATE(s->heading), s->sx, s->sy, s->speed);
} 

main.c

#include <stdio.h>
#include <allegro5/allegro.h>
#include <allegro5/allegro_primitives.h>
#include <allegro5/allegro_font.h>
#include <allegro5/allegro_ttf.h>
#include "./utility.h"
#include "./spaceship.h"// 全局变量 
const int WIDTH = 800; // 屏幕尺寸 
const int HEIGHT = 600;
const int FPS = 60; // 帧率 
ALLEGRO_FONT *font_40; // 字体 int main() {// 初始化 Allegroif (!al_init()) {fprintf(stderr, "Failed to initialize Allegro!\n");return -1;}// 安装键盘驱动,安装成功或已经安装过则返回 trueif (!al_install_keyboard()) {fprintf(stderr, "Failed to initialize keyboard!\n");return -1;}// 初始化图形绘制插件 if (!al_init_primitives_addon()) {fprintf(stderr, "Failed to initialize primitives addon!\n");return -1;}// 初始化字体插件 if (!al_init_font_addon()) {fprintf(stderr, "Failed to initialize font addon!\n");return -1;}// 初始化 TTF 字体插件 if (!al_init_ttf_addon()) {fprintf(stderr, "Failed to initialize ttf font addon!\n");return -1;}// 加载 TTF 字体,字号 40 font_40 = al_load_ttf_font("arial.ttf", 40, 0);// 启用多重采样al_set_new_display_option(ALLEGRO_SAMPLE_BUFFERS, 1, ALLEGRO_SUGGEST);al_set_new_display_option(ALLEGRO_SAMPLES, 4, ALLEGRO_SUGGEST);// 创建指定宽高的窗口 ALLEGRO_DISPLAY *display = al_create_display(WIDTH, HEIGHT);if (!display) {fprintf(stderr, "Failed to create display!\n");return -1;}// 创建事件队列 ALLEGRO_EVENT_QUEUE *event_queue = al_create_event_queue();if (!event_queue) {fprintf(stderr, "Failed to create event queue!\n");al_destroy_display(display);return -1;}// 创建定时器,每 1.0 / FPS 秒触发一次 ALLEGRO_TIMER *timer = al_create_timer(1.0 / FPS);// 注册事件源到事件队列 al_register_event_source(event_queue, al_get_display_event_source(display));al_register_event_source(event_queue, al_get_keyboard_event_source());al_register_event_source(event_queue, al_get_timer_event_source(timer));// 清除屏幕并填充黑色 al_clear_to_color(al_map_rgb(0, 0, 0));// 绘制背景 logo draw_logo();// 初始化并绘制飞船 Spaceship s = {WIDTH / 2.0, HEIGHT / 2.0, 0.0, 0.0, 0, al_map_rgb(0, 255, 0)};draw_ship(&s);// 交换缓冲区al_flip_display();// 启动定时器 al_start_timer(timer);bool done = false; // 游戏是否结束 bool redraw = false; // 是否重绘 ALLEGRO_KEYBOARD_STATE key_state; // 按键状态int rotate = 0; // 转向 int accelerate = 0; // 加速 // 轮询事件 while (!done) {ALLEGRO_EVENT event;// 等待从事件队列取出事件 al_wait_for_event(event_queue, &event);if (event.type == ALLEGRO_EVENT_TIMER) {// 处理定时器事件 redraw = true; // 重绘 // 获取所有按键状态并保存到 key_stateal_get_keyboard_state(&key_state);// 如果按下左右键就转向,否则左右键都为弹起状态则方向不变 if (al_key_down(&key_state, ALLEGRO_KEY_LEFT)) {rotate = -1;} else if (al_key_down(&key_state, ALLEGRO_KEY_RIGHT)) {rotate = 1;} else {rotate = 0;}// 按上键加速,上键弹起或按下键减速 if (al_key_down(&key_state, ALLEGRO_KEY_UP)) {accelerate = 1;} else {accelerate = -1;}if (al_key_down(&key_state, ALLEGRO_KEY_DOWN)) {accelerate = -1;}} else if (event.type == ALLEGRO_EVENT_KEY_DOWN && event.keyboard.keycode == ALLEGRO_KEY_ESCAPE) {// 处理单次按键事件,这里响应 ESC 按键 done = true;} else if (event.type == ALLEGRO_EVENT_DISPLAY_CLOSE) {// 处理窗口事件,这里响应点击窗口右上角关闭 done = true;}if (redraw && al_is_event_queue_empty(event_queue)) {redraw = false;// 更新转向和加速状态 rotate_ship(&s, rotate);accelerate_ship(&s, accelerate);// 清屏并更新绘制al_clear_to_color(al_map_rgb(0, 0, 0));draw_logo();draw_ship(&s);al_flip_display();}}// 销毁资源,释放内存 al_destroy_timer(timer);al_destroy_font(font_40);al_destroy_display(display);al_destroy_event_queue(event_queue);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/35685.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【嵌入式 RT-Thread】一种优雅的使用 [互斥锁] 和 [信号量] 解决数据多路并发思路

rt-thread 中的信号量和互斥锁在工业开发项目中的应用&#xff0c;本博文主要介绍了一种优雅的使用 [互斥锁] 和 [信号量] 解决数据多路并发思路 2024-06 by 积跬步、至千里 目录 0. 个人简介 && 授权须知1. 工业场景描述1.1 工业数据采集需求1.2 总线协议与数据采集 2…

汇聚荣做拼多多运营,是新手怎么做?

作为电商领域的一颗新星&#xff0c;拼多多以其独特的商业模式迅速崛起&#xff0c;吸引了众多商家和消费者的目光。对于新手来说&#xff0c;如何在拼多多平台上开展运营活动&#xff0c;成为了许多初入电商领域的人们关心的问题。本文将围绕如何做好拼多多运营这一核心内容&a…

DataGrip 2024 po for Mac 数据库管理工具解

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff08;适合自己的M芯片版或Intel芯片版&#xff09;&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功3、打开访达&#xff0c;点击【文…

基于Springboot+Vue的校友社交系统(带1w+文档)

基于SpringbootVue的校友社交系统(带1w文档) 校友社交系统作为一种典型的管理系统也迅速的发展并深入人们的日常生活中&#xff0c;它使用户足不出户就可以管理自己的校友社交信息等&#xff0c;最大化减缩了用户的管理时间&#xff0c;提高了管理效率。 项目简介 基于SSMVUE的…

基于百度地图实现矩形绘制/电子围栏/自定义覆盖物选择、点击、区域选中、轨迹绘制

目录 开发前的准备账号注册页面创建地图初始化矩形绘制开启绘制模式监听绘制完成事件矩形取消事件自定义覆盖物渲染数据准备覆盖物渲染自定义点击事件优化用户刷新提供的覆盖物添加右键菜单轨迹绘制开发前的准备 账号注册 百度地图开发者平台点此访问 登录注册后点击右上角的控…

任务5.1 初识Spark Streaming

实战概述&#xff1a;使用Spark Streaming进行词频统计 1. 项目背景与目标 背景: Spark Streaming是Apache Spark的流处理框架&#xff0c;用于构建可伸缩、高吞吐量的实时数据处理应用。目标: 实现一个实时词频统计系统&#xff0c;能够处理流式数据并统计文本中的单词出现频…

allWebPlugin助力iWebOffice2015插件在高版本浏览器使用

allWebPlugin简介 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品&#xff0c;致力于将浏览器插件重新应用到所有浏览器。它将现有ActiveX插件直接嵌入浏览器&#xff0c;实现插件加载、界面显示、接口调用、事件回调等。支持谷歌、火狐等浏…

11-Django项目--Ajax请求二

目录 模版: demo_list.html perform_list.html 数据库操作: 路由: 视图函数: Ajax_data.py perform.py 模版: demo_list.html {% extends "index/index.html" %} {% load static %} # 未实现修改,删除操作{% block content %}<div class"container…

vue2 + dataV 组件问题

在使用 dataV 过程中&#xff0c;遇见 svg 动画不加载问题。 一、理想状态下&#xff1a; 二、开发中遇到的 加载不出来问题。 解决方案 在查找官方资料中&#xff0c;提到使用 key 可以解决方案。 1 绑定 key 2 改变 key 值 注意&#xff1a;一定要在 $nextTick 里面执…

理解论文笔记:基于AHP和模糊综合评价的无线传感器网络可维护性评估方法

作为一个研0的娃,这是我认真读的第一篇论文,想着笔记让自己能看懂。如有侵权,请联系删除。 I. INTRODUCTION 介绍 主要介绍了无线传感器网络可维护性研究的重要性和必要性,并对下面的各章进行了总结。 翻译:第二部分简要介绍了无线传感器网络的维护,并对影响系统的因素…

VS 在多线程中仅调试某个线程

调试多线程程序时&#xff0c;只想观察某个线程的运行情况&#xff1b; 但是&#xff0c;由于线程切换执行&#xff0c;会导致调试时焦点在几个代码块之间跳来跳去&#xff0c;故需要解决这个问题。 参考文章&#xff1a; C#使用线程窗口调试多线程程序。 1 打开线程窗口&…

基于高度的纹理混合shader

基于高度的纹理混合shader 原文&#xff1a;基于高度的纹理混合shader - 知乎 (zhihu.com) 最近支持一个使用unity2021的项目&#xff0c;发现urp自带的Terrain/Lit shader已经自带高度混合了&#xff0c;看了下和我当初写的那个基本差不多&#xff0c;感觉稍微要比我的严谨一…

A股探底回升,跑出惊天大阳,你们知道为什么吗?

今天的A股&#xff0c;探底回升&#xff0c;让人惊呆了&#xff0c;你们知道是为什么吗&#xff1f;盘面上出现3个重要信号&#xff0c;一起来看看&#xff1a; 1、今天A股市场炸锅了&#xff0c;AI人工智能、国产软件、存储芯片迎来了涨停潮&#xff0c;惊呆了&#xff0c;科技…

阿里提出MS-Diffusion:一键合成你喜爱的所有图像元素,个性化生成新思路!

文本到图像生成模型的最新进展极大地增强了从文本提示生成照片级逼真图像的能力&#xff0c;从而增加了人们对个性化文本到图像应用的兴趣&#xff0c;尤其是在多主题场景中。然而&#xff0c;这些进步受到两个主要挑战的阻碍&#xff1a; 需要根据文本描述准确维护每个参考主题…

力扣:59. 螺旋矩阵 II(Java,模拟)

目录 题目描述示例 1&#xff1a;代码实现 题目描述 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[[1,2,3],[8,9,4],[7,6,5…

前端新手小白的第一个AI全栈项目---AI聊天室

前言 ok&#xff0c;大家好。- ̗̀(๑ᵔ⌔ᵔ๑)最近也是想做自己的第一个前后端分离的项目&#xff0c;刚好最近学了一点AI接口的实现。想着用接口做一个自己的ai聊天室并且尝试一下全栈式开发。中间真的解决了很多问题&#xff0c;也是成功之后也是想要将实现过程分享一下&a…

基于CNN卷积神经网络的MQAM调制识别matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 CNN模型结构 4.2 损失函数与优化 4.3 训练与测试 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2022a 3.部分核心程序 &#xff0…

d3dx9_42.dll找不到怎么正确处理?教学级修复d3dx9_42.dll的方法分享

d3dx9_42.dll找不到&#xff1f;别着急&#xff0c;这只是普普通通的dll文件找不到而已&#xff0c;它可能因为各种原因而导致丢失&#xff0c;我们只要直接对d3dx9_42.dll进行修复就可以了。下面我们一起来了解一下d3dx9_42.dll找不到的正确处理方法。 一.d3dx9_42.dll找不到是…

深度学习方法在谣言检测中的研究现状

摘要 管理社交媒体上的谣言&#xff0c;减少谣言对社会的危害。许多研究使用深度学习方法来检测开放网络中的谣言。为了从多个角度全面梳理谣言检测的研究现状&#xff0c;本文从特征选择、模型结构和研究方法三个角度分析了这一高度集中的工作。从特征选择的角度&#xff0c;将…

七天速通javaSE:第二天 基础:标识符与数据类型

文章目录 前言一、注释与标识符1. 注释2. 标识符2.1 标识符2.2 关键字 二、数据类型1. 语言类型2. 数据类型2.1 基本数据类型2.2引用数据类型 三、类型转换1. 自动转换2. 强制转换&#xff08;不建议&#xff09; 四、代码规范 前言 今天将学习Java语法的基础&#xff0c;认识…